Rozważmy projekt C++, zorganizowany w repozytorium git. Załóżmy, że repozytorium git posiada moduł częściowy, z którego zbudowana jest biblioteka, od której zależy projekt (super). Jeśli (super) projekt zależy nie tylko od biblioteki, ale od biblioteki zbudowanej na konkretnych parametrach (CMake), w jaki sposób można zagwarantować, że moduł jest zbudowany z tymi parametrami, gdy budowany jest (super) projekt?C++ z git i CMake: jak zbudować submoduły o określonych parametrach?
Odpowiedz
Myślę, że najprostszą odpowiedzią jest użycie opcji -C
, jak opisano w tej SO answer.
Nie jestem zadowolony z rozwiązania. Po pierwsze, użytkownik powinien wybrać cmake z odpowiednimi parametrami. Po drugie, jest to wezwanie CMake do głównego projektu, a nie do submodułu. –
Nie jestem pewien, co próbujesz zrobić. Opcja '' -C'' wydaje się rozsądna, gdy masz jakieś niestandardowe ustawienia, których potrzebujesz. Inne opcje wydają się wykorzystywać moduł cmake ExternalProject lub skryptowanie za pomocą skryptu cmake '' -P''. – Phil
opcje kompilacji (jak MYLIB_WITH_SQLITE
) muszą zostać dodane do interfejsu biblioteki, czyli do zmiennej MYLIB_DEFINITIONS
w przypadku starej szkoły config-modułu lub do nieruchomości INTERFACE_COMPILE_DEFINITIONS
, jeśli biblioteka tworzy jego config-moduł z komendy install(EXPORT ...)
:
add_library(mylib ...)
if(MYLIB_WITH_SQLITE)
target_compile_definitions(mylib PUBLIC MYLIB_WITH_SQLITE)
endif()
...
install(TARGETS mylib EXPORT mylib-targets ...)
install(EXPORT mylib-targets ...)
I w bibliotece zużywającego lub plik wykonywalny można napisać prostą kontrolę czasu kompilacji:
#ifndef MYLIB_WITH_SQLITE
#error mylib must be built with sqlite
#endif
Jedno rozwiązanie uważam to na talerz moduł repozytorium, zmodyfikuj plik CMakeLists.txt, aby był bardziej szczegółowy, a następnie dołącz wersję HEAD do rozwidlonego repo jako modułu podrzędnego. Nieelegancki, ale akceptowalny.
CMake obsługuje zewnętrzne projekty z ExternalProject_Add
, gdzie można definiować flagi kompilacji i bardziej do własnych potrzeb. Użyj go do zbudowania swoich submodułów.
Więcej szczegółów: https://cmake.org/cmake/help/v3.2/module/ExternalProject.html
Przepraszam, że się trochę off topic tutaj, ale to jest powód, staram się unikać CMake jeśli mogę. Ostatnio wyglądałem, że jest dokładnie jedna książka na temat pisania plików CMake. Istnieje 5 bajillionów na Make i autotools. Jeśli książki pomijają temat, jesteś SOL. – TLOlczyk
Czy twój submoduł jest zbudowany osobno lub jako część twojego super-projektu? – nils
Moduł częściowy jest biblioteką zbudowaną oddzielnie, a następnie połączoną z plikiem wykonywalnym projektu (super). –