Я не очень разбираюсь в создании Makefile, но я читал make make и добился определенного прогресса. Мой Makefile работает и делает то, что я хочу.
В моей ситуации обычно требуется от 1 до 3 разных программ, которые необходимо скомпилировать и отправить в мою ТА для маркировки и тому подобного через веб-форму. Структура каждого приложения - «prog.c», «prog_lib.h» и «prog_lib.c». В прошлом я создавал отдельные каталоги для каждой программы и создавал отдельные файлы Makefile для каждого каталога, чтобы построить программу, содержащуюся внутри. Затем я копирую каждую папку и отправляю их отдельно.
В последнее время ТП просили, чтобы все исходные файлы были в одном каталоге и один Makefile с различными целевыми объектами, которые будут создаваться, чтобы их приложения для разметки могли работать без вмешательства человека.
Мне было интересно, как кто-то более опытный улучшит этот Makefile и как обычно решается моя ситуация в целом? Я хотел бы сократить объем печати, необходимый для перехода к следующему заданию, и мне нужно обновить несколько мест.
Вот мой Makefile:
ASSIGNMENT = 3
TARNAME = Assignment$(ASSIGNMENT).tar.bz2
CC = gcc
CFLAGS = -O2 -Wall -ansi -pedantic -W # I like warnings
LDFLAGS = -lm
DEBUG = -g # to resolve symbols in GDB and valgrind
FREQ_OUT = frequency_table
FREQ_SOURCES = frequency_table.c frequency_table_lib.c
FREQ_OBJECTS = frequency_table.o frequency_table_lib.o
DECODE_OUT = decode
DECODE_SOURCES = decode.c decode_lib.c
DECODE_OBJECTS = decode.o decode_lib.o
SOURCES = $(FREQ_SOURCES) $(DECODE_SOURCES)
OBJECTS = $(FREQ_OBJECTS) $(DECODE_OBJECTS)
OUT = $(FREQ_OUT) $(DECODE_OUT)
.PHONY: info
info:
@echo -e "make info\n" \
"\tmake all \t\t\tMake all targets\n" \
"\tmake frequency_table \t\tMakes frequency table\n" \
"\tmake decode \t\t\tMakes decode\n" \
"\tmake dist \t\t\tMakes tar archive of sources and Makefile\n" \
"\tmake clean \t\t\tRemoves all the object files and executables\n" \
"\tmake distclean \t\t\tPerforms clean and removes tar archive"
.PHONY: all
all: $(OUT)
$(FREQ_OUT): $(FREQ_OBJECTS)
$(CC) $(CFLAGS) $(DEBUG) $(LDFLAGS) $(FREQ_OBJECTS) -o $@
$(DECODE_OUT): $(DECODE_OBJECTS)
$(CC) $(CFLAGS) $(DEBUG) $(LDFLAGS) $(DECODE_OBJECTS) -o $@
.o:
$(CC) -c $(CFLAGS) -o $@ $<
.PHONY: dist
dist: $(SOURCES)
@echo "Creating tar archive. See $(TARNAME)"
tar cvjf $(TARNAME) $(SOURCES) $(wildcard *_lib.h) Makefile
.PHONY: clean
clean:
rm -f $(OUT) $(OBJECTS)
.PHONY: distclean
distclean: clean
rm -f $(TARNAME)