現在、私は次の定義でMakefileを使用しています。
MYLIB=/.../mylib-1.2.34
問題は、これが開発者によって異なり、チェックアウトするたびにファイルを再編集する必要があることが痛いということです。
そのため、特定の環境変数をエクスポートして実行してみました。
MYLIBX:=$(MYLIB_ENV)
MYLIBX?=MYLIB
問題は、MYLIB_ENVが定義されていない場合でも空のMYLIBXを生成するため、? =が機能しないことです。この非常に基本的なタスクを実行するきちんとした方法はありますか?
私はビルドしてお互いを呼び出すなど、さまざまなタスクを実行する長年にわたって開発された「豊富な」makeファイルセットを使用しているので、深い変更は不可能です。
解決策
ダブルシャッフル。 MYLIBが定義されました。
MYLIB_ENV?=MYLIB
MYLIB:=MYLIB_ENV
答え1
問題は
MYLIB:=$(MYLIB_ENV)
MYLIB?=/.../mylib-1.2.34
常にMYLIB
最初の行に定義されているため、2番目の行は適用されません。
この場合の一般的なアプローチは次のとおりです。
MYLIB?=/.../mylib-1.2.34
これにより、個々の開発者はmake
コマンドラインのシェルで自分の値を指定できます。
make MYLIB=...
または実行する前に環境でmake
export MYLIB=...
make
(それで一度だけ設定してください。例えばシェル起動スクリプトに入れてから忘れてください)。
ただ走るなら
make
値を指定しない場合、MYLIB
デフォルト値が使用されます。/.../mylib-1.2.34
別のオプションはMakefileが保存される場所の決定ただし、すべての場合には機能しません(特にMakefileパスにスペースが含まれている場合)。
答え2
正確に何をしたいのか明確ではありません。ただし、Makefileを編集することなく、Make変数MYLIBの設定をMakefileで指定されたものとは異なるものにオーバーライドする必要がある場合は非常に簡単です。呼び出しで次のコマンドラインをmake
指定します。MYLIB
選択した値、例:
make -f yourmakefile yourtarget MYLIB="I_need_my_personal_value"
別の方法:
MYLIB := ORIGINAL_VALUE
ifneq '$(MYLIB_ENV)' ''
MYLIB := $(MYLIB_ENV)
endif