handmade/Makefile

202 lines
4.4 KiB
Makefile
Raw Normal View History

.PHONY: all clean reallyclean test
.POSIX:
# {{{ Flags
SRCDIR := src
OBJDIR := .o
DEPDIR := .d
TESTDIR := test
TEST_BINDIR := $(TESTDIR)/bin
MKDIR := mkdir -p
# }}}
PROGS := main_client main_server
IMGUI_INCLUDE := -Iimgui -Iimgui/backends
IMGUI_SRCS := \
imgui/backends/imgui_impl_glfw.cpp \
imgui/backends/imgui_impl_opengl3.cpp \
imgui/imgui.cpp \
imgui/imgui_demo.cpp \
imgui/imgui_draw.cpp \
imgui/imgui_tables.cpp \
imgui/imgui_widgets.cpp
SRCS := $(wildcard $(SRCDIR)/*.cpp) $(IMGUI_SRCS) $(wildcard $(TESTDIR)/*.cpp)
OBJS := $(patsubst %,$(OBJDIR)/%.o,$(basename $(SRCS)))
DEPS := $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS)))
COMMON_OBJS := \
$(OBJDIR)/src/lib_GetOpt.o \
$(OBJDIR)/src/lib_lua_common.o \
$(OBJDIR)/src/lib_SDL_common.o \
$(OBJDIR)/src/lib_SDL_Log.o \
$(OBJDIR)/src/signal_common.o \
$(OBJDIR)/src/UDPbase.o \
$(OBJDIR)/src/SafeUDPpacketV.o \
$(OBJDIR)/src/util.o
SERVER_OBJS := \
$(OBJDIR)/src/server_main.o \
$(OBJDIR)/src/Server.o \
$(OBJDIR)/src/Commands.o \
$(COMMON_OBJS)
CLIENT_OBJS := \
$(OBJDIR)/src/camera.o \
$(OBJDIR)/src/client_main.o \
$(OBJDIR)/src/cube.o \
$(OBJDIR)/src/FileIO.o \
$(OBJDIR)/src/lib_GL_common.o \
$(OBJDIR)/src/object.o \
$(OBJDIR)/src/quad.o \
$(OBJDIR)/src/shader.o \
$(COMMON_OBJS)
IMGUI_OBJS := $(patsubst %,$(OBJDIR)/%.o,$(basename $(IMGUI_SRCS)))
TEST_OBJ_COMMON := \
$(OBJDIR)/src/FileIO.o \
$(COMMON_OBJS)
TESTS := test_FileIO test_lua test_SafeUDPpacket
TEST_PROGS := $(addprefix $(TEST_BINDIR)/,$(TESTS))
$(shell $(MKDIR) $(dir $(OBJS)) >/dev/null)
$(shell $(MKDIR) $(dir $(DEPS)) >/dev/null)
$(shell $(MKDIR) $(dir $(TEST_PROGS)) >/dev/null)
# {{{ Flags
CC := gcc
CXX := g++
LD := g++
ifeq ($(CLANG),1)
CC := clang-12
CXX := clang++-12
LD := clang-12
endif
SRCDIR := src
OBJDIR := .o
DEPDIR := .d
RM := rm -rf
PKGS := SDL2_image SDL2_mixer SDL2_ttf SDL2_net sdl2 gl glew lua54
CPPFLAGS := $(shell pkg-config --cflags $(PKGS))
LDLIBS := $(shell pkg-config --libs $(PKGS)) -lm
DEFS := -D_FILE_OFFSET_BITS=64
INCS := -Iinclude $(IMGUI_INCLUDE)
DEBUG := -g
ifeq ($(D),1)
DEBUG := -ggdb
OPT := -O0
DEFS += -DDEBUG=1
endif
OPT := -O0
ifeq ($(O),1)
OPT := -O1 -g
endif
ifeq ($(O),2)
OPT := -O2 -g
endif
ifeq ($(O),3)
OPT := -O3 -g0
endif
ifeq ($(LTO),1)
LDFLAGS += -flto -fwhole-program
endif
ifeq ($(PG),1)
CFLAGS += -pg -coverage
endif
ifeq ($(PEDANTIC),1)
CFLAGS += -pedantic
endif
CFLAGS += -std=c99
CXXFLAGS += -std=c++14
CPPFLAGS += -fPIC -W -Wextra -Wall $(DEFS) $(DEBUG) $(INCS) $(OPT)
# flags required for dependency generation; passed to compilers
DEPFLAGS = -MT $@ -MD -MP -MF $(DEPDIR)/$*.Td
# compile C source files
COMPILE.c = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o $@
# compile C++ source files
COMPILE.cc = $(CXX) $(DEPFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -o $@
# link object files to binary
LINK.o = $(LD) $(LDFLAGS) -o $@
LINK.so = $(LD) $(LDFLAGS) -o $@ -shared
# precompile step
PRECOMPILE =
# postcompile step
POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d
# }}}
.SUFFIXES: .c .cc .cpp .cxx .o .1
all: $(OBJS) $(PROGS)
main_client: $(CLIENT_OBJS)
$(LINK.o) $^ $(LDLIBS)
main_server: $(SERVER_OBJS)
$(LINK.o) $^ $(LDLIBS)
test: $(TEST_PROGS)
@echo $(TEST_PROGS)
$(TEST_BINDIR)/test_FileIO: $(OBJDIR)/test/test_FileIO.o $(TEST_OBJ_COMMON) $(OBJDIR)/src/util.o
$(LINK.o) $^ $(LDLIBS)
$(TEST_BINDIR)/test_lua: $(OBJDIR)/test/test_lua.o $(TEST_OBJ_COMMON) $(OBJDIR)/src/lib_lua_common.o
$(LINK.o) $^ $(LDLIBS)
$(TEST_BINDIR)/test_SafeUDPpacket: $(OBJDIR)/test/test_SafeUDPpacket.o $(TEST_OBJ_COMMON) $(OBJDIR)/src/UDPbase.o $(OBJDIR)/src/lib_SDL_common.o
$(LINK.o) $^ $(LDLIBS)
$(OBJDIR)/%.o: %.c
$(OBJDIR)/%.o: %.c $(DEPDIR)/%.d
$(PRECOMPILE)
$(COMPILE.c) $<
$(POSTCOMPILE)
$(OBJDIR)/%.o: %.cpp
$(OBJDIR)/%.o: %.cpp $(DEPDIR)/%.d
$(PRECOMPILE)
$(COMPILE.cc) $<
$(POSTCOMPILE)
$(OBJDIR)/%.o: %.cc
$(OBJDIR)/%.o: %.cc $(DEPDIR)/%.d
$(PRECOMPILE)
$(COMPILE.cc) $<
$(POSTCOMPILE)
$(OBJDIR)/%.o: %.cxx
$(OBJDIR)/%.o: %.cxx $(DEPDIR)/%.d
$(PRECOMPILE)
$(COMPILE.cc) $<
$(POSTCOMPILE)
clean: REALLYCLEAN?=@echo
clean:
$(REALLYCLEAN) $(RM) $(DEPDIR) $(OBJDIR) $(PROGS)
$(REALLYCLEAN) $(RM) $(TEST_PROGS)
reallyclean:
$(MAKE) REALLYCLEAN= clean
.PRECIOUS: $(DEPDIR)/%.d
$(DEPDIR)/%.d: ;
-include $(DEPS)