makefile中不推荐使用sinclude
2015-12-20 12:51
239 查看
问题描述
实际功能
用gcc -M由main.c,fun1.c生成build/main.d build/fun1.d自动include build/main.d build/fun1.d
用gcc -c由main.c,fun1.c生成build/main.o build/fun1.o
Makefile实现
Q :=@ SRCS := main.c fun1.c all: $(addprefix build/,$(SRCS:.c=.o)) $(warning $(SRCS:.c=.o)) define _build_gen_deps_rule $(addprefix $(4)/,$(1:.$(2)=.d)): $(4)/%.d:%.$(2) $$(Q)echo DD $$< $$(Q)mkdir -p $$$$(dirname $$@) $$(Q)$$(CC) -M $(3) $$< > $$@.$$$$$$$$;\ sed 's,\($$(shell basename $$*)\)\.o[ :]*,$$(shell dirname $$@)/\1.o $$@:,g' < $$@.$$$$$$$$ > $$@;\ rm -f $$@.$$$$$$$$ endef build_gen_deps_rule=\ $(eval $(call _build_gen_deps_rule,$(SRCS),c,,build)) define _build_gen_c_obj_rule $(addprefix $(4)/,$(1:.$(2)=.o)): $(4)/%.o:%.$(2) $$(Q)echo CC $$< $$(Q)mkdir -p $$$$(dirname $$@) $$(Q)$$(CC) -o $$@ -c $(3) $$< endef build_gen_c_obj_rule= $(eval $(call _build_gen_c_obj_rule,$(SRCS),c,,build)) $(call build_gen_deps_rule) $(call build_gen_c_obj_rule) -include $(addprefix build/,$(SRCS:.c=.d))
问题
将main.c删除,得到如下支行结果xxx@ubuntu:~/ws/mk_sys/test2$ ls 1.txt fun1.c main2.c main.c~ Makefile Makefile~ t1 t1.mk t1.mk~ xxx@ubuntu:~/ws/mk_sys/test2$ make Makefile:6: main.o fun1.o DD fun1.c Makefile:6: main.o fun1.o xxx@ubuntu:~/ws/mk_sys/test2$ echo $? 2
没有任何告警或错误!不去检查$?还不知道其实编译出错了。更要命的,错在哪啊?这不是我们想要的结果
改进
将-include或sinclude换成include,运行结果如下xxx@ubuntu:~/ws/mk_sys/test2$ make Makefile:6: main.o fun1.o Makefile:35: build/main.d: No such file or directory Makefile:35: build/fun1.d: No such file or directory DD fun1.c DD main.c Makefile:6: main.o fun1.o CC main.c CC fun1.c
虽然第一次编译运行时,make会抱怨,但宁可这样,也不要到时被搞得莫名其妙,找不到原因
include与-include或sinclude的区别
如 果 指 示 符 “ include ” 指 定 的 文 件 不 是 以 斜 线 开 始 ( 绝 对 路 径 , 如/usr/src/Makefile...),而且当前目录下也不存在此文件; make将根据文件名试图在以下几个目录下查找:首先,查找使用命令行选项“-I”或者“--include-dir”(参考 9.7make的命令行选项 一节)指定的目录,如果找到指定的文件,则使用这个文件;否则继续依此搜索以下几个目录(如果其存在):“/usr/gnu/include”、“/usr/local/include”和“/usr/include”。 当在这些目录下都没有找到“include”指定的文件时, make将会提示一个包含文件未找到的告警提示,但是不会立刻退出。而是继续处理Makefile的后续内容。当完成读取整个Makefile后, make将试图使用规则来创建通过指示符“include”指定的但未找到的文件(参考 3.7 makefile文件的重建 一节),当不能创建它时(没有创建这个文件的规则), make将提示致命错误并退出。会输出类似如下错误提示: Makefile:错误的行数:未找到文件名:提示信息(No such file or directory) Make: *** No rule to make target ‘<filename>’. Stop 通常我们在 Makefile 中可使用“-include”来代替“include”,来忽略由于包含文件不存在或者无法创建时的错误提示(“-”的意思是告诉 make,忽略此操作的错误。make 继续执行)。像下边那样: -include FILENAMES... 使用这种方式时,当所要包含的文件不存在时不会有错误提示、 make 也不会退出;除此之外,和第一种方式效果相同。以下是这两种方式的比较: 使用“include FILENAMES...”, make 程序处理时,如果“FILENAMES”列表中的任何一个文件不能正常读取而且不存在一个创建此文件的规则时 make 程序将会提示错误并退出。 使用“-include FILENAMES...”的情况是,当所包含的文件不存在或者不存在一个规则去创建它, make 程序会继续执行,只有真正由于不能正确完成终极目标的重建时(某些必需的目标无法在当前已读取的 makefile 文件内容中找到正确的重建规则),才会提示致命错误并退出。 为了和其它的 make 程序进行兼容。也可以使用“sinclude”来代替“-include”( GNU 所支持的方式)。
相关文章推荐
- Linux/Unix环境下的Make和Makefile详解
- Python实现生成简单的Makefile文件代码示例
- (转)自动生成 Makefile 的全过程详解
- u-boot的Makefile分析
- 关于linux模块驱动简单的Makefile
- 编译单个驱动的Makefile文件。
- makefile完全教程
- Linux内核Makefile文件
- Linux内核的Makefile
- Makefile 文件的相关知识(2)
- 使用AutoMake轻松生成Makefile
- 学习写 Makefile
- makefile之环境变量MAKEFILES
- 一起写 Makefile
- u-boot的Makefile分析435557749
- MakeFile
- MakeFile详解
- Linux内核makefile解析
- linux 2.6内核makefile分析
- makefile经典实例