2016-02-11 14 views
5

Używam CMake dla projektu i googletest dla moich przypadków testowych. Rozglądając się po Internecie wydaje się, że zwykłą praktyką jest skopiowanie źródła googletest do podfolderu repozytorium i dodanie go do "add_subdirectory (googletest)". Ja to zrobiłem.CPack: wyklucza polecenia INSTALL z podkatalogu (katalog googletest)

Teraz używam CPack do generowania pakietów debian dla mojego projektu. Niestety, pakiety generowane przez CPack instalują googletest wraz z moim projektem. To oczywiście nie jest to, czego chcę.

Patrząc w katalogu googletest, znalazłem tam kilka poleceń cmake, więc jest jasne, dlaczego tak się dzieje. Pytanie brzmi teraz: jak mogę tego uniknąć? Nie lubię modyfikować plików CMakeLists.txt z googletest, ponieważ będę musiał pamiętać o ponownym zastosowaniu moich modyfikacji w aktualizacji. Czy istnieje inny sposób wyłączenia tych instalacji w CPack?

Odpowiedz

6

Jeśli nie potrzebują testów w wydaniu Twojego projektu (które mają być dostarczane z CPack), a następnie obejmować googletest podkatalogu warunkowo i ustaw warunkowy false gdy opakowanie:

... 
if(NOT DISABLE_TESTS) 
    add_subdirectory(googletest) 
endif() 

opakowanie z

cmake -DDISABLE_TESTS=ON <source-dir> 
cpack 

Ewentualnie, jeśli chcesz testy, ale nie chce zainstalować infrastrukturę badań, można wyłączyć komendę install poprzez definiowanie makra lub funkcji o tej samej nazwie:

# Replace install() to do-nothing macro. 
macro(install) 
endmacro() 
# Include subproject (or any other CMake code) with "disabled" install(). 
add_subdirectory(googletest) 
# Restore original install() behavior. 
macro(install) 
    _install(${ARGN}) 
endmacro() 

Takie podejście zostało również zasugerowane w CMake mailing.

+0

Druga rzecz zdaje się również wyłączać moje własne polecenia instalacji, chociaż są one zdefiniowane w innym (nie pod) katalogu. W jakim zakresie zastąpiono funkcję instalacji? Czy mogę go zastąpić tylko dla bieżącego katalogu (łącznie z podkatalogami)? – Heinzi

+0

'Czy mogę go zastąpić tylko dla bieżącego katalogu (włączając podkatalogi)? - Dokładnie, więc definicja funkcji powinna działać. Testuję to później. – Tsyvarev

+0

Cóż, w rzeczywistości definicja funkcji ma zasięg globalny.Dodałem kod do przywracania zachowanie 'install()' w odpowiedzi na post. – Tsyvarev

3

więc istnieje możliwość makro @Tsyvarev wspomnieć, że pierwotnie sugerowano here:

# overwrite install() command with a dummy macro that is a nop 
macro (install) 
endmacro() 

# configure build system for external libraries 
add_subdirectory(external) 

# replace install macro by one which simply invokes the CMake 
install() function with the given arguments 
macro (install) 
    _install(${ARGV}) 
endmacro(install) 

Uwaga ${ARGV} i ${ARGN} są takie same, ale docs obecnie sugerują użyciu ${ARGN}. Również fakt, że makro-nadpisywanie poprzedza _ oryginalną nazwę makra, nie jest udokumentowany, ale nadal jest to zachowanie. Zobacz kod here.

Jednak, nigdy nie otrzymałem powyższego kodu do prawidłowego działania. To naprawdę dziwne rzeczy i często dzwoni dwa razy.

Alternatywą - również nieudokumentowane - jest użycie EXCLUDE_FROM_ALL:

add_subdirectory(external EXCLUDE_FROM_ALL) 

Według niektórych komentarzu znalazłem gdzieś ten wyłącza install() do tego podkatalogu. Myślę, że tak naprawdę jest ustawiony domyślnie EXCLUDE_FROM_ALL dla wszystkich poleceń install(), które prawdopodobnie również robią to, co chcesz. Tak naprawdę tego nie testowałem, choć warto było strzelać.

+1

EXCLUDE_FROM_ALL działa poprawnie z cmake 3.7 – Dmitry

Powiązane problemy