2017-10-20 34 views
0

Je veux ajouter une cible CMake qui, lorsqu'elle est faite, déclenchera les éléments suivants:Utilisation de sous-clichés ou de tuyaux dans les commandes cmake?

rm $(find "${CMAKE_SOURCE_DIR}" -name "*.rej" -or -name "*.orig") 

J'ai essayé ceci:

add_custom_target(pclean 
    COMMAND bash -c "rm $(find \"${CMAKE_SOURCE_DIR}\" -name \"*.rej\" -or -name \"*.orig\")") 

et ceci:

add_custom_target(pclean 
    COMMAND bash -c "find "${CMAKE_SOURCE_DIR}" -name \"*.rej\" -or -name \"*.orig\" | xargs rm") 

mais ni œuvres . Comment dois-je faire cela correctement? Suis-je censé utiliser quelque chose comme add_custom_command?

Remarque: Le problème ici n'est pas les guillemets. Ainsi, si je l'utilise:

add_custom_target(pclean 
    COMMAND bash -c "find "${CMAKE_SOURCE_DIR}" -name \"*.rej\" -or -name \"*.orig\"") 

Je reçois la liste des *.orig et *.rej fichiers.

+0

@Florian: Les citations ne sont pas un problème. – einpoklum

+0

Pouvez-vous utiliser la propriété 'ADDITIONAL_MAKE_CLEAN_FILES'? par exemple. 'SET (addfiles toto barre) set_property (ANNUAIRE APPENDENT PROPRIETE ADDITIONAL_MAKE_CLEAN_FILES" $ {addfiles} ")' Pour obtenir une liste de fichiers à supprimer, vous pouvez utiliser la commande 'file (GLOB ...) '. – vre

+0

@vre: Je ne savais pas à ce sujet ... je me pencherai sur le sujet. ... oh, attendez, cela ne va-t-il pas causer 'make clean' pour supprimer ces fichiers? Je ne veux pas que ça arrive. – einpoklum

Répondre

0

Ceci est une réponse incomplète.

Il semble que le problème auquel nous sommes confrontés est que les arguments après COMMAND sont interprétées trois fois:

  • d'abord par CMake,
  • puis par GNU Make,
  • puis finalement par la coquille.

Quand il est juste le dernier - vous avez seulement besoin d'échapper au caractère glob *:

find some/where -name \*.rej -or -name \*.orig | xargs rm 

quand il est dans un Makefile, vous avez besoin quelque chose comme:

bash -c "find some/where -name \\*.rej -or -name \\*.orig | xargs rm" 

et enfin , dans une commande CMake, vous avez besoin d'un autre niveau d'échappement, donc vous faites:

add_custom_target(pclean 
    COMMAND bash -c "find \"${CMAKE_SOURCE_DIR}\" -name \\\\*.rej -or -name \\\\*.orig \\| xargs rm") 

Cependant, je n'ai pas réussi à obtenir des commandes qui fonctionnent également et qui utilisent ensuite des variables de shell - qui sont toujours gâchées d'une manière ou d'une autre. Donc pas de chance avec la deuxième variante de ma question, ou avec | while read f; do rm "$f"; done après la commande find. PS: Comme les commentateurs l'ont noté, il est également possible que la commande find supprime elle-même les fichiers (avec -exec ou -delete).

+0

Cette partie d'échappement et de barre oblique inverse semble avoir juste besoin d'ajouter 'VERBATIM' à votre appel' add_custom_target() '. – Florian

+0

@Florian: Pouvez-vous développer cela dans une réponse s'il vous plaît? – einpoklum

0

Tournant commentaire dans une réponse

je pourrais reproduire votre problème et en ajoutant le mot-clé VERBATIM à votre add_custom_target() ne le réparer.

Ce qui suit a fait le travail:

cmake_minimum_required(VERSION 2.6) 

project(SubShell NONE) 

add_custom_target(
    pclean 
    COMMAND bash -c "rm $(find \"${CMAKE_SOURCE_DIR}\" -name \"*.rej\" -or -name \"*.orig\")" 
    VERBATIM 
) 

Si vous commencez à « échapper » des choses dans votre commande personnalisée, il est une indication que vous devez utiliser VERBATIM:

Tous les arguments aux commandes à échapper correctement pour l'outil de construction de sorte que la commande invoquée reçoit chaque argument inchangé. Notez qu'un niveau d'échappement est toujours utilisé par le processeur de langage CMake avant que add_custom_target ne voit même les arguments.

Un extrait du produit makefile sans VERBATIM:

CMakeFiles/pclean: 
    bash -c rm\ $(find\ "/mnt/c/temp/StackOverflow/SubShell"\ -name\ "*.rej"\ -or\ -name\ "*.orig") 

et avec VERBATIM:

CMakeFiles/pclean: 
    bash -c "rm \$$(find \"/mnt/c/temp/StackOverflow/SubShell\" -name \"*.rej\" -or -name \"*.orig\")" 

Références