Makefileにいくつかの環境変数を含めようとしています。 envファイルは次のようになります。
FOO=bar
BAZ=quux
各環境変数に先行するexport
がないことに注意してください。 Makefileの先頭にexport
とinclude
のenvファイルを追加すると、すべてが正常に機能します。しかし、私は環境変数をexport
以外に保つ必要があります。これにより、Makefileでinclude envfile
を使用できなくなります。
私は次のようなことも試しました:
sed '/^#/!s/^/export /' envfile > $(BUILDDIR)/env
include $(BUILDDIR)/env
しかし、それを行うと、envファイルが含まれていないため、makeはエラーをスローします。
Gnu makeを使用している場合、機能するのはenvfile
ファイルをインクルードし、同じファイルから取得した変数のリストをエクスポートすることです。
#!make
include envfile
export $(Shell sed 's/=.*//' envfile)
test:
env
同様の問題があり、このスレッドに到達しました。別の可能な解決策は、引数なしでmake exportコマンドを実行することです。
include .env
export
これにより、すべてのmake変数が環境変数としてエクスポートされます。この動作はすべてのユースケースと一致する場合と一致しない場合がありますが、私にとっては機能し、シェルスクリプトウィザードは含まれていませんでした。
Make varsをインポートしないが、シェルサブプロセスの環境エクスポートを設定するエレガントなソリューションを次に示します。個人的には、プロファイルを動的なスクリプトにしておくことを好みます。
export BASH_ENV=tools/sh/env.sh
いくつかの落とし穴があります。残念ながらENVは機能しませんが、機能すると思います(ただし、これはMakeではなくBashの問題です)。 Makeのデフォルトのシェルインタープリターは/ bin/shであるため、実際には別の行が必要です。
BASH_ENV := tools/sh/env.sh
Shell := /usr/bin/bash
これにより、Makefileスクリプトにシェル関数を含めることもできますが、これはレシピスクリプトに対してのみです。バッシュ以外の砲弾がどうなっているかはわかりません。そして、もう少し進んでいます。 私はGistとしていくつかのテストファイルを作成しました 。
想像できるほど多くの複雑なシェルスクリプトがあります。シンプルな答えにはこのQ/Aが一番好きです。
ファイル名が.makerc
の場合、次のように簡単にMakefileに含めることができます。
include .makerc
警告を抑制するために、include
の前に-
記号を追加することをお勧めします。
既存の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