web-dev-qa-db-fra.com

Makefile inclut le fichier env

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.

31
Michael Irwin

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
48
meuh

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.

38
Brock

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.

4
mpe

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.

4
holms

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
4
theliberalsurfer