En passant des variables supplémentaires en ligne de commande pour faire
Puis-je passer des variables à une GNU Makefile comme arguments de ligne de commande? En d'autres termes, je veux passer quelques arguments qui deviendra par la suite les variables dans le fichier Makefile.
Vous devez vous connecter pour publier un commentaire.
Vous disposez de plusieurs options pour définir des variables à partir de l'extérieur de votre makefile:
De l'environnement - chaque variable d'environnement est transformé en un makefile variable avec le même nom et la valeur.
Vous pouvez également définir
-e
option (aka--environments-override
), et vos variables d'environnement remplacent les cessions effectuées dans le makefile (à moins que ces travaux utilisent eux-mêmes leremplacer
de la directive . Cependant, il n'est pas recommandé, et c'est beaucoup mieux et beaucoup plus souple à utiliser?=
affectation (la variable de condition opérateur d'affectation, il n'a d'effet que si la variable n'est pas encore défini):Noter que certaines variables ne sont pas héritées de l'environnement:
MAKE
est obtenu à partir du nom du scriptSHELL
est définie dans un fichier makefile, ou par défaut à/bin/sh
(justification: les commandes sont spécifiées dans le fichier makefile, et ils sont shell-spécifique).En ligne de commande -
make
peut prendre des assignations de variables dans le cadre de sa ligne de commande, mêlé avec des cibles:Mais alors toutes les missions à
FOO
variable dans le fichier makefile sera ignorée sauf si vous utilisez leremplacer
de la directive dans la tâche. (L'effet est le même qu'avec-e
option pour les variables d'environnement).L'exportation à partir de la parent de Faire - si vous appelez Faire à partir d'un Makefile, généralement, vous ne devriez pas écrire explicitement des affectations de variables comme ceci:
Au lieu de cela, la meilleure solution pourrait être de l'exportation de ces variables. L'exportation d'une variable dans l'environnement de chaque coquille d'invocation, et de Faire des appels à partir de ces commandes de sélection de ces variable d'environnement comme indiqué ci-dessus.
Vous pouvez également exporter tous variables en utilisant
export
sans arguments.make A='"as df"'
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
et de le passer commemake -C folder $(PROJECT_MAKE_FLAGS)
. Si il y a un moyen de dire à la bibliothèque du makefile pour ignorer l'environnement, ce serait l'idéal (en face de l'-e).override
déclaration? Parce que je viens d'obtenir:make: override: Command not found
ifdef($(DEBUG),1) debug_flags else normal_flags endif
qui est situé dans la partie supérieure et la variable est passée en ligne de commande commemake all DEBUG=1
oumake DEBUG=1 all
mais il ignore la valeur et utilise la valeur définie parDEBUG ?= 0
à tout moment. Pourquoi est-ce?make target FOO=bar
make FOO=bar target
?La façon la plus simple est:
Ensuite dans votre makefile, vous pouvez vous référer à
$(foo)
. Notez que cela ne se propagent pas à sous-rend automatiquement.Si vous utilisez des sous-marques, voir cet article: La communication des Variables à un Sous-rendre
included
dans le makefile principal?Dire que vous avez un fichier makefile comme ceci:
Vous serait alors de l'appeler
make action argument=something
De la manuel:
De sorte que vous pouvez faire (à partir de bash):
résultant dans une variable
FOOBAR
dans votre Makefile.Il y a une autre option de ne pas cités ici, qui est inclus dans le GNU Make livre par Stallman et McGrath (voir http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html). Il donne l'exemple:
Il consiste à vérifier si un paramètre apparaît dans
MAKEFLAGS
. Par exemple .. supposons que vous êtes étudiant à propos des threads en c++11 et vous avez divisé votre étude dans plusieurs fichiers (class01
, ... ,classNM
) et que vous souhaitez: compiler ensuite tous et exécuter individuellement ou de compiler et de l'exécuter si un indicateur est spécifié (-r
, par exemple). Donc, vous pouvez venir avec la suite deMakefile
:Avoir que, vous auriez:
make -r class02
;make
oumake all
;make -r
(en supposant que tous d'entre eux contiennent un certain type d'affirmer des trucs et on a juste envie de toutes les tester)Si vous faites un fichier appelé Makefile et ajouter une variable comme ceci $(unittest)
ensuite, vous serez en mesure d'utiliser cette variable dans le fichier Makefile, même avec des caractères génériques
exemple :
- Je utiliser BOOST_TEST et en donnant un caractère générique au paramètre --run_test=$(unittest)
ensuite, je vais être en mesure d'utiliser une expression régulière pour filtrer le test, je veux que mon Makefile
pour exécuter
Ensuite utiliser la variable,
$(ROOT_DIR)
dans le Makefile.