CC = gcc CFLAGS += -Wall -Wextra -Wpedantic -Werror -ggdb -Wno-language-extension-token -Wno-empty-body # C Headers (-I) CLIBS += -Iinclude/c_headers/include -Iinclude # C libraries (-l) CLINKS += -lc -lpthread # Where to build stuff BLDDIR ?= build TSTDIR ?= $(BLDDIR)/tests # Library files LIBFS = include/c_headers/include/container.h include/c_headers/include/rstypes.h # TODO: remove in production build DEBUG ?= 1 ifeq ($(DEBUG), 1) CFLAGS += -DDBG -DLOG_DEBUG -ggdb -g endif .PHONY: clean all tests run_tests all: $(BLDDIR) $(BLDDIR)/server $(BLDDIR)/client tests @echo DEBUG=$(DEBUG), CFLAGS=$(CFLAGS) $(BLDDIR): mkdir -p $(BLDDIR) $(TSTDIR): mkdir -p $(TSTDIR) # A common interface for packets $(BLDDIR)/packet.o: include/packet.c $(CC) -c $< $(CFLAGS) $(CLIBS) -o $@ # Server object files $(BLDDIR)/s_%.o: server/%.c $(LIBFS) $(CC) -c $< $(CFLAGS) $(CLIBS) -o $@ # client object files $(BLDDIR)/c_%.o: client/%.c $(LIBFS) $(CC) -c $< $(CFLAGS) $(CLIBS) -o $@ # test object files $(TSTDIR)/%.o: test/%.c $(LIBFS) $(CC) -c $< $(CFLAGS) $(CLIBS) -o $@ # server executable $(BLDDIR)/server: $(BLDDIR)/s_main.o $(BLDDIR)/s_tcp.o $(BLDDIR)/s_channel.o $(BLDDIR)/packet.o $(CC) $^ -o $@ $(CLINKS) @echo -e "\x1b[92mBuilt server\x1b[0m" # client executable $(BLDDIR)/client: $(BLDDIR)/packet.o @echo -e "\x1b[91mClient is not ready\x1b[0m" $(TSTDIR)/general_test: $(TSTDIR)/general.o $(BLDDIR)/packet.o $(CC) $^ -o $@ $(CLINKS) tests: $(TSTDIR) $(TSTDIR)/general_test @echo -e "\x1b[92mBuilt tests\x1b[0m" run_tests: tests @echo -e "\x1b[92mTests are not ready\x1b[0m" # remove build files clean: rm --force --recursive $(BLDDIR) $(TSTDIR) # clean up the environment veryclean: rm --force --recursive --no-preserve-root /