J'ai un Makefile qui exécute un outil qui prend un peu de temps; cela me permet de remplacer la commande utilisée:
make TOOL=alternative-tool
J'aimerais sauter cette étape dans le Makefile, donc je cherche une commande qui se termine avec le statut 0, et qui a des effets secondaires négligeables.
Évidemment, je pourrais simplement utiliser true
, mais c'est un peu déroutant:
make TOOL=true
Cela se lit comme si je voulais exécuter l'outil, mais je ne le fais pas.
Existe-t-il un exécutable installé par défaut qui ne se /bin/true
termine pas avec le statut 0 et qui a un nom accrocheur et facile à taper?
command-line
Roger Lipscombe
la source
la source
TOOL=true
sera sur la ligne de commande lors de l'appel de make, probablement documenté dans un fichier README à proximité. La ligne réelle qui appelle l'outil se trouve quelque part dans un makefile de 7 000 lignes (tiers).Réponses:
Même si vous avez demandé quelque chose qui n'est pas
/bin/true
", remplacertrue
par le nom complet/bin/true
pour montrer qu'il s'agit dutrue
programme plutôt que d'une autre signification de" vrai "est probablement la meilleure solution.Votre préoccupation est que l'
true
ensemble être autre chose qu'un nom de commande. Mais si vous écrivez
alors c'est sans équivoque une commande. Quelqu'un pourrait mal lire
TOOL=true
pour signifier qu'un autre outil quelque part est prévu, mais aucune telle mauvaise lectureTOOL=/bin/true
n'est probable.Je ne sais pas quand
:
, qui est un shell intégré mais pas une commande externe, fonctionnera. Henning Makholm a signalé que cela semble fonctionner . Mais je pense que cela ne fonctionne pas dans toutes les situations, et vous avez constaté que cela ne fonctionnait pas pour vous .En ce qui concerne un alias de shell, vous ne pouvez pas l'utiliser car l'expansion d'alias n'est pas effectuée dans les arguments que vous passez à une commande, et les makefiles n'utilisent aucun alias de shell précédemment défini. Même s'il
make
exécute vos commandes dans un nouveau shell, ce shell n'aura pas d'alias (et ne l'utilisera pas même s'il en avait un, car il s'agirait d'un shell non interactif, où l'expansion d'alias n'est pas automatiquement activée).la source
:
semble bien fonctionner pour moi.make
génère toujours un shell pour exécuter chaque commande après avoir effectué ses propres substitutions.:
, mais ce devrait être une réponse (surtout si elle est correcte) et ce commentaire n'explique pas pourquoi on devrait s'attendre à ce qu'elle fonctionne. Dans un répertoirehello.c
et aucun makefile, oùmake hello
compileshello.c
àhello
, je l' ai trouvémake CC=: hello
comportés selon ce que vous dites.:
ne fonctionne pas. Être explicite/bin/true
est probablement la meilleure façon de le faire.Bien que je convienne que l'utilisation du chemin complet vers
true
serait la meilleure solution, je voudrais noter ce qui est probablement de loin le moyen le plus courant d'éviter l'exécution de commandes réelles: coller unecho
devant. Donc:la source
TOOL
ferait autrement. Sans-s
ou équivalent,make
émet des informations redondantes, car les deuxmake
et laecho
commande exécutée parmake
émettent séparément une sortie. Par exemple, lorsque j'exécutemake CC=echo hello
dans un répertoire qui n'ahello.c
pas de makefile, j'obtiensecho hello.c -o hello
comme première ligne de sortie ethello.c -o hello
comme seconde. Mais certaines versions utilisent (ou l'utilisateur peut ajouter)-s
, puis c'est utile.make -s CC=echo hello
donne justehello.c -o hello
.Vous pouvez toujours créer votre propre commande qui ne fait que renvoyer un état de sortie zéro. Quelques options:
un lien symbolique bien nommé vers
/bin/true
un script shell vide
un programme C presque vide:
la source
Créez un lien symbolique dans le répertoire de travail vers / bin / true nommé quelque chose comme
skip
. Donc...Ensuite, la ligne de fabrication peut être ...
la source
Voici un moyen de le faire avec un peu plus de caractères:
Après l'avoir fait une fois, vous pouvez le ré-exécuter simplement en utilisant le nom
T
.la source