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
если избавиться от дублирования кода и поместить файлы 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[31m 33[5mPlease, install a compilar for C language such as gcc or clang!!! 33[0mn";
fi
Я лично всегда подобные вещи просто кладу в отдельный скрипт.
Answered by Ainar-G on November 30, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP