Pourquoi ne pas les variables d'environnement de travail dans $(shell) de commandes?
export HELLO=Hello,world
all:
@echo $(HELLO)
@echo $(shell echo $$HELLO)
@echo `echo $$HELLO`
sorties:
Hello,world
Hello,world
Pourquoi est-il une différence entre backtick et $(shell), et est-il un moyen de passer les variables d'environnement $(shell) les invocations?
Je suis en train d'utiliser pkg-config dans un cross-compilation de l'environnement, j'ai donc besoin de définir $PKG_CONFIG_SYSROOT. Je peux utiliser backticks, mais c'est exécutée une fois pour toutes .o fichier. Comme par Le calcul de Makefile variable sur cession, j'ai besoin d'utiliser PKG_CFLAGS := $(shell pkg-config $(PACKAGES)), mais je ne peux pas passer dans la variable d'environnement afin de faire ce travail correctement.
Testé sur GNU Make 4.0.
- Les backticks dans la troisième ligne sont inutiles et ne changez rien contre seulement à l'aide de
@echo $$HELLO
. - Oui, ils le font - le point de lancer un shell interne est exécuté. Il était plus concis pour l'expliquer de cette façon que SUBSHELL_HELLO=
echo $$HELLO
puis @echo $(SUBSHELL_HELLO) Il y avait des backticks là, mais les commentaires de formatage mange.
Vous devez vous connecter pour publier un commentaire.
Félicitations, vous avez frappé un bug: $(shell) ne fait pas honneur à l'exportation, mais c'est sans-papiers?
Il y a un commentaire dans le code (qui précèdent le dépôt de la contravention, et est cité dans le billet), qui indique qu'il y a des situations complexes où cela ne peut pas fonctionner correctement et il semble qu'il n'est tout simplement pas fait.
Je pense à deux façons d'obtenir de l'
$(shell)
de l'environnement de l'variables que vous souhaitez définir manuellement disponibles.Les mettre dans le
$(shell)
contexte explicitement.Les mettre dans le
make
processus environnement de sorte que le$(shell)
environnement hérite normalement.PKG_CONFIG_SYSROOT=/some/path make
?$(shell)
environnement manuellement?PCVAR:=$(shell PKG_CONFIG_SYSROOT=$(make-level-PKG_CONFIG_SYSROOT) pkg-config ...)
?