Bob Polis
c83be332d5
Made version and commit variables static, and local to the version display function. Previously, they would be globals, and as such would collide with those from linked shared libraries. Now, all project types will have them local.
295 lines
7.3 KiB
Makefile
295 lines
7.3 KiB
Makefile
include premake.make
|
|
|
|
# git commit hash and version for this build
|
|
COMMIT-HASH != git log 2>/dev/null | sed -e '1s/^commit //;q'
|
|
COMMIT := "static const char* commit = \"$(COMMIT-HASH)\";"
|
|
VERSION := "static 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/$(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++
|
|
|
|
# setup compiler flags and build config
|
|
CXXFLAGS += -Wshadow -Wall -Wpedantic -Wextra -Wno-unused-parameter
|
|
CXXFLAGS += -g3 -fPIC
|
|
ifeq ($(DEBUG), 1)
|
|
CXXFLAGS += -DDEBUG -O0
|
|
CONFIG := debug
|
|
else
|
|
CXXFLAGS += -DNDEBUG -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 ?= $(filter-out src/precomp.hpp, $(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 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) -install_name $(LIBDIR)/$(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:
|
|
$(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.gch
|
|
|
|
$(MANDIR)/man1:
|
|
install -m 0755 -d $@
|
|
|
|
$(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
|