include premake.make BIN := $(shell basename $$(pwd)) MANSECTION ?= 1 MANPAGE := $(BIN).$(MANSECTION) SRCS := $(notdir $(wildcard src/*.cpp)) OBJS := $(SRCS:.cpp=.o) DEPS := $(SRCS:.cpp=.d) BUILDDIR := build/intermediates/ PREFIX ?= /usr/local BINDIR ?= $(PREFIX)/bin MANDIR ?= $(PREFIX)/man/man CONFIGDIR ?= $(PREFIX)/etc DATADIR ?= $(PREFIX)/share DOCDIR ?= $(DATADIR)/$(BIN)/doc CXX ?= g++ RM := /bin/rm -rf INSTALL := /usr/bin/install -c CXXFLAGS += -Wshadow -Wall -Wpedantic -Wextra -g -std=c++17 ifeq ($(DEBUG),1) CXXFLAGS += -D DEBUG -O0 CONFIG := debug else CXXFLAGS += -D NDEBUG -O3 CONFIG := release endif OUTDIR := build/$(CONFIG)/ vpath %.cpp src vpath %.d $(BUILDDIR) vpath %.o $(BUILDDIR) .PHONY: all clean install prebuild test dist-clean all: prebuild $(OUTDIR)$(BIN) prebuild: @mkdir -p $(BUILDDIR) $(OUTDIR) $(OUTDIR)$(BIN): $(OBJS) $(DEPS) $(CXX) -o $(OUTDIR)$(BIN) $(LDFLAGS) $(LDLIBS) $(addprefix $(BUILDDIR),$(OBJS)) @ln -sf $(OUTDIR)$(BIN) $(BIN) %.o: %.cpp %.d $(CXX) $(CXXFLAGS) -MMD -MP -MT $@ -MF $*.d -c $< @mv $@ $*.d $(BUILDDIR) -include $(BUILDDIR)*.d %.d: ; test: $(MAKE) -C tests && tests/tests clean: $(RM) $(BUILDDIR) $(MAKE) -C tests clean dist-clean: $(RM) build $(BIN) $(MAKE) -C tests clean install: $(INSTALL) -d $(BINDIR) $(INSTALL) $(OUTDIR)$(BIN) $(BINDIR) $(INSTALL) -d $(MANDIR)$(MANSECTION) $(INSTALL) -m 0644 $(MANPAGE) $(MANDIR)$(MANSECTION)