浅显易懂 Makefile 入门 (09)— include 文件包含、MAKECMDGOALS

1. include文件包含

make 读取到 include 关键字的时候,会暂停读取当前的 Makefile,而是去读 include 包含的文件,读取结束后再继读取当前的 Makefile 文件。

include 使用的具体方式如下:

include <filenames>

filenamesshell 支持的文件名(可以使用通配符表示的文件)。

注意:include 关键字所在的行首可以包含一个或者是多个的空格(读取的时候空格会被自动的忽略),但是不能使用 Tab 开始,否则会把 include 当作式命令来处理。
包含的多个文件之间要使用空格分隔开。使用 include 包含进来的 Makefile 文件中,如果存在函数或者是变量的引用,它们会在包含的 Makefile 中展开。

include 通常使用在以下的场合:

  • 在一个工程文件中,每一个模块都有一个独立的 Makefile 来描述它的重建规则。它们需要定义一组通用的变量定义或者是模式规则。通用的做法是将这些共同使用的变量或者模式规则定义在一个文件中,需要的时候用 include 包含这个文件。
  • 当根据源文件自动产生依赖文件时,我们可以将自动产生的依赖关系保存在另一个文件中。然后在 Makefile 中包含这个文件。

注意:如果使用 include 包含文件的时候,指定的文件不是文件的绝对路径或者是为当前文件下没有这个文件,make 会根据文件名会在以下几个路径中去找,

  • 首先我们在执行 make 命令的时候可以加入选项 -I--include-dir 后面添加上指定的路径,如果文件存在就会被使用;
  • 如果文件不存在将会在其他的几个路径中搜索:usr/local/includeusr/include

如果在上面的路径没有找到 include 指定的文件,make 将会提示一个文件没有找到的警示提示,但是不会退出,而是继续执行 Makefile 的后续的内容。

当完成读取整个 Makefile 后,make 将试图使用规则来创建通过 include 指定但不存在的文件。当不能创建的时候,文件将会保存退出。

使用时,通常用 -include 来代替 include 来忽略文件不存在或者是无法创建的错误提示,使用格式如下:

-include <filename>

使用方法和 include 的使用方法相同。

这两种方式之间的区别:

  • include <filenames>make 在处理程序的时候,文件列表中的任意一个文件不存在的时候或者是没有规则去创建这个文件的时候,make 程序将会提示错误并保存退出;
  • -include <filenames>,当包含的文件不存在或者是没有规则去创建它的时候,make 将会继续执行程序,只有真正由于不能完成终极目标重建的时候我们的程序才会提示错误保存退出;

2. 使用示例

目录结构如下:

wohu@ubuntu:~/cpp/func$ ls
common_variable  demo.cpp  demo.h  Makefile

common_variable 内容如下:

a = 11
b = 22
c = 33

Makefile 内容如下:

include common_variable
all:
	echo $(a) $(b) $(c)

执行 make 之后

wohu@ubuntu:~/cpp/func$ make
echo 11 22 33
11 22 33
wohu@ubuntu:~/cpp/func$ 

3. MAKECMDGOALS

make 在执行时会设置一个特殊变量 – MAKECMDGOALS ,该变量记录了命令行参数指定的终极目标列表,没有通过参数指定终极目标时此变量为空。

ifeq ($(MAKECMDGOALS), aa cc)
obj = aa cc
else ifeq ($(MAKECMDGOALS), bb)
obj = bb
else
obj = other
endif

aa:
	@echo $(obj)
bb:
	@echo $(obj)
cc:
	@echo $(obj)
other:
	@echo $(obj)

执行 make 结果

wohu@ubuntu:~/cpp/func$ make aa cc
aa cc
aa cc
wohu@ubuntu:~/cpp/func$ make aa
other
wohu@ubuntu:~/cpp/func$ make bb
bb
wohu@ubuntu:~/cpp/func$ make cc
other
wohu@ubuntu:~/cpp/func$ 

猜你喜欢

转载自blog.csdn.net/wohu1104/article/details/111085894
今日推荐