Makefile中的子目录和递归构建

一 子目录规则

在多目录项目中,我们通常希望能够在每个子目录中维护独立的Makefile,并能够通过主目录的Makefile来主动调用子目录的Makefile。为此,我们需要在主Makefile中添加子目录规则

1 添加子目录规则

主Makefile中可以通过include关键字来引入子目录的Makefile。在主Makefile中添加子目录规则的语法如下:

include 子目录路径/Makefile

举例:

project/
|-- Makefile
|-- src/
| |-- main.c
| |-- utils.c
| |-- Makefile
|-- lib/
| |-- lib1.c
| |-- lib2.c
| |-- Makefile
在主目录Makefile中,我们可以使用以下方式添加子目录规则:
include src/Makefile
include lib/Makefile

子目录Makefile示例

在子目录的Makefile中,我们可以定义该子目录下的编译规则、依赖关系和目标文件等。例如,在src目录下的Makefile中,我们可以这样写:

# 定义源文件和目标文件
SRCS := main.c utils.c
OBJS := $(SRCS:.c=.o)

# 定义编译器和编译选项
CC := gcc
CFLAGS := -Wall -O2

# 定义目标文件
TARGET := myapp

# 定义编译规则
$(TARGET): $(OBJS)
    $(CC) $(CFLAGS) $^ -o $@

# 定义clean规则
clean:
    rm -f $(OBJS) $(TARGET)

2 递归构建

(某些情况下,可以省略 include 步骤)
在包含了子目录的Makefile后,我们可以通过递归调用make命令来构建子目录中的目标。为了在递归构建中传递变量,我们可以使用$(MAKE)变量。

递归构建示例
在主Makefile中,我们可以这样定义一个递归构建规则:

all:
    $(MAKE) -C src
    $(MAKE) -C lib

在上述示例中, ( M A K E ) − C s r c 表示调用 s r c 目录下的 M a k e f i l e 构建目标; (MAKE) -C src表示调用src目录下的Makefile构建目标; (MAKE)Csrc表示调用src目录下的Makefile构建目标;(MAKE) -C lib表示调用lib目录下的Makefile构建目标。

你可能感兴趣的:(脚本文件,开发语言)