diff --git a/.gitignore b/.gitignore index 84c048a..1856de0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /build/ +/.vscode/* \ No newline at end of file diff --git a/readme.md b/readme.md index 42059bb..3c728a8 100644 --- a/readme.md +++ b/readme.md @@ -12,14 +12,14 @@ --- bin/ ---- program -- include/ ---- algo.h ---- algo.c +--- algos.h +--- algos.c -- src/ --- main.c -- tests/ --- test.cpp -- conanfile.txt -- CMakeLists.txt +-- conanfile.txt +-- CMakeLists.txt ``` ## conanfile Для подключения тестового фреймворка используется система менеджмента артефактов Conan, которая позволяет осуществлять подключение заранее скомпилированных библиотек без необходимости их установки на ОС разработчика. Подключение осуществляется описанием корректных настроек в файле conanfile.txt: @@ -37,7 +37,7 @@ cmake В файле с программой подключается файл с тестируемым алгоритмом, который используется в коде программы: ```C++ #include -#include "../include/algo.h" +#include "../include/algos.h" void swap(char* a, char* b); @@ -56,7 +56,7 @@ user@debian: ./build/bin/prog a=-11; b=15 a=15; b=-11 ``` -### include/algo.h +### include/algos.h Подключаемый в код программ и тестов заголовочный файл должен содержать только одно объявление функций: ```C++ #ifndef algos @@ -66,7 +66,7 @@ void swap(char* a, char* b); #endif ``` -### include/algo.c +### include/algos.c файл с реализацией лаконичен: ```C++ #include "algos.h" @@ -118,7 +118,7 @@ include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() # test executable -add_executable(check tests/test.cpp include/algo.h include/algo.c) +add_executable(check tests/test.cpp include/algos.h include/algos.c) target_link_libraries(check ${CONAN_LIBS} gtest_main) # let make know we use tests @@ -126,13 +126,13 @@ include(GoogleTest) gtest_discover_tests(check) # application executable -add_executable(prog src/main.c include/algo.h include/algo.c) +add_executable(prog src/main.c include/algos.h include/algos.c) ``` ## Запуск Запуск осуществляется из папки `build`, соответственно: - `conan install ..` (установить зависимости conan, описанные в файле папкой выше) - `cmake ..` (подготовить Makefile по правилам из файла папкой выше) -- `make` (собрать проект) +- `make`/`ninja` (собрать проект) - `ctest` (запустить тесты) - `./bin/prog` (запустить программу) В результате запуска тестов получится следующий вывод: @@ -147,3 +147,88 @@ Test project /home/user/Documents/book-c-basic/build Total Test time (real) = 0.01 sec ``` +## Сборка артефакта +Данная часть руководства рассматривается в случае, если собранные артефакты не предназначены под конфигурацию Вашей ОС. В качестве примера создаётся артефакт **GTest** под **MinGW**, который отсутствует на данный момент на офф репозиториях **conan center**. + +* Инициализация репозитория в папке, где будет находиться скаченный с Интернета проект; +* Скачать **.zip git googletest**; +* Распаковать в папку, где инициализирован репозиторий; +* Создать проект на внутреннем **gitlab** и заремоутить; +* Теперь нужно создать проект тестирования артефакта, **conan** позволяет уже создать готовый **sample package recipe** для тестирования после сборки артефакта; +* Создание рецепта пакета (package recipe) - `conan create . testg/testing`; +* После чего появится следующий проект: +``` +- Project/ +-- test_package/ +--- CMakeLists.txt +--- conanfile.txt +--- example.cpp +-- conanfile.py +``` +* Поменять во внешнем файле **conanfile(py)** в методе `source` команды `git clone` ссылку на соответствующий проект, а также следующие изменения в данном файле: + +В методе `source` поменять название проекта и путь до CMakeLists.txt: +```python +tools.replace_in_file("hello/CMakeLists.txt", "PROJECT(HelloWorld)", + '''PROJECT(HelloWorld) +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup()''') +``` +На: +```python +tools.replace_in_file("googletest/CMakeLists.txt", "project(googletest-distribution)", + '''project(googletest-distribution) +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +conan_basic_setup()''') +``` + +В методе `build` меняем соурс папку: +```python +def build(self): + cmake = CMake(self) + cmake.configure(source_folder="hello") + cmake.build() +``` +На: +```python +def build(self): + cmake = CMake(self) + cmake.configure(source_folder="googletest") + cmake.build() +``` + +В методе `package` изменить название папки и пути до заголовков: +```python +def package(self): + self.copy("*.h", dst="include", src="hello") + self.copy("*hello.lib", dst="lib", keep_path=False) + self.copy("*.dll", dst="bin", keep_path=False) + self.copy("*.so", dst="lib", keep_path=False) + self.copy("*.dylib", dst="lib", keep_path=False) + self.copy("*.a", dst="lib", keep_path=False) +``` +На: +```python +def package(self): + self.copy("*.h", dst="include/gtest", src="googletest/googletest/include/gtest") + self.copy("*gtest.lib", dst="lib", keep_path=False) + self.copy("*.dll", dst="bin", keep_path=False) + self.copy("*.so", dst="lib", keep_path=False) + self.copy("*.dylib", dst="lib", keep_path=False) + self.copy("*.a", dst="lib", keep_path=False) +``` + +Последний метод будет `package_info`: +```python +def package_info(self): + self.cpp_info.libs = ["hello"] +``` +На: +```python +def package_info(self): + self.cpp_info.libs = ["gtest"] +``` +* После выполнения настроек **.py** файла можно выполнить - `conan create . testg/testing`; +* Затем, можно выполнить `upload` артефакта и использовать его по мануалу, который описан выше. Лабо можно использовать данный артефакт локально, conan автоматически вначале проверяет cache, и только потом обращается в remote, где указаны соответствующие ссылки (в нашем случае на Nexus). + +Также хотелось бы упомянуть один нюанс. Если Вы загружаете уже собранный артефакт, убедитесь, что в файле conan'а настроек конфигураций не были сбиты пути в `[env]` разделе. Была ситуация, когда был загружен артефакт, собранный на ОС GNU Linux, и в данном файле изменились пути под вид данной ОС (C:\MinGW... -> /c/MinGW/). \ No newline at end of file