mergerfs/Makefile

367 lines
8.8 KiB
Makefile
Raw Normal View History

# Copyright (c) 2024, Antonio SJ Musumeci <trapexit@spawn.link>
2014-05-12 12:41:46 -04:00
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
2014-05-12 12:41:46 -04:00
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
CP ?= cp
FAKEROOT ?= fakeroot
FIND ?= find
GIT ?= git
GIT2DEBCL ?= buildtools/git2debcl
INSTALL ?= install
LN ?= ln
MKDIR ?= mkdir
MKTEMP ?= mktemp
MV ?= mv
RM ?= rm
SED ?= sed
STRIP ?= strip
TAR ?= tar
TOUCH ?= touch
BUILDDIR := build
ifndef GIT_REPO
ifneq ($(shell $(GIT) --version 2> /dev/null),)
2017-08-06 14:39:56 -04:00
ifeq ($(shell test -e .git; echo $$?),0)
GIT_REPO = 1
endif
endif
endif
2017-08-06 14:39:56 -04:00
USE_XATTR ?= 1
UGID_USE_RWLOCK ?= 0
ifdef NDEBUG
OPT_FLAGS := -O2 -DNDEBUG
else
OPT_FLAGS := -O0 -g -fno-omit-frame-pointer -DDEBUG
endif
ifdef STATIC
STATIC_FLAGS := -static
else
STATIC_FLAGS :=
endif
ifdef LTO
LTO_FLAGS := -flto
else
LTO_FLAGS :=
endif
SRC := $(wildcard src/*.cpp)
OBJS := $(SRC:src/%.cpp=build/.src/%.o)
DEPS := $(SRC:src/%.cpp=build/.src/%.d)
TESTS := $(wildcard tests/*.cpp)
TESTS_OBJS := $(filter-out build/.src/mergerfs.o,$(OBJS))
TESTS_OBJS += $(TESTS:tests/%.cpp=build/.tests/%.o)
TESTS_DEPS := $(TESTS:tests/%.cpp=build/.tests/%.d)
TESTS_DEPS += $(DEPS)
MANPAGE := mergerfs.1
CPPFLAGS ?=
override CPPFLAGS += \
-D_FILE_OFFSET_BITS=64
CFLAGS ?= \
$(OPT_FLAGS) \
-Wall \
-Wno-unused-result \
-pipe
override CFLAGS += \
-MMD \
-MP
CXXFLAGS ?= \
$(OPT_FLAGS) \
$(STATIC_FLAGS) \
$(LTO_FLAGS) \
-Wall \
-Wno-unused-result \
-pipe
override CXXFLAGS += \
-std=c++17 \
-MMD \
-MP
override INC_FLAGS := \
-Isrc \
-Ilibfuse/include
override MFS_FLAGS := \
-DUSE_XATTR=$(USE_XATTR) \
-DUGID_USE_RWLOCK=$(UGID_USE_RWLOCK)
override TESTS_FLAGS := \
-Isrc \
-DTESTS
LIBFUSE := libfuse/$(BUILDDIR)/libfuse.a
LDFLAGS ?=
LDLIBS := \
-lrt \
-latomic \
-pthread \
-lstdc++fs
override LDLIBS += \
$(LIBFUSE)
2014-11-04 13:42:20 -05:00
# https://www.gnu.org/prep/standards/html_node/Directory-Variables.html
DESTDIR ?=
PREFIX ?= /usr/local
EXEC_PREFIX ?= $(PREFIX)
DATAROOTDIR ?= $(PREFIX)/share
DATADIR ?= $(DATAROOTDIR)
BINDIR ?= $(EXEC_PREFIX)/bin
SBINDIR ?= $(EXEC_PREFIX)/sbin
LIBDIR ?= $(EXEC_PREFIX)/lib
MANDIR ?= $(DATAROOTDIR)/man
MAN1DIR ?= $(MANDIR)/man1
INSTALLBINDIR ?= $(DESTDIR)$(BINDIR)
INSTALLSBINDIR ?= $(DESTDIR)$(SBINDIR)
INSTALLLIBDIR ?= $(DESTDIR)$(LIBDIR)/mergerfs
INSTALLMAN1DIR ?= $(DESTDIR)$(MAN1DIR)
2014-05-12 12:41:46 -04:00
2019-04-24 16:19:01 -04:00
.PHONY: all
all: libfuse $(BUILDDIR)/mergerfs $(BUILDDIR)/fsck.mergerfs $(BUILDDIR)/mergerfs.collect-info
2014-05-12 12:41:46 -04:00
2019-04-24 16:19:01 -04:00
.PHONY: help
2014-05-12 12:41:46 -04:00
help:
@echo "usage: make\n"
2018-10-09 11:58:06 -04:00
@echo "make USE_XATTR=0 - build program without xattrs functionality"
@echo "make STATIC=1 - build static binary"
@echo "make LTO=1 - build with link time optimization"
2014-05-12 12:41:46 -04:00
$(BUILDDIR)/mergerfs: $(LIBFUSE) src/version.hpp $(OBJS)
$(CXX) $(CXXFLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) $(OBJS) -o $@ $(LDFLAGS) $(LDLIBS)
$(BUILDDIR)/fsck.mergerfs:
$(LN) -sf "mergerfs" $@
$(BUILDDIR)/mergerfs.collect-info:
$(LN) -sf "mergerfs" $@
2019-04-24 16:19:01 -04:00
$(BUILDDIR)/tests: $(BUILDDIR)/mergerfs $(TESTS_OBJS)
$(CXX) $(CXXFLAGS) $(TESTS_FLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) $(TESTS_OBJS) -o $@ $(LDFLAGS) $(LDLIBS)
.PHONY: libfuse
$(LIBFUSE):
libfuse:
$(MAKE) NDEBUG=$(NDEBUG) -C libfuse
2019-04-24 16:19:01 -04:00
tests: $(BUILDDIR)/tests
2014-05-29 07:23:46 -04:00
changelog:
ifdef GIT_REPO
2019-04-24 16:19:01 -04:00
$(GIT2DEBCL) --name mergerfs > ChangeLog
else
@echo "WARNING: need git repo to generate ChangeLog"
2017-08-06 14:39:56 -04:00
endif
2015-08-06 13:11:17 -04:00
2019-04-24 16:19:01 -04:00
.PHONY: version
version: src/version.hpp
src/version.hpp:
./buildtools/update-version
2015-09-05 21:48:15 -04:00
$(BUILDDIR)/stamp:
$(MKDIR) -p $(BUILDDIR)/.src $(BUILDDIR)/.tests
2014-05-29 07:23:46 -04:00
$(TOUCH) $@
2014-05-12 12:41:46 -04:00
$(BUILDDIR)/.src/%.o: src/%.cpp $(BUILDDIR)/stamp
$(CXX) $(CXXFLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) -c $< -o $@
2014-05-12 12:41:46 -04:00
$(BUILDDIR)/.tests/%.o: tests/%.cpp
$(CXX) $(CXXFLAGS) $(TESTS_FLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) -c $< -o $@
$(BUILDDIR)/preload.so: $(BUILDDIR)/stamp tools/preload.c
$(CC) -shared -fPIC $(CFLAGS) -o $@ tools/preload.c
preload: $(BUILDDIR)/preload.so
2019-04-24 16:19:01 -04:00
.PHONY: clean
clean: rpm-clean
$(RM) -rf $(BUILDDIR)
2015-08-06 13:11:17 -04:00
$(FIND) . -name "*~" -delete
2019-04-24 16:19:01 -04:00
$(MAKE) -C libfuse clean
2014-05-29 07:23:46 -04:00
distclean: clean
ifdef GIT_REPO
$(GIT) clean -xfd
endif
2019-04-24 16:19:01 -04:00
.PHONY: install
install: install-base install-mount-tools install-preload install-man
2015-01-27 18:25:20 -05:00
.PHONY: install-base
install-base: all
2016-10-24 17:26:45 -04:00
$(MKDIR) -p "$(INSTALLBINDIR)"
$(INSTALL) -v -m 0755 "$(BUILDDIR)/mergerfs" "$(INSTALLBINDIR)/mergerfs"
$(LN) -fs "mergerfs" "${INSTALLBINDIR}/fsck.mergerfs"
$(LN) -fs "mergerfs" "${INSTALLBINDIR}/mergerfs.collect-info"
2015-01-27 18:25:20 -05:00
.PHONY: install-mount-tools
2020-02-21 08:01:49 -05:00
install-mount-tools: install-base
$(MKDIR) -p "$(INSTALLBINDIR)"
2020-02-21 08:01:49 -05:00
$(MAKE) -C libfuse install
2015-01-27 18:25:20 -05:00
.PHONY: install-man
install-man: man/$(MANPAGE)
2016-10-24 17:26:45 -04:00
$(MKDIR) -p "$(INSTALLMAN1DIR)"
$(INSTALL) -v -m 0644 "man/$(MANPAGE)" "$(INSTALLMAN1DIR)/$(MANPAGE)"
2015-01-27 18:25:20 -05:00
.PHONY: install-preload
install-preload: preload
$(MKDIR) -p "$(INSTALLLIBDIR)"
$(INSTALL) -v -m 444 "$(BUILDDIR)/preload.so" "$(INSTALLLIBDIR)/preload.so"
.PHONY: install-strip
2015-01-27 18:25:20 -05:00
install-strip: install-base
2019-04-24 16:19:01 -04:00
$(STRIP) "$(INSTALLBINDIR)/mergerfs"
2015-01-27 18:25:20 -05:00
2019-04-24 16:19:01 -04:00
.PHONY: uninstall
2016-01-21 14:48:12 -05:00
uninstall: uninstall-base uninstall-mount.mergerfs uninstall-man
2015-01-27 18:25:20 -05:00
uninstall-base:
2019-04-24 16:19:01 -04:00
$(RM) -f "$(INSTALLBINDIR)/mergerfs"
2014-05-29 07:23:46 -04:00
2016-01-21 14:48:12 -05:00
uninstall-mount.mergerfs:
$(RM) -f "$(INSTALLBINDIR)/mount.mergerfs"
2014-05-29 07:23:46 -04:00
2015-01-27 18:25:20 -05:00
uninstall-man:
2015-08-06 13:11:17 -04:00
$(RM) -f "$(INSTALLMAN1DIR)/$(MANPAGE)"
2019-04-24 16:19:01 -04:00
.PHONY: tarball
tarball: changelog version
2017-08-06 14:39:56 -04:00
$(eval VERSION := $(shell cat VERSION))
2015-09-05 17:56:45 -04:00
$(eval VERSION := $(subst -,_,$(VERSION)))
2019-04-24 16:19:01 -04:00
$(eval FILENAME := mergerfs-$(VERSION))
2014-05-29 07:23:46 -04:00
$(eval TMPDIR := $(shell $(MKTEMP) --tmpdir -d .$(FILENAME).XXXXXXXX))
$(MKDIR) $(TMPDIR)/$(FILENAME)
$(CP) -ar . $(TMPDIR)/$(FILENAME)
2015-09-05 17:56:45 -04:00
$(TAR) --exclude=.git -cz -C $(TMPDIR) -f $(FILENAME).tar.gz $(FILENAME)
2014-05-29 07:23:46 -04:00
$(RM) -rf $(TMPDIR)
.PHONY: debian-changelog
2015-08-06 13:11:17 -04:00
debian-changelog:
ifdef GIT_REPO
2019-04-24 16:19:01 -04:00
$(GIT2DEBCL) --name mergerfs > debian/changelog
2017-08-06 14:39:56 -04:00
else
$(CP) -v ChangeLog debian/changelog
2017-08-06 14:39:56 -04:00
endif
2015-08-06 13:11:17 -04:00
.PHONY: signed-deb
2019-04-24 16:19:01 -04:00
signed-deb:
$(MAKE) distclean
$(MAKE) debian-changelog
$(FAKEROOT) dpkg-buildpackage -nc
2015-08-06 13:11:17 -04:00
.PHONY: deb
2019-03-12 23:11:15 -04:00
deb:
$(MAKE) distclean
$(MAKE) debian-changelog
$(MAKE) version
$(FAKEROOT) dpkg-buildpackage -nc -uc -us
$(MKDIR) -p ./$(BUILDDIR)/pkgs/
$(MV) -v ../mergerfs*deb ./$(BUILDDIR)/pkgs/
2014-05-12 12:41:46 -04:00
2019-04-24 16:19:01 -04:00
.PHONY: rpm-clean
2015-09-05 17:56:45 -04:00
rpm-clean:
$(RM) -rf rpmbuild
.PHONY: rpm
2015-09-05 17:56:45 -04:00
rpm: tarball
2017-08-06 14:39:56 -04:00
$(eval VERSION := $(shell cat VERSION))
2015-09-05 17:56:45 -04:00
$(eval VERSION := $(subst -,_,$(VERSION)))
$(MKDIR) -p rpmbuild/BUILD rpmbuild/RPMS rpmbuild/SOURCES
2019-04-24 16:19:01 -04:00
$(SED) 's/__VERSION__/$(VERSION)/g' mergerfs.spec > \
rpmbuild/SOURCES/mergerfs.spec
cp -ar mergerfs-$(VERSION).tar.gz rpmbuild/SOURCES
rpmbuild -ba rpmbuild/SOURCES/mergerfs.spec \
2015-09-05 17:56:45 -04:00
--define "_topdir $(CURDIR)/rpmbuild"
2019-04-24 16:19:01 -04:00
.PHONY: install-build-pkgs
install-build-pkgs:
./buildtools/install-build-pkgs
.PHONY: install-build-tools
install-build-tools:
./bulidtools/install-build-tools
.PHONY: release
release:
./buildtools/build-release \
--target=all \
$(if $(CLEANUP),--cleanup) \
--branch=$(shell git branch --show-current)
.PHONY: release-sample
2025-06-23 21:57:55 -05:00
release-sample:
./buildtools/build-release \
--target=debian.12.amd64 \
$(if $(CLEANUP),--cleanup) \
2025-06-23 21:57:55 -05:00
--branch=$(shell git branch --show-current)
.PHONY: release-amd64
release-amd64:
./buildtools/build-release \
--target=amd64 \
$(if $(CLEANUP),--cleanup) \
--branch=$(shell git branch --show-current)
.PHONY: release-arm64
release-arm64:
./buildtools/build-release \
--target=arm64 \
$(if $(CLEANUP),--cleanup) \
--branch=$(shell git branch --show-current)
.PHONY: release-riscv64
release-riscv64:
./buildtools/build-release \
--target=riscv64 \
$(if $(CLEANUP),--cleanup) \
--branch=$(shell git branch --show-current)
.PHONY: release-armhf
release-armhf:
./buildtools/build-release \
--target=armhf \
$(if $(CLEANUP),--cleanup) \
--branch=$(shell git branch --show-current)
.PHONY: release-static
release-static:
./buildtools/build-release \
--target=static \
$(if $(CLEANUP),--cleanup) \
--branch=$(shell git branch --show-current)
.PHONY: release-tarball
release-tarball:
./buildtools/build-release \
--target=tarball \
$(if $(CLEANUP),--cleanup) \
--branch=$(shell git branch --show-current)
.PHONY: tags
tags:
rm -fv TAGS
find . -name "*.c" -print | etags --append -
find . -name "*.h" -print | etags --append -
find . -name "*.cpp" -print | etags --append -
find . -name "*.hpp" -print | etags --append -
2014-05-12 12:41:46 -04:00
-include $(DEPS)