[問題] makefile 自動生成依賴範例問題

看板C_and_CPP作者 (沒有暱稱)時間4年前 (2020/01/20 15:36), 4年前編輯推噓1(1011)
留言12則, 3人參與, 4年前最新討論串1/1
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

01/20 16:01, 4年前 , 1F
recipe 沒寫就會使用 implicit rules
01/20 16:01, 1F

01/20 16:02, 4年前 , 2F
01/20 16:02, 2F

01/20 16:04, 4年前 , 3F
第二個問題是你誤會了,文意是在解釋 sed 的作用
01/20 16:04, 3F

01/20 16:19, 4年前 , 4F
喔喔對 忘記了
01/20 16:19, 4F

01/20 16:20, 4年前 , 5F
但是第二個問題 還是不懂 sed的作用就是這個結果啊?
01/20 16:20, 5F

01/20 17:30, 4年前 , 6F
用意是當 foo.c *以外* 的 dependencies 有變化時
01/20 17:30, 6F

01/20 17:31, 4年前 , 7F
依然能觸發 foo.d 的 remake
01/20 17:31, 7F

01/20 17:32, 4年前 , 8F
比如說有人改了 common.h 造成 foo.d 必須更新
01/20 17:32, 8F

01/21 09:16, 4年前 , 9F
可是implicit rules會推導出foo.d的remake嗎?
01/21 09:16, 9F
remake一次 是不是就要做類似範例的動作一次? ※ 編輯: anoymouse (61.216.7.85 臺灣), 01/21/2020 09:24:53

01/21 14:58, 4年前 , 10F
foo.d 沒有 implicit rules
01/21 14:58, 10F

01/21 14:58, 4年前 , 11F
它的 rule/recipe 已經寫在前面了,就是 sed 那幾行
01/21 14:58, 11F
釐清一下: 所以有兩個地方有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 吧?

01/22 15:31, 4年前 , 12F
你要不要看簡單一點的範例。
01/22 15:31, 12F
※ 編輯: anoymouse (61.230.114.99 臺灣), 01/24/2020 15:30:17 ※ 編輯: anoymouse (61.230.114.99 臺灣), 01/24/2020 15:33:44
文章代碼(AID): #1U9LY3Y- (C_and_CPP)