教程 > makefile > 阅读:23

makefile 其他功能——迹忆客-ag捕鱼王app官网

在本章中,我们将研究 makefile 的各种其他特性。

递归使用 make

make 的递归使用意味着将 make 作为 makefile 中的命令使用。 当我们需要为组成更大系统的各种子系统创建单独的 makefile 时,此技术很有用。 例如,假设我们有一个名为“subdir”的子目录,它有自己的 makefile,并且我们希望包含目录的 makefile 在子目录上运行 make。 我们可以通过编写以下代码来完成

subsystem:
   cd subdir && $(make)
or, equivalently:
     
subsystem:
   $(make) -c subdir

我们只需复制此示例即可编写递归 make 命令。 但是,我们需要了解它们的工作原理和原因,以及子 make 与父级make 的关系。


将变量传递给 sub-make

顶层 make 的变量值可以通过显式请求通过环境传递给子 make。 这些变量在子 make 中定义为默认值。 除非使用-e开关,否则不能覆盖子 make 生成文件使用的生成文件中指定的内容。

要向下传递或导出变量,make 会将变量及其值添加到运行每个命令的环境中。 sub-make 反过来使用环境来初始化它的变量值表。

特殊变量 shellmakeflags 总是被导出(除非你取消导出它们)。 如果我们将其设置为任何内容,则会导出 makefiles

如果要将特定变量导出到子 make,请使用导出指令,如下所示

export variable ...

如果要防止导出变量,请使用 unexport 指令,如下所示

unexport variable ...

变量 makefiles

如果定义了环境变量 makefiles,make 将其值视为要在其他 makefile 之前读取的附加 makefile 的名称列表(以空格分隔)。 这很像 include 指令:在各种目录中搜索这些文件。

makefiles 的主要用途是在 make 的递归调用之间进行通信。


包含来自不同目录的头文件

如果你把头文件放到了不同的目录下,并且在不同的目录下运行 make,那么需要提供头文件的路径。 这可以在 makefile 中使用 -i 选项来完成。 假设 functions.h 文件在 /home/jiyik/header 文件夹中可用,其余文件在 /home/jiyik/src/ 文件夹中可用,那么 makefile 将编写如下

includes = -i "/home/jiyik/header"
cc = gcc
libs =  -lm
cflags = -g -wall
obj =  main.o factorial.o hello.o
hello: ${obj}
   ${cc} ${cflags} ${includes} -o $@ ${objs} ${libs}
.cpp.o:
   ${cc} ${cflags} ${includes} -c $<

向变量附加更多文本

向已定义的变量的值添加更多文本通常很有用。 我们可以使用包含 = 的行来执行此操作,如下所示

objects  = another.o

它获取变量对象的值,并向其添加文本“another.o”,前面有一个空格,如下所示。

objects = main.o hello.o factorial.o
objects  = another.o

上面的代码将对象设置为“main.o hello.o factorial.o another.o”。

使用 = 类似于:

objects = main.o hello.o factorial.o
objects := $(objects) another.o

makefile 中的分隔行

如果你不喜欢 makefile 中的行太大,那么你可以使用反斜杠 “\”来分隔行,如下所示

obj =  main.o factorial.o \
   hello.o
is equivalent to
obj =  main.o factorial.o hello.o

从命令提示符运行 makefile

如果我们已经准备好名称为“makefile”的 makefile,那么只需在命令提示符下编写 make,它将运行 makefile 文件。 但是,如果我们为 makefile 指定了任何其他名称,则使用以下命令

make -f your-makefile-name

查看笔记

扫码一下
查看教程更方便
网站地图