2015-10-13 2 views
2

J'essaie de lancer gperf à partir d'un fichier cmake.cmake La commande add_custom_command ne fonctionne pas

J'ai créé un très minime CMakeLists.txt ci-dessous.

Quand je cours par

$ cmake . 
$ make 

Il ne crée pas le fichier example.hpp

Ce qui pourrait être un problème avec le dessous CMakeLists.txt?

cmake_minimum_required(VERSION 2.6) 

function(gperf_generate_new source target) 

     add_custom_target(${target} echo "Creating ${target}") 

     add_custom_command(
       SOURCE ${source} 
       TARGET ${target} 
       COMMAND gperf -L c++ ${source} > ${target} 
       OUTPUTS ${target} 
       DEPENDS ${source} 
       ) 

endfunction() 

gperf_generate_new(command_options.new.gperf example.hpp) 
+0

Cochez [this] (http://stackoverflow.com/questions/2354473/cmake-add-custom-command?rq=1) et [this] (http://stackoverflow.com/questions/17696872/cmake -add-commande-personnalisée-qui-est-exécutée-sur-chaque-construction? rq = 1) Q/As. Probablement votre question est un doublon. – user3159253

+0

Un problème avec votre fichier CMakeLists.txt est que vous utilisez des options incorrectes pour 'add_custom_command': l'option' SOURCE' est complètement sans rapport avec cette commande, 'OUTPUTS' devrait être' OUTPUT' et ne devrait pas être mélangé avec l'option 'TARGET' ('OUTPUT' et' TARGET' sont utilisés pour * différents flux * de cette commande). ** CMake [documentation] (https://cmake.org/cmake/help/cmake2.6docs.html#section_Commands) décrit précisément les signatures de la commande **, pas besoin de deviner quelle option supplémentaire peut prendre telle ou telle commande. – Tsyvarev

Répondre

3

fichiers, produit par générateurs source-fichiers (comme gpref) sont rarement nécessaires en mode autonome. Au lieu de cela, ces fichiers sources sont généralement utilisés pour créer des exécutables ou des bibliothèques dans un projet.

Ainsi, le modèle standard de l'utilisation des générateurs de fichiers source dans le CMake ressemble:

# Call add_custom_command() with appropriate arguments for generate output file 
# Note, that *gperf* will work in the build tree, 
# so for file in the source tree full path should be used. 
function(gperf_generate_new input output) 
    add_custom_command(
     OUTPUT ${output} 
     COMMAND gperf -L c++ ${input} > ${output} 
     DEPENDS ${input} 
     COMMENT "Generate ${output}" # Just for nice message during build 
    ) 
endfunction() 

# Generate *example.hpp* file ... 
gperf_generate_new(${CMAKE_CURRENT_SOURCE_DIR}/command_options.new.gperf example.hpp) 

# ... for use it in executable 
add_executable(my_program ${CMAKE_CURRENT_BINARY_DIR}/example.hpp <other sources>) 

Si vous voulez seulement vérifier si example.hpp est la génération, au lieu de add_executable() utilisation

add_custom_target(my_target 
    ALL # Force target to be built with default build target. 
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/example.hpp 
) 

Remarque , cette liaison entre add_custom_command et add_custom_target est exprimée en utilisant le même nom de fichier dans leurs options OUTPUT et DEPENDS de manière correspondante. Avec un tel ordre de lien de ces commandes est insignifiant (mais les deux commandes doivent être appelées à partir du même script CMakeLists.txt).

+0

sur mon système de construction, il a travaillé que lorsque je l'ai changé pour add_custom_target (my_target ALL # cible force à construire avec l'objectif de construction par défaut. DÉPEND $ {CMAKE_CURRENT_BINARY_DIR} /example.hpp ) –

+1

Pour moi, cela fonctionne sans modification, mais CMake ne documente pas explicitement l'utilisation des chemins relatifs dans l'option 'DEPENDS' pour' add_custom_target'. J'ai corrigé mon message. – Tsyvarev