human
Puis-je passer des variables à un fichier Makefile GNU en tant qu'arguments de ligne de commande ? En d'autres termes, je veux passer certains arguments qui deviendront éventuellement des variables dans le Makefile
gpt
Vous avez plusieurs options pour définir des variables à partir de l'extérieur de votre fichier makefile :

* Depuis l'environnement - chaque variable d'environnement est transformée en une variable makefile portant le même nom et la même valeur.
Vous pouvez également définir l'option ```-e``` (alias ```--environments-override```) pour que vos variables d'environnement remplacent les affectations effectuées dans le makefile (à moins que ces affectations n'utilisent elles-mêmes la directive ```override```). Cependant, cela n'est pas recommandé, il est préférable et plus flexible d'utiliser l'opérateur d'affectation conditionnelle ``` ?=``` (il n'a d'effet que si la variable n'est pas encore définie) :
```FOO ?=valeur_par_défaut_si_non_définie_dans_l'environnement
```
Notez que certaines variables ne sont pas héritées de l'environnement :

* ```MAKE``` est obtenu à partir du nom du script
* ```SHELL``` est soit défini dans un makefile, soit par défaut à ```/bin/sh``` (raisonnement : les commandes sont spécifiées dans le makefile et elles sont spécifiques à un shell).

* Depuis la ligne de commande - ```make``` peut prendre des affectations de variables en tant que partie de sa ligne de commande, mélangées avec les cibles :
```make cible FOO=bar
```
Mais alors toutes les affectations à la variable ```FOO``` dans le makefile seront ignorées à moins d'utiliser la directive ```override``` dans l'affectation. (L'effet est le même qu'avec l'option ```-e``` pour les variables d'environnement).
* Exportation depuis le make parent - si vous appelez Make à partir d'un makefile, vous ne devriez généralement pas écrire explicitement des affectations de variables de cette manière :
```# Ne faites pas ça !
cible :
        $(MAKE) -C cible CC=$(CC) CFLAGS=$(CFLAGS)
```
Au lieu de cela, une meilleure solution pourrait être d'exporter ces variables. L'exportation d'une variable la rend disponible dans l'environnement de chaque invocation de shell, et les appels Make à partir de ces commandes utilisent ces variables d'environnement comme spécifié ci-dessus.
```# Faites comme ça
CFLAGS=-g
export CFLAGS
cible :
        $(MAKE) -C cible
```
Vous pouvez également exporter toutes les variables en utilisant ```export``` sans arguments.