2012-08-11 2 views
1

J'ai besoin d'un moyen d'ajouter des dépendances supplémentaires à une cible personnalisée. J'ai une macro qui ajoute des fichiers de ressources à un projet particulier, utilisé comme ceci:Ajouter des dépendances à une cible personnalisée

ADD_RESOURCES(${TARGET} some/path pattern1 pattern2) 
ADD_RESOURCES(${TARGET} another/path pattern1) 

Je crée une cible appelée ${TARGET}_ASSETS et souhaite fixer la génération de toutes ces ressources à une cible. add_dependencies cependant n'accepte que d'autres cibles. Donc, si je produis un fichier via un add_custom_command, je ne peux pas utiliser cela comme une dépendance. La solution de contournement consiste peut-être à créer un nouveau taget personnalisé pour chaque appel à ADD_RESOURCES, puis à l'associer à la cible ASSETS. Cependant, chaque cible nécessite un nom unique, et il n'est pas possible de générer ce nom unique à partir des paramètres de ADD_RESOURCES.

+0

'Donc, si je produis un fichier via un add_custom_command je ne peux pas l'utiliser comme un dependency.' Pas de problème,' ​​add_custom_target() 'qui dépendent de ce fichier. – arrowd

+0

Le problème est que la cible a besoin d'un nom, d'un nom unique et que j'appelle la même macro plusieurs fois. –

+0

Vous pouvez définir 'ADD_RESOURCES' de telle manière qu'il sera appelé comme ceci:' ADD_RESOURCES ($ {TARGET} "un/chemin pattern1 pattern2" "un autre/path pattern1") '. Ou vous ne pouvez pas le faire pour une raison quelconque? – arrowd

Répondre

1

Une solution consiste à différer la génération des cibles personnalisées ${target}_ASSETS jusqu'à ce que toutes les dépendances aient été configurées avec les appels ADD_RESOURCES.

lieu immédiatement ajouter les dépendances à la cible personnalisée, la ADD_RESOURCES macro doit enregistrer les dépendances dans une variable globale, dont le nom dépend de la cible:

macro (ADD_RESOURCES _targetName) 
    set (_dependencies ${ARGN}) 
    ... 
    # record depencies in a target dependency variable 
    if (DEFINED ${_targetName}_Dependencies) 
     list (APPEND ${_targetName}_Dependencies ${_dependencies}) 
    else() 
     set (${_targetName}_Dependencies ${_dependencies}) 
    endif() 
endmacro() 

Puis ajouter une autre macro d'aide qui détermine tous défini les variables de dépendance cible par la réflexion et met en place une cible personnalisée pour chaque cible:

macro (SETUP_ASSETS_TARGETS) 
    get_cmake_property(_vars VARIABLES) 
    foreach (_var ${_vars}) 
     if (_var MATCHES "(.+)_Dependencies") 
      set (_targetName ${CMAKE_MATCH_1}) 
      set (_targetDependencies ${${_var}}) 
      message("${_targetName} depends on ${_targetDependencies}") 
      add_custom_target(${_targetName}_ASSETS DEPENDS ${_targetDependencies}) 
     endif() 
    endforeach() 
endmacro() 

Dans votre CMakeLists.txt ajouter toutes les dépendances nécessaires avec des appels à ADD_RESOURCES, puis appelez la macro SETUP_ASSETS_TARGETS pour que toutes les cibles personnalisées soient définies.

ADD_RESOURCES(target1 some/path pattern1 pattern2) 
ADD_RESOURCES(target1 another/path pattern1) 
ADD_RESOURCES(target2 foo/bar pattern1) 
... 
... 
SETUP_ASSETS_TARGETS() 
+0

J'ai pensé à cette approche. Ça peut marcher, mais j'espérais que je n'aurais pas besoin de cette dernière étape (quelqu'un finira par l'oublier et se demander pourquoi ça ne marche pas). Pensé dans l'équité, je pourrais avoir besoin d'une dernière étape de toute façon (besoin de beaucoup plus que simplement configurer ces ressources). –

Questions connexes