Makefileインクルードenvファイル


26

いくつかのenv変数をMakefileに含めようとしています。envファイルは次のようになります。

FOO=bar
BAZ=quux

export各env変数につながるものはないことに注意してください。Makefileに先頭のenvファイルexportだけを追加するとinclude、すべてが正常に機能します。しかし、env vars sansをリードし続ける必要がありexportます。これによりinclude envfile、Makefileで使用することができなくなります。

私もこのようなことを試してみました:

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

しかし、それを行うと、envファイルが含まれていないため、makeがエラーをスローします。


1
Unix&Linuxへようこそ。質問を明確に述べてください。あなたが達成しようとしていることは何ですか?
darnir

1
makeを実行している環境で使用できるように、環境変数のペアを含むファイルをMakefileに含めようとしています。
マイケルアーウィン

回答:


40

gnu makeを使用している場合、envfile機能するのはファイルをインクルードし、同じファイルから取得した変数のリストをエクスポートすることです。

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

test:
        env

7
この答えをありがとう、それは素晴らしいです!私のバージョンはexport $(shell...ラインなしでも動作しますが。includeラインが必要です。
-DuffJ

32

私は同様の問題を抱えていて、このスレッドに行き着きました。別の可能な解決策は、引数なしでmake exportコマンドを実行することです。

include .env
export

これにより、すべてのmake変数が環境変数としてエクスポートされます。この動作は、すべてのユースケースに一致する場合と一致しない場合がありますが、私にとってはうまく機能し、シェルスクリプトウィザードを使用しませんでした。


3

既存のENV変数を保持します

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

test:
    echo $$FOO

走る

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo

3

Make変数をインポートせず、シェルサブプロセスの環境エクスポートを設定するエレガントなソリューションを次に示します。個人的には、プロファイルを動的なスクリプトに保つことを好みます。

export BASH_ENV=tools/sh/env.sh

いくつかの落とし穴があります。残念ながら、ENVは動作しません。動作するはずです(ただし、これはMakeではなくBashの問題です)。また、Makeのデフォルトのシェルインタープリターは/ bin / shであるため、実際には別の行が必要です。

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

上側では、Makefileスクリプトにシェル関数を含めることもできますが、これはレシピスクリプトのみです。Bash以外のシェルがどのように機能するかはわかりません。そして、もう少し進行中です。いくつかのテストファイルをGISTとして作成しました

想像できる多くの複雑なシェルスクリプトがあります。このQ / Aは、簡単な答えに最適です。


2

ファイル名が.makerc次のように、Makefileに含めることができます。

include .makerc

警告を抑制するため-include、前にsign を追加することを好みます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.