# Only used for standalone compilation, usually inherits these from the main makefile CXX ?= g++ CC ?= gcc AR := ar FORMAT := clang-format-11 UNAME := $(shell uname) ASAN ?= 0 DEBUG ?= 1 OPTFLAGS ?= -O0 X11 ?= 0 LTO ?= 0 # flag to save whether the compiler being used is clang or gcc by checking CXX --version CXX_IS_CLANG ?= $(shell $(CXX) --version | grep -c clang) ifeq ($(CXX_IS_CLANG),1) MXX := $(CXX) else MXX ?= clang++ endif WARN := -Wall -Wextra -Werror \ -Wno-unused-variable \ -Wno-unused-parameter \ -Wno-unused-function \ -Wno-parentheses \ -Wno-narrowing \ -Wno-missing-field-initializers \ -Wno-error=multichar \ -Wno-delete-non-abstract-non-virtual-dtor \ -Wno-unused-private-field \ -Wno-deprecated-copy-with-user-provided-copy \ -Wno-deprecated-declarations \ -Wno-unknown-warning-option CWARN := CXXWARN := -Wno-deprecated-enum-enum-conversion -Wno-deprecated-copy ifneq ($(CXX_IS_CLANG),1) WARN += -Wno-error=stringop-overflow CXXWARN += -Wno-error=maybe-uninitialized endif CXXFLAGS := $(WARN) $(CXXWARN) -std=c++20 -D_GNU_SOURCE -DENABLE_OPENGL -DSPDLOG_ACTIVE_LEVEL=0 CFLAGS := $(WARN) $(CWARN) -std=c99 -D_GNU_SOURCE -DENABLE_OPENGL -DSPDLOG_ACTIVE_LEVEL=0 CPPFLAGS := -MMD $(shell pkg-config --cflags sdl2 glew) MMFLAGS := -Wno-deprecated-declarations -ObjC++ -fobjc-weak -fobjc-arc ifeq ($(X11), 1) CXXFLAGS += -DX11_SUPPORTED CFLAGS += -DX11_SUPPORTED endif # if not using clang, ask clang to use gcc standard library ifneq ($(CXX_IS_CLANG),1) STD_ISYSTEM=$(shell ${CXX} -xc++ -E -v - < /dev/null 2>&1 | grep "> search starts here" -A2 | tail -n 2 | head -n 1) CXX_ISYSTEM=$(shell ${CXX} -xc++ -E -v - < /dev/null 2>&1 | grep "> search starts here" -A2 | tail -n 2 | tail -n 1) MMFLAGS += -stdlib++-isystem ${STD_ISYSTEM} -cxx-isystem ${CXX_ISYSTEM} endif ifneq ($(DEBUG),0) CXXFLAGS += -g -D_DEBUG CFLAGS += -g -D_DEBUG endif ifneq ($(ASAN),0) CXXFLAGS += -fsanitize=address CFLAGS += -fsanitize=address endif ifneq ($(LTO),0) CXXFLAGS += -flto CFLAGS += -flto endif SRC_DIRS := $(shell find . -type d -not -path "*build*") CXX_FILES := \ $(shell find libultraship/Factories -name "*.cpp") \ $(shell find libultraship/Lib/Fast3D -name "*.cpp") \ $(shell find libultraship -maxdepth 1 -name "*.cpp") \ $(shell find libultraship/Lib/ImGui -maxdepth 1 -name "*.cpp") \ $(shell find libultraship/Lib/Mercury -maxdepth 1 -name "*.cpp") \ libultraship/Lib/ImGui/backends/imgui_impl_opengl3.cpp \ libultraship/Lib/ImGui/backends/imgui_impl_sdl.cpp \ libultraship/Lib/StrHash64.cpp \ libultraship/Lib/tinyxml2/tinyxml2.cpp C_FILES := \ libultraship/mixer.c \ libultraship/Lib/stb/stb_impl.c MM_FILES := \ libultraship/OSXFolderManager.mm FMT_FILES := $(shell find libultraship/ -type f \( -name "*.cpp" -o -name "*.h" \) -a -not -path "libultraship/Lib/*") O_FILES := \ $(CXX_FILES:%.cpp=build/%.o) \ $(C_FILES:%.c=build/%.o) ifeq ($(UNAME), Darwin) #APPLE O_FILES += $(MM_FILES:%.mm=build/%.o) endif D_FILES := $(O_FILES:%.o=%.d) LIB := libultraship.a INC_DIRS := $(addprefix -I, \ ../ZAPDTR/ZAPDUtils \ libultraship/Lib/Fast3D/U64 \ libultraship/Lib/spdlog \ libultraship/Lib/spdlog/include \ libultraship/Lib/ImGui \ libultraship/Lib/Mercury \ libultraship \ ../StormLib/src \ ) # create build directories $(shell mkdir -p $(SRC_DIRS:%=build/%)) all: $(LIB) clean: rm -rf build $(LIB) format: $(FORMAT) -i $(FMT_FILES) .PHONY: all clean format build/%.o: %.cpp $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(OPTFLAGS) $(INC_DIRS) -c $< -o $@ build/%.o: %.c $(CC) $(CFLAGS) $(CPPFLAGS) $(OPTFLAGS) $(INC_DIRS) -c $< -o $@ build/%.o: %.mm $(MXX) $(MMFLAGS) $(CXXFLAGS) $(OPTFLAGS) $(INC_DIRS) -c $< -o $@ $(LIB): $(O_FILES) $(AR) rcs $@ $^ -include $(D_FILES)