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

时间:2013-10-20 07:43:36

标签: makefile

在makefile中,即使没有CC的定义,${CC} -o myfile myfile.c$(CC) -o myfile myfile.c也能正常工作。 我的问题是:

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

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

2 个答案:

答案 0 :(得分:18)

上一个答案不正确:Make的(){}之间没有区别。

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

在您引用的配方命令中

for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done

Make do this:

  • 替换DIR的值${DIR}$(DIR)
  • $$替换为$(“转义”,以便$可以传递给shell)
  • MAKE的值替换为${MAKE},这可能是$(MAKE)MAKE的值由Make自动设置为正在使用的make可执行文件。
  • 将生成的字符串传递给shell执行 - 然后shell以其想要的方式解释剩余的${}

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

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

.PHONY: $(DIR)
target: $(DIR)
$(DIR):
    $(MAKE) -C $@

请参阅手册以了解不清楚的事项。

答案 1 :(得分:0)


$(CC) - is evaluate ; this can be a command

Vs

${CC} - is dereference; just get value of a variable