2015-07-22 32 views
5

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?

+0

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

+0

Czy twój submoduł jest zbudowany osobno lub jako część twojego super-projektu? – nils

+0

Moduł częściowy jest biblioteką zbudowaną oddzielnie, a następnie połączoną z plikiem wykonywalnym projektu (super). –

Odpowiedz

-1

Myślę, że najprostszą odpowiedzią jest użycie opcji -C, jak opisano w tej SO answer.

+0

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. –

+0

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

1

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 
-1

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.