#makefile
#makefile
Вопрос:
Я пытаюсь изучить синтаксис Make, я дал ему указание скомпилировать файл, и он делает это правильно, когда я говорю ему выполнить команду оболочки для создания файла с помощью touch, он этого не делает, он не возвращает ошибку, указывающую, что что-то не так.
Команды
HelloWorld: HelloWorld.c
gcc -o HelloWorld HelloWorld.c
FILES="$(shell touch > file1.txt)"
Ответ №1:
Как уже указывалось, ваш синтаксис неправильный. Но помимо этого ваша функция оболочки даже никогда не выполняется.
Почему нет? Потому что в вашем makefile вы определяете переменную, которая содержит вызов переменной оболочки, но затем вы никогда и нигде не используете эту переменную. Поскольку вы ее не используете, переменная никогда не расширяется. Поскольку переменная никогда не расширяется, функция в ней никогда не вызывается.
Если вы хотите, чтобы переменная была расширена, вам либо нужно сделать ее простой переменной (используя :=
), чтобы правая часть расширялась при назначении переменной, либо вам нужно использовать функцию в контексте, где она немедленно расширяется; в другом ответе приведен пример использования этого (вне любого назначения переменной)
Вот пример использования простой переменной:
HelloWorld: HelloWorld.c
gcc -o HelloWorld HelloWorld.c
FILES := $(shell touch file1.txt)
(обратите внимание, что вам не нужны кавычки при настройке переменных makefile, в отличие от переменных оболочки).
Что касается руководства, оно написано как руководство пользователя: то есть предполагается, что вы должны прочитать его с самого начала, а не справочное руководство, в котором вы переходите по кругу. В частности, вы ничего не добьетесь при написании makefiles, пока внимательно не прочтете и полностью не поймете две первые главы «Введение в Makefiles» и «Написание Makefiles». Для беглости вам нужно понять раздел, как make считывает Makefile-файлы.
Ответ №2:
Я думаю, вы хотите:
$(shell touch file1.txt)
(Обратите внимание на отсутствие >
перенаправления там). Также touch ничего не выводит в стандартный вывод, поэтому FILES
независимо ни от чего будет пустым, поэтому назначение бесполезно.
Если вы собираетесь делать подобные вещи, имейте в виду, что $(shell ...)
команды (в глобальной области видимости) выполняются во время синтаксического анализа, перед запуском любого из рецептов.
———— РЕДАКТИРОВАТЬ ————-
Что касается вашего вопроса о создании пустого файла:
all:
$(info output $(shell echo "hello world"))
$(shell touch file1.txt)
должен создать ваш файл:
> ls file1.txt; make; ls file1.txt
file1.txt
output hello world
make-3.81: Nothing to be done for `all'.
file1.txt
Комментарии:
1. Это все еще не работает. Я пытаюсь заставить Make создать пустой файл для меня, используя команду командной строки. Неужели make не способен выполнить это? Я попытался также выполнить echo в оболочке в качестве теста, но это также ничего не дало. Правильно ли я понимаю команду оболочки Maks, она используется для запуска команд оболочки bash, верно?
2. Да, это для запуска команд оболочки bash во время синтаксического анализа. Во время синтаксического анализа make заменяет
$(shell)
команду ее выводом. Одним из способов использования может быть установка переменной типаDATE:=$(shell date)
, которая будет расширяться доDATE:=Mon Mar 18
, тем самым устанавливая переменную MakefileDATE
. Обычно вам следует избегать$(shell)
команд с побочными эффектами, такими как создание файлов и т.д. Такого рода вещи должны выполняться по рецептам.3. Можете ли вы привести мне пример синтаксиса рецепта, который позволил бы создать пустой текстовый файл?
4. Кстати, я не уверен, почему команда touch, которую я вам дал, должна создавать file1.txt если она помещена в глобальную область действия makefile (я только что попробовал это …).
5. Нет, я просто забуду об этом, руководство по созданию настолько плохо написано, что это сводит меня с ума.