From aaaa70775f26d4dda541ade06423c941f79b0c61 Mon Sep 17 00:00:00 2001 From: Bob Polis Date: Thu, 19 Sep 2024 16:29:23 +0200 Subject: [PATCH] Replace Makefile with unified Makefile --- Makefile | 290 ++++++++++++++++++++++++++++++++++++++++------- Makefile.unified | 287 ---------------------------------------------- 2 files changed, 248 insertions(+), 329 deletions(-) delete mode 100644 Makefile.unified diff --git a/Makefile b/Makefile index e6d6a04..3927ffe 100644 --- a/Makefile +++ b/Makefile @@ -1,81 +1,287 @@ -BIN := $(shell basename $$(pwd)) -PLUGINS := $(wildcard modules/*) +include premake.make -MAKE += --no-print-directory +# dir name becomes product name +PROJ := $(shell basename $$(pwd)) -MANSECTION := 1 -MANPAGE := $(BIN).$(MANSECTION) +# find out what platform we're on +UNAME_S := $(shell uname -s) -SRCS := $(wildcard *.cpp) -OBJS := $(subst .cpp,.o,$(SRCS)) -DEPS := $(subst .cpp,.d,$(SRCS)) - -CXX ?= g++ -PKG_CONFIG ?= pkg-config +# git commit hash and version for this build +COMMIT-HASH != git log 2>/dev/null | sed -e '1s/^commit //;q' +COMMIT := "const char* commit = \"$(COMMIT-HASH)\";" +VERSION := "const char* version = \"$(MAJOR).$(MINOR).$(PATCH)\";" +# some important install locations PREFIX ?= /usr/local BINDIR ?= $(PREFIX)/bin CONFIGDIR ?= $(PREFIX)/etc +INCLUDEDIR ?= $(PREFIX)/include +LIBDIR ?= $(PREFIX)/lib +MANDIR ?= $(PREFIX)/man DATADIR ?= $(PREFIX)/share -MANDIR ?= $(DATADIR)/man/man -DOCDIR ?= $(DATADIR)/$(BIN)/doc +DOCDIR ?= $(DATADIR)/$(PROJ)/doc -RM := /bin/rm -f -INSTALL := /usr/bin/install -c +# setup naming and versioning for library product +ifeq ($(UNAME_S), Darwin) + LINKERNAME := $(PROJ).dylib + SONAME := $(PROJ).$(MAJOR).dylib + REALNAME := $(LINKERNAME) +else ifeq ($(UNAME_S), OpenBSD) + REALNAME := $(PROJ).so.$(MAJOR).$(MINOR) +else ifeq ($(UNAME_S), Linux) + LINKERNAME := $(PROJ).so + SONAME := $(LINKERNAME).$(MAJOR) + REALNAME := $(SONAME).$(MINOR).$(PATCH) +endif +STATICLIB := $(PROJ).a -CXXFLAGS += -Wshadow -Wall -Wpedantic -Wextra -g -std=c++17 -ifeq ($(DEBUG),1) +# select default compiler +CXX ?= g++ + +# setup compiler flags and build config +CXXFLAGS += -Wshadow -Wall -Wpedantic -Wextra -Wno-unused-parameter +CXXFLAGS += -g3 -std=c++20 -fPIC +ifeq ($(DEBUG), 1) CXXFLAGS += -D DEBUG -O0 + CONFIG := debug else CXXFLAGS += -D NDEBUG -O3 + CONFIG := release endif -LDLIBS := -lm -lscgui -lcairo -lscerror -lscstring -lscscreensaver -lscnumerics +# setup build locations +OUTDIR := build/$(CONFIG) +BUILDDIR := build/obj +BIN := $(OUTDIR)/$(PROJ) -LDLIBS += $(shell pkg-config sdl2 --libs) -CXXFLAGS += $(shell pkg-config sdl2 --cflags) - -UNAME_S := $(shell uname -s) +# define sources and derived files +# allow for extra sources defined in premake.make +SRCS += $(notdir $(wildcard src/*.cpp)) +OBJS := $(addprefix $(BUILDDIR)/, $(SRCS:.cpp=.o)) +DEPS := $(addprefix $(BUILDDIR)/, $(SRCS:.cpp=.dep)) +HDRS ?= $(wildcard src/*.hpp) +MANS := $(addprefix $(PREFIX)/, $(wildcard man/man*/*)) +# if project supports plugins, link to libdl where needed +ifdef PLUGINS ifeq ($(UNAME_S),Darwin) LDLIBS += -ldl -endif -ifeq ($(UNAME_S),Linux) +else ifeq ($(UNAME_S),Linux) LDLIBS += -ldl endif +endif -.PHONY: all clean install modules new +# pattern rules =========================================================== -all: $(BIN) modules +$(BUILDDIR)/%.o: src/%.cpp +ifeq ($(PRECOMPILE), 1) + $(CXX) $(CXXFLAGS) -o $@ -include precomp.hpp -MMD -MP -MT $@ -MF $(BUILDDIR)/$*.dep -c $< +else + $(CXX) $(CXXFLAGS) -o $@ -MMD -MP -MT $@ -MF $(BUILDDIR)/$*.dep -c $< +endif +%.dep: ; + +$(MANDIR)/man1/%: man/man1/% + install -m 0644 $< $@ + +$(MANDIR)/man3/%: man/man3/% + install -m 0644 $< $@ + +$(MANDIR)/man5/%: man/man5/% + install -m 0644 $< $@ + +# =========================================================== pattern rules + +# targets ================================================================= + +.PHONY: all commit-hash version plugins test clean dist-clean install-plugins install uninstall-plugins uninstall + +# main target +ifeq ($(PRODUCT), tool) +all: $(BUILDDIR) $(OUTDIR) commit-hash version plugins $(BIN) +else ifeq ($(PRODUCT), lib) +all: $(BUILDDIR) $(OUTDIR) commit-hash version plugins $(OUTDIR)/$(REALNAME) $(OUTDIR)/$(STATICLIB) +endif + +$(BUILDDIR): + mkdir -p $@ + +$(OUTDIR): + mkdir -p $@ + +# product build rules +ifeq ($(PRODUCT), tool) # -------------------------------------------- tool + +ifeq ($(PRECOMPILE), 1) +$(BIN): precomp.hpp.gch $(OBJS) +else $(BIN): $(OBJS) - $(CXX) $(OBJS) $(LDFLAGS) -o $(BIN) $(LDLIBS) +endif + $(CXX) -o $(BIN) $(LDFLAGS) $(OBJS) $(LDLIBS) + @ln -sf $(BIN) $(PROJ) -%.o %.d: %.cpp - $(CXX) $(CXXFLAGS) -MMD -MP -MT $@ -MF $*.d -c $< +endif # -------------------------------------------------------------- tool +ifeq ($(PRODUCT), lib) # ---------------------------------------------- lib + +ifeq ($(PRECOMPILE), 1) +$(OUTDIR)/$(REALNAME): precomp.hpp.gch $(OBJS) +else +$(OUTDIR)/$(REALNAME): $(OBJS) +endif +ifeq ($(UNAME_S),Darwin) + $(CXX) -dynamiclib -o $(OUTDIR)/$(REALNAME) -current_version $(MAJOR) -compatibility_version $(MINOR) $(LDFLAGS) $(OBJS) $(LDLIBS) +else ifeq ($(UNAME_S),OpenBSD) + $(CXX) -g -shared -Wl,-soname,$(REALNAME) -o $(OUTDIR)/$(REALNAME) $(LDFLAGS) $(OBJS) $(LDLIBS) +else ifeq ($(UNAME_S),Linux) + $(CXX) -g -shared -Wl,-soname,$(SONAME) -o $(OUTDIR)/$(REALNAME) $(LDFLAGS) $(OBJS) $(LDLIBS) +endif + +$(OUTDIR)/$(STATICLIB): $(OBJS) + ar r $(OUTDIR)/$(STATICLIB) $(OBJS) + +ifeq ($(GENERATELIBHEADER),1) +$(OUTDIR)/$(PROJ).hpp: $(HDRS) + @echo updating $(OUTDIR)/$(PROJ).hpp + @cp /dev/null $(OUTDIR)/$(PROJ).hpp + @for h in $(HDRS); \ + do \ + sed '/@exclude/d' $$h >> $(OUTDIR)/$(PROJ).hpp; \ + done +endif + +endif # --------------------------------------------------------------- lib + +# get generated dependencies, if any -include $(DEPS) -modules: $(PLUGINS) - mkdir -p plugins +commit-hash: + @if ! echo $(COMMIT) | diff -q src/commit.inc - >/dev/null 2>&1 ;\ + then \ + echo $(COMMIT) > src/commit.inc ;\ + fi + +version: + @if ! echo $(VERSION) | diff -q src/version.inc - >/dev/null 2>&1 ;\ + then \ + echo $(VERSION) > src/version.inc ;\ + fi + +$(BUILDDIR)/version.o: src/version.inc src/commit.inc + +precomp.hpp.gch: src/precomp.hpp + $(CXX) $< $(CXXFLAGS) -o $@ + +plugins: +ifdef PLUGINS @for plug in $(PLUGINS) ;\ do \ - cd $$plug && $(MAKE) && $(MAKE) install ;\ - cd ../.. ;\ + $(MAKE) -C $$plug ;\ done +else + ; +endif + +test: + $(MAKE) -C tests && tests/tests clean: - $(RM) $(OBJS) $(DEPS) $(BIN) - $(RM) -r plugins + rm -rf $(BUILDDIR) tests/build tests/tests tests/src/commit.inc tests/src/version.inc +ifdef PLUGINS @for plug in $(PLUGINS) ;\ do \ $(MAKE) -C $$plug clean ;\ done +endif -install: $(BIN) - $(INSTALL) -d $(BINDIR) - $(INSTALL) $(BIN) $(BINDIR) - $(INSTALL) -d $(MANDIR)$(MANSECTION) - $(INSTALL) -m 644 $(MANPAGE) $(MANDIR)$(MANSECTION) - $(INSTALL) -d $(DATADIR)/$(BIN)/plugins - $(INSTALL) -m 644 plugins/* $(DATADIR)/$(BIN)/plugins/ +dist-clean: clean + rm -rf build $(PROJ) src/commit.inc src/version.inc precomp.hpp.pch + +$(MANDIR)/man1: + install -m 0755 -d $@ + +$(MANDIR)/man3: + install -m 0755 -d $@ + +$(MANDIR)/man5: + install -m 0755 -d $@ + +# (un)install targets + +install-plugins: +ifdef PLUGINS + @for plug in $(PLUGINS) ;\ + do \ + $(MAKE) -C $$plug install ;\ + done +else + ; +endif + +uninstall-plugins: +ifdef PLUGINS + @for plug in $(PLUGINS) ;\ + do \ + $(MAKE) -C $$plug uninstall ;\ + done +else + ; +endif + +ifeq ($(PRODUCT), tool) # -------------------------------------------- tool + +$(BINDIR): + install -m 0755 -d $@ + +install: $(MANDIR)/man1 $(MANDIR)/man3 $(MANDIR)/man5 $(BINDIR) $(MANS) install-plugins + install -m 0755 $(BIN) $(BINDIR) + +uninstall: uninstall-plugins + rm -f $(BINDIR)/$(PROJ) $(MANS) + +endif # -------------------------------------------------------------- tool + +ifeq ($(PRODUCT), lib) # ---------------------------------------------- lib + +$(LIBDIR): + install -m 0755 -d $@ + +$(INCLUDEDIR): + install -m 0755 -d $@ + +$(INCLUDEDIR)/$(PROJ): + install -m 0755 -d $@ + +ifeq ($(GENERATELIBHEADER), 1) +install: $(MANDIR)/man1 $(MANDIR)/man3 $(MANDIR)/man5 $(LIBDIR) $(INCLUDEDIR) $(MANS) $(OUTDIR)/$(PROJ).hpp install-plugins + install -m 0644 $(OUTDIR)/$(PROJ).hpp $(INCLUDEDIR) +else +install: $(MANDIR)/man1 $(MANDIR)/man3 $(MANDIR)/man5 $(LIBDIR) $(INCLUDEDIR) $(MANS) $(INCLUDEDIR)/$(PROJ) install-plugins + install -m 0644 $(HDRS) $(INCLUDEDIR)/$(PROJ) +endif + install -m 0644 $(OUTDIR)/$(REALNAME) $(LIBDIR) + install -m 0644 $(OUTDIR)/$(STATICLIB) $(LIBDIR) +ifeq ($(UNAME_S), Darwin) + cd $(LIBDIR) && ln -sf $(REALNAME) $(SONAME) +else ifeq ($(UNAME_S), Linux) + ldconfig + cd $(LIBDIR) && ln -sf $(SONAME) $(LINKERNAME) +else ifeq ($(UNAME_S), OpenBSD) + ldconfig -R +endif + +uninstall: uninstall-plugins + rm -rf $(INCLUDEDIR)/$(PROJ).hpp $(INCLUDEDIR)/$(PROJ) $(MANS) $(LIBDIR)/$(STATICLIB) $(LIBDIR)/$(REALNAME) $(LIBDIR)/$(SONAME) $(LIBDIR)/$(LINKERNAME) +ifeq ($(UNAME_S), Linux) + ldconfig +else ifeq ($(UNAME_S), OpenBSD) + ldconfig -R +endif + +endif # --------------------------------------------------------------- lib + +# ================================================================= targets + +# project-specific targets go in here +-include postmake.make diff --git a/Makefile.unified b/Makefile.unified deleted file mode 100644 index 3927ffe..0000000 --- a/Makefile.unified +++ /dev/null @@ -1,287 +0,0 @@ -include premake.make - -# dir name becomes product name -PROJ := $(shell basename $$(pwd)) - -# find out what platform we're on -UNAME_S := $(shell uname -s) - -# git commit hash and version for this build -COMMIT-HASH != git log 2>/dev/null | sed -e '1s/^commit //;q' -COMMIT := "const char* commit = \"$(COMMIT-HASH)\";" -VERSION := "const char* version = \"$(MAJOR).$(MINOR).$(PATCH)\";" - -# some important install locations -PREFIX ?= /usr/local -BINDIR ?= $(PREFIX)/bin -CONFIGDIR ?= $(PREFIX)/etc -INCLUDEDIR ?= $(PREFIX)/include -LIBDIR ?= $(PREFIX)/lib -MANDIR ?= $(PREFIX)/man -DATADIR ?= $(PREFIX)/share -DOCDIR ?= $(DATADIR)/$(PROJ)/doc - -# setup naming and versioning for library product -ifeq ($(UNAME_S), Darwin) - LINKERNAME := $(PROJ).dylib - SONAME := $(PROJ).$(MAJOR).dylib - REALNAME := $(LINKERNAME) -else ifeq ($(UNAME_S), OpenBSD) - REALNAME := $(PROJ).so.$(MAJOR).$(MINOR) -else ifeq ($(UNAME_S), Linux) - LINKERNAME := $(PROJ).so - SONAME := $(LINKERNAME).$(MAJOR) - REALNAME := $(SONAME).$(MINOR).$(PATCH) -endif -STATICLIB := $(PROJ).a - -# select default compiler -CXX ?= g++ - -# setup compiler flags and build config -CXXFLAGS += -Wshadow -Wall -Wpedantic -Wextra -Wno-unused-parameter -CXXFLAGS += -g3 -std=c++20 -fPIC -ifeq ($(DEBUG), 1) - CXXFLAGS += -D DEBUG -O0 - CONFIG := debug -else - CXXFLAGS += -D NDEBUG -O3 - CONFIG := release -endif - -# setup build locations -OUTDIR := build/$(CONFIG) -BUILDDIR := build/obj -BIN := $(OUTDIR)/$(PROJ) - -# define sources and derived files -# allow for extra sources defined in premake.make -SRCS += $(notdir $(wildcard src/*.cpp)) -OBJS := $(addprefix $(BUILDDIR)/, $(SRCS:.cpp=.o)) -DEPS := $(addprefix $(BUILDDIR)/, $(SRCS:.cpp=.dep)) -HDRS ?= $(wildcard src/*.hpp) -MANS := $(addprefix $(PREFIX)/, $(wildcard man/man*/*)) - -# if project supports plugins, link to libdl where needed -ifdef PLUGINS -ifeq ($(UNAME_S),Darwin) - LDLIBS += -ldl -else ifeq ($(UNAME_S),Linux) - LDLIBS += -ldl -endif -endif - -# pattern rules =========================================================== - -$(BUILDDIR)/%.o: src/%.cpp -ifeq ($(PRECOMPILE), 1) - $(CXX) $(CXXFLAGS) -o $@ -include precomp.hpp -MMD -MP -MT $@ -MF $(BUILDDIR)/$*.dep -c $< -else - $(CXX) $(CXXFLAGS) -o $@ -MMD -MP -MT $@ -MF $(BUILDDIR)/$*.dep -c $< -endif - -%.dep: ; - -$(MANDIR)/man1/%: man/man1/% - install -m 0644 $< $@ - -$(MANDIR)/man3/%: man/man3/% - install -m 0644 $< $@ - -$(MANDIR)/man5/%: man/man5/% - install -m 0644 $< $@ - -# =========================================================== pattern rules - -# targets ================================================================= - -.PHONY: all commit-hash version plugins test clean dist-clean install-plugins install uninstall-plugins uninstall - -# main target -ifeq ($(PRODUCT), tool) -all: $(BUILDDIR) $(OUTDIR) commit-hash version plugins $(BIN) -else ifeq ($(PRODUCT), lib) -all: $(BUILDDIR) $(OUTDIR) commit-hash version plugins $(OUTDIR)/$(REALNAME) $(OUTDIR)/$(STATICLIB) -endif - -$(BUILDDIR): - mkdir -p $@ - -$(OUTDIR): - mkdir -p $@ - -# product build rules -ifeq ($(PRODUCT), tool) # -------------------------------------------- tool - -ifeq ($(PRECOMPILE), 1) -$(BIN): precomp.hpp.gch $(OBJS) -else -$(BIN): $(OBJS) -endif - $(CXX) -o $(BIN) $(LDFLAGS) $(OBJS) $(LDLIBS) - @ln -sf $(BIN) $(PROJ) - -endif # -------------------------------------------------------------- tool - -ifeq ($(PRODUCT), lib) # ---------------------------------------------- lib - -ifeq ($(PRECOMPILE), 1) -$(OUTDIR)/$(REALNAME): precomp.hpp.gch $(OBJS) -else -$(OUTDIR)/$(REALNAME): $(OBJS) -endif -ifeq ($(UNAME_S),Darwin) - $(CXX) -dynamiclib -o $(OUTDIR)/$(REALNAME) -current_version $(MAJOR) -compatibility_version $(MINOR) $(LDFLAGS) $(OBJS) $(LDLIBS) -else ifeq ($(UNAME_S),OpenBSD) - $(CXX) -g -shared -Wl,-soname,$(REALNAME) -o $(OUTDIR)/$(REALNAME) $(LDFLAGS) $(OBJS) $(LDLIBS) -else ifeq ($(UNAME_S),Linux) - $(CXX) -g -shared -Wl,-soname,$(SONAME) -o $(OUTDIR)/$(REALNAME) $(LDFLAGS) $(OBJS) $(LDLIBS) -endif - -$(OUTDIR)/$(STATICLIB): $(OBJS) - ar r $(OUTDIR)/$(STATICLIB) $(OBJS) - -ifeq ($(GENERATELIBHEADER),1) -$(OUTDIR)/$(PROJ).hpp: $(HDRS) - @echo updating $(OUTDIR)/$(PROJ).hpp - @cp /dev/null $(OUTDIR)/$(PROJ).hpp - @for h in $(HDRS); \ - do \ - sed '/@exclude/d' $$h >> $(OUTDIR)/$(PROJ).hpp; \ - done -endif - -endif # --------------------------------------------------------------- lib - -# get generated dependencies, if any --include $(DEPS) - -commit-hash: - @if ! echo $(COMMIT) | diff -q src/commit.inc - >/dev/null 2>&1 ;\ - then \ - echo $(COMMIT) > src/commit.inc ;\ - fi - -version: - @if ! echo $(VERSION) | diff -q src/version.inc - >/dev/null 2>&1 ;\ - then \ - echo $(VERSION) > src/version.inc ;\ - fi - -$(BUILDDIR)/version.o: src/version.inc src/commit.inc - -precomp.hpp.gch: src/precomp.hpp - $(CXX) $< $(CXXFLAGS) -o $@ - -plugins: -ifdef PLUGINS - @for plug in $(PLUGINS) ;\ - do \ - $(MAKE) -C $$plug ;\ - done -else - ; -endif - -test: - $(MAKE) -C tests && tests/tests - -clean: - rm -rf $(BUILDDIR) tests/build tests/tests tests/src/commit.inc tests/src/version.inc -ifdef PLUGINS - @for plug in $(PLUGINS) ;\ - do \ - $(MAKE) -C $$plug clean ;\ - done -endif - -dist-clean: clean - rm -rf build $(PROJ) src/commit.inc src/version.inc precomp.hpp.pch - -$(MANDIR)/man1: - install -m 0755 -d $@ - -$(MANDIR)/man3: - install -m 0755 -d $@ - -$(MANDIR)/man5: - install -m 0755 -d $@ - -# (un)install targets - -install-plugins: -ifdef PLUGINS - @for plug in $(PLUGINS) ;\ - do \ - $(MAKE) -C $$plug install ;\ - done -else - ; -endif - -uninstall-plugins: -ifdef PLUGINS - @for plug in $(PLUGINS) ;\ - do \ - $(MAKE) -C $$plug uninstall ;\ - done -else - ; -endif - -ifeq ($(PRODUCT), tool) # -------------------------------------------- tool - -$(BINDIR): - install -m 0755 -d $@ - -install: $(MANDIR)/man1 $(MANDIR)/man3 $(MANDIR)/man5 $(BINDIR) $(MANS) install-plugins - install -m 0755 $(BIN) $(BINDIR) - -uninstall: uninstall-plugins - rm -f $(BINDIR)/$(PROJ) $(MANS) - -endif # -------------------------------------------------------------- tool - -ifeq ($(PRODUCT), lib) # ---------------------------------------------- lib - -$(LIBDIR): - install -m 0755 -d $@ - -$(INCLUDEDIR): - install -m 0755 -d $@ - -$(INCLUDEDIR)/$(PROJ): - install -m 0755 -d $@ - -ifeq ($(GENERATELIBHEADER), 1) -install: $(MANDIR)/man1 $(MANDIR)/man3 $(MANDIR)/man5 $(LIBDIR) $(INCLUDEDIR) $(MANS) $(OUTDIR)/$(PROJ).hpp install-plugins - install -m 0644 $(OUTDIR)/$(PROJ).hpp $(INCLUDEDIR) -else -install: $(MANDIR)/man1 $(MANDIR)/man3 $(MANDIR)/man5 $(LIBDIR) $(INCLUDEDIR) $(MANS) $(INCLUDEDIR)/$(PROJ) install-plugins - install -m 0644 $(HDRS) $(INCLUDEDIR)/$(PROJ) -endif - install -m 0644 $(OUTDIR)/$(REALNAME) $(LIBDIR) - install -m 0644 $(OUTDIR)/$(STATICLIB) $(LIBDIR) -ifeq ($(UNAME_S), Darwin) - cd $(LIBDIR) && ln -sf $(REALNAME) $(SONAME) -else ifeq ($(UNAME_S), Linux) - ldconfig - cd $(LIBDIR) && ln -sf $(SONAME) $(LINKERNAME) -else ifeq ($(UNAME_S), OpenBSD) - ldconfig -R -endif - -uninstall: uninstall-plugins - rm -rf $(INCLUDEDIR)/$(PROJ).hpp $(INCLUDEDIR)/$(PROJ) $(MANS) $(LIBDIR)/$(STATICLIB) $(LIBDIR)/$(REALNAME) $(LIBDIR)/$(SONAME) $(LIBDIR)/$(LINKERNAME) -ifeq ($(UNAME_S), Linux) - ldconfig -else ifeq ($(UNAME_S), OpenBSD) - ldconfig -R -endif - -endif # --------------------------------------------------------------- lib - -# ================================================================= targets - -# project-specific targets go in here --include postmake.make