Makefile include file env


26

Sto cercando di includere alcuni env var in un Makefile. Il file env è simile a:

FOO=bar
BAZ=quux

Nota che non c'è alcun indizio exportper ogni var var. Se aggiungo il file principale exporte solo includeil file env nel Makefile, tutto funziona come dovrebbe. Ma ho bisogno di mantenere la guida senza limiti export. Questo mi impedisce di usare solo include envfilenel Makefile.

Ho anche provato a fare qualcosa del genere:

sed '/^#/!s/^/export /' envfile > $(BUILDDIR)/env
include $(BUILDDIR)/env

Ma fare ciò causa un errore perché il file env non è lì per l'inclusione.


1
Benvenuti in Unix e Linux. Si prega di indicare chiaramente la domanda. Che cosa stai esattamente cercando di realizzare?
darnir,

1
Sto cercando di includere un file che contiene coppie di variabili di ambiente in un Makefile in modo che siano disponibili per l'ambiente in cui make è in esecuzione.
Michael Irwin,

Risposte:


40

Se stai usando gnu make, ciò che dovrebbe funzionare è includere il envfilefile, quindi esportare l'elenco di Vars ottenuto dallo stesso file:

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

test:
        env

7
Grazie per questa risposta, è geniale! Anche se la mia versione funziona anche senza la export $(shell...linea. Ho solo bisogno della includelinea.
DuffJ,

32

Ho avuto un problema simile e sono atterrato su questo thread. Un'altra possibile soluzione è semplicemente eseguire il comando make export senza argomenti:

include .env
export

Questo esporterà tutte le variabili create come variabili d'ambiente. Questo comportamento può corrispondere o meno a tutti i casi d'uso, ma ha funzionato per me e non ha comportato alcuna procedura guidata per gli script di shell.


3

Conserva le variabili ENV preesistenti

export $(shell [ ! -n "$(ENVFILE)" ] || cat $(ENVFILE) | grep -v \
    --perl-regexp '^('$$(env | sed 's/=.*//'g | tr '\n' '|')')\=')

test:
    echo $$FOO

Correre

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo

3

Ecco una soluzione elegante che non importa Make vars, ma imposta esportazioni di ambiente per i sottoprocessi della shell. Personalmente preferisco mantenere gli script dinamici dei miei profili.

export BASH_ENV=tools/sh/env.sh

Ci sono dei gotchas. Sfortunatamente ENV non funziona, penso che dovrebbe (ma questo è un problema con Bash, non Make). Inoltre richiede davvero un'altra riga, perché l'interprete di shell predefinito di Make è / bin / sh.

BASH_ENV := tools/sh/env.sh
SHELL := /usr/bin/bash

Sul lato positivo, ciò consente anche di includere funzioni shell negli script Makefile, ma solo per gli script ricetta. Non so come le altre conchiglie oltre alla tariffa di Bash. E c'è ancora qualcosa da fare. Ho messo alcuni file di test come GIST .

Ci sono molti script di shell complicati immaginabili. Mi piace questo Q / A meglio per le risposte semplici.


2

se il tuo nome file è .makercquindi puoi includerlo in Makefile in questo modo:

include .makerc

Preferisco aggiungere il -segno prima include, per eliminare eventuali avvisi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.