Команда Makefile FILES не будет выполнена

#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 , тем самым устанавливая переменную Makefile DATE . Обычно вам следует избегать $(shell) команд с побочными эффектами, такими как создание файлов и т.д. Такого рода вещи должны выполняться по рецептам.

3. Можете ли вы привести мне пример синтаксиса рецепта, который позволил бы создать пустой текстовый файл?

4. Кстати, я не уверен, почему команда touch, которую я вам дал, должна создавать file1.txt если она помещена в глобальную область действия makefile (я только что попробовал это …).

5. Нет, я просто забуду об этом, руководство по созданию настолько плохо написано, что это сводит меня с ума.