Sonntag, April 5, 2020

CMake: führen Sie ein makro/Funktion wie der Befehl von add_custom_command

Ich verwende eine externe Bibliothek, die bietet ein CMake-Funktion für die automatische code-Generierung, verwendet werden, in meinem CMakeLists. Das problem ist, dass, wenn ich ändern, eine CMakeLists dann die Funktion erneut ausgeführt wird, wird die Auslösung der Neukompilierung des neu generiert werden, aber unverändert Quellen. Ich bräuchte so etwas wie add_custom_command mit der Möglichkeit zum angeben der CMake-Funktion als BEFEHL anstatt eine ausführbare Datei, so dass die Funktion wird nur ausgeführt, wenn die automatisch generierten Dateien nicht bereits vorhanden sind.
Ist das machbar?? Wenn nicht, gibt es einen anderen Weg um dasselbe Ergebnis zu erhalten?
Danke.

InformationsquelleAutor Nicola Mori | 2015-01-14

3 Kommentare

  1. 3

    Zu verhindern, dass die Funktion ausgeführt, nur wickeln Sie es in if:

    if(NOT EXISTS ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp)
       run_your_provided_command(BLAH_BLAH)
    endif()
    

    Einfach!

    Update: Um Sie auszuführen, wenn die config-Datei geändert hat, verwenden Sie einfach etwas komplizierter Zustand:

    if(
       NOT EXISTS ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp OR
       ${CMAKE_SOURCE_DIR}/blah-blah.config IS_NEWER_THAN ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp
      )
    ...
    

    und verwenden add_dependencies – Befehl, um sicherzustellen, dass Ihre binären sein Wiederaufbau im Falle der config-Datei änderungen:

    add_executable(
        YourBinary
        ...
        ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp
      )
    add_dependencies(YourBinary ${CMAKE_SOURCE_DIR}/blah-blah.config)
    
    • Vielen Dank, das weitgehend löst mein problem. Aber da die Funktion liest eine config-Datei, um den code erzeugen, der würde ich brauchen, um neu zu laufen, wenn die config-Datei geändert wird. Dies ist der Grund, warum ich nach etwas gefragt wie add_custom_command die Unterstützung Abhängigkeiten.
    • Wow, ich wusste nicht, IS_NEWER_THAN. Die aktualisierte Antwort ist die komplette Lösung für mein problem, danke!
    • Sie brauchen nicht, um eine zusätzliche NOT EXISTS – check in Verbindung mit IS_NEWER_THAN, weil letztere bereits impliziert die ehemalige.
  2. 2

    Werfen Sie einen Blick auf das SO ein post.

    Rufen Sie Ihre Funktion in einem separaten CMake-Skript, dieses Skript aufrufen, mit add_custom_target und cmake -P dann hinzufügen einer Abhängigkeit zu Ihrem binäre :

    add_custom_target(run_script COMMAND ${CMAKE_COMMAND} -P separate_script.cmake)
    add_executable(your_binary ...)
    # or add_library(your_binary ...)
    add_dependencies(your_binary run_script)
    
    • Gibt es eine Möglichkeit ein parameter übergeben werden, um die separate_script.cmake?
  3. 1

    Gibt es eine Möglichkeit ein parameter übergeben werden, um die separate_script.cmake?

    Können Sie die cmake-Variablen Werte übergeben, wenn Sie rufen Sie das Skript z.B.

    "COMMAND ${CMAKE_COMMAND} -DPARAM=value -P separate_script.cmake" 
    

Kostenlose Online-Tests