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.