Makefile - 其他功能

在本章中,我们将研究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 = 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 
是相当于
 OBJ = main.o factorial.o hello.o

从命令提示符运行Makefile

如果您准备了名为"Makefile"的Makefile ",然后只需在命令提示符下编写make,它将运行Makefile文件.但是如果你给Makefile任何其他名字,那么使用以下命令 :

 
 make -f your-makefile-name