include premake.make LIBNAME := $(shell basename $$(pwd)) MAJOR := 1 MINOR := 0.0 UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Darwin) LINKERNAME := $(LIBNAME).dylib SONAME := $(LIBNAME).$(MAJOR).dylib REALNAME := $(LINKERNAME) else LINKERNAME := $(LIBNAME).so SONAME := $(LINKERNAME).$(MAJOR) REALNAME := $(SONAME).$(MINOR) endif BUILDDIR := build/intermediates/ PREFIX ?= /usr/local BINDIR ?= $(PREFIX)/bin CONFIGDIR ?= $(PREFIX)/etc INCLUDEDIR ?= $(PREFIX)/include LIBDIR ?= $(PREFIX)/lib DATADIR ?= $(PREFIX)/share MANDIR ?= $(DATADIR)/man DOCDIR ?= $(DATADIR)/$(LIBNAME)/doc SRCS := $(notdir $(wildcard src/*.cpp)) OBJS := $(SRCS:.cpp=.o) DEPS := $(SRCS:.cpp=.d) HDRS := $(wildcard src/*.hpp) CXX ?= g++ CXXFLAGS := $(CXXFLAGS) -Wshadow -Wall -Wpedantic -Wextra -g -fno-strict-aliasing -std=c++17 -fPIC ifeq ($(DEBUG),1) CXXFLAGS += -D DEBUG -O0 CONFIG := debug else CXXFLAGS += -D NDEBUG -O3 CONFIG := release endif OUTDIR := build/$(CONFIG)/ RM := /bin/rm -rf INSTALL := /usr/bin/install -c vpath %.cpp src vpath %.d $(BUILDDIR) vpath %.o $(BUILDDIR) .PHONY: all clean install prebuild test all: prebuild $(OUTDIR)$(REALNAME) prebuild: @mkdir -p $(BUILDDIR) $(OUTDIR) $(OUTDIR)$(REALNAME): $(OBJS) $(DEPS) ifeq ($(UNAME_S),Darwin) $(CXX) -dynamiclib -o $(OUTDIR)$(REALNAME) -current_version $(MAJOR) \ -compatibility_version $(MINOR) $(LDFLAGS) $(LDLIBS) $(addprefix $(BUILDDIR),$(OBJS)) else $(CXX) -g -shared -Wl,-soname,$(SONAME) -o $(OUTDIR)$(REALNAME) $(LDFLAGS) $(LDLIBS) $(addprefix $(BUILDDIR),$(OBJS)) endif %.o: %.cpp %.d $(CXX) $(CXXFLAGS) -MMD -MP -MT $@ -MF $*.d -c $< @mv $@ $*.d $(BUILDDIR) -include $(BUILDDIR)*.d %.d: ; build/$(LIBNAME).hpp: $(HDRS) @echo updating build/$(LIBNAME).hpp @cp /dev/null build/$(LIBNAME).hpp @for h in $(HDRS); \ do \ cat $$h >> build/$(LIBNAME).hpp; \ done test: $(MAKE) -C tests && tests/tests clean: $(RM) build $(MAKE) -C tests clean install: $(OUTDIR)$(REALNAME) build/$(LIBNAME).hpp $(INSTALL) -d $(LIBDIR) $(INSTALL) -m 644 $(OUTDIR)$(REALNAME) $(LIBDIR) $(INSTALL) -d $(INCLUDEDIR) $(INSTALL) -m 644 build/$(LIBNAME).hpp $(INCLUDEDIR) ifeq ($(UNAME_S),Darwin) cd $(LIBDIR) && ln -sf $(REALNAME) $(SONAME) else ldconfig cd $(LIBDIR) && ln -sf $(SONAME) $(LINKERNAME) endif