Update to unified Makefile with DATAFILES support
This commit is contained in:
		
							
								
								
									
										303
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										303
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,27 +1,40 @@ | |||||||
| include premake.make | include premake.make | ||||||
|  |  | ||||||
| BIN := $(shell basename $$(pwd)) | # 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)\";" | ||||||
|  |  | ||||||
| MANSECTION := 1 | # some important install locations | ||||||
| MANPAGE := $(BIN).$(MANSECTION) |  | ||||||
|  |  | ||||||
| SRCS := $(notdir $(wildcard src/*.cpp)) |  | ||||||
| OBJS := $(SRCS:.cpp=.o) |  | ||||||
| DEPS := $(SRCS:.cpp=.d) |  | ||||||
|  |  | ||||||
| BUILDDIR := build/intermediates/ |  | ||||||
| PREFIX ?= /usr/local | PREFIX ?= /usr/local | ||||||
| BINDIR ?= $(PREFIX)/bin | BINDIR ?= $(PREFIX)/bin | ||||||
| CONFIGDIR ?= $(PREFIX)/etc | CONFIGDIR ?= $(PREFIX)/etc | ||||||
| DATADIR ?= $(PREFIX)/share | INCLUDEDIR ?= $(PREFIX)/include | ||||||
| MANDIR ?= $(DATADIR)/man/man | LIBDIR ?= $(PREFIX)/lib | ||||||
| DOCDIR ?= $(DATADIR)/$(BIN)/doc | MANDIR ?= $(PREFIX)/man | ||||||
|  | DATADIR ?= $(PREFIX)/share/$(PROJ) | ||||||
|  | DOCDIR ?= $(DATADIR)/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++ | CXX ?= g++ | ||||||
| RM := /bin/rm -rf |  | ||||||
| INSTALL := /usr/bin/install -c |  | ||||||
|  |  | ||||||
| CXXFLAGS += -Wshadow -Wall -Wpedantic -Wextra -Wno-unused-parameter -g3 -std=c++17 | # setup compiler flags and build config | ||||||
|  | CXXFLAGS += -Wshadow -Wall -Wpedantic -Wextra -Wno-unused-parameter | ||||||
|  | CXXFLAGS += -g3 -fPIC | ||||||
| ifeq ($(DEBUG), 1) | ifeq ($(DEBUG), 1) | ||||||
| 	CXXFLAGS += -D DEBUG -O0 | 	CXXFLAGS += -D DEBUG -O0 | ||||||
| 	CONFIG := debug | 	CONFIG := debug | ||||||
| @@ -29,40 +42,252 @@ else | |||||||
| 	CXXFLAGS += -D NDEBUG -O3 | 	CXXFLAGS += -D NDEBUG -O3 | ||||||
| 	CONFIG := release | 	CONFIG := release | ||||||
| endif | endif | ||||||
| OUTDIR := build/$(CONFIG)/ |  | ||||||
|  |  | ||||||
| vpath %.cpp src | # setup build locations | ||||||
| vpath %.d $(BUILDDIR) | OUTDIR := build/$(CONFIG) | ||||||
| vpath %.o $(BUILDDIR) | BUILDDIR := build/obj | ||||||
|  | BIN := $(OUTDIR)/$(PROJ) | ||||||
|  |  | ||||||
| .PHONY: all clean install prebuild test | # 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*/*)) | ||||||
|  |  | ||||||
| all: prebuild $(OUTDIR)$(BIN) | # 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 | ||||||
|  |  | ||||||
| prebuild: | # pattern rules =========================================================== | ||||||
| 	@mkdir -p $(BUILDDIR) $(OUTDIR) |  | ||||||
|  |  | ||||||
| $(OUTDIR)$(BIN): $(OBJS) | $(BUILDDIR)/%.o: src/%.cpp | ||||||
| 	$(CXX) $(addprefix $(BUILDDIR),$(OBJS)) $(LDFLAGS) -o $(OUTDIR)$(BIN) $(LDLIBS) | ifeq ($(PRECOMPILE), 1) | ||||||
| 	@ln -sf $(OUTDIR)$(BIN) $(BIN) | 	$(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 | ||||||
|  |  | ||||||
| %.o %.d: %.cpp | %.dep: ; | ||||||
| 	$(CXX) $(CXXFLAGS) -MMD -MP -MT $@ -MF $*.d -c $< |  | ||||||
| 	@mv $@ $*.d $(BUILDDIR) |  | ||||||
|  |  | ||||||
| -include $(addprefix $(BUILDDIR), $(DEPS)) | $(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 install-data uninstall-data 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 | ||||||
|  | endif | ||||||
|  |  | ||||||
| test: | test: | ||||||
| 	$(MAKE) -C tests && tests/tests | 	$(MAKE) -C tests && tests/tests | ||||||
|  |  | ||||||
| clean: | clean: | ||||||
| 	$(RM) build $(BIN) | 	rm -rf $(BUILDDIR) tests/build tests/tests tests/src/commit.inc tests/src/version.inc | ||||||
| 	$(MAKE) -C tests clean | ifdef PLUGINS | ||||||
|  | 	@for plug in $(PLUGINS) ;\ | ||||||
|  | 	do \ | ||||||
|  | 		$(MAKE) -C $$plug clean ;\ | ||||||
|  | 	done | ||||||
|  | endif | ||||||
|  |  | ||||||
| install: $(OUTDIR)$(BIN) | dist-clean: clean | ||||||
| 	$(INSTALL) -d $(BINDIR) | 	rm -rf build $(PROJ) src/commit.inc src/version.inc precomp.hpp.gch | ||||||
| 	$(INSTALL) $(OUTDIR)$(BIN) $(BINDIR) |  | ||||||
| 	$(INSTALL) -d $(MANDIR)$(MANSECTION) | $(MANDIR)/man1: | ||||||
| 	$(INSTALL) -m 0644 $(MANPAGE) $(MANDIR)$(MANSECTION) | 	install -m 0755 -d $@ | ||||||
| 	$(INSTALL) -d $(DATADIR)/$(BIN) |  | ||||||
| 	$(INSTALL) -m 0644 numerals.db $(DATADIR)/$(BIN) | $(MANDIR)/man3: | ||||||
|  | 	install -m 0755 -d $@ | ||||||
|  |  | ||||||
|  | $(MANDIR)/man5: | ||||||
|  | 	install -m 0755 -d $@ | ||||||
|  |  | ||||||
|  | $(DATADIR): | ||||||
|  | 	install -m 0755 -d $@ | ||||||
|  |  | ||||||
|  | # (un)install targets | ||||||
|  |  | ||||||
|  | ifdef DATAFILES | ||||||
|  | install-data: $(DATADIR) | ||||||
|  | 	install -m 0644 $(DATAFILES) $(DATADIR) | ||||||
|  | else | ||||||
|  | install-data: | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | uninstall-data: | ||||||
|  | 	rm -rf $(DATADIR) | ||||||
|  |  | ||||||
|  | install-plugins: | ||||||
|  | ifdef PLUGINS | ||||||
|  | 	@for plug in $(PLUGINS) ;\ | ||||||
|  | 	do \ | ||||||
|  | 		$(MAKE) -C $$plug install ;\ | ||||||
|  | 	done | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | uninstall-plugins: | ||||||
|  | ifdef PLUGINS | ||||||
|  | 	@for plug in $(PLUGINS) ;\ | ||||||
|  | 	do \ | ||||||
|  | 		$(MAKE) -C $$plug uninstall ;\ | ||||||
|  | 	done | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | ifeq ($(PRODUCT), tool) # -------------------------------------------- tool | ||||||
|  |  | ||||||
|  | $(BINDIR): | ||||||
|  | 	install -m 0755 -d $@ | ||||||
|  |  | ||||||
|  | install: $(MANDIR)/man1 $(MANDIR)/man3 $(MANDIR)/man5 $(BINDIR) $(MANS) install-data install-plugins | ||||||
|  | 	install -m 0755 $(BIN) $(BINDIR) | ||||||
|  |  | ||||||
|  | uninstall: uninstall-data 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-data install-plugins | ||||||
|  | 	install -m 0644 $(OUTDIR)/$(PROJ).hpp $(INCLUDEDIR) | ||||||
|  | else | ||||||
|  | install: $(MANDIR)/man1 $(MANDIR)/man3 $(MANDIR)/man5 $(LIBDIR) $(INCLUDEDIR) $(MANS) $(INCLUDEDIR)/$(PROJ) install-data 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) | ||||||
|  | ifeq ($(USER), root) | ||||||
|  | 	ldconfig | ||||||
|  | else | ||||||
|  | 	cd $(LIBDIR) && ln -sf $(REALNAME) $(SONAME) | ||||||
|  | endif | ||||||
|  | 	cd $(LIBDIR) && ln -sf $(SONAME) $(LINKERNAME) | ||||||
|  | else ifeq ($(UNAME_S), OpenBSD) | ||||||
|  | 	ldconfig -R | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | uninstall: uninstall-data 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 | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								premake.make
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								premake.make
									
									
									
									
									
								
							| @@ -1 +1,31 @@ | |||||||
|  | # Define linker flags here, like: -lsqlite3 -lpthread | ||||||
| LDLIBS := -lm -lpthread -lsqlite3 | LDLIBS := -lm -lpthread -lsqlite3 | ||||||
|  |  | ||||||
|  | # Dir name becomes product name. | ||||||
|  | PROJ := $(shell basename $$(pwd)) | ||||||
|  |  | ||||||
|  | # Find out what platform we're on, e.g. Darwin, Linux, OpenBSD. | ||||||
|  | UNAME_S := $(shell uname -s) | ||||||
|  |  | ||||||
|  | # We will build a tool, not a library. | ||||||
|  | PRODUCT := tool | ||||||
|  |  | ||||||
|  | # Single source of truth for version. | ||||||
|  | MAJOR := 1 | ||||||
|  | MINOR := 0 | ||||||
|  | PATCH := 0 | ||||||
|  |  | ||||||
|  | # Specify desired C++ standard for this project. | ||||||
|  | CXXFLAGS += -std=c++20 | ||||||
|  |  | ||||||
|  | # Set to 1 if you want a precompiled header for the C++ Standard Library. | ||||||
|  | PRECOMPILE := 0 | ||||||
|  |  | ||||||
|  | # List of extra files to be installed in DATADIR (/usr/local/share/$(PROJ) by default) | ||||||
|  | DATAFILES := numerals.db | ||||||
|  |  | ||||||
|  | # Define plugin sub-projects here. Assumption here is a directory "plugins" | ||||||
|  | # containing plugin sub-projects, each in its own directory. | ||||||
|  | # Rename and/or repeat accordingly. | ||||||
|  | PLUGINS := $(wildcard plugins/*) | ||||||
|  | MAKE += --no-print-directory | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user