web-dev-qa-db-ja.com

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

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

FOO=bar
BAZ=quux

各環境変数に先行するexportがないことに注意してください。 Makefileの先頭にexportincludeのenvファイルを追加すると、すべてが正常に機能します。しかし、私は環境変数をexport以外に保つ必要があります。これにより、Makefileでinclude envfileを使用できなくなります。

私は次のようなことも試しました:

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

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

31
Michael Irwin

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

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

test:
        env
48
meuh

同様の問題があり、このスレッドに到達しました。別の可能な解決策は、引数なしでmake exportコマンドを実行することです。

include .env
export

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

38
Brock

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が一番好きです。

4
mpe

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

include .makerc

警告を抑制するために、includeの前に-記号を追加することをお勧めします。

4
holms

既存の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
4