Makefile $wildcard 仅匹配顶级目录

Makefile $wildcard 仅匹配顶级目录

我正在尝试为我的 C 项目实现一个 makefile,其目录结构如下:

PROJECT_FOLDER:
    folder1
    folder2
    folder // n number of folders
    main.c

FOLDER1:
    subfolder1
    subfolder // n number of subfolders

子文件夹 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)

我的问题是如果parse包含子文件夹,比如说test给出结构

PROJECT_FOLDER/parse/test

在这种情况下,不会返回任何内容

$(foreach dirz, $(dirs), \
        \
        $(patsubst %.c,%.o,$(wildcard $(dirz).c)) \
        \
    )

我使用以下 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)) \
        \
    )

其中,给定结构:

dirs = * */parse */parse/test

产生以下输出:

main.o parse/parse.o

忽略*/parse/test

为什么会出现这种情况,我该怎么做才能修复我的 OBJ 分配以识别*/parse/test或以其他方式?

答案1

您在模式中使用了向后的通配符dirs。你自找的:

dirs = * parse/* parse/test/*

正如所写,上面的模式扩展为:(*.c好)、*/parse.c(幸运!)和*/parse/test.c,如果该文件存在,这会让您更加困惑。它看起来适用于第一级目录的唯一原因是因为您使用了相同的文件名“parse”作为目录名。

相关内容