1

我正在嘗試一個在GNU Make中使用元編程的小項目,並且我有一個專門的需求來以編程方式創建將傳遞給我的一些用戶定義函數的所有參數。如何以編程方式在GNU Make中爲用戶定義函數生成參數?

override CMD:=foo 

define foo = 
    $(info You have called function [$0] with $$1='$1' and $$2='$2') 
endef 

# this doesn't work 
override ARGS:=bar,baz 
$(call $(CMD),$(ARGS)) 

# this doesn't work either 
override COMMA:=, 
override ARGS:=bar;baz 
$(call $(CMD),$(subst ;,$(COMMA),$(ARGS))) 

$(info ---) 
$(info CMD was '$(CMD)') 
$(info ARGS was '$(ARGS)') 
$(info COMMA was '$(COMMA)') 

我遇到的問題是,GNU提出的是聰明,比我希望它是,並且可以識別和變量或立即值內的逗號語法逗號之間的區別,:

You have called function [foo] with $1='bar,baz' and $2='' 
You have called function [foo] with $1='bar,baz' and $2='' 
--- 
CMD was 'foo' 
ARGS was 'bar;baz' 
COMMA was ',' 

有沒有偷偷摸摸的方法來做到這一點,以便我的'foo'函數將$ 1視爲'bar',將$ 2視爲'baz'?或者我將不得不放棄這種方法?

注意1:空格分隔符和$(foreach)不是一個適當的解決方案,因爲這只是在路上踢。最終,我需要foo被愚弄,認爲它已經通過了預期的參數數量。 (雖然我不反對使用$(foreach)一些中間步驟的解決方案。)

NOTE2:雖然我不想阻止依賴於程序生成的二次生成文件的解決方案,包括在這一點的底部 - 這對其他SO讀者可能是有用的 - 我個人並不關心任何這樣的方法。

+1

嘗試'$(EVAL $$($$調用(CMD),$(參數)))' –

+0

你是我的英雄。 (另外:爲什麼我沒有想到這一點?)讓這個答案! –

+1

這裏要拿走的關鍵理解是,make會總是將參數分解到_before_展開任何東西。這就是它如何知道嵌入逗號等不是分隔符(通常你不希望它們是)。它還允許你通過將它們放入變量中來隱藏make函數中的各種其他特殊字符。 – MadScientist

回答

1

評估和演示將爲您節省不必要的包括:

$(eval $$(call $$(CMD),$(ARGS))) 
相關問題