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
  1. в программировании считается хорошим тоном переиспользовать существующий код
  2. к чему все эти манипуляции с подкаталогами? 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).

→ Ссылка