2014-09-05 17 views
7

Ich versuche CMake entweder drei Bash-Befehle oder ein Bash-Skript auszuführen. Aber ich kann es nicht zur Arbeit bringen.Ausführen eines Bash-Befehls über CMake

Die bash Befehle sind:

cd ${CMAKE_SOURCE_DIR}/dependencies/library 
    make 
    cd ${CMAKE_BINARY_DIR} 

Wesentlichen würde ich CMake wie die Bibliothek in diesem Verzeichnis zu bauen, wenn es nicht bereits vorhanden ist.

Hier ist der CMake Code, den ich versucht:

if(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 
    execute_process(COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/library) 
    execute_process(COMMAND make) 
    execute_process(COMMAND cd ${CMAKE_BINARY_DIR}) 
endif(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 

Allerdings ist es nicht etwas zu bauen. Was mache ich falsch?

Auch, während ich hier frage: Soll der dritte Befehl, in den Binärordner zu wechseln, enthalten sein?

Danke!

+3

Zuerst warum verwenden Sie nicht 'WORKING_DIRECTORY' Parameter anstelle dieser' cd' Befehle? Etwas wie 'execute_process (COMMAND machen WORKING_DIRECTORY $ {CMAKE_SOURCE_DIR}/Abhängigkeiten/Bibliothek)'. Ich nehme an, 'execute_process()' Anrufe teilen nicht die gleiche Umgebung. Auch, wenn ich Sie wäre, würde ich die ['add_custom_target()'] (http://www.cmake.org/cmake/help/v3.0/command/add_custom_target.html?highlight=add_custom_target) überprüfen und ['add_custom_command()'] (http://www.cmake.org/cmake/help/v3.0/command/add_custom_command.html?highlight=add_custom_command) für diese Art von Dingen. – Kamiccolo

+1

Ich kann das meiste von dem, was @Kamiccolo gesagt hat, nicht kommentieren, aber ich kann sagen, dass ich denke, dass die Details über 'execute_process', die nicht den Status teilen, ziemlich genau sind. Es ist * unglaublich * wahrscheinlich, dass das 'cd' im ersten Befehl das Verzeichnis nur für diesen Prozess und nicht für andere ändert. –

+1

Wenn Sie eine Drittanbieterbibliothek erstellen möchten, verwenden Sie das Modul [ExternalProject] (http://www.cmake.org/cmake/help/v3.0/module/ExternalProject.html) wahrscheinlich besser. – sakra

Antwort

11

execute_process() wird während der Konfigurationszeit ausgeführt. Aber Sie möchten, dass dies zur Erstellungszeit ausgeführt wird, also add_custom_command() und add_custom_target() ist, was Sie suchen.

In diesem speziellen Fall, dass Sie eine Ausgabedatei erstellt werden soll, so dass Sie für add_custom_command() (beide sind im Wesentlichen gleich gehen sollte, aber command erzeugt eine oder mehrere Ausgabedateien, während target nicht der Fall ist.

Die Cmake Snippet

add_custom_command(
    OUTPUT ${CMAKE_SOURCE_DIR}/dependencies/library/lib.o 
    WORKING_DIR ${CMAKE_SOURCE_DIR}/dependencies/library 
    COMMAND make 
) 

Sie müssen dann in einem anderen Ziel als Abhängigkeit der Ausgabedatei hinzuzufügen, und alles sollte (hoffentlich) wie erwartet

denn das in etwa wie folgt aussehen sollte.

Sie können auch DEPENDS Anweisungen zum Aufruf add_custom_command() hinzufügen, um die Objektdatei neu zu erstellen, falls sich einige Eingabequellen geändert haben.

Verwandte Themen