Makefile inclut le fichier env

26

J'essaie d'inclure des vars env dans un Makefile. Le fichier env ressemble à:

FOO=bar
BAZ=quux

Notez qu'il n'y a aucun conduit exportà chaque var env. Si j'ajoute le premier exportet juste includele fichier env dans le Makefile, tout fonctionne comme il se doit. Mais je dois garder l'env vars sans leader export. Cela m'empêche de simplement utiliser include envfiledans 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.

Michael Irwin
la source
1
Bienvenue sur Unix et Linux. Veuillez énoncer clairement votre question. Qu'est-ce que vous essayez d'accomplir exactement?
darnir
1
J'essaie d'inclure un fichier qui contient des paires de variables d'environnement dans un Makefile afin qu'elles soient disponibles pour l'environnement dans lequel make s'exécute.
Michael Irwin

Réponses:

40

Si vous utilisez gnu make, ce qui devrait fonctionner est d'inclure le envfilefichier, puis d'exporter la liste des vars obtenues à partir du même fichier:

#!make
include envfile
export $(shell sed 's/=.*//' envfile)

test:
        env
meuh
la source
7
Merci pour cette réponse, c'est génial! Bien que ma version fonctionne même sans export $(shell...ligne. J'ai juste besoin de la includeligne.
DuffJ
32

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.

Brock
la source
3

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
theliberalsurfer
la source
3

Voici une solution élégante qui n'importe pas 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 de commandes 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.

mpe
la source
2

si votre nom de fichier est .makercalors vous pouvez l'inclure dans Makefile aussi simple que ceci:

include .makerc

Je préfère ajouter un -signe avant include, pour supprimer les avertissements.

holms
la source