2010-03-01 5 views
13

Je suis aux prises avec add_custom_command. Laissez-moi vous expliquer le problème en détail.cmake add_custom_command

J'ai cet ensemble de fichiers cxx et fichiers hxx. Je lance un script Perl sur chacun d'eux pour générer un certain type de fichier de traduction. La commande ressemble à

perl trans.pl source.cxx -o source_cxx_tro 

et similaire pour les fichiers header.hxx.

Je vais finir avec quelques commandes multiples (chacun pour un fichier)

Puis-je utiliser une autre scripn perl sur la sortie générée à partir de ces commandes (source_cxx_tro, header_hxx_tro)

perl combine.pl source_cxx_tro header_hxx_tro -o dir.trx 

dir .trx est le fichier de sortie.

J'ai quelque chose comme ça. Ce que je m'attend à ce que je m'attend à ce que je construis la cible de post-construction, les trofiles seront construits en premier. mais ce n'est pas le cas. Les $ {trofiles} ne sont pas construits et donc la commande post build se termine par un échec. Est-ce que je peux dire que la commande POST_BUILD dépend de la commande personnalisée précédente?

Des suggestions?

Merci à l'avance, Surya

Répondre

27

Permet de créer une chaîne de transformation de fichiers de add_custom_command

  • * (cxx | hxx) -> * _. (Cxx | hxx) _tro
  • * _ (cxx | hxx) _tro -> Foo. trx

et de faire de la dernière transformation une entité de première classe dans cmake en utilisant add_custom_target. Par défaut, cette cible ne sera pas construite, sauf si vous la marquez avec ALL ou si vous laissez une autre cible construite en dépendre.

 
set(SOURCES foo.cxx foo.hxx) 
add_library(Foo ${SOURCES}) 

set(trofiles) 
foreach(_file ${SOURCES}) 
    string(REPLACE "." "_" file_tro ${_file}) 
    set(file_tro "${file_tro}_tro") 
    add_custom_command(
    OUTPUT ${file_tro} 
    COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/trans.pl ${CMAKE_CURRENT_SOURCE_DIR}/${_file} -o ${file_tro} 
    DEPENDS ${_file} 
) 
    list(APPEND trofiles ${file_tro}) 
endforeach() 
add_custom_command(
    OUTPUT Foo.trx 
    COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/combine.pl ${trofiles} -o Foo.trx 
    DEPENDS ${trofiles} 
) 
add_custom_target(do_trofiles DEPENDS Foo.trx) 
add_dependencies(Foo do_trofiles) 
3

Vous souhaitez créer une cible personnalisée qui consomme la sortie des commandes personnalisées. Utilisez ensuite ADD_DEPENDENCIES pour vous assurer que les commandes sont exécutées dans le bon ordre.

Cela pourrait être une sorte de près de ce que vous voulez: http://www.cmake.org/Wiki/CMake_FAQ#How_do_I_use_CMake_to_build_LaTeX_documents.3F

Fondamentalement un add_custom_command pour chaque fichier généré, dresser une liste de ces fichiers (trofiles), puis utilisez add_custom_target avec un DÉPEND sur la liste trofiles. Utilisez ensuite add_dependencies pour que LibraryTarget dépende de la cible personnalisée. Ensuite, la cible personnalisée doit être créée avant la construction de la cible de la bibliothèque.