2016-03-10 4 views
0

J'ai un problème avec CMake exécutant un processus avant de faire quoi que ce soit d'autre.cmake exécute le processus avant toute chose

Le code suivant montre la situation:

if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/generated") 
    file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/generated") 
    execute_process(
    # This tool generates library sources, which are not known before 
    COMMAND "source_file_generator_command" 
    # This tool iterates over the generated source tree and creates 
    # a proper CMakeLists.txt in the 'generated' directory from the 
    # source files found there 
    COMMAND "cmake_lists_generator_command" 
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/generated" 
) 
endif() 

# At this point the generated subdirectory (with the also 
# generated CMakeLists.txt file) shall be included 
add_subdirectory(
    "${CMAKE_CURRENT_BINARY_DIR}/generated" 
    "${CMAKE_CURRENT_BINARY_DIR}/generated_build" 
) 
# But the 'add_subdirectory' statement fails due to non-existing 
# CMakeLists.txt in the 'generated' source directory at this point 

Le problème est, comme commenté ci-dessus, que le fichier CMakeLists.txt dans le sous-répertoire qui devrait être ajoutée est générée à la volée par un script spécial (les sources générées ne sont pas connues auparavant) lors de la première exécution de CMake. Littéralement, j'ai besoin que CMake attende que toutes les instructions du bloc if/else soient exécutées et traite l'instruction add_subdirectory non jusqu'à ce que tout soit fait (le CMakeLists.txt est généré). Existe-t-il une solution adéquate pour un tel cas d'utilisation?

Merci pour votre aide,

Felix

+0

'execute_process' devrait fonctionner avant toute autre chose. Notez que * plusieurs * 'COMMAND 'qui lui sont attribués sont exécutés ** dans le canal **, pas séquentiellement. Si vous voulez une vraie exécution séquentielle, vous devez utiliser une option 'COMMAND' par appel' execute_process'. – Tsyvarev

+0

Tsyvarev, merci beaucoup. J'ai divisé la chaîne de commande en deux sections 'execute_process', maintenant cela fonctionne comme un charme. – harlix

Répondre

0

Lorsque plusieurs COMMAND s pour execute_process sont utilisés, ils sont exécutés dans le tuyau. De l'description de cette commande CMake:

exécute la séquence donnée d'une ou plusieurs commandes à la sortie standard de chaque processus d'ambiance à l'entrée standard de la suivante.

Si vous voulez vrai séquentielle exécution des commandes, vous devez utiliser un appel à execute_process par COMMAND:

execute_process(
    COMMAND "source_file_generator_command" 
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/generated" 
) 
execute_process(
    COMMAND "cmake_lists_generator_command" 
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/generated" 
)