我有一大堆makefile目标做同样的事情:
${SOME_FILE}:
${FILES} | ${DIST_DIR}
@@cat ${FILES} | \
sed 's/@DATE/'"${DATE}"'/' | \
sed 's/@VERSION/'"${CR_VER}"'/' \
> ${OUT_FILE};
Run Code Online (Sandbox Code Playgroud)
在哪里${FILES},${OUT_FILE}是唯一改变的事情.我想弄清楚是否有可能将这些目标简化为:
${SOME_FILE}:
compile(${FILES},${OUT_FILE})
Run Code Online (Sandbox Code Playgroud)
感谢您的任何见解.
Kon*_*nin 28
文档链接(如已接受的答案中)很好,但好的例子更好:)
define my_func
$(eval $@_PROTOCOL = "https:")
$(eval $@_HOSTNAME = $(1))
$(eval $@_PORT = $(2))
echo "${$@_PROTOCOL}//${$@_HOSTNAME}:${$@_PORT}/"
endef
my-target:
@$(call my_func,"example.com",8000)
Run Code Online (Sandbox Code Playgroud)
考虑以下因素:
$@_前缀声明的,这使得它们对于规则来说是“本地”的(实际上不是本地的,而是以目标名称为前缀)。所以我们通过模仿局部变量来模仿函数,但通常这效果很好。
小智 13
GNU make有这个:
要定义多行函数,可以使用以下语法: