makefile中不推荐使用sinclude

来源:互联网 发布:通达信软件使用教程 编辑:程序博客网 时间:2024/05/21 22:56

问题描述

实际功能

  1. 用gcc -M由main.c,fun1.c生成build/main.d build/fun1.d
  2. 自动include build/main.d build/fun1.d
  3. 用gcc -c由main.c,fun1.c生成build/main.o build/fun1.o

Makefile实现

Q :=@SRCS := main.c fun1.call: $(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 $$@.$$$$$$$$endefbuild_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) $$<endefbuild_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$ ls1.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.oDD fun1.cMakefile:6: main.o fun1.oxxx@ubuntu:~/ws/mk_sys/test2$ echo $?2

没有任何告警或错误!不去检查$?还不知道其实编译出错了。更要命的,错在哪啊?这不是我们想要的结果

改进

将-include或sinclude换成include,运行结果如下

xxx@ubuntu:~/ws/mk_sys/test2$ make Makefile:6: main.o fun1.oMakefile:35: build/main.d: No such file or directoryMakefile:35: build/fun1.d: No such file or directoryDD fun1.cDD main.cMakefile:6: main.o fun1.oCC main.cCC 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 所支持的方式)。
0 0
原创粉丝点击