一個Makefile的進化(三)
makefile配置分離與交叉編譯設置
目標:
1.分離makefile的配置
2.增加交叉編譯的例子
3.增加定制顯示輸出的變量Q
string@asus:~/Projects/makefile$ tree
.
├── config.mk
├── include
│ └── test.h
├── Makefile
├── rule.mk
└── src
├── Makefile
├── test.c
└── test_fun1.c
上一篇已經完成一個比較成熟的Makefile, 但是為了讓配置更容易,特地的在本片進一步修改官辈,使期更加方便配置赞哗,看起來更加清晰明了
先放代碼
主Makefile
include config.mk
include rule.mk
all:$(OUTDIR) .build.stamp
$(OUTDIR):
$Qmkdir $@
@echo creat:"$@"
.build.stamp: $(OBJS)
$(Q) $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $(OUTDIR)/$(PROJECT)
@echo link "\e[32;1m[$(PROJECT)]:$^"
$(Q) touch $@
clean:
$(Q) $(RM) .build.stamp
$(Q) rm -rf $(OUTDIR)
echo clean all
.PHONY : clean
rule.mk
PROJECT:= $(notdir $(SRCDIR))
include $(SRCDIR)/Makefile
OBJS=$(addprefix $(OUTDIR)/,$(OBJ))
$(OUTDIR)/%.o:$(SRCDIR)/%.c
$(Q) $(COMPILE.c) $(OUTPUT_OPTION) $<
@echo compile [$(PROJECT)]:$<
config.mk
Q:=@
CPPFLAGS:=-Iinclude
#CC=arm-linux-gnueabi-gcc
OUTDIR:=out
SRCDIR:=src
分離原則
所有的生成規(guī)則放在rule.mk
所有的字符串拼接放在rule.mk
所有的變量賦值放在config.mk
代碼解釋:
在主Makefile包含兩個配置mk廓译,注意順序不能變术唬,因為在config.mk中有rule.mk需要的變量捺癞,有時候在實際工作中發(fā)現(xiàn)明明修改了一個變量的值但是卻不生效,很可能是這個原因引起的
清注意一下config.mk的下面幾行
Q:=@
#CC=arm-linux-gnueabi-gcc
這幾行是對變量的賦值,第一個賦值是在make的時候信息顯示開關變量申窘,用于控制make的時候的輸出內容,
第二個變量是在交叉編譯的時候對編譯連進行賦值孔轴,有了這一行就可以生成arm下可以運行的二進制剃法,這里默認將其注釋了,如果要編譯arm版的路鹰,刪除注釋即可
演示中我已經刪除注釋贷洲,下面是make后的輸出結果
string@asus:~/Projects/makefile$ make
creat:out
compile [test]:src/test.c
compile [test]:src/test_fun1.c
link [test]:out/test.o out/test_fun1.o
string@asus:~/Projects/makefile$ file out/test
out/test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=9bfee606c64bb9989671ffdee00660e4a26b7da8, not stripped
string@asus:~/Projects/makefile$
在這里我特意使用file看了以下文件的屬性,注意生成的文件是ARM 版的文件
至此這篇已經結束
這篇的Makefile已經可以在設計工作中使用了晋柱,可能需要稍做修改优构,希望這篇文章可以幫助大家學習Makefile