$(SUBDIRS): $(MAKE) -C $@ 这句话在makefile中的意思
时间: 2024-04-24 16:23:33 浏览: 16
在 Makefile 中,`$(SUBDIRS): $(MAKE) -C $@` 这句话表示对 `$(SUBDIRS)` 中的每个子目录执行 `make` 命令。
具体来说,`$(SUBDIRS)` 是一个变量,表示需要进行递归构建的子目录列表。通常,这个变量会被设置为 Makefile 中的多个子目录的名称。
`$(MAKE)` 是一个内置变量,表示当前执行的 `make` 命令。通过 `-C` 选项,可以指定在指定的目录下执行 `make` 命令。
因此,`$(MAKE) -C $@` 表示在当前规则中遍历 `$(SUBDIRS)` 变量中的每个子目录,并在每个子目录中执行 `make` 命令。
例如,假设 `SUBDIRS` 的值是 `dir1 dir2 dir3`,那么执行 `$(SUBDIRS): $(MAKE) -C $@` 后,将依次执行以下命令:
```
make -C dir1
make -C dir2
make -C dir3
```
这样可以递归地进入每个子目录,并执行各自的 Makefile 中定义的规则。这通常用于构建具有多级目录结构的项目。
相关问题
CC = gcc SUBDIRS = f1 \ f2 \ main \ obj OBJS = f1.o f2.o main.o BIN = myapp OBJS_DIR = obj BIN_DIR = bin export CC OBJS BIN OBJS_DIR BIN_DIR all : CHECK_DIR $(SUBDIRS) CHECK_DIR : mkdir -p $(BIN_DIR) $(SUBDIRS) : ECHO make -C $@ ECHO: @echo $(SUBDIRS) @echo begin compile CLEAN : @$(RM) $(OBJS_DIR)/*.o @rm -rf $(BIN_DIR)
这是一个 Makefile 文件,用于编译 C 代码。通过设置 CC 变量为 gcc,指定编译器为 gcc。SUBDIRS 变量定义了需要编译的子目录,OBJS 变量定义了需要编译的目标文件。BIN 变量定义了最终的可执行文件名,OBJS_DIR 和 BIN_DIR 分别指定了目标文件和可执行文件的输出目录。all 目标是默认目标,用于编译全部子目录中的代码。CHECK_DIR 目标用于检查目标文件和可执行文件的输出目录是否存在,如果不存在则创建。SUBDIRS 对应的规则通过递归调用 make 命令进入子目录进行编译。CLEAN 目标用于清理编译生成的目标文件和可执行文件。
all:$(SUBDIRS) $(CUR_OBJS) DEBUG $(SUBDIRS):ECHO make -C $@ DEBUG:ECHO $(AR) crv libbsp.a $(ROOT_DIR)/$(OBJS_DIR)/*.o cp $(ROOT_DIR)/libbsp.a $(ROOT_DIR)/$(BIN_DIR)/ cp $(ROOT_DIR)/libbsp.a ../workspace/obj/ ECHO: @echo $(SUBDIRS)
这是一个 Makefile 文件的规则,该规则定义了一个名为 all 的目标,该目标依赖于变量 SUBDIRS、CUR_OBJS 和 DEBUG,同时定义了三个动作。
第一个动作是 `$(SUBDIRS)`,该动作会依次进入 SUBDIRS 中指定的每个目录,并在该目录下执行 make 命令。
第二个动作是 `$(CUR_OBJS)`,该动作未被定义,因此无法确定其意义。
第三个动作是 DEBUG,该动作依赖于一个命令 `$(AR) crv libbsp.a $(ROOT_DIR)/$(OBJS_DIR)/*.o`,该命令会将 $(ROOT_DIR)/$(OBJS_DIR) 目录下的所有 .o 文件打包成一个名为 libbsp.a 的静态库文件。接着执行 `cp $(ROOT_DIR)/libbsp.a $(ROOT_DIR)/$(BIN_DIR)/` 命令,将 libbsp.a 静态库文件拷贝到 $(ROOT_DIR)/$(BIN_DIR)/ 目录下,最后执行 `cp $(ROOT_DIR)/libbsp.a ../workspace/obj/` 命令,将 libbsp.a 静态库文件拷贝到 ../workspace/obj/ 目录下。
ECHO 是一个伪目标,这个规则的作用是输出一个字符串 $(SUBDIRS)。