J'essaie d'inclure des vars env dans un Makefile. Le fichier env ressemble à:
FOO=bar
BAZ=quux
Notez qu'il n'y a pas de export
de tête pour chaque var env. Si j'ajoute le export
et juste include
le fichier env dans le Makefile, tout fonctionne comme il se doit. Mais je dois garder l'env vars sans mener export
. Cela m'empêche d'utiliser simplement include envfile
dans le Makefile.
J'ai aussi essayé de faire quelque chose comme ça:
sed '/^#/!s/^/export /' envfile > $(BUILDDIR)/env
include $(BUILDDIR)/env
Mais faire cela cause faire une erreur car le fichier env n'est pas là pour l'inclure.
Si vous utilisez gnu make, ce qui devrait fonctionner est d'inclure le fichier envfile
, puis d'exporter la liste des variables obtenues à partir du même fichier:
#!make
include envfile
export $(Shell sed 's/=.*//' envfile)
test:
env
J'ai eu un problème similaire et j'ai atterri sur ce fil. Une autre solution possible consiste à simplement exécuter la commande make export sans aucun argument:
include .env
export
Cela exportera toutes les variables make en tant que variables d'environnement. Ce comportement peut ou non correspondre à tous les cas d'utilisation, mais il a fonctionné pour moi et n'a impliqué aucune sorcellerie de script Shell.
Voici une solution élégante qui n'importe pas de Make vars, mais définit toutes les exportations d'environnement pour les sous-processus Shell. Personnellement, je préfère conserver les scripts dynamiques de mon profil.
export BASH_ENV=tools/sh/env.sh
Il y a quelques pièges. Malheureusement ENV ne fonctionne pas, je pense qu'il devrait (mais c'est un problème avec Bash, pas Make). De plus, cela nécessite vraiment une autre ligne, car l'interpréteur Shell par défaut de Make est/bin/sh.
BASH_ENV := tools/sh/env.sh
Shell := /usr/bin/bash
À la hausse, cela permet également d'inclure des fonctions Shell dans les scripts Makefile, mais uniquement pour les scripts de recette. Je ne sais pas comment d'autres coquilles que le tarif Bash. Et il se passe un peu plus. J'ai mis un fichier de test sous Gist .
Il existe de nombreux scripts Shell complexes imaginables. J'aime mieux cette Q/A pour les réponses simples.
si votre nom de fichier est .makerc
alors vous pouvez l'inclure dans Makefile aussi simple que ceci:
include .makerc
Je préfère ajouter -
signe avant include
, pour supprimer tous les avertissements.
Préserve les vars ENV existants
export $(Shell [ ! -n "$(ENVFILE)" ] || cat $(ENVFILE) | grep -v \
--Perl-regexp '^('$$(env | sed 's/=.*//'g | tr '\n' '|')')\=')
test:
echo $$FOO
Courir
make ENVFILE=envfile test # bar
export FOO=foo
make ENVFILE=envfile test # foo