Сложное выполнение команды в Makefile

У меня есть запрос на выполнение сложной команды в make-файле текущей системы.

В настоящее время я использую команду оболочки в make-файле для выполнения команды. Однако моя команда терпит неудачу, поскольку она представляет собой комбинацию множества команд, а выполнение собирает огромное количество данных. Содержимое make-файла выглядит примерно так:

variable=$(shell ls -lart | grep name | cut -d/ -f2- )

Тем не менее make выполнение завершается с ошибкой execvp, так как список файлов огромен, и мне нужно проанализировать их все.

Пожалуйста, предложите мне любые способы преодоления этой проблемы. По сути, я хотел бы выполнить сложную команду и назначить этот вывод переменной makefile, которую я хочу использовать позже в программе.

2 ответа

(Это может занять несколько итераций.)

Это выглядит как ограничение архитектуры, а не как ограничение Make. Есть несколько способов решения этой проблемы, но вы должны показать нам, как вы используете variableв противном случае, даже если вам удастся построить его, вы не сможете использовать его так, как намереваетесь. Пожалуйста, покажите нам точные операции, которые вы собираетесь выполнить variable,

А пока я предлагаю вам сделать пару экспериментов и сообщить нам результаты. Сначала попробуйте назначение с коротким списком файлов (например, три), чтобы убедиться, что назначение соответствует вашим намерениям. Во-вторых, в каталоге с большим количеством файлов попробуйте:

variable=$(shell ls -lart | grep name)

чтобы увидеть, есть ли проблема в grep или же cut,

Вместо того, чтобы хранить список файлов в переменной, вы можете легко использовать функциональность оболочки, чтобы получить тот же результат. Это немного странно, что вы выравниваете рекурсивный ls чтобы только получить листья, а затем работает mkdir -p что действительно полезно только в том случае, если родительский каталог не существует, но если вы знаете, какую глубину вы хотите (например, текущий каталог и все подкаталоги на один уровень ниже), вы можете сделать что-то вроде этого:

directories:
        for path in ./*name* ./*/*name*; do \
                mkdir "/some/path/$(basename "$path")" || exit 1; \
        done

или даже

find . -name '*name*' -exec mkdir "/some/path/$(basename {})" \;
Другие вопросы по тегам