2013-04-18 3 views
27

Für einige interne Tests möchte ich das Installationspräfix standardmäßig auf ein Unterverzeichnis des Build-Verzeichnisses, sofern nicht explizit durch den Benutzer überschrieben. Ich weiß, dass der Benutzer einen Präfix installieren angeben können:Installationspräfix automatisch auf benutzerdefinierten Pfad festlegen, wenn nicht explizit in der Befehlszeile angegeben

$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar .. 

Aber wenn der Benutzer tut nicht dies angeben, sollte es standardmäßig, z ${PWD}/installed.

Die Variable CMAKE_INSTALL_PREFIX ist bereits auf /usr/local eingestellt, daher kann ich nicht einfach überprüfen, ob sie vor der Einstellung unscharf/leer ist.

Meine aktuelle Lösung ist ein benutzerdefinierten Schalter hinzufügen, dass der Benutzer angeben, berufen hat, dass die CMAKE_INSTALL_PREFIX Variable respektiert werden:

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

Meine Fragen sind:

(a) Gibt es Probleme mit dem oben genannten, über den Ärger der zusätzlichen Flagge, die an CMake übergeben werden muss, um CMAKE_INSTALL_PREFIX zu bekommen, um einen Effekt zu haben?

(b) Gibt es einen besseren, saubereren, robusteren, idiomatischen und/oder weniger störenden Weg, um das Obige zu erreichen?

Danke.

Antwort

45

CMake legt die boolesche Variable CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT fest, wenn CMAKE_INSTALL_PREFIX nicht explizit angegeben wurde und auf die Standardeinstellung initialisiert wird. Sie können es auf folgende Weise überschreiben:

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

Perfekt! Vielen Dank! – Jeet

+0

Ich wünschte, ich hätte diesen Post vor ein paar Tagen gefunden, während ich mir die Haare auszog und versuchte, mehrere ExternalProject-Abhängigkeiten zu bekommen, um das Richtige zu tun. Vielen Dank! – KarateSnowMachine

2

Vor ein paar Jahren wollte ich das gleiche versuchen. Leider konnte ich nie eine voll befriedigende Lösung finden. Stattdessen habe ich einen Regex gewählt, um zu überprüfen, ob CMAKE_INSTALL_PREFIX dem Standard entspricht.

z. auf Windows verwende ich die im Anschluss an den install dir im Build-Verzeichnis zu erstellen:

mit diesem Konstrukt
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") 

Das größte Problem ist, dass Sie manuell die CMake sollten in C:\Program Files installieren angeben. Da ich mein Tool mit einem NSIS-Installer vertreibe, ist dies kein Problem (für mich).

Vielleicht könnten Sie etwas ähnliches auf Unix versuchen.

+0

Auf Unix würde man '" ^/usr/local "' in der Übereinstimmung verwenden; oder, noch besser, "STREQUAL"/usr/local "' anstelle eines regulären Ausdrucksvergleichs. – thiagowfx

Verwandte Themen