web-dev-qa-db-ja.com

メイクファイルで環境変数を読み取る

$ MY_ENV_VARIABLEという名前の環境変数が設定されています。

Makefile内でこの変数を使用して(たとえば)ソースファイルを含めるにはどうすればよいですか?

LOCAL_SRC_FILES = $(MY_ENV_VARIABLE)/libDEMO.so

上記のようなものが動作しないようです。

注:私の場合、これはAndroid NDKでビルドするために必要ですが、これは一般的にmakeに適用されると思います。

19
Sander Versluys

シェルから変数をエクスポートしたことを確認してください。ランニング:

echo $MY_ENV_VARIABLE

シェルで設定されているかどうかを示します。しかし、サブシェルや他のサブコマンド(makeなど)がそれを表示できるようにエクスポートしたかどうかを確認するには、実行してみます。

env | grep MY_ENV_VARIABLE

そこにない場合は、makeを実行する前にexport MY_ENV_VARIABLEを実行してください。

それだけで十分です。makeは、起動時にすべての環境変数をmake変数として自動的にインポートします。

11
MadScientist

情報を追加するだけです...

Makeで環境変数にアクセスする構文は、makeの他の変数と同様です...

#export the variable. e.g. in the terminal,
export MY_ENV_VARIABLE="hello world"

...

#in the makefile (replace before call)
echo $(MY_ENV_VARIABLE)

これは、コマンドを実行する前に置換を実行します。代わりに、コマンド実行中に置換を実行したい場合は、$をエスケープする必要があります(たとえば、echo $MY_ENV_VARIABLEは正しくなく、makeで変数Mを置換しようとします、それをY_ENV_VARIABLE)に追加します...

#in the makefile (replace during call)
echo $$MY_ENV_VARIABLE
15
jozxyqk

私は同じような問題を抱えていました(Cygwinの下で):

  • シェルで_echo $OSTYPE_を実行すると値が出力されますが、
  • _env | grep OSTYPE_を実行しても何も出力されません。

メイクファイルを実行するすべてのマシンでこの変数がexportedであることを保証できないため、以下を使用してメイクファイル内から変数を取得しました。

_OSTYPE = $(Shell echo $$OSTYPE)
_

もちろん、次のような条件でも使用できます。

_ifeq ($(Shell echo $$OSTYPE),cygwin)
# ...do something...
else
# ...do something else...
endif
_

編集:

jozxyqkの答え からの情報を実験した後、すべてmakefile内から見つけたいくつかのこと:

  • レシピで_@echo $$OSTYPE_または_@echo "$$OSTYPE"_を実行すると、変数は正常にcygwinに展開されます。
  • ただし、ifeq ($$OSTYPE,cygwin)またはifeq ("$$OSTYPE","cygwin")のような条件でそれを使用しても、展開されません。
  • したがって、最初に_TEST = "$$OSTYPE"_のような変数を設定するとecho $(TEST)cygwinに出力されます(展開はecho呼び出しによって行われます)が、条件で機能しない-ifeq ($(TEST),cygwin)はfalseです。
3
FriendFX