[爆卦]makefile語法是什麼?優點缺點精華區懶人包

為什麼這篇makefile語法鄉民發文收入到精華區:因為在makefile語法這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者MetalChao (饅頭)看板C_and_CPP標題[問題] Makefile 如何產字計數的...


請教各位高手, 在 Makefile 如何產生計數(遞增或遞減)的迴圈?

基本上就是要 (例如給定0~63) 做到讓 Makefile 產生類似這樣的定義

CSRCS0 = $(addprefix ${TOP}/,${CFILES0})
CSRCS1 = $(addprefix ${TOP}/,${CFILES1})
CSRCS2 = $(addprefix ${TOP}/,${CFILES2})
.
.
.
CSRCS62 = $(addprefix ${TOP}/,${CFILES62})
CSRCS63 = $(addprefix ${TOP}/,${CFILES63})

當然事實上並不只是變數定義, 還包括用 ifneq 等等檢查變數是否存在之類的
會有很多地方使用到0~63的計數, 每個地方也不只一行
而且因為數字並不是固定的0~63, 所以我不能直接土法煉鋼真的像上面那樣展開來寫

目標是想做到類似像下面這樣子, 很簡潔, 也很容易修改這個數字:

MAX = 63

define CSRCS_template =
CSRCS$(1) = $$(addprefix $${TOP}/,$${CFILES$(1)})
endef

$(for i=0..${MAX},$(eval $(call CSRCS_template,$(i))))

註: 我知道 Makefile 沒有 for i=0..63 這種語法, 只是用來表達我想要做到的事情

一種做法是利用 script/shell 先產生出0~63的數列, 或是直接產生這64行定義
然後在 Makefile裡再 include 這個產生出來的檔案, 這樣是可以做到的

但我想知道, 有沒有辦法單靠 Makefile 語法技巧就可以做到這件事呢?
(因為這個 Makefile 可能在不同平台上執行, 所以不希望靠額外的 script)

先謝謝各位了!

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.248.89
LPH66:http://ppt.cc/k8zg 12/07 00:42
感謝! 雖然裡面原提問者要的東西跟我不一樣(他要執行時期的, 而我要在Makefile裡面)
但是倒數第二個答案就是我要的!
基本上他讓我知道, 可以利用 $(call) 遞迴呼叫來達到可控制的迴圈,
然後用再利用 $(words) 來做數字的增減,
我覺得應該可以把他的答案再簡化一點, 等我完成了會再來報告
再次感謝!
※ 編輯: MetalChao 來自: 220.135.248.89 (12/07 22:42)

最後簡化成這樣

NUMBERS :=
define ITERATE
$(if $(word ${1}, ${NUMBERS}),,\
$(eval NUMBERS+=$(words ${NUMBERS}))\
$(call ITERATE,${1})\
)
endef

如果用參數 5 來執行它
$(call ITERATE,5)

就會產生這個 0 到 4 的數列
NUMBERS 會變成 0 1 2 3 4

有了這樣的數列變數
就可以用 $(foreach num,${NUMBERS},...) 來做到任何數字迴圈了
※ 編輯: MetalChao 來自: 210.80.67.18 (12/09 22:05)

你可能也想看看

搜尋相關網站