1.常用參數:
-f : 指定makefile的名稱,這樣,就可以不用makefile做爲規則文件的名字了。
-i : 使make程序忽略運行時的錯誤,繼續運行。
-C: 指定目錄運行make ; make -C dir
-j: 多線程編譯 -j 8
-I dir, --include-dir=dir 指定一個目錄作爲make.include的頭文件
-n 不執行make,但是打印所有命令行, 即時使用了 @ 在命令前
-p 打印當前 環境下 包含自定義的 所有規則 信息,可以用於debug
-s silence mode
-t make touch it
2. 語法
$@: 規則中的目標名
$<: 規則中的依賴項目,只代表規則所有依賴項目中的<第一項>!$^: 規則中所有的依賴項目。
$?: 規則中時間新於目標的依賴項目
函數:
abc -> abc.o -> dir/abc.o
$(addprefix $(DIR), $(addsuffix .o, $(SRC)))
對於一些操作,也可以預定義好,在使用的地方直接引用
DO_CLEAN = $(RM) -frv $(TARGET_BIN) $(OBJS)
makefile:
clean:
$(DO_CLEAN)
默認規則摘要:
1. *.c ==> * 直接將.c 編譯成exe
%: %.c | 431 # commands to execute (built-in):
# commands to execute (built-in): | 432 $(TEX) $<
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
應用: 只有一個源文件時:
all: src_file_no_suffix
clean:
$(RM) -rfv src_file_no_suffix *.o
2. %.c ==> %.o
編譯器: C
編譯選項 CFLAGS
3. %.cc ==> %.o
4. %.cpp ==> %.o
編譯器: CXX
編譯選項 CXXFLAGS CPPFLAGS
new_in:
1. define 操作
類似於宏, 可以放在include的地方,做一些執行類的操作
一般的執行類操作只能放在 標號所在位置
define macro_ok
[tab] echo "OK"
[tab] echo $1
endef
使用 call 函數來調用 define
$(call macro_ok, arg1, arg2)
2. MAKEFILE_LIST
現在已經載入的所有 文件, 第一個就是自己, 後續都是include出來的文件名稱
3. abspath
4. filter && filter-out
$(filter-out $(MK_SELF), $(MAKEFILE_LIST)
把 MK_SELF從 MAKEFILE_LIST中刪除掉
5. firstword, lastword
獲取列表中的 第一個,或者最後一個字符
6. ifreq ifudef ifdef
6.1 ifudef str
endif
as
if( str == "undefined")
6.2 ifreq ($str, "hello")
VAR=....
all:
ops
endif
7. shell 獲取 文件絕對路徑
abspath=$(cd `dirname $MAKE_PATH` ; pwd)
echo $abspath
example:
Makefile.root.include
#-- for deduce the abspath of the project root
MK_ROOT_INC_DIR := $(dir $(word 2, $(MAKEFILE_LIST)))
MK_ROOT_INC_RELATE_TO_SRC_ROOT := ..
SRC_ROOT_DIR := $(abspath $(MK_ROOT_INC_DIR)$(MK_ROOT_INC_RELATE_TO_SRC_ROOT))
Makefile
include ../../mk/Makefile.root.include
all:$(TARGET_BIN)
@echo $(MAKEFILE_LIST)
@echo $(MK_ROOT_INC_DIR)
@echo $(MK_ROOT_INC_RELATE_TO_SRC_ROOT)
@echo $(MK_ROOT_INC_DIR)$(MK_ROOT_INC_RELATE_TO_SRC_ROOT)
@echo $(SRC_ROOT_DIR)