tsu*_*ujp 4 make directory recursive
我正在尝试为我的 C 项目实现一个 makefile,其目录结构如下:
PROJECT_FOLDER:
folder1
folder2
folder // n number of folders
main.c
FOLDER1:
subfolder1
subfolder // n number of subfolders
Run Code Online (Sandbox Code Playgroud)
子文件夹 1 可以有更多的子文件夹等等。
我不想对我的目录结构感到愚蠢,我可能最深入的是 1-2 MAYBE 3。
到目前为止我有:
# A Makefile to build our First_Game_2 project
dirs = * */parse
PROJECT = main
HEADERS = $(PROJECT).h
OBJ = $(foreach dirz, $(dirs), \
\
$(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
\
)
C99 = gcc -std=c99
CFLAGS = -Wall -pedantic -Werror
$(PROJECT) : $(OBJ)
$(C99) $(CFLAGS) -o $(PROJECT) $(OBJ)
%.o : %.c $(HEADERS)
$(C99) $(CFLAGS) -c $<
clean:
rm -f $(PROJECT) $(OBJ)
Run Code Online (Sandbox Code Playgroud)
我的问题是如果parse包含子文件夹,比如说test给出结构
PROJECT_FOLDER/parse/test
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不会返回任何内容
$(foreach dirz, $(dirs), \
\
$(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
\
)
Run Code Online (Sandbox Code Playgroud)
我使用以下 makefile 测试了该函数的输出
# A Makefile to build our First_Game_2 project
dirs = * */parse
PROJECT = main
HEADERS = $(PROJECT).h
OBJ =
C99 = gcc -std=c99
CFLAGS = -Wall -pedantic -Werror
$(foreach dirz, $(dirs), \
\
$(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
\
)
Run Code Online (Sandbox Code Playgroud)
其中,给定结构:
dirs = * */parse */parse/test
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
main.o parse/parse.o
Run Code Online (Sandbox Code Playgroud)
忽略*/parse/test
为什么会出现这种情况,我该怎么做才能修复我的 OBJ 分配以识别*/parse/test或以其他方式?
您在模式中使用了向后的通配符dirs。你自找的:
dirs = * parse/* parse/test/*
Run Code Online (Sandbox Code Playgroud)
正如所写,上面的模式扩展为:(*.c好)、*/parse.c(幸运!)和*/parse/test.c,如果该文件存在,这会让您更加困惑。它看起来适用于第一级目录的唯一原因是因为您使用了相同的文件名“parse”作为目录名。