make
中是否有命令行方式來找出目標的哪些先決條件未更新?調試GNU make
回答
make -d
應該給你足夠多的信息更調試你的makefile。
被警告:分析輸出需要花費一些時間和精力,但將輸出加載到您喜歡的編輯器中,並且執行搜索將有很大幫助。
可以大大減少調試輸出量,如果你指定你感興趣的特定目標。因此,如果你只在dodgy
目標感興趣,而不是僅僅make -d
這可能使一百個不同的東西,嘗試:
make clean
make -d dodgy
(假設你有一個clean
目標當然)。
的make --debug
是相同的make -d
但你也可以指定:
make --debug=FLAGS
其中標誌可以是:
a
所有調試(同make -d
和make --debug
)。b
進行基本調試。v
稍微更詳細的基本調試。i
隱式規則。j
用於調用信息。m
在makefile重製期間獲取信息。
看起來make --debug=b
是你需要什麼是最好的選擇,因爲顯示在下面的成績單:
[email protected]> cat makefile
c:a b
touch c
[email protected]> touch a b ; make
touch c
[email protected]> make
make: 'c' is up to date.
[email protected]> touch a ; make --debug=b
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc. Blah, blah, blah.
Reading makefiles...
Updating goal targets....
Prerequisite 'a' is newer than target 'c'.
Must remake target 'c'.
touch c
Successfully remade target file 'c'.
另一個建議是,如果你想擺脫內建的隱式規則,你可以使用'-r'標誌和'-d'一起。 – 2009-11-17 15:07:26
您是否在尋找製作的「預演」?它會打印出製作過程中沒有做的事,讓你看到會發生什麼。
該標誌是-n
,使用它就像make -n
。
這是我最喜歡的,'-d'太冗長了(甚至是'--debug = b')。特別是如果你堅持遞歸make(唉!)。 – 2011-07-13 13:34:20
你的問題有點不清楚。如果您想查看哪些先決條件文件最近未被修改,請使用ls -l來查看它們的修改時間。如果你想看到什麼使正在做,試試這個:
# Make will announce when it is making this target, and why. sometarget: preq1 preq2 preq3 @echo making [email protected] @echo The following preqs are newer than the target: $? do_things
我打算建議$?以及 – 2009-11-17 01:22:51
不是一個真正的命令行解決方案,但仍然有用。只有在設置了env-var的情況下,纔可以通過僅執行回顯來使其成爲命令行。 – paxdiablo 2009-11-17 01:34:20
還有GNU做一個調試器和更好的跟蹤/錯誤輸出:Remake
截屏:
http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40
幾聲我也使用this(舊的但仍然有效)交互式調試器作者:John Graham-Cumming
我通常所做的並不是像前面的回答者那樣使用-d。
我可以:
- 使用-p打印的數據庫,看規則已經創造了什麼。如果您有第二個擴展規則並且正在創建規則,那麼這非常方便,特別是遞歸make。
- 大量使用$(info)函數。
- 使用此DrDobbs文章Debugging Makefiles
下面所描述的技巧和訣竅是一些代碼,我使用打印出值:
define pv
$(info $(1) [$(origin $(1))] : >|$($(1))|<)
endef
define pva
$(foreach t,$(1),$(call pv,$(t)))
endef
define itemizer
$(foreach t,$($(1)),$(info $(t)))
endef
我使用GNU使使模板定義按目標制定規則;
模板都是這樣寫的規則宏,他們在這裏https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
當你有化妝系統,包括核心的makefile生成每個項目類型的所有規則,這個功能非常有用解釋;如果它說要做共享庫,那麼它會編寫規則來編譯共享庫;等等其他類型的目標。
在此示例中:如果將SHOW_RULES = 1添加到make命令行中,它還會顯示由PROGRAM_target_setup_template生成的規則的文本;同時自己生成規則(使用eval)。
# this one defines the target for real
$(foreach prog, $(TARGETS), $(eval $(call PROGRAM_target_setup_template,$(prog))))
ifneq "$(SHOW_RULES)" ""
$(foreach prog, $(TARGETS), $(info $(call PROGRAM_target_setup_template,$(prog))))
endif
- $(叫...)調用模板
- $(信息...)打印模板替換的結果; (EVAL會調用輸出和另外的分析當前的make文件)
更多關於我的make文件在這裏:http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
- 1. gnu make substring
- 2. GNU make引用
- 3. NDK:Android.mk/GNU Make
- 4. Unix與Windows的GNU-Make測試
- 5. Xcode中的GNU make
- 6. 的GNU-make編譯
- 7. 從GNU Make到Scons
- 8. gnu make中的「.MAKE」目標是什麼?
- 9. BSD Make和GNU Make兼容的makefile
- 10. 調試make和cmake?
- 11. GUI的GNU調試
- 12. GNU Make中的互斥量?
- 13. Makefile中的GNU make變量
- 14. GNU make error code(e = -1)
- 15. 綜合gnu make/gcc教程
- 16. Gnu make on Windows 7 64bit?
- 17. GNU make的SECONDEXPANSION和遞歸
- 18. GNU make通配符替代?
- 19. GNU make的-j選項
- 20. GNU Make中的雙精度%
- 21. GNU Make中的concatenate值
- 22. GNU make和對象列表
- 23. (GNU make)installcheck一個庫
- 24. qt是否帶有gnu make?
- 25. Monodevelop 5.9(GNU調試器?)
- 26. 使用GNU Make同時構建調試目標和發佈目標
- 27. 將函數調用作爲GNU Make的依賴關係的變量Make
- 28. GNU make - 如何獲得完整的命令行用於調用make
- 29. 自上次調用make後,GNU Make列出修改後的源文件?
- 30. GNU make-prune輸出等於較低級別的調試(或兩個調試輸出)
是不是有像詳細模式?難道你不能在每個目標上進行一些'echo'調試來弄清楚嗎? – Earlz 2009-11-17 00:58:48