Я мало знаю о создании Makefiles, но я читал make manual, и я сделал некоторый прогресс. Мой Makefile работает и делает то, что я хочу.Как я могу улучшить этот Makefile?
В моей ситуации обычно используется от 1 до 3 различных программ, которые необходимо скомпилировать и отправить в мою TA для маркировки и, например, через веб-форму. Структура каждого приложения - «prog.c», «prog_lib.h» и «prog_lib.c». Раньше я создавал отдельные каталоги для каждой программы и создавал отдельные Make-файлы для каждого каталога для сборки программы, содержащейся внутри. Затем я деактивирую каждую папку и отправляю их отдельно.
Недавно TA запросили, чтобы все исходные файлы находились в одном каталоге и один 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 [email protected]
$(DECODE_OUT): $(DECODE_OBJECTS)
$(CC) $(CFLAGS) $(DEBUG) $(LDFLAGS) $(DECODE_OBJECTS) -o [email protected]
.o:
$(CC) -c $(CFLAGS) -o [email protected] $<
.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)
не выглядит так: «Я мало знаю о создании Makefiles» из кода :) – Lazer