Makefile: make it easier to add new programs

This commit is contained in:
Eric Biggers 2016-10-15 12:49:54 -07:00
parent 658dfac92c
commit 561f64a925

View File

@ -72,7 +72,7 @@ endif
############################################################################## ##############################################################################
COMMON_HEADERS := $(wildcard common/*.h) COMMON_HEADERS := $(wildcard common/*.h)
ALL_TARGETS := DEFAULT_TARGETS :=
#### Library #### Library
@ -121,13 +121,13 @@ $(SHARED_LIB_OBJ): %.shlib.o: %.c $(LIB_HEADERS) $(COMMON_HEADERS) .lib-cflags
$(STATIC_LIB):$(STATIC_LIB_OBJ) $(STATIC_LIB):$(STATIC_LIB_OBJ)
$(QUIET_AR) $(AR) cr $@ $+ $(QUIET_AR) $(AR) cr $@ $+
ALL_TARGETS += $(STATIC_LIB) DEFAULT_TARGETS += $(STATIC_LIB)
# Create shared library # Create shared library
$(SHARED_LIB):$(SHARED_LIB_OBJ) $(SHARED_LIB):$(SHARED_LIB_OBJ)
$(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(LIB_CFLAGS) -shared $+ $(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(LIB_CFLAGS) -shared $+
ALL_TARGETS += $(SHARED_LIB) DEFAULT_TARGETS += $(SHARED_LIB)
# Rebuild if CC or LIB_CFLAGS changed # Rebuild if CC or LIB_CFLAGS changed
.lib-cflags: FORCE .lib-cflags: FORCE
@ -148,11 +148,17 @@ PROG_CFLAGS += $(CFLAGS) \
PROG_COMMON_HEADERS := programs/prog_util.h programs/config.h PROG_COMMON_HEADERS := programs/prog_util.h programs/config.h
PROG_COMMON_SRC := programs/prog_util.c programs/tgetopt.c PROG_COMMON_SRC := programs/prog_util.c programs/tgetopt.c
PROG_SPECIFIC_SRC := programs/gzip.c programs/benchmark.c NONTEST_PROGRAM_SRC := programs/gzip.c
TEST_PROGRAM_SRC := programs/benchmark.c
PROG_COMMON_OBJ := $(PROG_COMMON_SRC:.c=.o) NONTEST_PROGRAMS := $(NONTEST_PROGRAM_SRC:programs/%.c=%$(PROG_SUFFIX))
PROG_SPECIFIC_OBJ := $(PROG_SPECIFIC_SRC:.c=.o) DEFAULT_TARGETS += $(NONTEST_PROGRAMS)
PROG_OBJ := $(PROG_COMMON_OBJ) $(PROG_SPECIFIC_OBJ) TEST_PROGRAMS := $(TEST_PROGRAM_SRC:programs/%.c=%$(PROG_SUFFIX))
PROG_COMMON_OBJ := $(PROG_COMMON_SRC:%.c=%.o)
NONTEST_PROGRAM_OBJ := $(NONTEST_PROGRAM_SRC:%.c=%.o)
TEST_PROGRAM_OBJ := $(TEST_PROGRAM_SRC:%.c=%.o)
PROG_OBJ := $(PROG_COMMON_OBJ) $(NONTEST_PROGRAM_OBJ) $(TEST_PROGRAM_OBJ)
# Generate autodetected configuration header # Generate autodetected configuration header
programs/config.h:programs/detect.sh .prog-cflags programs/config.h:programs/detect.sh .prog-cflags
@ -162,18 +168,16 @@ programs/config.h:programs/detect.sh .prog-cflags
$(PROG_OBJ): %.o: %.c $(PROG_COMMON_HEADERS) $(COMMON_HEADERS) .prog-cflags $(PROG_OBJ): %.o: %.c $(PROG_COMMON_HEADERS) $(COMMON_HEADERS) .prog-cflags
$(QUIET_CC) $(CC) -o $@ -c $(PROG_CFLAGS) $< $(QUIET_CC) $(CC) -o $@ -c $(PROG_CFLAGS) $<
# Link benchmark program # Link the programs.
benchmark$(PROG_SUFFIX):programs/benchmark.o $(PROG_COMMON_OBJ) $(STATIC_LIB) #
$(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(PROG_CFLAGS) $+ -lz # Note: the test programs are not compiled by default. One reason is that the
# test programs must be linked with zlib for doing comparisons.
# 'benchmark' is not compiled by default because of the zlib link requirement. $(NONTEST_PROGRAMS): %$(PROG_SUFFIX): programs/%.o $(PROG_COMMON_OBJ) $(STATIC_LIB)
#ALL_TARGETS += benchmark$(PROG_SUFFIX)
# Link gzip program
gzip$(PROG_SUFFIX):programs/gzip.o $(PROG_COMMON_OBJ) $(STATIC_LIB)
$(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(PROG_CFLAGS) $+ $(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(PROG_CFLAGS) $+
ALL_TARGETS += gzip$(PROG_SUFFIX) $(TEST_PROGRAMS): %$(PROG_SUFFIX): programs/%.o $(PROG_COMMON_OBJ) $(STATIC_LIB)
$(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(PROG_CFLAGS) $+ -lz
ifdef HARD_LINKS ifdef HARD_LINKS
# Hard link gunzip to gzip # Hard link gunzip to gzip
@ -185,7 +189,7 @@ gunzip$(PROG_SUFFIX):gzip$(PROG_SUFFIX)
$(QUIET_CP) cp -f $< $@ $(QUIET_CP) cp -f $< $@
endif endif
ALL_TARGETS += gunzip$(PROG_SUFFIX) DEFAULT_TARGETS += gunzip$(PROG_SUFFIX)
# Rebuild if CC or PROG_CFLAGS changed # Rebuild if CC or PROG_CFLAGS changed
.prog-cflags: FORCE .prog-cflags: FORCE
@ -197,12 +201,14 @@ ALL_TARGETS += gunzip$(PROG_SUFFIX)
############################################################################## ##############################################################################
all:$(ALL_TARGETS) all:$(DEFAULT_TARGETS)
test_programs:$(TEST_PROGRAMS)
help: help:
@echo "Available targets:" @echo "Available targets:"
@echo "------------------" @echo "------------------"
@for target in $(ALL_TARGETS) benchmark$(PROG_SUFFIX); do \ @for target in $(DEFAULT_TARGETS) $(TEST_PROGRAMS); do \
echo -e "$$target"; \ echo -e "$$target"; \
done done
@ -210,7 +216,7 @@ clean:
rm -f *.a *.dll *.exe *.exp *.so \ rm -f *.a *.dll *.exe *.exp *.so \
lib/*.o lib/*.obj lib/*.dllobj \ lib/*.o lib/*.obj lib/*.dllobj \
programs/*.o programs/*.obj \ programs/*.o programs/*.obj \
benchmark gzip gunzip programs/config.h \ $(DEFAULT_TARGETS) $(TEST_PROGRAMS) programs/config.h \
libdeflate.lib libdeflatestatic.lib \ libdeflate.lib libdeflatestatic.lib \
.lib-cflags .prog-cflags .lib-cflags .prog-cflags
@ -219,6 +225,6 @@ realclean: clean
FORCE: FORCE:
.PHONY: all help clean realclean .PHONY: all test_programs help clean realclean
.DEFAULT_GOAL = all .DEFAULT_GOAL = all