Сложное выполнение команды в 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 {})" \;