Я не знаю, как определить программные цели в GNU Make. Как это возможно?Как программно определить цели в GNU Make?
Иногда можно уйти with alternate methods. Однако способность определять программные цели в Make-файлах очень важна для написания и организации сложных производственных правил с помощью make
. Примеры сложных правил производства находятся в системе сборки FreeBSD или в Makefile библиотек, таких как BSD Owl
main differences между сценариями оболочки и Makefiles являются:
В Makefile, состояние программы заданные командной строкой и файловой системой, поэтому можно возобновить работу после ее прерывания. Конечно, для этого требуется правильно написать Makefile, но даже если это довольно сложно, это значительно проще, чем добиться аналогичного эффекта с помощью сценария оболочки.
В Makefile, это смешно легко украсить процедуру советом или украсить ее крючками, в то время как это практически невозможно в сценариях оболочки.
Например, очень простой и полезный шаблон является следующее:
build: pre-build
build: do-build
build: post-build
Это представляет build
мишени в виде композита из трех мишеней, одна из которых содержит фактические инструкции do-build
и два других, которые являются крюки, выполненные до и после do-build
. Эта модель используется во многих системах сборки, написанных для BSD Make, которая, кстати, позволяет программное определение целей, так что можно написать в пакете:
.for _target in configure build test install
.if !target(${_target})
${_target}: pre-${_target}
${_target}: do-${_target}
${_target}: post-${_target}
.endif
.endfor
условие введено .if/.endif
блока позволяет пользователю использовать его собственное определение любого ${_target}
.
Каким будет перевод этого фрагмента для GNU Make?
Следует отметить, что в GNU вы не ** получаете гарантию в порядке между целевыми условиями (хотя без '-j', я считаю, что это безопасно предположить, что вы это делаете), поэтому ваши« крючки » «не обязательно делать то, что вы хотите. –
@ EtanReisner Конечно, но это напрямую не связано с вопросом, и я пропустил это, чтобы все было просто. В BSD Make, например, говорят: '.ЗАКАЗ: предварительная сборка «строить-строить пост-строить» для обеспечения последовательной обработки указанных целей. –
С или без '-j' make всегда будет переходить список предварительных условий в том же порядке. Это просто, что с помощью '-j' make не будет ждать, пока предыдущие (не зависимые) предпосылки не закончатся, прежде чем запускать новые (это может привести к тому, что некоторые задания будут выполняться в другом порядке из-за отсутствия необходимых условий). Без '-j' make _does_ гарантирует сборку в порядке. – MadScientist