做项目去了,然后发现一个星期前学的东西快忘光了,翻翻以前的代码回忆一下。
这是makefile不涉及指令的字符串预处理部分,首先明确目标,需要的字符串有以下:
arm-linux-guneabihf-gcc 交叉编译器编译指令
arm-linux-guneabihf-ld 交叉编译器链接指令
arm-linux-guneabihf-objcopy 交叉编译器elf转bin指令
arm-linux-guneabihf-objdump 交叉编译器elf转dis指令(反编译)
所有的.o文件名
汇编.s文件编译的.o文件名
c语言.c文件编译的.o文件名
所有的源文件文件路径
所有的”-I 头文件文件路径“
然后看几个字符串处理函数的用法
$(patsubst %, -I %, $(INCDIRS))代表找出$(INCDIRS)中的单词并在前面加-I
$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))代表找到源文件路径中的所有.s文件并以空格隔开组成新的字串
$(notdir $(SFILES))代表去掉文件路径,只留下文件名
VPATH := $(SRCDIRS)
.PHONY: clean
VPATH和.PHONY是makefile的两个关键字,一个指定脚本搜索文件的路径,一个指定伪指令名字
然后就是有关规则的部分
默认目标文件部分和clean伪指令没有使用特殊模式不必多说
编译部分使用了makefile的静态模式需要留意,关于静态模式
$(SOBJS) : obj/%.o : %.S
前面把$(SOBJS)处理成由.S文件编译生成的.o文件文件名(包含路径如obj/start.o)
而目标模式则是搜寻所有符合obj/%.o的单词,显然字串的所有单词都符合
依赖模式则为需要生成的.o文件依赖的所有.S文件(不包含路径)因为前面设置了VPATH,所以makefile会自动帮我们搜寻,而之所以要在.o文件前加路径,是因为我们想指定生成.o文件后的存放路径