2013-02-14 9 views
10

W naszym systemie kompilacji CMake buduję niektóre biblioteki i niektóre pliki wykonywalne. Wszystkie produkty do kompilacji są wysyłane do określonego folderu.Czy istnieje ogólny sposób wyłączania wykonywalnych obiektów docelowych w cmake

Problem polega na tym, że mam pakiet narzędzi VS2010 i VS2008, ale potrzebuję tylko zestawu narzędzi VS2008 dla bibliotek VS2008. Pliki wyjściowe są docelowymi wartościami docelowymi dla Win32 dla obu zestawów narzędzi, więc muszę tylko raz zbudować pliki wykonywalne za pośrednictwem łańcucha narzędzi VS2010, podczas gdy pakiet narzędzi VS2008 powinien po prostu pominąć pliki wykonywalne i zbudować tylko pożądane biblioteki (co oszczędza czas budowania).

Skrypty bazowe CMake i ogólna konfiguracja mogą być również dostarczane klientom w przyszłości, więc byłoby miło, gdyby w CMake była możliwość wyłączenia określonych celów, jak wszystkie pliki wykonywalne w sposób ogólny. W przeciwnym razie muszę napisać wiele dużych IF (BUILD_EXECUTABLES) ... ENDIF() konstruuje wokół mojej konfiguracji plików wykonywalnych w moim CMakeLists.txt, bez CMake daje mi błędy, gdy je zapomnę.

Kompilacja jest uruchamiana za pośrednictwem niektórych plików wsadowych. Idealnie chcę przekazać zmienną do cmake poprzez opcję -D (np „-D BUILD_EXECUTABLES = false”)

Próbowałem owinąć makra ADD_EXECUTABLE ale to nie działa, ponieważ mam połączenia jak TARGET_LINK_LIBRARIES który następnie skarżą o nieistniejącym celu.

mogę też ustawić katalog wyjściowy do jakiegoś folderu śmieci, które mogłyby zostać usunięty potem, ale (jak już wspomniano) nie byłoby zaoszczędzić czas budowy (Mamy dość duży projekt)

pomysłów jak wykonać w czysty i ogólny sposób?

Odpowiedz

18

Cele CMake mają dwie właściwości, które kontrolują, czy cel jest zbudowany domyślnie. Pierwszy to EXCLUDE_FROM_ALL. Wskazuje, czy cel jest wykluczony z domyślnego celu kompilacji. Dla generatorów Makefile, wpisując make nie wywoła build docelowej którego EXCLUDE_FROM_ALL właściwość jest ustawiona na 1.

drugi jest EXCLUDE_FROM_DEFAULT_BUILD i ma zastosowanie wyłącznie do generatorów Visual Studio. Jeśli jest ustawiony na 1, obiekt docelowy nie będzie częścią domyślnej kompilacji po wywołaniu polecenia menu "Kompilacja rozwiązania".

Można ustawić wartości właściwości dla obu wykonywalnych celów w zależności od opcji BUILD_EXECUTABLES:

if (NOT BUILD_EXECUTABLES) 
    set_target_properties(exe1 exe2 PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) 
endif() 
+0

Brilliant, że działa bardzo dobrze. Dziękuję Ci. – ecreif

Powiązane problemy