Makefile - 其他功能

在本章中,我们将研究 Makefile 的其他各种功能。

Make 的递归使用

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

subsystem:
   cd subdir && $(MAKE)

or, equivalently:
 	
subsystem:
   $(MAKE) -C subdir

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

将变量传达给子 make

顶级 make 的变量值可以通过显式请求通过环境传递给子 make。这些变量在子 make 中定义为默认值。除非使用"-e"开关,否则您无法覆盖子 make makefile 使用的 makefile 中指定的内容。

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

特殊变量 SHELL 和 MAKEFLAGS 始终被导出(除非您取消导出它们)。如果您将 MAKEFILES 设置为任何值,则它会被导出。

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

export variable ...

如果您想要阻止变量被导出,请使用 unexport 指令,如下所示 −

unexport variable ...

变量 MAKEFILES

如果定义了环境变量 MAKEFILES,make 会将其值视为在读取其他 makefile 之前要读取的其他 makefile 的名称列表(以空格分隔)。它的工作原理与 include 指令非常相似:在各个目录中搜索这些文件。

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

从不同目录包含头文件

如果您将头文件放在不同的目录中,并且在不同的目录中运行 make,则需要提供头文件的路径。这可以在 makefile 中使用 -I 选项来完成。假设 functions.h 文件位于 /home/tutorialspoint/header 文件夹中,其余文件位于 /home/tutorialspoint/src/ 文件夹中,则 makefile 将按以下方式编写 −

INCLUDES = -I "/home/tutorialspoint/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