make 调试和传参
在makefile文件中可以預先使用一個未定義的變量,在執(zhí)行make時再傳遞值
# Debug build flags
ifeq ($(dbg),1)
? ? ? NVCCFLAGS += -g -G
? ? ? TARGET := debug
else
? ? ? TARGET := release
endif
執(zhí)行
make dbg=1
就會編譯中添加-g -G的debug信息
執(zhí)行
make
就是直接編譯
http://blog.csdn.net/skywalkzf/article/details/6926395
通常我們需要看看自己的編寫的makefile是否有錯誤,命令是否正確,執(zhí)行順序是否使我們期望的方式,這里就需要使用makefile的參數(shù)。
-n
--just-print
--dry-run
--recon
不執(zhí)行參數(shù),這些參數(shù)只是打印命令,不管目標是否更新,把規(guī)則和連帶規(guī)則的命令打印出來,但不執(zhí)行。
make -n 就會輸出執(zhí)行的具體指令
-t
--touch
這個參數(shù)的意思就是把目標文件的時間更新,但不更改目標文件。也就是說,make假裝編譯沒標,但不是真正的編譯目標,只是把目標變成已經(jīng)編譯的狀態(tài)。
-q
--question
這個參數(shù)的行為是找目標的意思,也就是說,如果目標存在,那么其他什么也不會輸出,當然也不會執(zhí)行編譯,如果目標不存在,則會打印出一條出錯信息
-W <file>
--waht-if=<file>
--assume-new=<file>
--new-file=<file>
這個參數(shù)需要指定一個文件。一般是源文件(或依賴文件),make會根據(jù)規(guī)則推導來運行依賴于這個文件的命令,一般來說,可以和“-n”參數(shù)一同使用,來查看這個依賴文件鎖發(fā)生的規(guī)則命令。
-b
-m
這兩個參數(shù)的作用是忽略和其他版本make的兼容性
-B
--always-make
認為所有的目標都需要重新更新(重編譯)
-C <dir>
--directory=<dir>
指定讀取makefile的目錄。如果有多個-C參數(shù),make的解釋是后面的路徑以前面的作為相對路徑,并以最后的目錄作為被指定目錄。如:"make -C ~/test -C prog"等價于"make -C ~/test/prog"
-d
--debug[=<options>]
輸出make的調(diào)試信息。它有幾種不同的級別可供選擇,如果沒有參數(shù),那就是輸出最簡單的調(diào)試信息,下面是<option>的取值:
a ----- 也就是all,輸出所有的調(diào)試信息
b ----- basic,值輸出簡單的調(diào)試信息。即輸出不需要重編譯的目標
v ----- verbose,在b選項的級別之上。輸出的信息包括哪個makefile被解析,不需要被重編譯的依賴文件(或是依賴目標)等
i ----- implicit,輸出所有的隱含規(guī)則
j ----- jobs,輸出執(zhí)行規(guī)則中命令的詳細信息,如命令的PID,返回碼等
m ----- makefile,輸出make讀取makefile,更新makefile,執(zhí)行makefile的信息
-e
--environment-overrides
指明環(huán)境變量的值覆蓋makefile中定義的變量的值
-f=<file>
--file=<file>
--makefile=<file>
指定需要執(zhí)行的makefile
-h
--help
顯示幫助信息
-i
--ignore-errors
在執(zhí)行時忽略所有的錯誤
-I <dir>
--include-dir=<dir>
指定一個被包含makefile的搜索目標??梢允褂枚鄠€"-I"參數(shù)來指定多個目標
-j [<jobsnum>]
--jobs[=<jobsnum>]
指同時運行命令的個數(shù)。如果沒有這個參數(shù),make運行命令時能運行多少就運行多少。如果有一個以上的“-j”參數(shù),那么僅最后一個“-j”才是有效的。
-k
--keep-going
出錯也不停止運行。如果一個目標失敗了,那么依賴于其上的目標就不會被執(zhí)行了
-l <load>
--load-average[=<load>]
--max-load[=<load>]
指定make運行命令的負載
-n
--just-print
--dry-run
--recon
僅輸出執(zhí)行過程中的命令序列,但并不執(zhí)行
-o <file>
--old-file=<file>
--assume-old=<file>
不重新生成的指定的<file>,即使這個目標的依賴文件新于他
-p
--print-data-base
輸出makefile中的所有信息,包括所有的規(guī)則和變量。這個參數(shù)會讓一個簡單的makefile都會輸出一堆信息。如果你只是想輸出信息而不想執(zhí)行makefile,你可以使用"make -qp"命令。如果你想查看執(zhí)行makefile前的預設變量和規(guī)則,你可以使用“make -p -f /dev/null"。這個參數(shù)輸出的信息包含著你的makefile文件的文件名和行號,所以,用這個參數(shù)來調(diào)試你的makefile會是很有用的,特別是當你的環(huán)境變量很復雜的時候。
-q
--question
不運行命令,也不輸出。僅僅是檢查所指定的目標是否需要更新。如果是0,則說明要更新,如果是2則說明是有錯誤發(fā)生。
-r
--no-builtin-rules
禁止make使用任何隱含規(guī)則
-R
--no-builtin-variabes
禁止make使用任何作用于變了上的隱含規(guī)則
-s
--silent
--quiet
在命令運行時不輸出命令的輸出
-S
--no-keep-going
--stop
取消-k選項的作用。因為有些時候,make的選項是從環(huán)境變量”MAKEFLAGS“中繼承下來的,所以你可以在命令行中使用這個參數(shù)來讓環(huán)境變量中的-k選項失效
-t
--touch
相當于UNIX的touch命令,只是把目標的修改日期變成最新的,也就是阻止生成目標的命令運行
-v
--version
輸出make程序的版本,版權等關于make的信息
-w
--print-directory
輸出運行makefile之前和之后的信息,這個參數(shù)對于跟蹤嵌套式調(diào)用make時很有用
--no-print-directory
禁止-w選項
-W <file>
--what-if=<file>
--new-file=<file>
--assume-file=<file>
假定目標<file>需要更新,如果和”-n“選項使用,那么這個參數(shù)就會輸出該目標更新時的運行動作。如果沒有”-n“那么就像運行UNIX的”touch“命令一樣,使得<file>的修改時間為當前時間
--warn-undefined-variables
只要make發(fā)現(xiàn)有未定義的變量,那么就輸出警告信息
Thanks for CoolShell!
全部來自于《跟我一起寫Makefile》,這里只是我的一個筆記,提醒自己有這些東西。
Have Fun!
ver = debug
ifeq ($(ver), debug)
ALL: test_d
CXXFLAGS = -c -g -Ddebug
else
ALL: test_r
CXXFLAGS = -c -O3?
endif
test_d: test.do
? ? g++ -o $@ $^
test_r: test.ro
? ? g++ -o $@ $^
%.do: %.cpp
? ? g++ $(CXXFLAGS) $< -o $@
%.ro: %.cpp
? ? g++ $(CXXFLAGS) $< -o $@
添加debug符合只要在編譯成.o文件時添加就行,在鏈接階段不用添加
總結
以上是生活随笔為你收集整理的make 调试和传参的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何调试bash脚本
- 下一篇: java.util.concurrent