📅  最后修改于: 2020-11-01 04:38:41             🧑  作者: Mango
在本章中,我们将研究Makefile的各种其他功能。
递归使用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指令,如下所示:
export variable ...
如果要防止导出变量,请使用unexport指令,如下所示:
unexport variable ...
如果定义了环境变量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中的大行,则可以使用反斜杠“ \”来中断行,如下所示-
OBJ = main.o factorial.o \
hello.o
is equivalent to
OBJ = main.o factorial.o hello.o
如果已经准备了名称为“ Makefile”的Makefile,则只需在命令提示符下编写make,它将运行Makefile文件。但是,如果您给Makefile赋予了其他任何名称,请使用以下命令-
make -f your-makefile-name