cmake, add_custom_command avec dépendances à partir d'un autre répertoire

J'ai une question à propos de CMake qui semble être fréquemment posées ici, mais aucune de ces réponses semblent résoudre mon problème.

Dans le details sous-répertoire, il y a un CMakeLists.txt qui contient:

add_custom_command(OUTPUT part.out
                   COMMAND foo --input=part.src --output=part.out
                   DEPENDS part.src)

add_custom_target(part_out
                  DEPENDS part.out)

Dans le répertoire principal il y a un CMakeLists.txt qui utilise part.out pour la génération d'un autre fichier:

add_custom_command(OUTPUT full.out
                   COMMAND bar --input=./details/part.out --output=full.out)

add_custom_target(full_out
                  DEPENDS full.out)

Le problème est que je veux 3 choses ici:

  1. si part.out n'existe pas, il doit être généré
  2. si part.out est pas à jour (part.src est plus récente que part.out) je veux qu'il soit régénéré
  3. si full.out est pas à jour (part.out est plus récente que full.out, ou full.out desn existe pas) je veux qu'il soit (re)générés

Donc si j'ajoute DEPENDS ./details/part.out à add_custom_command(OUTPUT full.out) je vais atteindre les points 2 et 3, mais pas au point 1, parce que si je supprime part.out puis-je appeler make full_out je vais passer une erreur qu'il n'y a pas de règle pour faire ./details/part.out (comme c'est une règle à partir d'un autre répertoire).

Si j'ajoute DEPENDS full_out à add_custom_command(OUTPUT full.out) ou à add_custom_target(full_out) je vais atteindre les points 1 et 2, pas 3, parce que même si part.out a été régénéré, un full.out ne sera pas régénéré, car il ne dépend pas de la part.out fichier lui-même.

Alors, comment puis-je connecter les deux scénarios?
Je pensais à l'ajout de deux DEPENDS, mais comment savoir si ça va toujours bien? Je veux dire que dans un tel cas, l'ordre de construire sera question ici.

OriginalL'auteur Michał Walenciak | 2012-11-20