在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
答案 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