在本章中,我们将研究Makefile的其他各种功能.
递归使用Make
递归使用 make 表示在makefile中使用 make 作为命令.当您需要为构成更大系统的各种子系统创建单独的makefile时,此技术非常有用.例如,假设您有一个名为`subdir'的子目录,它有自己的makefile,并且您希望包含目录的makefile在子目录中运行 make .你可以写下面的代码 :
subsystem: cd subdir && $(MAKE)or, equivalently: subsystem: $(MAKE) -C subdir
只需复制此示例即可编写递归 make 命令.但是,您需要了解它们的工作原理和原因,以及子制作如何与顶级制作相关.
将变量传递给子制作
顶级 make 的变量值可以通过显式请求通过环境传递给sub-make.这些变量在sub-make中定义为默认值.除非使用`-e'开关,否则不能覆盖sub-make makefile使用的makefile中指定的内容.
传递或导出变量 make 将变量及其值添加到环境中以运行每个命令.反过来,子make使用环境初始化其变量值表.
特殊变量SHELL和MAKEFLAGS总是被导出(除非你取消它们).如果您将MAKEFILES设置为任何内容,则会导出MAKEFILES.
如果要将特定变量导出到子品牌,请使用export指令,如下所示 :
export variable ...
如果要阻止变量导出,请使用undeport指令,如下所示 :
unexport variable ...
变量MAKEFILES
如果定义了环境变量MAKEFILES, make 会将其值视为其他makefile的名称列表(由空格分隔)在别人之前阅读.这与include伪指令非常相似:在各种目录中搜索这些文件.
MAKEFILES的主要用途是在 make 的递归调用之间进行通信./p>
包括来自不同目录的头文件
如果您已将头文件放在不同的目录中并且您正在运行 make 在不同的目录中,则需要提供头文件的路径.这可以使用makefile中的-I选项完成.假设functions.h文件在/home/IT roof/header文件夹中可用,其余文件在/home/IT roof/src/文件夹中可用,那么makefile将写成如下 :
INCLUDES = -I "/home/IT屋/header"CC = gccLIBS = -lmCFLAGS = -g -WallOBJ = main.o factorial.o hello.ohello: ${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 是相当于 OBJ = main.o factorial.o hello.o
从命令提示符运行Makefile
如果您准备了名为"Makefile"的Makefile ",然后只需在命令提示符下编写make,它将运行Makefile文件.但是如果你给Makefile任何其他名字,那么使用以下命令 :
make -f your-makefile-name