diff --git a/Makefile b/Makefile index daf3d53a..0b3837c5 100644 --- a/Makefile +++ b/Makefile @@ -12,35 +12,30 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -GIT = $(shell which git) -TAR = $(shell which tar) -MKDIR = $(shell which mkdir) -TOUCH = $(shell which touch) -CP = $(shell which cp) -RM = $(shell which rm) -LN = $(shell which ln) -FIND = $(shell which find) -INSTALL = $(shell which install) -MKTEMP = $(shell which mktemp) -STRIP = $(shell which strip) -PANDOC = $(shell which pandoc) -SED = $(shell which sed) -GZIP = $(shell which gzip) -RPMBUILD = $(shell which rpmbuild) -GIT2DEBCL = ./tools/git2debcl -PKGCONFIG = pkg-config +GIT = git +TAR = tar +MKDIR = mkdir +TOUCH = touch +CP = cp +RM = rm +LN = ln +FIND = find +INSTALL = install +MKTEMP = mktemp +STRIP = strip +PANDOC = pandoc +SED = sed +RPMBUILD = rpmbuild +GIT2DEBCL = ./tools/git2debcl +PKGCONFIG = pkg-config GIT_REPO = 0 -ifneq ($(GIT),) +ifneq ($(shell $(GIT) --version 2> /dev/null),) ifeq ($(shell test -e .git; echo $$?),0) GIT_REPO = 1 endif endif -ifeq ($(PANDOC),) -$(warning "pandoc does not appear available: manpage won't be buildable") -endif - USE_XATTR = 1 INTERNAL_FUSE = 1 @@ -59,16 +54,30 @@ $(error "Use of external FUSE requested, but no libfuse >= $(EXTERNAL_FUSE_MIN_R endif endif +ifeq ($(STATIC),1) +STATIC_FLAG := -static +else +STATIC_FLAG := +endif + +ifeq ($(LTO),1) +LTO_FLAG := -flto +else +LTO_FLAG := +endif + UGID_USE_RWLOCK = 0 -OPTS = -O2 +OPTS = -O2 -g SRC = $(wildcard src/*.cpp) OBJ = $(SRC:src/%.cpp=obj/%.o) DEPS = $(OBJ:obj/%.o=obj/%.d) TARGET = mergerfs MANPAGE = $(TARGET).1 -CFLAGS = -g -Wall \ - $(OPTS) \ +CXXFLAGS = $(OPTS) \ + $(STATIC_FLAG) \ + $(LTO_FLAG) \ + -Wall \ -Wno-unused-result \ $(FUSE_CFLAGS) \ -DFUSE_USE_VERSION=29 \ @@ -92,12 +101,14 @@ INSTALLMAN1DIR = $(DESTDIR)$(MAN1DIR) all: $(TARGET) help: - @echo "usage: make" + @echo "usage: make\n" @echo "make USE_XATTR=0 - build program without xattrs functionality" @echo "make INTERNAL_FUSE=0 - to build program with external (system) libfuse rather than the bundled one ('-o threads=' option will be unavailable)" + @echo "make STATIC=1 - build static binary" + @echo "make LTO=1 - build with link time optimization" $(TARGET): version obj/obj-stamp $(FUSE_TARGET) $(OBJ) - $(CXX) $(CFLAGS) $(LDFLAGS) $(OBJ) -o $@ $(FUSE_LIBS) -ldl -pthread -lrt + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(OBJ) -o $@ $(FUSE_LIBS) -ldl -pthread -lrt mount.mergerfs: $(TARGET) $(LN) -fs "$<" "$@" @@ -105,11 +116,15 @@ mount.mergerfs: $(TARGET) changelog: ifeq ($(GIT_REPO),1) $(GIT2DEBCL) --name $(TARGET) > ChangeLog +else + @echo "WARNING: need git repo to generate ChangeLog" endif authors: ifeq ($(GIT_REPO),1) $(GIT) log --format='%aN <%aE>' | sort -f | uniq > AUTHORS +else + @echo "WARNING: need git repo to generate AUTHORS" endif version: @@ -120,7 +135,7 @@ obj/obj-stamp: $(TOUCH) $@ obj/%.o: src/%.cpp - $(CXX) $(CFLAGS) -c $< -o $@ + $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< -o $@ clean: rpm-clean libfuse_Makefile $(RM) -f src/version.hpp @@ -139,6 +154,11 @@ ifeq ($(GIT_REPO),1) $(GIT) clean -fd endif +superclean: distclean +ifeq ($(GIT_REPO),1) + $(GIT) clean -xfd +endif + install: install-base install-mount.mergerfs install-man install-base: $(TARGET) @@ -168,13 +188,15 @@ uninstall-man: $(RM) -f "$(INSTALLMAN1DIR)/$(MANPAGE)" $(MANPAGE): README.md -ifneq ($(PANDOC),) +ifneq ($(shell $(PANDOC) --version 2> /dev/null),) $(PANDOC) -s -t man -o "man/$(MANPAGE)" README.md +else + $(warning "pandoc does not appear available: unable to build manpage") endif man: $(MANPAGE) -tarball: distclean man changelog authors version +tarball: superclean man changelog authors version $(eval VERSION := $(shell cat VERSION)) $(eval VERSION := $(subst -,_,$(VERSION))) $(eval FILENAME := $(TARGET)-$(VERSION)) @@ -211,17 +233,7 @@ rpm: tarball --define "_topdir $(CURDIR)/rpmbuild" install-build-pkgs: -ifeq ($(shell test -e /usr/bin/apt-get; echo $$?),0) - apt-get -qy update - apt-get -qy --no-install-suggests --no-install-recommends --force-yes \ - install build-essential git g++ debhelper python automake libtool lsb-release -else ifeq ($(shell test -e /usr/bin/dnf; echo $$?),0) - dnf -y update - dnf -y install git rpm-build gcc-c++ make which python automake libtool gettext-devel -else ifeq ($(shell test -e /usr/bin/yum; echo $$?),0) - yum -y update - yum -y install git rpm-build gcc-c++ make which python automake libtool gettext-devel -endif + tools/install-build-pkgs unexport CFLAGS .PHONY: libfuse_Makefile diff --git a/tools/install-build-pkgs b/tools/install-build-pkgs new file mode 100755 index 00000000..40005e0e --- /dev/null +++ b/tools/install-build-pkgs @@ -0,0 +1,25 @@ +#!/bin/sh + +if [ -e /usr/bin/apt-get ]; then + apt-get -qy update + apt-get -qy --no-install-suggests --no-install-recommends --force-yes \ + install \ + build-essential git g++ debhelper \ + python \ + automake libtool lsb-release +elif [ -e /usr/bin/dnf ]; then + dnf -y update + dnf -y install \ + git rpm-build gcc-c++ make which python automake \ + libtool gettext-devel +elif [ -e /usr/bin/yum ]; then + yum -y update + yum -y install \ + git rpm-build gcc-c++ make which \ + python python-argparse \ + automake libtool gettext-devel +elif [ -e /sbin/apk ]; then + apk add \ + abuild git gcc g++ make autoconf \ + automake libtool gettext-dev linux-headers +fi