Re: [問題] makefile的寫法問題
※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
: a.o: a.c
: b.o: b.c
: 可以用 pattern rule 來解決,
: 那
: ab:a.o b.o
: gcc -o $@ $^
: 這種的有無類似方法來處理?
: 後面 a.o b.o ... 要一值寫到 z.o 也是要寫不少。
: → pcyu16:可以用變數做一些整理 08/22 08:40
: pcyu16: 可以舉個例子嗎?
: 推 Bencrie:變數存 .c list,然後用 patsubst 產生 .o list 08/22 09:01
: macro substitution? 也是不錯的方法。
提供一下我的方法
這其實是我的 cppgm 的 Makefile 的寫法
不過因為 cppgm 的 Honor code 條款我不能直接貼上內容
所以我另外寫一個類似的範例出來
之所以會這樣寫是因為 cppgm 要編譯的程式跟它需要的模組都很多
用這個方法可以簡單管理
---
#這裡列出每支程式所需要的模組
#不寫 .c 或 .o 免得哪時忘了加
PROG1MODULE := module1
PROG2MODULE := module1 module2
PROG3MODULE := module1 module2 module3
#執行檔名, 當然這裡寫 exe1 exe2 什麼的是範例
#實際上的執行檔名沒有這麼有規則...
EXE1 := exe1
EXE2 := exe2
EXE3 := exe3
#產生執行檔的 rule 字串, ".o" 用 patsubst 加上去
#順便也加上收集目的檔的資料夾
#$(1) 是執行檔名, $(2) 是模組列表變數的 prefix
# ; 後面是命令, 這個是 makefile 的語法之一
#後面的 $ 寫兩次是為了能展開成特殊變數 $^ 跟 $@
TargetRule = $(1): $(patsubst %,bin/%.o,$($(2)MODULE)) ; g++ $$^ -o $$@
#.c => .o 就直接用對應的就好
bin/%.o : src/%.cpp
$(CXX) $(CXXFLAGS) -Isrc -c $^ -o $@
#所有的程式名, 因為 cppgm 每一支作業都有編號所以簡化成編號列表
ALLPROG := 1 2 3
#實際產生 rule
#例如當 num 為 1 時就會先計算 $(call TargetRule,$(EXE1),PROG1) 產生 rule 字串
#然後送進 eval 執行
#不過似乎直接這樣展開好像會有點問題所以我是把它的結果額外用一個空變數接起來
#像是 DUMMY += ... 這樣 反正 eval 的展開結果是空字串所以沒差
$(foreach num,$(ALLPROG),$(eval $(call TargetRule,$(EXE($num)),PROG$(num))))
---
這樣子所有要改的東西都會集中在一個地方
要加的話也很方便
如果有不在數字列表外的程式也只要另加
ANOTHERMODULE := module1 module2 module3 othermodule
再寫 $(eval $(call TargetRule,another,ANOTHER))
就會得到編譯出 another 這個執行檔的 rule
--
有人喜歡邊玩遊戲邊上逼;
也有人喜歡邊聽歌邊打字。
但是,我有個請求,
選字的時候請專心好嗎?
-- 改編自「古 火田 任三郎」之開場白
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.69.49.38
推
08/22 15:49, , 1F
08/22 15:49, 1F
→
08/22 15:50, , 2F
08/22 15:50, 2F
→
08/22 15:50, , 3F
08/22 15:50, 3F
討論串 (同標題文章)