Makefile – 其他特性

Make的递归使用

make的递归使用意味着在makefile中使用make作为命令。在大项目中,可以利用这项技术为各个子模块分离makefile,降低makefile复杂度。

例如,假设有一个名为“subdir”的子目录,有自己的makefile,现在要编译此目录下的源文件,可以通过以下方式调用子目录下的makefile:

subsystem:
    cd subdir && $(MAKE)

也可以用下面的等价方式:

subsystem:
    $(MAKE) -C subdir

给子make传递变量

上层make的变量可以通过导出传递给子make。在子make中除非使用’ -e’开关,否则无法覆盖这些变量。

要导出变量,make将变量添加到命令运行环境中,子make从运行环境中读取这些变量。

特殊变量SHELLMAKEFLAGSMAKEFILES默认被导出(除非显示声明不导出)。

导出变量使用export指令,如下所示

export variable...

阻止导出变量使用unexport指令,如下所示

unexport variable ...

MAKEFILES 变量

变量MAKEFILES的作用与include指令类似,可以把要包含的makefile 文件名列表(由空格分隔)赋值给MAKEFILES,make会导入这些要包含的makefile。

一旦设置MAKEFILESMAKEFILES就会被默认导出。

为头文件指定文件夹

如果Makefile中需要包含其他文件夹的头文件,可以使用编译器的-I选项,指定头文件所在的文件夹。

例如,functions.h文件在/home/qikegu/header文件夹中,其余文件在/home/qikegu/src/文件夹中,Makefile如下:

INCLUDES = -I "/home/qikegu/header"
CC = gcc
LIBS =  -lm
CFLAGS = -g -Wall
OBJ =  main.o factorial.o hello.o

hello: ${OBJ}
   ${CC} ${CFLAGS} ${INCLUDES} -o $@ ${OBJS} ${LIBS}

向变量添加更多文本

Makefile中,有种常见场景是给已有变量添加文本,这个可通过 +=实现:

objects = main.o hello.o factorial.o
objects += another.o

objects的值为: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


浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载