2014-08-29 2 views
1

Я работаю над Makefile, у которого есть квитанция, производящая некоторый файл с использованием M4. Он использует некоторые сложные конструкции оболочек для вычисления значений макросов, которые должны быть переданы в M4. Как я могу организовать код, чтобы избежать избыточных объявлений, отображаемых в следующем примере?Как определить подпрограммы в Makefile

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} 

¹ На самом деле много!

+0

Можете ли вы уточнить? Какие избыточные объявления вы хотите избежать? –

+0

Даже если вы можете определить подпрограмму, большая проблема в том, что вы все равно будете называть 'make' 3 раза. Вы можете группировать несколько применений '-V', чтобы сократить это до одного, но вам понадобится дополнительная оболочка для разбора на 3 отдельных параметра' -D' для 'm4'. Существует не так много, чтобы объединить два вызова с 'openssl'. – chepner

+0

@AndrejAdamenko Я хотел бы уменьшить избыточность 'cd ... && $ {MAKE} -V' и найти способ« phonier »поместить вещи. –

ответ

2

Вы должны определить псевдо-команду с помощью -c опции оболочки, например:

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

Обратите внимание на использование $ или $$ использовать bsdmake расширение переменного или переменную оболочку расширения. С этими исправлениями вы можете реорганизовать свой код следующим образом:

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: Вы можете взглянуть на макрос COPYTREE_SHARE в /usr/ports/Mk/bsd.port.mk на систему FreeBSD. Это хорошо иллюстрирует технику.

Смежные вопросы