TransWikia.com

Syntax error: end of file unexpected

Stack Overflow на русском Asked on November 30, 2021

Имею следующий 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 "33[31m33[5mPlease, install a compilar for C language such as gcc or clang!!!33[0mn"
    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 "33[31m33[5mPlease, install a compilar for C language such as gcc or clang!!!33[0mn"
    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 Answers

  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).

Answered by aleksandr barakin on November 30, 2021

Каждая строчка в мейкфайле выполняется как отдельная команда, за исключением случаев, когда конец предыдущей экранирован. Так что:

./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 "33[31m33[5mPlease, install a compilar for C language such as gcc or clang!!!33[0mn";
  fi

Я лично всегда подобные вещи просто кладу в отдельный скрипт.

Answered by Ainar-G on November 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP