Команда Makefile FILES не будет выполнена - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь изучить синтаксис Make, я приказал ему скомпилировать файл, и он делает это правильно, когда я говорю ему выполнить команду оболочки для создания файла с помощью touch, он не делает этого, он не возвращает ошибкууказать, что что-то не так.

Команды

HelloWorld: HelloWorld.c
    gcc -o HelloWorld HelloWorld.c 

FILES="$(shell touch > file1.txt)"

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Как уже указывалось, ваш синтаксис неверен. Но кроме этого ваша функция оболочки никогда даже не выполняется .

Почему бы и нет? Потому что в вашем make-файле вы определяете переменную, которая содержит вызов переменной оболочки, но тогда вы никогда не используете переменную где-либо. Поскольку вы не используете его, переменная никогда не раскрывается. Поскольку переменная никогда не раскрывается, функция в ней никогда не вызывается.

Если вы хотите, чтобы переменная была расширена, вам нужно либо сделать ее простой переменной (используя :=), чтобы правая часть раскрывалась при назначении переменной, либо использовать функцию в контекст, в котором он раскрывается немедленно; у другого ответа есть пример использования этого (вне любого назначения переменной)

Вот пример использования простой переменной:

HelloWorld: HelloWorld.c
        gcc -o HelloWorld HelloWorld.c 

FILES := $(shell touch file1.txt)

(обратите внимание, вам не нужны кавычки при установке переменных make-файла, в отличие от переменных оболочки).

Что касается руководства, оно написано как руководство пользователя: то есть вы должны читать его, начиная с самого начала, а не как справочное руководство, в котором вы перепрыгиваете. В частности, вы нигде не добьетесь написания make-файлов, пока не прочитаете внимательно и полностью не поймете первые две главы «Введение в Make-файлы» и «Написание Make-файлов». Для свободного владения языком вам необходимо разобраться в разделе Как make читает Makefile .

1 голос
/ 19 марта 2019

Я думаю, что вы хотите:

 $(shell touch file1.txt)

(обратите внимание на отсутствие перенаправления >). Также touch ничего не выводит в stdout, поэтому 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...