Makefile で変数名が空であるというエラーを回避する方法

Makefile で変数名が空であるというエラーを回避する方法

この makefile の実行コマンドと共にバージョンを指定する場合、そのバージョンは変数 VERSION に格納される必要があります。バージョンが指定されていない場合は、デフォルト値が使用されます。

これは私のMakefileです

export $(BUILDVERSION) = $2
VERS = VABCDE.00.00A002

$(info    BUILDVERSION is "$(BUILDVERSION)")
$(info    vers is "$(VERS)")
ifneq ($(BUILDVERSION),undefined)
        VERSION := $(VERS)
endif

ifneq ($(BUILDVERSION),undefined)
        VERSION := $(BUILDVERSION)
endif
$(info    VERSION is $(VERSION))

ケース1: 実行時に引数を含めると、この出力が表示されます

BUILDVERSION is "VABCDE.00.00A001"
vers is VABCDE.00.00A002
VERSION is "VABCDE.00.00A001"

ケース2: 実行時に引数を指定しないとこのエラーが発生します

Makefile:1: *** empty variable name.  Stop.
Makefile:1: *** empty variable name.  Stop.

私のコードのどこが間違っているのか見つけるのを手伝ってくれる人はいますか?

答え1

よく分かりませんが、質問は理解しています。

タスクが の外部からバージョン番号を提供しmake、コマンドラインでバージョンが指定されていない場合はデフォルト値を使用することである場合、 はmakefile次のようになります。

VERS = VABCDE.00.00A002

$(info    BUILDVERSION is "$(BUILDVERSION)")
$(info    vers is "$(VERS)")

ifdef BUILDVERSION
        VERSION := $(BUILDVERSION)
else
        VERSION := $(VERS)
endif

$(info    VERSION is $(VERSION))

そして、次のように呼び出します:

make BUILDVERSION="not-default-version"

答え2

export $(BUILDVERSION) = $2

tl;dr; GNU make は bash ではありません。

は、として$(BUILDVERSION)呼び出された場合にのみ、何らかの形に展開されます。その結果、その行は a)として定義されます。makemake BUILDVERSION=somethingsomething関数のようなマクロとして使用されるときに2番目の引数に展開され$(call something, ...)、b)をエクスポートします。空のsomethingmake ルールから実行されるコマンドに名前が付けられた環境変数。

が定義されていないか、空の文字列に定義されている場合はBUILDVERSION、そのエラーが発生しますempty variable name

$ make -f - <<'EOT' BUILDVERSION=something
export $(BUILDVERSION) = $2
all:; set | grep ^something; echo XXX $(call something,first,second)
EOT

set | grep ^something; echo XXX second
something=''
XXX second

$2するない... make は bash ではないため、make のコマンドラインで渡される 2 番目の引数に展開されます。

関連情報