2013-04-18 23 views
27

Dla niektórych testów wewnętrznych, chciałbym, aby domyślny prefiks instalacji był podkatalogiem katalogu budowania, chyba że zostanie jawnie nadpisany przez użytkownika. Wiem, użytkownik może określić prefiks instalacji przez:Ustaw prefiks instalacji automatycznie na niestandardową ścieżkę, jeśli nie jest jawnie określony w wierszu polecenia

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar .. 

Ale jeśli użytkownik nie ma określenie to powinno domyślnie, na przykład ${PWD}/installed.

Zmienna CMAKE_INSTALL_PREFIX jest już ustawiona na /usr/local, więc nie mogę po prostu sprawdzić, czy jest ona rozbrajana/pusta przed jej ustawieniem.

Moje obecne rozwiązanie jest dodanie przełącznika niestandardowy, który użytkownik musi powołać, aby określić, że zmienna CMAKE_INSTALL_PREFIX dostaje przestrzegane:

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

moje pytania są następujące:

(a) Czy są jakieś problemy z powyższym, poza irytacją dodatkowej flagi, która musi zostać przekazana do CMake, aby uzyskać efekt CMAKE_INSTALL_PREFIX?

(b) Czy istnieje lepszy, czystszy, bardziej solidny, bardziej idiomatyczny i/lub mniej irytujący sposób, aby osiągnąć powyższe?

Dzięki.

Odpowiedz

45

CMake ustawia zmienną boolean CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT, jeśli CMAKE_INSTALL_PREFIX nie została jawnie określona i została zainicjowana z ustawieniem domyślnym. Możesz go przesłonić w następujący sposób:

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

Idealny! Dzięki! – Jeet

+0

Chciałbym znaleźć ten post kilka dni temu, gdy wyciągałem włosy, próbując uzyskać wiele zależności ExternalProject, aby zrobić to, co trzeba. Dzięki! – KarateSnowMachine

2

Kilka lat temu chciałem spróbować tego samego. Niestety nigdy nie mogłem znaleźć w pełni satysfakcjonującego rozwiązania. Zamiast tego zdecydowałem się użyć wyrażenia regularnego, aby sprawdzić, czy CMAKE_INSTALL_PREFIX pasuje do domyślnego.

E.g. na windows używam następujących aby utworzyć install dir w gromadzeniu katalogu:

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") 

Największym problemem tej konstrukcji jest to, że można określić ręcznie, które należy zainstalować w CUpewnij C:\Program Files. Ponieważ dystrybucję mojego narzędzia za pomocą instalatora NSIS nie stanowi to problemu (dla mnie).

Być może możesz wypróbować coś podobnego na Uniksie.

+0

Na Unixie użyjemy '" ^/usr/local "' w dopasowaniu; lub, jeszcze lepiej, 'STREQUAL"/usr/local "' zamiast dopasowywania wyrażenia regularnego. – thiagowfx