makefile語法基礎。

2021-10-01 05:45:28 字數 2120 閱讀 6478

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...