Syntax error: end of file unexpected
Имею следующий Makefile:
./object_files/server.o: ./source_files/server.c ./header_files/server.h
if which gcc
then
gcc -c ./source_files/server.c
mv ./server.o ./object_files/server.o
elif which clang
then
clang -c ./source_files/server.c
mv ./server.o ./object_files/server.o
else
echo -e "\033[31m\033[5mPlease, install a compilar for C language such as gcc or clang!!!\033[0m\n"
fi
./executable_files/server: ./object_files/server.o
if which gcc
then
gcc -o ./executable_files/server ./object_files/server.o
elif which clang
then
clang -o ./executable_files/server ./object_files/server.o
else
echo -e "\033[31m\033[5mPlease, install a compilar for C language such as gcc or clang!!!\033[0m\n"
fi
Вывод консоли:
if which gcc
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
make: *** [Makefile:2: object_files/server.o] Error 2
Ответы (2 шт):
Автор решения: Ainar-G
→ Ссылка
Каждая строчка в мейкфайле выполняется как отдельная команда, за исключением случаев, когда конец предыдущей экранирован. Так что:
./object_files/server.o: ./source_files/server.c ./header_files/server.h
if which gcc;\
then\
gcc -c ./source_files/server.c;\
mv ./server.o ./object_files/server.o;\
elif which clang;\
then\
clang -c ./source_files/server.c;\
mv ./server.o ./object_files/server.o;\
else\
echo -e "\033[31m\033[5mPlease, install a compilar for C language such as gcc or clang!!!\033[0m\n";\
fi
Я лично всегда подобные вещи просто кладу в отдельный скрипт.
Автор решения: aleksandr barakin
→ Ссылка
- в программировании считается хорошим тоном переиспользовать существующий код
- к чему все эти манипуляции с подкаталогами? kiss вроде никто пока не отменял. у программы gnu/make по этому поводу есть удобная «магия».
если избавиться от дублирования кода и поместить файлы server.c и server.h в текущий каталог, то ровно той же функциональности можно добиться гораздо более лаконичным (а потому проще поддерживаемым) кодом:
CC = $(shell command -v gcc || command -v clang)
ifeq ($(CC),)
$(error Please, install a compilar for C language such as gcc or clang!!!)
endif
server:
server.o: server.c server.h
p.s. подробнее о применённой «магии» (или в первоисточнике: implicit rules).