mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-02-21 10:51:10 +00:00
new makefile
This commit is contained in:
parent
94c2936bfa
commit
f971f89e1e
1 changed files with 180 additions and 76 deletions
256
Makefile
256
Makefile
|
@ -1,100 +1,204 @@
|
||||||
UNAME ?= $(shell uname)
|
# Compilation options:
|
||||||
CYGWIN = $(findstring CYGWIN, $(UNAME))
|
# * LTO - Link time optimization [default=0]
|
||||||
MINGW = $(findstring MINGW, $(UNAME))
|
# * 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 ?= ./
|
||||||
|
|
||||||
ifneq ("$(CYGWIN)", "")
|
# Determine if we're building for Windows or not so we can set the right file
|
||||||
WINDOWS=1
|
# extensions for the binaries and exclude the testsuite because it doesn't build
|
||||||
endif
|
# for that platform.
|
||||||
ifneq ("$(MINGW)", "")
|
ifeq ($(OS),Windows_NT)
|
||||||
WINDOWS=1
|
GMQCC := gmqcc.exe
|
||||||
|
QCVM := qcvm.exe
|
||||||
|
else
|
||||||
|
GMQCC := gmqcc
|
||||||
|
QCVM := qcvm
|
||||||
|
TESTSUITE := testsuite
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# C++ compiler
|
||||||
CXX ?= clang++
|
CXX ?= clang++
|
||||||
CXXFLAGS = \
|
|
||||||
-std=c++11 \
|
|
||||||
-Wall \
|
|
||||||
-Wextra \
|
|
||||||
-Wno-parentheses \
|
|
||||||
-Wno-class-memaccess \
|
|
||||||
-fno-exceptions \
|
|
||||||
-fno-rtti \
|
|
||||||
-MD \
|
|
||||||
-g3
|
|
||||||
|
|
||||||
CSRCS = \
|
# Build artifact directories
|
||||||
ast.cpp \
|
OBJDIR := .build/objs
|
||||||
code.cpp \
|
DEPDIR := .build/deps
|
||||||
conout.cpp \
|
|
||||||
fold.cpp \
|
|
||||||
ftepp.cpp \
|
|
||||||
intrin.cpp \
|
|
||||||
ir.cpp \
|
|
||||||
lexer.cpp \
|
|
||||||
main.cpp \
|
|
||||||
opts.cpp \
|
|
||||||
parser.cpp \
|
|
||||||
stat.cpp \
|
|
||||||
utf8.cpp \
|
|
||||||
util.cpp
|
|
||||||
|
|
||||||
TSRCS = \
|
# Collect all the source files for GMQCC.
|
||||||
conout.cpp \
|
GSRCS := ast.cpp
|
||||||
opts.cpp \
|
GSRCS += code.cpp
|
||||||
stat.cpp \
|
GSRCS += conout.cpp
|
||||||
test.cpp \
|
GSRCS += fold.cpp
|
||||||
util.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
|
||||||
|
|
||||||
VSRCS = \
|
# Collect all the source files for QCVM.
|
||||||
exec.cpp \
|
QSRCS := exec.cpp
|
||||||
stat.cpp \
|
QSRCS += stat.cpp
|
||||||
util.cpp
|
QSRCS += util.cpp
|
||||||
|
|
||||||
COBJS = $(CSRCS:.cpp=.o)
|
# Collect all the source files for TESTSUITE.
|
||||||
TOBJS = $(TSRCS:.cpp=.o)
|
TSRCS := conout.cpp
|
||||||
VOBJS = $(VSRCS:.cpp=.o)
|
TSRCS += opts.cpp
|
||||||
|
TSRCS += stat.cpp
|
||||||
|
TSRCS += test.cpp
|
||||||
|
TSRCS += util.cpp
|
||||||
|
|
||||||
CDEPS = $(CSRCS:.cpp=.d)
|
#
|
||||||
TDEPS = $(TSRCS:.cpp=.d)
|
# Compilation flags
|
||||||
VDEPS = $(VSRCS:.cpp=.d)
|
#
|
||||||
|
CXXFLAGS := -Wall
|
||||||
|
CXXFLAGS += -Wextra
|
||||||
|
CXXFLAGS += -Wno-parentheses
|
||||||
|
CXXFLAGS += -Wno-class-memaccess
|
||||||
|
CXXFLAGS += -Wno-implicit-fallthrough
|
||||||
|
CXXFLAGS += -std=c++11
|
||||||
|
|
||||||
ifndef WINDOWS
|
# Disable some unneeded features.
|
||||||
CBIN = gmqcc
|
CXXFLAGS += -fno-exceptions
|
||||||
VBIN = qcvm
|
CXXFLAGS += -fno-rtti
|
||||||
TBIN = testsuite
|
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
|
else
|
||||||
CBIN = gmqcc.exe
|
# Disable all the stack protection features in release builds.
|
||||||
VBIN = qcvm.exe
|
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
|
endif
|
||||||
|
|
||||||
ifndef WINDOWS
|
# Sanitizer selection
|
||||||
all: $(CBIN) $(QCVM) $(TBIN)
|
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
|
else
|
||||||
all: $(CBIN) $(QCVM)
|
STRIP := strip
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(CBIN): $(COBJS)
|
all: $(GMQCC) $(QCVM) $(TESTSUITE)
|
||||||
$(CXX) $(COBJS) -o $@
|
|
||||||
|
|
||||||
$(VBIN): $(VOBJS)
|
# Build artifact directories.
|
||||||
$(CXX) $(VOBJS) -o $@
|
$(DEPDIR):
|
||||||
|
@mkdir -p $(DEPDIR)
|
||||||
|
$(OBJDIR):
|
||||||
|
@mkdir -p $(OBJDIR)
|
||||||
|
|
||||||
ifndef WINDOWS
|
$(OBJDIR)/%.o: %.cpp $(DEPDIR)/%.d | $(OBJDIR) $(DEPDIR)
|
||||||
$(TBIN): $(TOBJS)
|
$(CXX) -MT $@ $(DEPFLAGS) -MF $(DEPDIR)/$*.Td $(CXXFLAGS) -c -o $@ $<
|
||||||
$(CXX) $(TOBJS) -o $@
|
@mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d
|
||||||
|
|
||||||
test: $(CBIN) $(VBIN) $(TBIN)
|
$(GMQCC): $(filter %.o,$(GSRCS:%.cpp=$(OBJDIR)/%.o))
|
||||||
@./$(TBIN)
|
$(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
|
endif
|
||||||
|
|
||||||
.cpp.o:
|
test: $(QCVM) $(TESTSUITE)
|
||||||
$(CXX) -c $(CXXFLAGS) $< -o $@
|
@$(RUNTESTS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.d
|
rm -rf $(DEPDIR) $(OBJDIR)
|
||||||
rm -f $(COBJS) $(CDEPS) $(CBIN)
|
|
||||||
rm -f $(VOBJS) $(VDEPS) $(VBIN)
|
|
||||||
ifndef WINDOWS
|
|
||||||
rm -f $(TOBJS) $(TDEPS) $(TOBJS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
-include *.d
|
.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 $@)
|
||||||
|
|
Loading…
Reference in a new issue