Makefile-Include-Env-Datei

26

Ich versuche, einige Umgebungsvariablen in ein Makefile aufzunehmen. Die env-Datei sieht folgendermaßen aus:

FOO=bar
BAZ=quux

Beachten Sie, dass nicht exportzu jeder Umgebungsvariable ein Hinweis führt . Wenn ich die führende exportund nur includedie env-Datei im Makefile hinzufüge , funktioniert alles wie es sollte. Aber ich muss das env vars sans in Führung halten export. Das hindert mich daran, nur include envfiledas Makefile zu benutzen .

Ich habe auch versucht, so etwas zu tun:

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

Aber wenn du das machst, löst das einen Fehler aus, weil die env-Datei nicht zum Einschließen da ist.

Michael Irwin
quelle
1
Willkommen bei Unix & Linux. Bitte geben Sie Ihre Frage deutlich an. Was genau wollen Sie erreichen?
Darnir
1
Ich versuche, eine Datei, die Umgebungsvariablenpaare enthält, in ein Makefile aufzunehmen, damit sie für die Umgebung verfügbar sind, in der make ausgeführt wird.
Michael Irwin

Antworten:

40

Wenn Sie gnu make verwenden, sollte es funktionieren, die envfileDatei einzuschließen und dann die Liste der Variablen zu exportieren, die aus derselben Datei stammen:

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

test:
        env
meuh
quelle
7
Vielen Dank für diese Antwort, es ist brillant! Obwohl meine Version auch ohne export $(shell...Leitung funktioniert . Ich brauche nur die includeLeitung.
DuffJ
32

Ich hatte ein ähnliches Problem und bin auf diesem Thread gelandet. Eine andere mögliche Lösung besteht darin, den Befehl make export ohne Argumente auszuführen:

include .env
export

Dadurch werden alle make-Variablen als Umgebungsvariablen exportiert. Dieses Verhalten stimmt möglicherweise nicht mit allen Anwendungsfällen überein, funktionierte jedoch für mich und beinhaltete keine Assistenten für Shell-Skripte.

Brock
quelle
3

Behält bereits vorhandene ENV-Versionen bei

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

test:
    echo $$FOO

Zu rennen

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo
derLiberalsurfer
quelle
3

Hier ist eine elegante Lösung, die keine Make-Vars importiert, sondern Umgebungsexporte für Shell-Unterprozesse festlegt. Ich persönlich bevorzuge es, die dynamischen Skripte meines Profils beizubehalten.

export BASH_ENV=tools/sh/env.sh

Es gibt einige Fallstricke. Leider funktioniert ENV nicht, ich denke es sollte (aber das ist ein Problem mit Bash, nicht Make). Außerdem wird wirklich eine andere Zeile benötigt, da der Standard-Shell-Interpreter von Make / bin / sh ist.

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

Auf der Oberseite erlaubt dies auch die Einbindung von Shell-Funktionen in Makefile-Skripte, jedoch nur für die Rezept-Skripte. Ich weiß nicht, wie es mit anderen Muscheln als Bash weitergeht. Und da ist noch ein bisschen mehr los. Ich habe ein Testfile als GIST erstellt .

Es sind viele komplizierte Shell-Skripte denkbar. Diese Frage / Antwort gefällt mir am besten für die einfachen Antworten.

mpe
quelle
2

Wenn Ihr Dateiname so ist .makerc, können Sie ihn so einfach wie folgt in Makefile einfügen:

include .makerc

Ich bevorzuge es, -vorher ein Zeichen hinzuzufügen include, um etwaige Warnungen zu unterdrücken.

holms
quelle