makefile迭代并检索文件名

时间:2013-09-30 20:16:26

标签: makefile iteration filenames

在makefile中,我试图遍历c文件并使用路径和文件名。 例如/dir/dir2/file.c 我想执行“cc /dir/dir2/file.c -o file” 我不明白为什么basename和patsubst不起作用。它只是向我展示了路径。 有人可以帮忙吗?

test_files := Test/src/test_*.c

compile_tests:
    @for f in $(test_filenames); do \
        echo ">>> $(basename $(patsubst %.c, %, $$f ))";\
    done

1 个答案:

答案 0 :(得分:1)

您不能将make函数与shell操作混合使用。 Make将首先完全展开所有变量和函数,然后将扩展结果传递给shell,shell将其作为脚本运行。

您正在尝试在shell循环中使用make函数,但首先展开make函数,然后循环将在结果上运行。 basename和patsubst在文本字符串$f上运行,它没有任何路径名且与%.c模式不匹配,因此这些函数无效。

如果你想这样做,你必须使用100%shell操作,否则在shell获取之前修改变量:

test_filenames := $(wildcard Test/src/test_*.c)

compile_tests:
        @for f in $(basename $(patsubst %.c,%,$(test_filenames))); do \
            echo ">>> $$f";\
        done

ETA:如果您想在shell中完成所有操作,可以使用:

test_filenames := $(wildcard Test/src/test_*.c)

compile_tests:
        @for f in $(test_filenames); do \
            echo ">>> $$(basename $$f .c)";\
        done

或者,或许更清楚:

test_filenames := $(wildcard Test/src/test_*.c)

compile_tests:
        @for f in $(test_filenames); do \
            echo ">>> `basename $$f .c`";\
        done