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.


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

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.


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

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.