Попытка создать make-файл
с правилом run
, которое имеет if в это.
Когда я запускаю команду make run
, она возвращает эту ошибку:
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
Имя файла - Makefile
. Что я могу сделать? (Я создал этот Makefile
с редактором Vim и формат Vim уже установлен на unix).
Это часть кода:
#!bin/bash
#other rules
run:
if ls exec &>/dev/null
then
gcc -o exec file1.o file2.o
./exec
else
./exec
fi
Оператор if
должен выглядеть так, если вы хотите проверить существование exec
.
if [ ! -f exec ]; then
gcc -o exec file1.o file2.o
fi
./exec
Добавление кода оболочки в Makefile таким образом почти наверняка не сработает так, как вы ожидаете (если оно вообще будет работать).
В частности, каждая командная строка оболочки будет выполняться в собственной подоболочке - с использованием по умолчанию / bin / sh
- поэтому вы видите такие ошибки, как
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
из / bin / sh
, несмотря на #!/ bin / bash
shebang (который make
будет рассматривать как чистый комментарий).
Поскольку вся цель make
состоит в проверке наличия и статуса модификации предварительных требований, вы можете определить цель run
, которая условно строит свой исполняемый компонент, если он отсутствует или устарел, следующим образом:
executable: file1.o file2.o
gcc -o executable file1.o file2.o
run: executable
./executable
Примечание. Я назвал исполняемую программу исполняемым
, поскольку name exec
конфликтует с именем встроенной оболочки.
или, что более идиоматично, использование автоматических переменных make
для целей и предварительных требований:
CC := gcc
OBJS := file1.o file2.o
executable: $(OBJS)
$(CC) -o $@ $^
run: executable
./$<
] Тестирование с помощью make -n
:
$ touch file1.c file2.c
$ make -n run
gcc -c -o file1.o file1.c
gcc -c -o file2.o file2.c
gcc -o executable file1.o file2.o
./executable