2013-04-18 7 views
27

Per alcuni test interni, desidero che il prefisso di installazione sia impostato su una sottodirectory della directory di compilazione, a meno che non venga sovrascritto esplicitamente dall'utente. So che l'utente può specificare un prefisso di installazione da:Imposta automaticamente il prefisso di installazione sul percorso personalizzato se non specificato esplicitamente nella riga di comando

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar .. 

Ma se l'utente fa non specificare questo, si dovrebbe impostare, ad esempio, ${PWD}/installed.

La variabile CMAKE_INSTALL_PREFIX è già impostata su /usr/local, quindi non posso semplicemente controllare se è disinserita/vuota prima di impostarla.

mia soluzione attuale è quella di aggiungere un interruttore personalizzato che l'utente deve richiamare per specificare che la variabile CMAKE_INSTALL_PREFIX viene rispettata:

option(ENABLE_INSTALL_PREFIX "Install build targets to system (path given by '-DCMAKE_INSTALL_PREFIX' or '${CMAKE_INSTALL_PREFIX}' if not specified)." OFF) 
if (ENABLE_INSTALL_PREFIX) 
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root") 
else() 
    set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root" FORCE) 
endif() 

Le mie domande sono:

(a) non ci sono problemi con quanto sopra, oltre il fastidio della bandiera in più che deve essere passato a CMake per ottenere un effetto CMAKE_INSTALL_PREFIX?

(b) Esiste un modo migliore, più pulito, più robusto, più idiomatico e/o meno fastidioso per ottenere quanto sopra?

Grazie.

risposta

45

CMake imposta la variabile booleana CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT se CMAKE_INSTALL_PREFIX non è stato specificato esplicitamente ed è inizializzato sull'impostazione predefinita. Puoi sovrascriverlo nel modo seguente:

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 
    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed" CACHE PATH "default install path" FORCE) 
endif() 
+0

Perfetto! Grazie! – Jeet

+0

Vorrei aver trovato questo post pochi giorni fa mentre stavo tirando i capelli cercando di ottenere più dipendenze ExternalProject per fare la cosa giusta. Grazie! – KarateSnowMachine

2

Alcuni anni fa, volevo provare la stessa cosa. Sfortunatamente non ho mai trovato una soluzione soddisfacente. Invece, ho scelto di usare un'espressione regolare per verificare se CMAKE_INSTALL_PREFIX corrisponde al valore predefinito.

E.g. Su Windows Io uso il seguente per creare il install dir nella build-directory:

if (CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files") 
    # Override to an "Install" directory in the current build-dir 
    message(STATUS " Install-prefix was at default -> forcing it to the build-dir") 
    message(STATUS "  'set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install)'") 
    set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/install) 
endif (CMAKE_INSTALL_PREFIX MATCHES "^C:/Program Files") 

Il problema più grande con questo costrutto è che è possibile specificare manualmente che CMake dovrebbe installare in C:\Program Files. Poiché distribuisco il mio strumento con un programma di installazione NSIS, questo non è un problema (per me).

Forse potresti provare qualcosa di simile su Unix.

+0

Su Unix si usa '" ^/usr/local "' nell'abbinamento; o, ancora meglio, 'STREQUAL"/usr/local "' al posto di una corrispondenza di espressioni regolari. – thiagowfx

Problemi correlati