789 votes

En passant les variables supplémentaires de la ligne de commande pour faire

Comment passer des variables au makefile gnu d’arguments de ligne de commande ? En d’autres termes, je veux passer quelques arguments qui finira par devenir variables dans le fichier makefile.

895voto

Pavel Shved Points 34706

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 l' override directive . Cependant, il n'est pas recommandé, et c'est beaucoup mieux et beaucoup plus souple à utiliser ?= d'attribution (la variable de condition opérateur d'affectation, il n'a d'effet que si la variable n'est pas encore défini):

    FOO?=default_value_if_not_set_in_environment
    

    Notez que certaines variables ne sont pas héritées de l'environnement:

    • MAKE est obtenu à partir du nom du script
    • SHELL 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 à la coque).
  • En ligne de commande - make peut prendre des assignations de variables dans le cadre de sa ligne de commande, mêlé avec des cibles:

    make target FOO=bar
    

    Mais ensuite, toutes les missions à FOO variable dans le fichier makefile sera ignorée sauf si vous utilisez l' override directive sur l'attribution. (L'effet est le même qu'avec -e option pour les variables d'environnement).

  • L'exportation de la part du parent Faire - si vous appelez Faire à partir d'un Makefile, généralement, vous ne devriez pas écrire explicitement des affectations de variables comme ceci:

    # Don't do this!
    target:
            $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
    

    Au lieu de cela, la meilleure solution pourrait être à 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.

    # Do like this
    CFLAGS=-g
    export CFLAGS
    target:
            $(MAKE) -C target
    

    Vous pouvez également exporter toutes les variables en utilisant export sans arguments.

306voto

Mark Byers Points 318575

Le moyen le plus simple est :

Puis dans votre makefile, vous pouvez vous référer à `` . Notez que cela ne se propage au secondaire rend automatiquement.

Si vous utilisez fait secondaire, consultez cet article : Communiquer les Variables à une sous marque

124voto

nc3b Points 6704

Disons que vous avez un fichier makefile comme ceci :

Vous appelleriez puis il``

27voto

Thomas Points 63635

À partir du manuel:

Les Variables en faire peut venir de l'environnement dans lequel faire est d'exécuter. Chaque variable d'environnement qui font le voit lorsqu'il démarre est transformée en une variable avec le même nom et la valeur. Cependant, une affectation explicite dans le fichier makefile, ou avec un argument de la commande, les remplacements de l'environnement.

De sorte que vous pouvez faire (à partir de bash):

FOOBAR=1 make

résultant en une variable FOOBAR dans votre Makefile.

5voto

serup Points 78

Si vous créez un fichier appelé Makefile et ajoutez une variable comme cette $(unittest) puis vous serez en mesure d’utiliser cette variable dans le fichier Makefile, même avec des caractères génériques

exemple :

J’utilise BOOST_TEST et en donnant un caractère générique au paramètre--run_test=$(unittest) alors je vais être capable d’utiliser des expressions régulières pour filtrer le test, je veux mon Makefile pour exécuter

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X