Makefile zawiera plik env

26

Próbuję dołączyć niektóre zmienne env do pliku Makefile. Plik env wygląda następująco:

FOO=bar
BAZ=quux

Zauważ, że nie ma prowadzącej exportdo każdej zmiennej env. Jeśli dodam wiodący exporti tylko includeplik env w Makefile, wszystko działa tak, jak powinno. Ale muszę nadal przewodzić env vars sans export. To uniemożliwia mi używanie include envfilew Makefile.

Próbowałem też zrobić coś takiego:

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

Ale zrobienie tego powoduje, że make zgłasza błąd, ponieważ nie ma pliku env do włączenia.

Michael Irwin
źródło
1
Witamy w systemach Unix i Linux. Proszę podać jasne pytanie. Co dokładnie starasz się osiągnąć?
darnir
1
Próbuję dołączyć plik zawierający pary zmiennych środowiskowych do pliku Makefile, aby były one dostępne dla środowiska, w którym działa make.
Michael Irwin,

Odpowiedzi:

40

Jeśli używasz gnu make, powinno działać to załączyć envfileplik, a następnie wyeksportować listę vars otrzymanych z tego samego pliku:

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

test:
        env
meuh
źródło
7
Dzięki za tę odpowiedź, jest genialna! Chociaż moja wersja działa nawet bez export $(shell...linii. Potrzebuję tylko includelinii.
DuffJ
32

Miałem podobny problem i wylądowałem na tym wątku. Innym możliwym rozwiązaniem jest wykonanie polecenia make export bez żadnych argumentów:

include .env
export

Spowoduje to wyeksportowanie wszystkich zmiennych make jako zmiennych środowiskowych. To zachowanie może, ale nie musi pasować do wszystkich przypadków użycia, ale zadziałało dla mnie i nie wiązało się z żadnym magicznym skryptem powłoki.

Śmierdziel
źródło
3

Zachowuje istniejące wcześniej zmienne ENV

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

test:
    echo $$FOO

Biegać

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo
theliberalsurfer
źródło
3

Oto eleganckie rozwiązanie, które nie importuje Make vars, ale ustawia eksport środowiska dla podprocesów powłoki. Osobiście wolę zachować dynamiczne skrypty moich profili.

export BASH_ENV=tools/sh/env.sh

Jest trochę gotchas. Niestety ENV nie działa, myślę, że powinno (ale to jest problem z Bash, a nie Make). Naprawdę wymaga również innej linii, ponieważ domyślnym interpretatorem powłoki Make jest / bin / sh.

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

Z drugiej strony pozwala to również na włączenie funkcji powłoki w skryptach Makefile, ale tylko dla skryptów receptur. Nie wiem, jak wypadają inne pociski oprócz Bash. I dzieje się trochę więcej. Podałem trochę pliku testowego jako GIST .

Można sobie wyobrazić wiele skomplikowanych skryptów powłoki. Najbardziej podoba mi się to pytanie / odpowiedź dla prostych odpowiedzi.

mpe
źródło
2

jeśli twoja nazwa pliku to .makerc, możesz dołączyć ją do Makefile tak prosto:

include .makerc

Wolę wcześniej dodać -znak include, aby ukryć wszelkie ostrzeżenia.

holms
źródło