2014-12-02 22 views
3

我正在嘗試使用Make offer的string functions在Makefile中執行一些字符串操作。我希望做我的琴絃兩次轉換,我有一個變量,它列出源文件類似於:Makefile字符串函數可以嵌套嗎?

C_SRCS += \ 
./src/foo.c \ 
./src/bar.c \ 
... 

我想利用這個字符串,並將其轉換成一個新的變量保存所有的目標文件。這些對象將被存儲在不同的目錄中,並且明顯將具有.o擴展而不是.c。切實他們應該改變來自:

./src/<file>.c 

./artifacts/src/<file>.o 

我可以像兩個規則做到這一點:

OBJS1 := $(C_SRCS:%.c=%.o) 
OBJS = $(subst ./,./artifacts/,$(OBJS1)) 

,將工作很好,但我希望這兩個結合起來規則並刪除中間變量。我想:

OBJS = $($(subst ./,./artifacts/,$(C_SRCS)):%.c=%.o) 

和剛剛離開OBJS空的,我想,也許它會更好,如果我用了兩個完全相同的功能類型的,所以我嘗試:

OBJS = $(subst %.c,%.o,$(subst ./,./artifacts/,$(C_SRCS))) 

和執行的嵌套規則只有OBJS被設置爲./artifacts/src/foo.c ./artifacts/src/bar.c ...

我開始閱讀一些Make文檔,但是我找不到任何有關嵌套字符串函數的信息。是否可以在Makefiles中嵌套字符串函數?如果是的話,我在這裏做錯了什麼?

回答

3

是的,你可以嵌套字符串函數。

雖然您不能在函數的結果上使用速記:X=Y表示法。

所以,當你結合OBJS1 := $(C_SRCS:%.c=%.o)OBJS = $(subst ./,./artifacts/,$(OBJS1))你沒有做正確的(或明顯的方式)你做了別的。當明顯的(和正確的)嵌套是OBJS = $(subst ./,./artifacts/,$(C_SRCS:%.c=%.o))時,你寫了OBJS = $($(subst ./,./artifacts/,$(C_SRCS)):%.c=%.o)。 (也許這是我不確定的錯字)。

:X=Y簡寫爲patsubst(自動%前綴的簡寫)不subst的速記這就是爲什麼你行OBJS = $(subst %.c,%.o,$(subst ./,./artifacts/,$(C_SRCS)))沒有工作(考慮,否則即$(C_SRCS:.c=.o)將在比值剛剛結束更多的地方發生)。

請參閱下面的工作版本。

C_SRCS += \ 
      ./src/foo.c \ 
      ./src/bar.c 

pv = $(warning $1: $($1)) 
$(call pv,C_SRCS) 

$(warning RAW: $(subst ./,./artifacts/,$(C_SRCS:%.c=%.o))) 

OBJS = $(patsubst %.c,%.o,$(subst ./,./artifacts/,$(C_SRCS))) 
$(call pv,OBJS) 
1

你這樣做是錯誤的。只是 「展開宏」 和替換$(OBJS1)$(OBJS)

OBJS1 := $(C_SRCS:%.c=%.o) 
OBJS = $(subst ./,./artifacts/,$(OBJS1)) 

變爲:

OBJS = $(subst ./,./artifacts/,$(C_SRCS:%.c=%.o))