2

假设我的 Makefile 如下:

FILES = hello.py
PHONY: hi
hi:
    -@for file in $(FILES); do \
            (echo $$file; \
            echo $(subst py,xml,$$file); \
            echo $(subst py,xml,hello.py)); \
    done

调用 make 时,将打印以下内容:

hello.py
hello.py
hello.xml

我可以知道为什么 echo $(subst py,xml,$$file); 不能按我想要的方式工作(回显 hello.xml 而不是 hello.ph)?另外,如果您对如何修改此 for 循环元素有任何建议,请告诉我?

4

2 回答 2

2

它不起作用的原因是 Make 扩展 $(subst...) 以生成文本,然后将其传递给 shell,并且您试图根据 shell 在扩展时生成的文本进行替换“$文件”。处理此问题的一种简单方法是在 shell 中进行所有扩展:

FILES = hello.py
PHONY: hi
hi:
    -@for file in $(FILES); do \
            echo $$file; \
            echo $${file%py}xml; \
    done
于 2012-05-03T02:44:38.933 回答
0

foreach命令可能会有所帮助

FILES = hello.py hello2.py hello3.py
PHONY: hi
hi:
    $(foreach file,$(FILES),echo $(subst py,xml,$(file));)

输出

echo hello.xml; echo hello2.xml; echo hello3.xml;
hello.xml
hello2.xml
hello3.xml
于 2020-07-29T14:00:46.643 回答