看板 C_and_CPP 關於我們 聯絡資訊
Ubuntu GCC Makefile手冊 4.13 Generating Prerequisites Automatically %.d: %.c @set -e; rm -f $@; \ $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ < $@.$$$$ > $@; \ rm -f $@.$$$$ sources = foo.c bar.c include $(sources:.c=.d) 上網查了語法解釋 最終會產生一個foo.d,假設prerequisite是foo.c 然後內容是:foo.o foo.d: foo.c foo.h defs.h common.h 1.想請問include後 下一行是不就應該要下recipe了? 不然新增一個規則沒recipe是 做什麼呢? 因為我看我的一個專案的makefile就是在最後一行include 一個.d檔,但 沒有recipe。 2.foo.o foo.d: foo.c .....common.h ,為什麼foo.d要擺在target的位置呢? 不是已經根據prerequisite %.c(foo.c) 判斷要不要產生.d檔了嗎? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.7.85 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1579505795.A.8BE.html
Schottky: recipe 沒寫就會使用 implicit rules 01/20 16:01
Schottky: https://bit.ly/2uXyYlZ 01/20 16:02
Schottky: 第二個問題是你誤會了,文意是在解釋 sed 的作用 01/20 16:04
anoymouse: 喔喔對 忘記了 01/20 16:19
anoymouse: 但是第二個問題 還是不懂 sed的作用就是這個結果啊? 01/20 16:20
Schottky: 用意是當 foo.c *以外* 的 dependencies 有變化時 01/20 17:30
Schottky: 依然能觸發 foo.d 的 remake 01/20 17:31
Schottky: 比如說有人改了 common.h 造成 foo.d 必須更新 01/20 17:32
anoymouse: 可是implicit rules會推導出foo.d的remake嗎? 01/21 09:16
remake一次 是不是就要做類似範例的動作一次? ※ 編輯: anoymouse (61.216.7.85 臺灣), 01/21/2020 09:24:53
Schottky: foo.d 沒有 implicit rules 01/21 14:58
Schottky: 它的 rule/recipe 已經寫在前面了,就是 sed 那幾行 01/21 14:58
釐清一下: 所以有兩個地方有foo.d的rules 1. %.d:%.c sed ..... 2. foo.o foo.d: foo.c foo.h defs.h common.h foo.d的recipe只有在1.有寫,也就是foo.c比foo.d還新的的時候才會執行吧? 就算2中的.h有任何一個比foo.d還新,也不會因為就這樣跳到1.的rule去執行1.的recipe 吧?
MOONRAKER: 你要不要看簡單一點的範例。 01/22 15:31
※ 編輯: anoymouse (61.230.114.99 臺灣), 01/24/2020 15:30:17 ※ 編輯: anoymouse (61.230.114.99 臺灣), 01/24/2020 15:33:44