Makefile中$()和$ {}之间的功能和区别

AuA*_*AuA 11 makefile

在生成文件,${CC} -o myfile myfile.c以及$(CC) -o myfile myfile.c双方即使没有CC的定义,做工精细.我的问题是:

  1. 如何使用$()和$ {}?

    • 如果没有定义该字符串,它们只是将{}或()中的字符串转换为小写吗?
    • 为什么$$ {dir}需要两个$$
      for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done
  2. $ {}和$()之间有什么区别吗?

Mar*_*eck 20

之前的答案是错误的:Make (){}Make 之间没有区别.

如果您$$在配方中使用,则会$"转义"并传递给shell.然后壳可以在$()或之间产生差异${}.但这完全取决于shell,与Make或makefiles无关.

在您引用的配方命令中

for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done
Run Code Online (Sandbox Code Playgroud)

做到这一点:

  • 替换DIR,for ${DIR}和的价值,也可以$(DIR)
  • 替换$$$("转义",因此$可以传递给shell)
  • 替换MAKEfor 的值${MAKE},再次这可能是$(MAKE).MAKEMake 的值自动设置为正在使用的make可执行文件.
  • 将生成的字符串传递给shell执行 - 然后shell ${}按照它想要的方式解释剩余的字符串.

CC,类似于MAKE默认情况下由Make预先定义的那些变量之一,这就是为什么即使您没有自己设置它也"有效".

顺便说一句,为"目标"编写此配方的更好方法是

.PHONY: $(DIR)
target: $(DIR)
$(DIR):
    $(MAKE) -C $@
Run Code Online (Sandbox Code Playgroud)

有关不清楚的事项的说明,请参阅手册.