You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

218 lines
6.4 KiB

10 years ago
10 years ago
10 years ago
  1. # Copyright (c) 2016, Antonio SJ Musumeci <trapexit@spawn.link>
  2. #
  3. # Permission to use, copy, modify, and/or distribute this software for any
  4. # purpose with or without fee is hereby granted, provided that the above
  5. # copyright notice and this permission notice appear in all copies.
  6. #
  7. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  10. # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  12. # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  13. # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  14. GIT = $(shell which git)
  15. TAR = $(shell which tar)
  16. MKDIR = $(shell which mkdir)
  17. TOUCH = $(shell which touch)
  18. CP = $(shell which cp)
  19. RM = $(shell which rm)
  20. LN = $(shell which ln)
  21. FIND = $(shell which find)
  22. INSTALL = $(shell which install)
  23. MKTEMP = $(shell which mktemp)
  24. STRIP = $(shell which strip)
  25. PANDOC = $(shell which pandoc)
  26. SED = $(shell which sed)
  27. GZIP = $(shell which gzip)
  28. RPMBUILD = $(shell which rpmbuild)
  29. GIT2DEBCL = ./tools/git2debcl
  30. ifeq ($(PANDOC),"")
  31. $(warning "pandoc does not appear available: manpage won't be buildable")
  32. endif
  33. XATTR_AVAILABLE = $(shell test ! -e /usr/include/attr/xattr.h; echo $$?)
  34. UGID_USE_RWLOCK = 0
  35. OPTS = -O2
  36. SRC = $(wildcard src/*.cpp)
  37. OBJ = $(SRC:src/%.cpp=obj/%.o)
  38. DEPS = $(OBJ:obj/%.o=obj/%.d)
  39. TARGET = mergerfs
  40. MANPAGE = $(TARGET).1
  41. FUSE_CFLAGS = -D_FILE_OFFSET_BITS=64 -Ilibfuse/include
  42. CFLAGS = -g -Wall \
  43. $(OPTS) \
  44. -Wno-unused-result \
  45. $(FUSE_CFLAGS) \
  46. -DFUSE_USE_VERSION=29 \
  47. -MMD \
  48. -DUGID_USE_RWLOCK=$(UGID_USE_RWLOCK)
  49. LDFLAGS = -pthread -lrt
  50. PREFIX = /usr/local
  51. EXEC_PREFIX = $(PREFIX)
  52. DATAROOTDIR = $(PREFIX)/share
  53. DATADIR = $(DATAROOTDIR)
  54. BINDIR = $(EXEC_PREFIX)/bin
  55. SBINDIR = $(EXEC_PREFIX)/sbin
  56. MANDIR = $(DATAROOTDIR)/man
  57. MAN1DIR = $(MANDIR)/man1
  58. INSTALLBINDIR = $(DESTDIR)$(BINDIR)
  59. INSTALLSBINDIR = $(DESTDIR)$(SBINDIR)
  60. INSTALLMAN1DIR = $(DESTDIR)$(MAN1DIR)
  61. ifeq ($(XATTR_AVAILABLE),0)
  62. $(warning "xattr not available: disabling")
  63. CFLAGS += -DWITHOUT_XATTR
  64. endif
  65. all: $(TARGET)
  66. help:
  67. @echo "usage: make"
  68. @echo "make XATTR_AVAILABLE=0 - to build program without xattrs functionality (auto discovered otherwise)"
  69. $(TARGET): src/version.hpp obj/obj-stamp libfuse/lib/.libs/libfuse.a $(OBJ)
  70. cd libfuse && make
  71. $(CXX) $(CFLAGS) $(OBJ) -o $@ libfuse/lib/.libs/libfuse.a -ldl $(LDFLAGS)
  72. mount.mergerfs: $(TARGET)
  73. $(LN) -fs "$<" "$@"
  74. changelog:
  75. $(GIT2DEBCL) --name $(TARGET) > ChangeLog
  76. authors:
  77. $(GIT) log --format='%aN <%aE>' | sort -f | uniq > AUTHORS
  78. src/version.hpp:
  79. $(eval VERSION := $(shell $(GIT) describe --always --tags --dirty))
  80. @echo "#ifndef _VERSION_HPP" > src/version.hpp
  81. @echo "#define _VERSION_HPP" >> src/version.hpp
  82. @echo "static const char MERGERFS_VERSION[] = \"$(VERSION)\";" >> src/version.hpp
  83. @echo "#endif" >> src/version.hpp
  84. obj/obj-stamp:
  85. $(MKDIR) -p obj
  86. $(TOUCH) $@
  87. obj/%.o: src/%.cpp
  88. $(CXX) $(CFLAGS) -c $< -o $@
  89. clean: rpm-clean libfuse_Makefile
  90. ifneq ($(GIT),)
  91. ifeq ($(shell test -e .git; echo $$?),0)
  92. $(RM) -f src/version.hpp
  93. endif
  94. endif
  95. $(RM) -rf obj
  96. $(RM) -f "$(TARGET)" mount.mergerfs
  97. $(FIND) . -name "*~" -delete
  98. cd libfuse && $(MAKE) clean
  99. distclean: clean libfuse_Makefile
  100. cd libfuse && $(MAKE) distclean
  101. $(GIT) clean -fd
  102. install: install-base install-mount.mergerfs install-man
  103. install-base: $(TARGET)
  104. $(MKDIR) -p "$(INSTALLBINDIR)"
  105. $(INSTALL) -v -m 0755 "$(TARGET)" "$(INSTALLBINDIR)/$(TARGET)"
  106. install-mount.mergerfs: mount.mergerfs
  107. $(MKDIR) -p "$(INSTALLBINDIR)"
  108. $(CP) -a "$<" "$(INSTALLBINDIR)/$<"
  109. install-man: $(MANPAGE)
  110. $(MKDIR) -p "$(INSTALLMAN1DIR)"
  111. $(INSTALL) -v -m 0644 "man/$(MANPAGE)" "$(INSTALLMAN1DIR)/$(MANPAGE)"
  112. install-strip: install-base
  113. $(STRIP) "$(INSTALLBINDIR)/$(TARGET)"
  114. uninstall: uninstall-base uninstall-mount.mergerfs uninstall-man
  115. uninstall-base:
  116. $(RM) -f "$(INSTALLBINDIR)/$(TARGET)"
  117. uninstall-mount.mergerfs:
  118. $(RM) -f "$(INSTALLBINDIR)/mount.mergerfs"
  119. uninstall-man:
  120. $(RM) -f "$(INSTALLMAN1DIR)/$(MANPAGE)"
  121. $(MANPAGE): README.md
  122. ifneq (,$(PANDOC))
  123. $(PANDOC) -s -t man -o "man/$(MANPAGE)" README.md
  124. endif
  125. man: $(MANPAGE)
  126. tarball: clean man changelog authors src/version.hpp
  127. $(eval VERSION := $(shell $(GIT) describe --always --tags --dirty))
  128. $(eval VERSION := $(subst -,_,$(VERSION)))
  129. $(eval FILENAME := $(TARGET)-$(VERSION))
  130. $(eval TMPDIR := $(shell $(MKTEMP) --tmpdir -d .$(FILENAME).XXXXXXXX))
  131. $(MKDIR) $(TMPDIR)/$(FILENAME)
  132. $(CP) -ar . $(TMPDIR)/$(FILENAME)
  133. $(TAR) --exclude=.git -cz -C $(TMPDIR) -f $(FILENAME).tar.gz $(FILENAME)
  134. $(RM) -rf $(TMPDIR)
  135. debian-changelog:
  136. $(GIT2DEBCL) --name $(TARGET) > debian/changelog
  137. signed-deb: debian-changelog
  138. dpkg-buildpackage
  139. deb: debian-changelog
  140. dpkg-buildpackage -uc -us
  141. rpm-clean:
  142. $(RM) -rf rpmbuild
  143. rpm: tarball
  144. $(eval VERSION := $(shell $(GIT) describe --always --tags --dirty))
  145. $(eval VERSION := $(subst -,_,$(VERSION)))
  146. $(MKDIR) -p rpmbuild/BUILD rpmbuild/RPMS rpmbuild/SOURCES
  147. $(SED) 's/__VERSION__/$(VERSION)/g' $(TARGET).spec > \
  148. rpmbuild/SOURCES/$(TARGET).spec
  149. cp -ar $(TARGET)-$(VERSION).tar.gz rpmbuild/SOURCES
  150. $(RPMBUILD) -ba rpmbuild/SOURCES/$(TARGET).spec \
  151. --define "_topdir $(CURDIR)/rpmbuild"
  152. install-build-pkgs:
  153. ifeq ($(shell test -e /usr/bin/apt-get; echo $$?),0)
  154. apt-get -qy update
  155. apt-get -qy --no-install-suggests --no-install-recommends --force-yes \
  156. install build-essential git g++ debhelper libattr1-dev python automake libtool lsb-release
  157. else ifeq ($(shell test -e /usr/bin/dnf; echo $$?),0)
  158. dnf -y update
  159. dnf -y install git rpm-build libattr-devel gcc-c++ make which python automake libtool gettext-devel
  160. else ifeq ($(shell test -e /usr/bin/yum; echo $$?),0)
  161. yum -y update
  162. yum -y install git rpm-build libattr-devel gcc-c++ make which python automake libtool gettext-devel
  163. endif
  164. unexport CFLAGS LDFLAGS
  165. .PHONY: libfuse_Makefile
  166. libfuse_Makefile:
  167. ifeq ($(shell test -e libfuse/Makefile; echo $$?),1)
  168. cd libfuse && \
  169. $(MKDIR) -p m4 && \
  170. autoreconf --force --install && \
  171. ./configure --enable-lib --disable-util --disable-example
  172. endif
  173. libfuse/lib/.libs/libfuse.a: libfuse_Makefile
  174. cd libfuse && $(MAKE)
  175. .PHONY: all clean install help
  176. -include $(DEPS)