我工作的一个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}
¹其实很多!
你应该使用定义伪指令-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系统上。 这很好地说明了该技术。