5

次の行に沿ってメイクファイルで使用するマクロを作成しました。

TODO_MSG = $(warning TODO: $(1))
$(call TODO_MSG, This part of the msg displays fine, but this part does not)

次のようなもので回避できます。

BLAH := $(shell perl -e 'print join( " ", 2..200 )'
COMMA := ,
TODO_MSG = $(warning TODO:$(1)$(strip $(foreach x,${BLAH},$(if $(${x}),${COMMA}$(${x}))))

...しかし、可変引数マクロをより明示的にサポートするものがあるかどうかに興味があります。

4

3 に答える 3

6

ベータ版のソリューションのリミックスは次のとおりです。

TODO_MSG = $(warning TODO: $(1))

test:
        $(call TODO_MSG, $(strip This part displays fine, and this does too))

Make 用の $(identity ...) 関数があれば、それを使用します。$(strip ...) は、私が見つけることができる最も近いものでした。

于 2012-08-30T01:12:29.927 に答える
3

これでうまくいきますか?

comma := ,

#define TODO_MSG = $(warning TODO: $(1))
TODO_MSG = $(warning TODO: $(1))
$(call TODO_MSG, This part displays fine$(comma) and so does this)
于 2012-08-29T03:59:01.000 に答える
1

コメントで述べたように、@ Beta@claytontstanley の回答は十分に優れており、個人的にはそれらのソリューションの 1 つを使用します。

可変引数を取得する一般的な方法を好む場合は、次の方法が役立ちます。

警告: 以下にたくさんの魔法と汚いハックがあります。

# に現れる数値引数のカンマ区切りのリストに展開します
# 現在の呼び出しコンテキスト。
引数= \
    $(eval __arg_tmp := \
        $(call __args_strip_tail,$(foreach __a,.1,$(__args_list))))$(__arg_tmp)

# 空でない引数参照のリスト、例えば $(1),,$(3),,,
# Context: __a - 現在処理中の引数のエンコードされた番号。
__args_list = \
    $(if $(__arg_value),$(__arg_ref))$(foreach __a,$(call inc,$(__a)) \
        ,$(if $(__arg_simple),$(comma)$(eval __arg_tmp := \
            $(値 __args_list))$(__arg_tmp)))

__arg_value = $(value $(call to_dec,$(__a)))
__arg_ref = $${$(call to_dec,$(__a))}
__arg_simple = $(findstring simple,$(flavor $(call to_dec,$(__a))))

# 'call' の GNU Make バグの回避策として使用。
# ${1},,${3},,, -> ${1},,${3}
__args_strip_tail = $(subst } ,},$(call nolastword,$(subst },} ,$1,)))

# 便利なもの...
コンマ := ,
nolastword = $(単語リスト 2,$(words $1),x $1)

# .4.2 を 42 にデコード
to_dec = $(subst .,,$1)

# 指定された数値をインクリメントします。
# 1. 桁間にピリオドがある 10 進数: 42 は .4.2
inc = \
    $(call __inc$(接尾辞 .0$1),$(ベース名 $1))

__inc.0 = $1.1
__inc.1 = $1.2
__inc.2 = $1.3
__inc.3 = $1.4
__inc.4 = $1.5
__inc.5 = $1.6
__inc.6 = $1.7
__inc.7 = $1.8
__inc.8 = $1.9
__inc.9 = $(call inc,$1).0

テスト:

func = args [ $(args) ]で呼び出される Func $0

foo = $(関数)
bar = $(call func,ar,baz,boo)

$(warning $(call foo,a1,a2,a3,a4))
$(警告 $(コールバー、a1、a2、a3、a4))

出力は次のとおりです。

Makefile:49: Func foo called with args [a1,a2,a3,a4]
Makefile:50: Func func called with args [ar,baz,boo]
于 2012-08-30T12:01:39.043 に答える