如何在Makefile中定义的子程序(How to define subroutines in a

2019-10-20 20:07发布

我工作的一个Makefile具有A'收据生产使用M4的一些文件。 它使用了一些复杂的外壳结构来计算其必须被传递到M4宏值。 我如何组织代码,以避免在下面的例子中显示多余的声明?

M4TOOL= m4
M4TOOL+= -D PACKAGE=$$(cd ${PROJECTBASEDIR} && ${MAKE} -V PACKAGE)
M4TOOL+= -D VERSION=$$(cd ${PROJECTBASEDIR} && ${MAKE} -V VERSION)
M4TOOL+= -D AUTHOR=$$(cd ${PROJECTBASEDIR} && ${MAKE} -V AUTHOR)
M4TOOL+= -D RDC960=$$(openssl rdc960 ${DISTFILE} | cut -d ' ' -f 2)
M4TOOL+= -D SHA256=$$(openssl sha256 ${DISTFILE} | cut -d ' ' -f 2)

Portfile: Portfile.m4
    ${M4TOOL} ${.ALLSRC} > ${.TARGET}

¹其实很多!

Answer 1:

你应该使用定义伪指令-c外壳,这样的选项:

PROJECTVARIABLE=sh -c 'cd ${PROJECTBASEDIR} && ${MAKE} -V $$1' PROJECTVARIABLE
OPENSSLHASH=sh -c 'openssl $$1 $$2 | cut -d " " -f 2' OPENSSLHASH

注意使用$$$使用bsdmake变量扩展或外壳变量扩展。 有了这些defintions你可以重新组织你这样的代码:

M4TOOLS+= -D PACKAGE=$$(${PROJECTVARIABLE} PACKAGE)
M4TOOLS+= -D VERSION=$$(${PROJECTVARIABLE} VERSION)
M4TOOLS+= -D AUTHOR=$$(${PROJECTVARIABLE} AUTHOR)
M4TOOLS+= -D RMD160=$$(${OPENSSLHASH} rmd160 ${DISTFILE})
M4TOOLS+= -D SHA256=$$(${OPENSSLHASH} sha256 ${DISTFILE})

其结果无疑是更容易阅读和维护。 当你写这样的剧本,记得用错误代码和标准错误报告错误。

PS:你可以看看COPYTREE_SHARE/usr/ports/Mk/bsd.port.mk FreeBSD系统上。 这很好地说明了该技术。



文章来源: How to define subroutines in a Makefile