mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-23 12:22:26 +00:00
204 lines
4.2 KiB
Makefile
204 lines
4.2 KiB
Makefile
# Compilation options:
|
|
# * LTO - Link time optimization [default=0]
|
|
# * ASAN - Address sanitizer [default=0]
|
|
# * UBSAN - Undefined behavior sanitizer [default=0]
|
|
# * DEBUG - Debug build [default=0]
|
|
# * UNUSED - Remove unused references [default=1]
|
|
# * SRCDIR - Out of tree builds [default=./]
|
|
LTO ?= 0
|
|
ASAN ?= 0
|
|
UBSAN ?= 0
|
|
DEBUG ?= 0
|
|
UNUSED ?= 1
|
|
SRCDIR ?= ./
|
|
|
|
# Determine if we're building for Windows or not so we can set the right file
|
|
# extensions for the binaries and exclude the testsuite because it doesn't build
|
|
# for that platform.
|
|
ifeq ($(OS),Windows_NT)
|
|
GMQCC := gmqcc.exe
|
|
QCVM := qcvm.exe
|
|
else
|
|
GMQCC := gmqcc
|
|
QCVM := qcvm
|
|
TESTSUITE := testsuite
|
|
endif
|
|
|
|
# C++ compiler
|
|
CXX ?= clang++
|
|
|
|
# Build artifact directories
|
|
OBJDIR := .build/objs
|
|
DEPDIR := .build/deps
|
|
|
|
# Collect all the source files for GMQCC.
|
|
GSRCS := ast.cpp
|
|
GSRCS += code.cpp
|
|
GSRCS += conout.cpp
|
|
GSRCS += fold.cpp
|
|
GSRCS += ftepp.cpp
|
|
GSRCS += intrin.cpp
|
|
GSRCS += ir.cpp
|
|
GSRCS += lexer.cpp
|
|
GSRCS += main.cpp
|
|
GSRCS += opts.cpp
|
|
GSRCS += parser.cpp
|
|
GSRCS += stat.cpp
|
|
GSRCS += utf8.cpp
|
|
GSRCS += util.cpp
|
|
|
|
# Collect all the source files for QCVM.
|
|
QSRCS := exec.cpp
|
|
QSRCS += stat.cpp
|
|
QSRCS += util.cpp
|
|
|
|
# Collect all the source files for TESTSUITE.
|
|
TSRCS := conout.cpp
|
|
TSRCS += opts.cpp
|
|
TSRCS += stat.cpp
|
|
TSRCS += test.cpp
|
|
TSRCS += util.cpp
|
|
|
|
#
|
|
# Compilation flags
|
|
#
|
|
CXXFLAGS := -Wall
|
|
CXXFLAGS += -Wextra
|
|
CXXFLAGS += -Wno-parentheses
|
|
CXXFLAGS += -Wno-class-memaccess
|
|
CXXFLAGS += -Wno-implicit-fallthrough
|
|
CXXFLAGS += -std=c++11
|
|
|
|
# Disable some unneeded features.
|
|
CXXFLAGS += -fno-exceptions
|
|
CXXFLAGS += -fno-rtti
|
|
CXXFLAGS += -fno-asynchronous-unwind-tables
|
|
|
|
# Give each function and data it's own section so the linker can remove unused
|
|
# references to each, producing smaller, tighter binaries.
|
|
ifeq ($(UNUSED),1)
|
|
CXXFLAGS += -ffunction-sections
|
|
CXXFLAGS += -fdata-sections
|
|
endif
|
|
|
|
# Enable link-time optimizations if requested.
|
|
ifeq ($(LTO),1)
|
|
CXXFLAGS += -flto
|
|
endif
|
|
|
|
ifeq ($(DEBUG),1)
|
|
# Ensure there is a frame-pointer in debug builds.
|
|
CXXFLAGS += -fno-omit-frame-pointer
|
|
|
|
# Disable all optimizations in debug builds.
|
|
CXXFLAGS += -O0
|
|
|
|
# Enable debug symbols.
|
|
CXXFLAGS += -g
|
|
else
|
|
# Disable all the stack protection features in release builds.
|
|
CXXFLAGS += -fno-stack-protector
|
|
CXXFLAGS += -fno-stack-check
|
|
|
|
# Disable frame pointer in release builds when AddressSanitizer isn't present.
|
|
ifeq ($(ASAN),1)
|
|
CXXFLAGS += -fno-omit-frame-pointer
|
|
else
|
|
CXXFLAGS += -fomit-frame-pointer
|
|
endif
|
|
|
|
# Highest optimization flag in release builds.
|
|
CXXFLAGS += -O3
|
|
endif
|
|
|
|
# Sanitizer selection
|
|
ifeq ($(ASAN),1)
|
|
CXXFLAGS += -fsanitize=address
|
|
endif
|
|
ifeq ($(UBSAN),1)
|
|
CXXFLAGS += -fsanitize=undefined
|
|
endif
|
|
|
|
#
|
|
# Dependency flags
|
|
#
|
|
DEPFLAGS := -MMD
|
|
DEPFLAGS += -MP
|
|
|
|
#
|
|
# Linker flags
|
|
#
|
|
LDFLAGS :=
|
|
|
|
# Remove unreferenced sections
|
|
ifeq ($(UNUSED),1)
|
|
LDFLAGS += -Wl,--gc-sections
|
|
endif
|
|
|
|
# Enable link-time optimizations if request.
|
|
ifeq ($(LTO),1)
|
|
LDFLAGS += -flto
|
|
endif
|
|
|
|
# Sanitizer selection
|
|
ifeq ($(ASAN),1)
|
|
LDFLAGS += -fsanitize=address
|
|
endif
|
|
ifeq ($(UBSAN),1)
|
|
LDFLAGS += -fsanitize=undefined
|
|
endif
|
|
|
|
# Strip the binaries when not a debug build
|
|
ifneq (,$(findstring -g,$(CXXFLAGS)))
|
|
STRIP := true
|
|
else
|
|
STRIP := strip
|
|
endif
|
|
|
|
all: $(GMQCC) $(QCVM) $(TESTSUITE)
|
|
|
|
# Build artifact directories.
|
|
$(DEPDIR):
|
|
@mkdir -p $(DEPDIR)
|
|
$(OBJDIR):
|
|
@mkdir -p $(OBJDIR)
|
|
|
|
$(OBJDIR)/%.o: %.cpp $(DEPDIR)/%.d | $(OBJDIR) $(DEPDIR)
|
|
$(CXX) -MT $@ $(DEPFLAGS) -MF $(DEPDIR)/$*.Td $(CXXFLAGS) -c -o $@ $<
|
|
@mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d
|
|
|
|
$(GMQCC): $(filter %.o,$(GSRCS:%.cpp=$(OBJDIR)/%.o))
|
|
$(CXX) $^ $(LDFLAGS) -o $@
|
|
$(STRIP) $@
|
|
|
|
$(QCVM): $(filter %.o,$(QSRCS:%.cpp=$(OBJDIR)/%.o))
|
|
$(CXX) $^ $(LDFLAGS) -o $@
|
|
$(STRIP) $@
|
|
|
|
$(TESTSUITE): $(filter %.o,$(TSRCS:%.cpp=$(OBJDIR)/%.o))
|
|
$(CXX) $^ $(LDFLAGS) -o $@
|
|
$(STRIP) $@
|
|
|
|
# Determine if the tests should be run.
|
|
RUNTESTS := true
|
|
ifdef TESTSUITE
|
|
RUNTESTS := ./$(TESTSUITE)
|
|
endif
|
|
|
|
test: $(QCVM) $(TESTSUITE)
|
|
@$(RUNTESTS)
|
|
|
|
clean:
|
|
rm -rf $(DEPDIR) $(OBJDIR)
|
|
|
|
.PHONY: test clean $(DEPDIR) $(OBJDIR)
|
|
|
|
# Dependencies
|
|
$(filter %.d,$(GSRCS:%.cpp=$(DEPDIR)/%.d)):
|
|
include $(wildcard $@)
|
|
|
|
$(filter %.d,$(QSRCS:%.cpp=$(DEPDIR)/%.d)):
|
|
include $(wildcard $@)
|
|
|
|
$(filter %.d,$(TSRCS:%.cpp=$(DEPDIR)/%.d)):
|
|
include $(wildcard $@)
|