CPPSTD=c++20 #CFIFLAGS=-fsanitize=cfi -fvisibility=hidden -fsanitize=cfi -flto #Does not work reliably atm CFIFLAGS= CXXFLAGS=-std=$(CPPSTD) -O2 -g -no-pie -pipe -MMD -Wall -Wextra -DGLIBCXX_ASSERTIONS -D_LIBCPP_ENABLE_ASSERTIONS=1 $(CFIFLAGS) RELEASE_CXXFLAGS=-std=$(CPPSTD) -O3 -pipe -MMD -Wall -Wextra -DGLIBCXX_ASSERTIONS -D_LIBCPP_ENABLE_ASSERTIONS=1 $(CFIFLAGS) LDFLAGS=-lsqlite3 -lpthread -lcrypto -lstdc++fs $(CFIFLAGS) INCLUDEFLAGS=-I submodules/sqlitemoderncpp/hdr -I submodules/cpp-httplib -I submodules/exile.h SOURCES=$(wildcard *.cpp) SOURCES+=$(wildcard gateway/*.cpp) SOURCES+=$(wildcard handlers/*.cpp) SOURCES+=$(wildcard database/*.cpp) SOURCES+=$(wildcard cache/*.cpp) SOURCES+=$(wildcard sandbox/*.cpp) SOURCES+=$(wildcard dynamic/*.cpp) HEADERS=$(wildcard *.h) HEADERS+=$(wildcard gateway/*.h) HEADERS+=$(wildcard handlers/*.h) HEADERS+=$(wildcard database/*.h) HEADERS+=$(wildcard cache/*.h) HEADERS+=$(wildcard sandbox/*.h) HEADERS+=$(wildcard dynamic/*.h) BUILDDIR = build OBJECTS=$(patsubst %.cpp, $(BUILDDIR)/%.o, $(SOURCES)) WIKIOBJECTS=$(filter-out test.o, $(OBJECTS)) TESTOBJECTS=$(filter-out qswiki.o, $(OBJECTS)) DEPENDS = ${WIKIOBJECTS:.o=.d} -include ${DEPENDS} # Points to the root of Google Test, relative to where this file is. # Remember to tweak this if you move this file. GTEST_DIR = ../../gtest/googletest GTESTS_TESTDIR = ./tests/ GTEST_CXXFLAGS=-std=$(CPPSTD) -isystem $(GTEST_DIR)/include -I$(GTEST_DIR) -g -O0 -pipe -Wall -Wextra GTEST_LDFLAGS=-lsqlite3 -g -O0 -lpthread -lcrypto -lstdc++fs GTEST_OBJECTS=$(filter-out qswiki.o, $(WIKIOBJECTS)) RESOURCEDIR ?= template/quitesimple RESOURCEFILES := $(shell find $(RESOURCEDIR) -type f) RESOURCEOUTDIR := $(BUILDDIR)/resources RESOURCEOBJECTS := $(patsubst $(RESOURCEDIR)/%,$(RESOURCEOUTDIR)/%.o,$(RESOURCEFILES)) GENERATED_PATH = $(BUILDDIR)/generated OBJCOPY_ARCH := elf64-x86-64 OBJCOPY_TARGET := i386:x86-64 .DEFAULT_GOAL := qswiki release: CXXFLAGS=$(RELEASE_CXXFLAGS) profile: CXXFLAGS=$(RELEASE_CXXFLAGS) -pg profile: LDFLAGS+= -pg release: qswiki profile: qswiki OBJECTDIRS=$(sort $(dir $(OBJECTS))) $(OBJECTS): | $(OBJECTDIRS) $(OBJECTDIRS): mkdir -p $@ $(BUILDDIR)/exile.o: submodules/exile.h/exile.c $(CC) -std=c99 -c submodules/exile.h/exile.c -o $@ qswiki: $(WIKIOBJECTS) $(BUILDDIR)/exile.o genresources $(CXX) $(shell shuf -e $(WIKIOBJECTS) $(RESOURCEOBJECTS) $(BUILDDIR)/exile.o ) ${LDFLAGS} ${INCLUDEFLAGS} -o $(BUILDDIR)/qswiki test: $(TESTOBJECTS) $(CXX) $(TESTOBJECTS) ${LDFLAGS} -o $(BUILDDIR)/test gtest: $(GTESTS_TESTDIR)/*.cpp $(GTEST_OBJECTS) $(CXX) -o gtest $(GTESTS_TESTDIR)/*.cpp $(GTEST_OBJECTS) $(GTEST_CXXFLAGS) $(GTEST_DIR)/src/gtest_main.cc $(GTEST_DIR)/src/gtest-all.cc $(GTEST_LDFLAGS) $(BUILDDIR)/%.o:%.cpp $(CXX) ${CXXFLAGS} ${INCLUDEFLAGS} -c -o $@ $< $(BUILDDIR)/version.o:version.cpp $(CXX) ${CXXFLAGS} ${INCLUDEFLAGS} -DGITCOMMIT=\"$(shell git rev-parse --short HEAD)\" -c -o $@ $< $(BUILDDIR)/embedded.o:embedded.cpp genresources $(CXX) ${CXXFLAGS} ${INCLUDEFLAGS} -I $(GENERATED_PATH) -c -o $@ $< clean: rm -r build genresources: resources_gen.sh resources ./resources_gen.sh $(GENERATED_PATH) $(RESOURCEDIR) $(RESOURCEOUTDIR)/%.o: $(RESOURCEDIR)/% .FORCE @mkdir -p $(dir $@) objcopy -I binary -O $(OBJCOPY_ARCH) -B $(OBJCOPY_TARGET) \ --rename-section .data=.rodata,alloc,load,readonly,data,contents \ $< $@ .PHONY: resources resources: $(RESOURCEOBJECTS) .PHONY: clean-resources clean-resources: rm -rf $(RESOURCEOUTDIR) rm -rf $(GENERATED_PATH) .PHONY: .FORCE .FORCE: