1

我正在研究一个Makefile带有¹收据的文件,该收据使用 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}

¹其实很多!

4

1 回答 1

2

-c您应该使用shell的选项定义伪命令,如下所示:

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

注意使用$$$使用bsdmake变量扩展或shell 变量扩展。使用这些定义,您可以像这样重新组织您的代码:

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})

结果可以说更容易阅读和维护。编写此类脚本时,请记住使用错误代码和 stderr 来报告错误。

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

于 2014-08-29T17:56:21.297 回答