cross_compile ?= arm-linux-gnueabihf-
target ?= bsp
cc := $(cross_compile)gcc #$(變數名)引用變數
ld := $(cross_compile)ld
objcopy := $(cross_compile)objcopy
objdump := $(cross_compile)objdump
#整個工程的.h頭檔案目錄,"\"表示換行符
incdirs := imx6ul \
bsp/clk \
bsp/led \
bsp/delay
#整個工程的所有.c和.s檔案
srcdirs := project \
bsp/clk \
bsp/led \
bsp/delay
# $(subst ,,) 將字串中的內容替換為# $(patsubst ,,) 和上面一樣但是多了"%".
# $(dir ) 提取目錄.如$(dir ) 還回/src.
# $(notdir ) 提取檔名.如$(notdir ) 還回a.c
# $(foreach , ,) 把引數中的單詞逐一取出來放到引數中,然後再執行所包含的表示式。
# 每次都會返回乙個字串,迴圈的過程中,中所包含的每個字串會以空格隔開,最後當整個迴圈結束時,
# 所返回的每個字串所組成的整個字串將會是函式 foreach 函式的返回值。
include := $(patsubst %, -i %, $(incdirs))
sfiles := $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.s))
cfiles := $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.c))
sfilendir := $(notdir $(sfiles))
cfilendir := $(notdir $(cfiles))
sobjs := $(patsubst %, obj/%, $(sfilendir:.s=.o))#放入obj資料夾
cobjs := $(patsubst %, obj/%, $(cfilendir:.c=.o))
objs := $(sobjs) $(cobjs)
vpath := $(srcdirs)
# "="變數的真實值取決於它所引用的變數的最後一次有效值.
#":="不會使用後面定義變數的值.
#"?="若前面沒有賦值則現在賦值.若已經賦值則用之前的值.
#"+="追加變數的內容.
.phony: clean #偽目標clean. 避免生成檔案,規則後面的命令會執行.
$(target).bin : $(objs)
$(ld) -timx6ul.lds -o $(target).elf $^
$(objcopy) -o binary -s $(target).elf $@
$(objdump) -d -m arm $(target).elf > $(target).dis
#"%"目標中表示對檔名的匹配.或者表示模式規則.
$(sobjs) : obj/%.o : %.s #所有的.c和.s檔案.
$(cc) -wall -nostdlib -c -o2 $(include) -o $@ $<
#$@表示表示匹配模式中定義的目標集合.
#$《符合模式的一系列檔案集合.
$(cobjs) : obj/%.o : %.c
$(cc) -wall -nostdlib -c -o2 $(include) -o $@ $<
clean:
rm -rf $(target).elf $(target).dis $(target).bin $(cobjs) $(sobjs)
#萬用字元「%」只能用在規則中,只有在規則中它才會展開,如果在變數定義和函式使用時,
#萬用字元不會自動展開,這個時候就要用到函式 wildcard,$(wildcard *.c) 功能和%一樣.
Makefile基礎語法入門
makefile 是一種常用於編譯的指令碼語言。它可以更好更方便的管理你的專案的 編譯,節約編譯時間 沒改動的檔案不編譯 注意 makefile 檔案命令必須是 makefile 或者 makefile,並使用 make 命令編譯。目標.依賴.命令1命令2 目標即要生成的檔案。如果目標檔案的更新時間...
makefile語法 Makefile的語法
假如乙個目標檔案所依賴的依賴檔案很多,我們豈不是要寫很多規則?這顯然不合乎常理。我們可以使用萬用字元解決這些問題。我們對上節程式進行修改 如下 test a.o b.o gcc o test o c gcc c o o 表示所用的.o檔案 c 表示所有的.c檔案 表示目標 表示所有依賴檔案 在該目錄...
makefile語法示例
edit main.o kbd.o cc o edit main.o kdb.o main.o main.c defs.h cc c main.c kbd.o kbd.c defs.h command.h cc c kbd.c clean rm o edit makefile中使用變數 object...