2016-02-11 26 views
5

Sto usando CMake per un progetto e googletest per i miei casi di test. Guardando in giro per Internet, sembra essere una pratica comune copiare semplicemente la fonte googletest in una sottocartella del repository e includerla con "add_subdirectory (googletest)". L'ho fatto.CPack: Escludere i comandi INSTALL dalla sottodirectory (directory googletest)

Ora sto usando CPack per generare pacchetti debian per il mio progetto. Sfortunatamente, i pacchetti generati da CPack installano googletest insieme al mio progetto. Questo ovviamente non è quello che voglio.

Guardando nella directory googletest, ho trovato alcuni comandi di installazione di cmake lì, quindi è chiaro, perché succede. La domanda è ora - come posso evitarlo? Non mi piace modificare i file CMakeLists.txt da googletest, perché dovrei ricordare di applicare nuovamente le mie modifiche su un aggiornamento. C'è un altro modo per disabilitare queste installazioni in CPack?

risposta

6

Se non avete bisogno di test in rilascio del progetto (che si desidera fornire con CPack), quindi includere googletest sottodirectory condizionale, e impostare condizionale per false quando imballaggio:

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

imballaggio con

cmake -DDISABLE_TESTS=ON <source-dir> 
cpack 

In alternativa, se si desidera che i test, ma non si vuole installare l'infrastruttura di test, è possibile disattivare install comando tramite la definizione di macro o una funzione con lo stesso nome:

# 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() 

Questo approccio è stato suggerito anche in CMake mailing.

+0

La seconda cosa sembra disabilitare anche i miei comandi di installazione, sebbene siano definiti in una directory diversa (non secondaria). Per quale ambito è stata sovrascritta la funzione di installazione? Posso sovrascriverlo solo per la directory corrente (comprese le sottodirectory)? – Heinzi

+0

'Posso sovrascriverlo solo per la directory corrente (comprese le sottodirectory)?' - Esattamente la definizione della funzione dovrebbe funzionare. Lo metterò alla prova più tardi. – Tsyvarev

+0

Bene, in realtà la definizione della funzione ha un ambito globale.Ho aggiunto il codice per ripristinare il comportamento di 'install()' nel post di risposta. – Tsyvarev

3

Quindi non v'è l'opzione macro @Tsyvarev detto che è stato originariamente suggerito 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) 

Nota ${ARGV} e ${ARGN} sono gli stessi, ma la documentazione attualmente suggeriscono usando ${ARGN}. Anche il fatto che la macro-sovrascrittura anteponga _ al nome della macro originale non è documentato, ma è ancora il comportamento. Vedi il codice here.

Tuttavia, non ho mai ricevuto il codice sopra per funzionare correttamente. Lo fa in realtà le cose strane e spesso chiama il numero install() due volte.

Un'alternativa - anche non documentato - è quello di utilizzare EXCLUDE_FROM_ALL:

add_subdirectory(external EXCLUDE_FROM_ALL) 

Secondo alcuni commenti che ho trovato da qualche parte questo disabilita install() per quella sottodirectory. Penso che ciò che effettivamente fa è impostato su EXCLUDE_FROM_ALL per impostazione predefinita per tutti i comandi install() che probabilmente fanno anche ciò che si desidera. Non l'ho ancora provato, vale comunque la pena.

+1

EXCLUDE_FROM_ALL funziona correttamente con cmake 3.7 – Dmitry