如何定义一个对包含子目录的目录中的所有文件有效的模式?

时间:2014-08-17 11:29:37

标签: makefile

我正在编写一个模式来编译.c目录中的所有test文件。

目录详情如下:

./prj/makefile

./prj/test

./prj/test/test1/a.c
./prj/test/test1/b.c

./prj/test/test2/c.c
./prj/test/test2/d.c

./prj/test/e.c

...

只是一个演示。这是我makefile的内容:

# Find all files
rwildcard := $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

# All .c files
SRC_FILES := $(call rwildcard,test,*.c)

# All .o files
OBJ_FILES := $(SRC_FILES:.o=.c)

all : $(OBJ_FILES)
    echo $(OBJ_FILES)

%.o : %.c
    echo $@ $<

制作照片No rule to make target '...'。我认为需要知道.o个文件和.c文件的路径。但是我不知道如何设置路径,因为我的prj中有很多.c个文件。

因为OBJ_FILES包含所有.o个文件。然后我猜模式应该是这样的:



    $(output_dir)/%.o : $(input_dir)/%.c
        echo $@ $

因为./prj/test中可能有很多目录,所以我不能在makefile中硬编码

感谢另一位朋友,上述方法是正确的。因为%可以匹配许多多级目录。

2 个答案:

答案 0 :(得分:0)

您可以使用它来获取子目录中的所有c文件:

$(wildcard */*.c)

或者这也是为了获得任何深度的子目录中的所有c文件:

$(wildcard **/*.c)

答案 1 :(得分:0)

我们无法真正解决您的问题,因为您仍未指定目标文件的位置。所有在特定目录?始终在源文件的父目录中?在其他地方?

无论您如何解决这个问题,您都可以将所有源目录添加到VPATH,并在确定依赖关系时解决精确位置。

VPATH=test:test/test1:test/test2

experiment: a.c d.c
        echo $^

将以完整路径回显test/test1/a.c test/test2/d.c

因此,您可以从%.o规则中删除硬编码的目录名称,只需指定要为.o目标构建的all个文件。