Используйте аргументы оболочки внутри функции GNU Make

Можно ли использовать аргументы оболочки внутри функции makefile? например

mywords:=hello there neighbour

myrecipe:
    for ((i = 0 ; i < 3 ; i++)); do \
        this_word=$(word $${i}, $(mywords)); \
    done

За исключением того, что myrecipe выдает ошибку non-numeric first argument to 'word' function: '${i}'. Stop

Вы пытаетесь использовать функцию Делать внутри функции ракушка, и нет, это не сработает. Это просто исследование, или вы действительно пытаетесь что-то сделать?

Beta 23.03.2022 08:11

Нет, любые аргументы оболочки расширяются после выполнения функции makefile. Однако то, что вы представляете, - это функция оболочки. Вы можете использовать строку с for this_word in $mywords; do \ , и у вас будет переменная оболочки this_word, установленная для каждой итерации.

Andreas 23.03.2022 08:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Помните, что делать сначала расширяет весь рецепт (да, это все строки рецепта), прежде чем что-либо делать с оболочкой. Только после этого полного расширения делать ищет отдельные строки рецептов, запуская каждую из них по очереди.

Таким образом, делать ведет себя разумно, когда у вас есть макрос, который расширяется более чем на одну строку.

Это также намекает на то, что вы должны использовать функциональность делать везде, где это возможно.

mywords := hello there neighbour

define mkcommand
    echo $1
    something $1
endef

myrecipe:
    $(foreach _,${mywords},$(call mkcommand,$_))

Теперь, когда вы просите делать построить мой рецепт, делать видит что-то вроде:

myrecipe:
    echo hello
    something hello
    echo there
    something there
    ⋮

ИМХО, это почти всегда ошибка, если вы пишете циклы оболочки в make-файле.

Я согласен с вашим описанием работы make, но не обязательно с вашей рекомендацией. Если кто-то заинтересован в написании переносимых (то есть не специфичных для GNU) make-файлов, то сам make иногда не предоставляет то, что вам нужно. Более того, даже когда нацеливается GNU make, я считаю, что гораздо понятнее зарезервировать make функции для кода высшего уровня и использовать в рецептах только шелл-код. Можно избежать зацикливания вообще, но если цикл должен появиться в рецепте, я бы предпочел, чтобы он был выражен на языке оболочки.

John Bollinger 29.03.2022 16:14

Я с уважением не согласен. Делая это в делать, по моему опыту, неизменно получаются более чистые файлы сборки, охватывают больше угловых случаев и их легче рефакторить. По общему признанию, я хорошо знаю делать. Например, большинство циклов не проверяют ненулевые коды выхода должным образом. Параллельные сборки также начинают работать, и в настоящее время у всех нас более одного процессора (ваш make-файл не работает, если он не работает при параллельной сборке). Циклы оболочки обычно являются признаком того, что автор не знаком с делать. Аналогичные проблемы возникают при чрезмерном использовании $(shell … ). YMMV применяется, конечно.

bobbogo 29.03.2022 17:04

Другие вопросы по теме