Makefile affecter la sortie d'une commande à une variable
J'ai un script qui comprime mes fichiers css et sorties le nom de fichier du fichier de sortie.
Je suis en train de construire un makefile pour automatiser le processus:
all:
@echo "Compiling CSS"
CSS_OUTPUT=$(shell php minify_css.php )
echo $(CSS_OUTPUT)
Je suis en train de stocker le nom du fichier de sortie dans CSS_OUTPUT variable, mais je suis en train de faire quelque chose de mal, comme tout ce makefile imprime juste:
$ make
abcdefg.css
Compiling CSS
CSS_OUTPUT=
echo
Donc de sortie n'est pas affecté à CSS_OUTPUT
. Aussi, pourquoi est sortie php imprimé avant la @echo "Compiling CSS"
?
J'ai essayé avec ceci:
all:
@echo "Compiling CSS"
CSS_OUTPUT=$(shell echo php minify_css.php )
echo $(CSS_OUTPUT)
Mais il ne fait que s'aggraver:
$ make
Compiling CSS
CSS_OUTPUT=php minify_css.php
./minify_css.php: line 1: ?php: No such file or directory
./minify_css.php: line 3: syntax error near unexpected token `dirname'
./minify_css.php: line 3: `require_once( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'maintenance.php' );'
make: *** [css] Error 2
Modifier
À la suite de la réponse dans les commentaires, ce qui suggère l'utilisation d'eval:
@echo "Compiling CSS"
$(eval CSS_OUTPUT:=$(shell php minify_css.php))
echo ${CSS_OUTPUT}
Sorties:
make: *** No targets specified and no makefile found. Stop.
J'ai lu ceci: stackoverflow.com/questions/2019989/...
Et ceci: stackoverflow.com/questions/2373081/...
Aucun d'eux ne répond à mon problème...
Que diriez - celui-ci?
À l'aide de la fonction eval me lance ceci: make: *** Pas de cibles spécifiées et aucun makefile trouvé. Stop.
Et ceci: stackoverflow.com/questions/2373081/...
Aucun d'eux ne répond à mon problème...
Que diriez - celui-ci?
À l'aide de la fonction eval me lance ceci: make: *** Pas de cibles spécifiées et aucun makefile trouvé. Stop.
OriginalL'auteur Raúl Ferràs | 2012-01-31
Vous devez vous connecter pour publier un commentaire.
Faire des travaux en deux phases. Tout d'abord, il lit dans le fichier makefile, évalue les variables et construit un graphe de dépendance. Faire aussi des fonctions évaluées au cours de cette phase. Dans la deuxième phase de l'exécution de la nécessaire recettes pour mettre à jour la cible principale. Cela signifie que le
$(shell ...)
fonction d'appel est élargi au cours de la première phase, avant toute recette est exécuté. La sortie de la commande est remplacé par le shell appel de fonction, mais je soupçonne la sortie de la commande php ne va pas vers la sortie standard, donc au lieu de se retrouver avecCSS_OUTPUT=abcdefg.css
(qui pourrait être ce que vous voulez),abcdefg.css
est fait l'écho à l'écran et que le résultat de la fonction shell est vide.Suivant la recette est exécutée, mais quand cela est fait, chaque ligne est exécutée dans une autre instance du shell, de sorte que les commandes sur plusieurs lignes dans une recette, n'ont pas accès à des variables shell set sur une autre ligne (ce qui serait inutile dans ce cas de toute façon, à cause de la question précédente). Une façon de contrer cela est de la colle les lignes ensemble, en se terminant par un point-virgule et d'une barre oblique inverse. Maintenant ils sont exécutés comme une ligne dans une seule instance du shell.
Un autre problème est que dans la dernière ligne de la recette, vous n'avez pas référence à une variable du shell (qui est ce que CSS_OUTPUT est), mais à un makefile variable qui n'a jamais été établi.
Est-il une raison pourquoi vous ne vous contentez pas faire de cette façon:
Il n'y a pas moyen de savoir le nom de fichier à l'avance? Est-il généré automatiquement? Je commence à me demander si
make
est vraiment le meilleur outil pour cela; il est difficile de dire à partir de ce simplifié makefile, mais peut-être un bon script est plus facile.le nom de fichier est généré automatiquement, et quelque peu aléatoire
OriginalL'auteur eriktous
Problème & Solution
J'ai couru dans le même problème moi-même. J'ai trouvé un moyen de contourner cela, mais il est certainement moins qu'idéales.
Tel que décrit, le problème vient quand la
$(shell)
commande est exécutée. Il est exécuté lorsque le makefile variables sont évaluées, qui est avant tout des objectifs ont été résolus ou traitées. Pour contourner ce problème, vous pouvez rompre le$(shell)
commande à se produire dans une autre invocation du makefile. Pour obtenir difficile, je viens de créer un "caché" de la cible pour l'ensemble de mon post-fichier-création de travail dans le même fichier, et fait un appel récursif à faire appel à mon même makefile. Le résultat ressemble à quelque chose comme ceci:Explication
Le remplacement des commandes
La première ligne de cette poignées de force à la définition d'une variable qui ne peut pas être annulé à partir de la ligne de commande pour recueillir le nom du fichier makefile. La première ligne DOIT être appelé comme la première ligne de votre fichier makefile depuis, y compris d'autres makefiles peut changer ce qui ne fonctionne pas à partir de l'intérieur inclus dans les makefiles. À noter est le fait que ce sera vide si vous n'avez pas spécifié un fichier makefile sur la ligne de commande, ce qui signifie qu'il peut être appelé de la même façon lorsqu'il est appelé à partir de dans le makefile.
La deuxième ligne, juste des constructions de l'appel pour le makefile en réglage par défaut, certaines options comme changer le répertoire courant le makefile de ligne de commande a été à l'origine appelé depuis et y compris la spécification de l'makefile à utiliser si elle a été incluse dans l'appel original.
Noter que ces deux premières lignes sont actuellement mises en œuvre dans mon système de construction, de sorte qu'ils ne dans le fait de travailler pour de multiples imbriquées les appels récursifs à la même makefile.
Appel Récursif
Suite de ces deux lignes sont les plus importants que répondre à votre requête d'origine. Pour démontrer que la création du fichier plutôt que de simplement en utilisant un shell de commande de retour, j'ai fait semblant de votre fichier doit également créer les
minify_css.php
fichier. Quand je fais l'appel récursif pour le makefile pour cibleall_hid
, je sais que la cibleall
est en cours d'évaluation. Cela signifie que leminify_css.php
dépendance a déjà été traitée, donc je peux vous garantir qu'il existe déjà, une hypothèse qui permet à l'$(shell php minify_css.php)
commande pour être évalué dans le premier appel récursif pour le makefile et agir sur le fichier généré. La prochaine étape était de recueillir lesCSS_OUTPUT
de la valeur et de l'obtenir dans un autre appel récursif. Pour le faire j'ai encore une fois invoqué le makefile de manière récursive, à partir de dans un déjà appel récursif, et de le passer sur la ligne de commande. Rappelez-vous que lors d'un appel à un fichier makefile seules les variables explicitement à l'exportation sont disponibles dans les sous-marques, donc on ne peut pas le définir, puis de faire l'appel récursif sur la ligne suivante, il doit effectivement être transmises dans le cadre de la ligne de commande. Dans le niveau suivant récursive makefile, lorsque nous appelons laprint_css_hid
cible, la variable semble avoir été définie à partir de la ligne de commande et peut être utilisé.Sub-faire des Considérations
Dans ce cas, vous êtes réellement appeler votre propre fichier makefile de manière récursive, donc une préoccupation doit être que toutes les autres variables ne sont pas configurés correctement. Heureusement, cela n'arrive pas. En ligne de commande les valeurs pour les options passées à l'origine de la ligne de commande sont automatiquement remis à chaque sous-invocation de faire appelé à partir d'un fichier. Depuis les seules sources d'entrée qui peuvent influer sur la construction de vos variables dans un fichier makefile est le contenu des répertoires que vous êtes d'exploitation sur la ligne de commande, paramètres, le répertoire le fichier makefile a été appelé, et les paramètres dans le fichier makefile lui-même, vous avez juste à vous assurer que vous ne faites pas quelque chose comme accidentellement, y compris votre nouveau fichier généré dans un "sources" liste des cours d'appels imbriqués à faire et vous pouvez garantir à l'environnement sera mis en place le même.
OriginalL'auteur mtalexan