递归使用 make
递归使用 make
的方式即在 Makefile 中将 **make**
用作命令。这个用法的主要用途是将一个大系统的拆成多个子系统组合编译时。比如说,你有一个名为 `subdir’ 的子目录,它有自己的 Makefile,并且您希望在包含 Makefile 的子目录上运行 make。
那么可以通过这个来做到这一点:
subsystem:
cd subdir && $(MAKE)
#或者,等效的
subsystem:
$(MAKE) -C subdir
export变量到子make
make
通过明确的请求可以将顶层 make 的变量值传递给子 make 的环境。这些变量在子 make 中被定义为默认值。你不能重写被子 make 的 Makefile 所使用的变量(除非你执行的时候使用`-e’ 开关)。
为了传递或导出变量,make
会将该变量和它的值添加到每个运行命令的环境中。而子 make 会顺序的根据环境来初始化它的变量表。
特殊变量 SHELL 和 MAKEFLAGS 总是被导出(除非你明确的阻止)。只要设置了 MAKEFILES 的内容,它就会被导出。
如果您想要将指定变量导出到子 make 中,请使用 export 指令,如图所示:
export variable ...
如果您想阻止变量被导出,请使用 unexport 指令,如图所示:
unexport variable ...
变量 MAKEFILES
如果定义了环境变量MAKEFILES,则将make
其值视为其他makefile的名称列表(以空格分隔),以便在其他makefile之前读取。这与include指令非常相似:搜索各种目录以查找这些文件。
MAKEFILES的主要用途是在递归调用之间进行通信make
。
引入不同目录的头文件
如果你将头文件放在不同的目录中并且在在不同的目录中运行make
,则需要提供头文件的路径。这可以在 Makefile 中使用 -I选项完成。
假设 functions.h 文件在 /home/tutorialspoint/头文件夹中可用,其余文件在/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 $<
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