递归使用 make

递归使用 make 的方式即在 Makefile 中将 **make** 用作命令。这个用法的主要用途是将一个大系统的拆成多个子系统组合编译时。比如说,你有一个名为 `subdir’ 的子目录,它有自己的 Makefile,并且您希望在包含 Makefile 的子目录上运行 make。
那么可以通过这个来做到这一点:

  1. subsystem:
  2. cd subdir && $(MAKE)
  3. #或者,等效的
  4. subsystem:
  5. $(MAKE) -C subdir

可以基于这个例子来编写递归make命令。

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