Je le schéma de dépendance suivanteCmake ne reconstruit pas dépendante après condition change
a.txt <- prereq <- stamp <- dest
où prereq
et dest
sont des cibles, et a.txt
et stamp
sont des fichiers. Je veux que le tampon soit mis à jour chaque fois que a.txt
change.
Pour ce faire, je le fichier CMakeLists.txt suivant:
cmake_minimum_required(VERSION 3.6)
project(sample)
# variable holding location of stamp and a.txt file
set(STAMP ${CMAKE_CURRENT_SOURCE_DIR}/stamp)
set(ATXT ${CMAKE_CURRENT_SOURCE_DIR}/a.txt)
add_custom_target(
prereq
DEPENDS ${ATXT}
)
add_custom_command(
OUTPUT ${STAMP}
COMMAND ${CMAKE_COMMAND} -E echo "Update stamp."
COMMAND ${CMAKE_COMMAND} -E touch ${STAMP}
DEPENDS prereq
)
add_custom_target(dest ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/stamp)
Dans un premier temps, je les fichiers suivants
$ ls
a.txt
CMakeLists.txt
Après l'exécution de CMake et de faire pour la première fois que nous obtenons la comportement attendu,
$ cmake .
$ make
[ 0%] Built target prereq
[100%] Generating stamp
Update stamp.
[100%] Built target dest
Cependant, après avoir touché a.txt
, je me attends à stamp
pour être mis à jour, mais ce n'est pas le cas.
$ touch a.txt
$ make
[ 0%] Built target prereq
[100%] Built target dest
Est-ce un bug dans cmake ou est-ce le comportement attendu? Comment pouvons-nous forcer cmake à exécuter la commande tactile à chaque fois prereq
changements?
Merci pour la suggestion. En fait, ce que vous suggérez fonctionne, mais la raison pour laquelle j'ai structuré le cmake de cette façon est que je voulais ajouter dynamiquement des dépendances en utilisant la commande 'add_dependencies', et cela ne fonctionne que sur' targets' et non sur 'output . Si j'utilise la commande 'DEPENDS' dans' add_custom_command', je ne pourrai pas utiliser cette commande et devra spécifier explicitement les dépendances. – dzhelil
@dzhelil De rien. Vous pouvez toujours ajouter une cible personnalisée pour l'injection de regroupement ou de dépendance, il vous suffira de déplacer les dépendances du fichier source dans une commande personnalisée supplémentaire. Je vais mettre à jour ma réponse en conséquence demain. – Florian