#makefile #&nu-make
#makefile #&nu-make
Вопрос:
Я нахожу makefiles очень полезными, и заголовок каждого рецепта
<tar&et&&t; : [dependencies]
полезно. В рецепте полезны префиксы @ и -, а также автоматически определяемые переменные, такие как $ @ и $?. Однако, помимо этого, я нахожу способ кодирования фактического рецепта странным и бесполезным. По StackOverflow возникает так много вопросов типа «как это сделать в файле makefile» для чего-то, что просто (или, по крайней мере, более знакомо) сделать в bash.
Есть ли причина, по которой содержимое рецепта не интерпретируется просто как обычный сценарий оболочки? Читая страницы руководства, кажется, что существует множество инструментов с эквивалентной функциональностью сценарию оболочки, но с другим синтаксисом. В конечном итоге я указываю .ONESHELL и экранирование $ с помощью $ $, или иногда я просто вызываю скрипт из рецепта, когда не могу понять, как заставить его работать в файле makefile. Мой вопрос в том, является ли это просто неудачным дизайном, или существуют важные особенности файлов makefile, которые заставляют их быть спроектированными таким образом?
Комментарии:
1. Make и bash — оба языка с кратким изложением, но они имеют принципиально разный дизайн (например, bash является процедурным, Make — нет). Разработать чистый интерфейс между ними, который не мешает ни одному из них, очень сложно.
2. Сила make заключается не в написании сценариев (которые, я согласен, тупые), а в том, как он обрабатывает зависимости и параллелизм. Make может вызывать make для себя или для других файлов makefile, что позволяет эффективно компилировать очень большие проекты на любом языке. Если вы думаете о make как о генераторе рецептов, в который вы можете встроить несколько строк сценария оболочки (кстати, любой оболочки), то вы попали туда. .ONESHELL нарушает один из способов параллельного выполнения задач.
Ответ №1:
Я действительно не знаю, как ответить на ваш вопрос. Вероятно, это означает, что это не совсем подходит для StackOverflow.
Требование использования $$
вместо $
очевидно. Причина использования отдельной оболочки для каждой логической строки файла makefile вместо передачи всего рецепта в одну оболочку менее ясна. Это могло сработать в любом случае, и именно так оно и было выбрано.
В том, как это работает сейчас, есть одно преимущество, хотя, возможно, большинству людей это безразлично: вам нужно только сделать отступ в первой строке рецепта с помощью TAB, если вы используете обратную косую черту новой строки для продолжения каждой строки. Если вы не используете обратную косую черту новой строки, то в каждой строке должен быть отступ TAB, иначе вы не знаете, где заканчивается рецепт.
Если ваш вопрос в том, мог ли Стюарт Фельдман принять совсем другие синтаксические решения, которые облегчили бы написание длинных / сложных рецептов в файлах makefile, то конечно. Выбор более непонятного символа, чем $
, в качестве вводящего переменной уменьшил бы количество экранирования (хотя в сценариях оболочки где-то используются практически все специальные символы, поэтому «уменьшить» — лучшее, что вы можете сделать). Выбор явной последовательности символов «start / stop» для рецептов упростил бы написание длинных рецептов, возможно, за счет некоторой читабельности.
Но это было сделано не так.