Make的递归使用
make的递归使用意味着在makefile中使用make作为命令。在大项目中,可以利用这项技术为各个子模块分离makefile,降低makefile复杂度。
例如,假设有一个名为“subdir”的子目录,有自己的makefile,现在要编译此目录下的源文件,可以通过以下方式调用子目录下的makefile:
subsystem:
cd subdir && $(MAKE)
也可以用下面的等价方式:
subsystem:
$(MAKE) -C subdir
给子make传递变量
上层make的变量可以通过导出传递给子make。在子make中除非使用’ -e’开关,否则无法覆盖这些变量。
要导出变量,make将变量添加到命令运行环境中,子make从运行环境中读取这些变量。
特殊变量SHELL
,MAKEFLAGS
,MAKEFILES
默认被导出(除非显示声明不导出)。
导出变量使用export
指令,如下所示
export variable...
阻止导出变量使用unexport
指令,如下所示
unexport variable ...
MAKEFILES 变量
变量MAKEFILES
的作用与include指令类似,可以把要包含的makefile 文件名列表(由空格分隔)赋值给MAKEFILES
,make会导入这些要包含的makefile。
一旦设置MAKEFILES
,MAKEFILES
就会被默认导出。
为头文件指定文件夹
如果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