makefile中的函数?

Mar*_*ahn 13 makefile

我有一大堆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)

考虑以下因素:

  • Makefile 语言中没有自定义“函数”。所以“my_func”实际上是一个仅包含文本的变量。
  • 该“功能”没有自己的范围。该“功能”的所有内容都按原样复制到配方中。之后,正文中的所有变量都将作为配方的一部分使用。
  • 不要在逗号附近使用空格来美化“call”函数的参数列表。
  • 参数像 $(1), $(2), ... 那样传递,这不是很方便,所以用有意义的名称重新声明它们。这是可选的,但建议用于较大的“功能”主体。
  • 变量是用$@_前缀声明的,这使得它们对于规则来说是“本地”的(实际上不是本地的,而是以目标名称为前缀)。

所以我们通过模仿局部变量来模仿函数,但通常这效果很好。


小智 13

GNU make有这个:

要定义多行函数,可以使用以下语法:

  • 使用define ... endef对我没什么用.它完全忽略了这条线.我尝试使用$(var-name)和$(call var-name).我可以使用单行变量,然后使用分号包装行;和反斜杠\.我使用的是Ubuntu 14.04,我的GNU make版本是3.81. (2认同)

Jac*_*lly 6

如果您不想将自己限制在 GNUmake 上,那么最好的选择可能是自己生成 makefile 片段,然后生成include它们。