Makefile - 其他功能
在本章中,我们将研究 Makefile 的各种其他功能。
递归使用 Make
递归使用make意味着在 makefile 中使用make作为命令。当您需要为构成较大系统的各个子系统使用单独的 makefile 时,此技术非常有用。例如,假设您有一个名为“subdir”的子目录,它有自己的 makefile,并且您希望包含目录的 makefile在该子目录上运行make 。您可以通过编写以下代码来做到这一点 -
subsystem: cd subdir && $(MAKE) or, equivalently: subsystem: $(MAKE) -C subdir
您只需复制此示例即可编写递归make命令。但是,您需要了解它们的工作原理和原因,以及子品牌如何与顶级品牌相关。
将变量传递给子品牌
顶级make的变量值可以通过显式请求通过环境传递给子make。这些变量在子 make 中定义为默认值。除非使用“-e”开关,否则不能覆盖子 make makefile 使用的 makefile 中指定的内容。
要传递或导出变量,make将变量及其值添加到运行每个命令的环境中。子 make 反过来使用环境来初始化其变量值表。
特殊变量 SHELL 和 MAKEFLAGS 始终被导出(除非您取消导出它们)。如果您将其设置为任何值,则 MAKEFILES 会被导出。
如果要将特定变量导出到子 make,请使用导出指令,如下所示 -
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