+#
+# NOTE: For static compiles, you need to have all the required libs
+# static equivalent available
+#
+static: $(progs_static)
+
+version.h: version.h.in configure.ac
+ @echo " [SH] $@"
+ $(Q)bash ./config.status --silent $@
+
+mktables: kernel-lib/mktables.c
+ @echo " [CC] $@"
+ $(Q)$(CC) $(CFLAGS) $< -o $@
+
+# the target can be regenerated manually using mktables, but a local copy is
+# kept so the build process is simpler
+kernel-lib/tables.c:
+ @echo " [TABLE] $@"
+ $(Q)./mktables > $@ || ($(RM) -f $@ && exit 1)
+
+libbtrfs.so.0.1: $(libbtrfs_objects)
+ @echo " [LD] $@"
+ $(Q)$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LIBBTRFS_LIBS) \
+ -shared -Wl,-soname,libbtrfs.so.0 -o $@
+
+libbtrfs.a: $(libbtrfs_objects)
+ @echo " [AR] $@"
+ $(Q)$(AR) cr $@ $^
+
+libbtrfs.so.0 libbtrfs.so: libbtrfs.so.0.1
+ @echo " [LN] $@"
+ $(Q)$(LN_S) -f $< $@
+
+libbtrfsutil/%.o: libbtrfsutil/%.c
+ @echo " [CC] $@"
+ $(Q)$(CC) $(LIBBTRFSUTIL_CFLAGS) -o $@ -c $< -o $@
+
+libbtrfsutil.so.$(libbtrfsutil_version): $(libbtrfsutil_objects)
+ @echo " [LD] $@"
+ $(Q)$(CC) $(LIBBTRFSUTIL_CFLAGS) $(libbtrfsutil_objects) \
+ -shared -Wl,-soname,libbtrfsutil.so.$(libbtrfsutil_major) -o $@
+
+libbtrfsutil.a: $(libbtrfsutil_objects)
+ @echo " [AR] $@"
+ $(Q)$(AR) cr $@ $^
+
+libbtrfsutil.so.$(libbtrfsutil_major) libbtrfsutil.so: libbtrfsutil.so.$(libbtrfsutil_version)
+ @echo " [LN] $@"
+ $(Q)$(LN_S) -f $< $@
+
+ifeq ($(PYTHON_BINDINGS),1)
+libbtrfsutil_python: libbtrfsutil.so libbtrfsutil/btrfsutil.h
+ @echo " [PY] libbtrfsutil"
+ $(Q)cd libbtrfsutil/python; \
+ CFLAGS= LDFLAGS= $(PYTHON) setup.py $(SETUP_PY_Q) build_ext -i build
+
+.PHONY: libbtrfsutil_python
+endif
+
+# keep intermediate files from the below implicit rules around
+.PRECIOUS: $(addsuffix .o,$(progs))
+
+# Make any btrfs-foo out of btrfs-foo.o, with appropriate libs.
+# The $($(subst...)) bits below takes the btrfs_*_libs definitions above and
+# turns them into a list of libraries to link against if they exist
+#
+# For static variants, use an extra $(subst) to get rid of the ".static"
+# from the target name before translating to list of libs
+
+btrfs-%.static: btrfs-%.static.o $(static_objects) $(patsubst %.o,%.static.o,$(standalone_deps)) $(static_libbtrfs_objects)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $@.o $(static_objects) \
+ $(patsubst %.o, %.static.o, $($(subst -,_,$(subst .static,,$@)-objects))) \
+ $(static_libbtrfs_objects) $(STATIC_LDFLAGS) \
+ $($(subst -,_,$(subst .static,,$@)-libs)) $(STATIC_LIBS)
+
+btrfs-%: btrfs-%.o $(objects) $(standalone_deps) $(libs_static)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $(objects) $@.o \
+ $($(subst -,_,$@-objects)) \
+ $(libs_static) \
+ $(LDFLAGS) $(LIBS) $($(subst -,_,$@-libs))
+
+btrfs: btrfs.o $(objects) $(cmds_objects) $(libs_static)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(LDFLAGS) $(LIBS) $(LIBS_COMP)
+
+btrfs.static: btrfs.static.o $(static_objects) $(static_cmds_objects) $(static_libbtrfs_objects)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(STATIC_LDFLAGS) $(STATIC_LIBS) $(STATIC_LIBS_COMP)
+
+# For backward compatibility, 'btrfs' changes behaviour to fsck if it's named 'btrfsck'
+btrfsck: btrfs
+ @echo " [LN] $@"
+ $(Q)$(LN_S) -f btrfs btrfsck
+
+btrfsck.static: btrfs.static
+ @echo " [LN] $@"
+ $(Q)$(LN_S) -f $^ $@
+
+mkfs.btrfs: $(mkfs_objects) $(objects) $(libs_static)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
+
+mkfs.btrfs.static: $(static_mkfs_objects) $(static_objects) $(static_libbtrfs_objects)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(STATIC_LDFLAGS) $(STATIC_LIBS)
+
+btrfstune: btrfstune.o $(objects) $(libs_static)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
+
+btrfstune.static: btrfstune.static.o $(static_objects) $(static_libbtrfs_objects)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(STATIC_LDFLAGS) $(STATIC_LIBS)
+
+btrfs-image: $(image_objects) $(objects) $(libs_static)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(LDFLAGS) $(LIBS) $(LIBS_COMP)
+
+btrfs-image.static: $(static_image_objects) $(static_objects) $(static_libbtrfs_objects)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(STATIC_LDFLAGS) $(STATIC_LIBS) $(STATIC_LIBS_COMP)
+
+btrfs-convert: $(convert_objects) $(objects) $(libs_static)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(LDFLAGS) $(btrfs_convert_libs) $(LIBS)
+
+btrfs-convert.static: $(static_convert_objects) $(static_objects) $(static_libbtrfs_objects)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(STATIC_LDFLAGS) $(btrfs_convert_libs) $(STATIC_LIBS)
+
+dir-test: dir-test.o $(objects) $(libs)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
+
+quick-test: quick-test.o $(objects) $(libs)
+ @echo " [LD] $@"
+ $(Q)$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
+
+ioctl-test.o: ioctl-test.c ioctl.h kerncompat.h ctree.h
+ @echo " [CC] $@"
+ $(Q)$(CC) $(CFLAGS) -c $< -o $@
+
+ioctl-test-32.o: ioctl-test.c ioctl.h kerncompat.h ctree.h
+ @echo " [CC32] $@"
+ $(Q)$(CC) $(CFLAGS) -m32 -c $< -o $@
+
+ioctl-test-64.o: ioctl-test.c ioctl.h kerncompat.h ctree.h
+ @echo " [CC64] $@"
+ $(Q)$(CC) $(CFLAGS) -m64 -c $< -o $@
+
+ioctl-test: ioctl-test.o
+ @echo " [LD] $@"
+ $(Q)$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
+ @echo " ?[PAHOLE] $@.pahole"
+ -$(Q)pahole $@ > $@.pahole
+
+ioctl-test-32: ioctl-test-32.o
+ @echo " [LD32] $@"
+ $(Q)$(CC) -m32 -o $@ $< $(LDFLAGS)
+ @echo " ?[PAHOLE] $@.pahole"
+ -$(Q)pahole $@ > $@.pahole
+
+ioctl-test-64: ioctl-test-64.o
+ @echo " [LD64] $@"
+ $(Q)$(CC) -m64 -o $@ $< $(LDFLAGS)
+ @echo " ?[PAHOLE] $@.pahole"
+ -$(Q)pahole $@ > $@.pahole
+
+test-ioctl: ioctl-test ioctl-test-32 ioctl-test-64
+ @echo " [TEST/ioctl]"
+ $(Q)./ioctl-test > ioctl-test.log
+ $(Q)./ioctl-test-32 > ioctl-test-32.log
+ $(Q)./ioctl-test-64 > ioctl-test-64.log
+
+library-test: library-test.c libbtrfs.so
+ @echo " [TEST PREP] $@"$(eval TMPD=$(shell mktemp -d))
+ $(Q)mkdir -p $(TMPD)/include/btrfs && \
+ cp $(libbtrfs_headers) $(TMPD)/include/btrfs && \
+ cd $(TMPD) && $(CC) -I$(TMPD)/include -o $@ $(addprefix $(ABSTOPDIR)/,$^) -Wl,-rpath=$(ABSTOPDIR) -lbtrfs
+ @echo " [TEST RUN] $@"
+ $(Q)cd $(TMPD) && ./$@
+ @echo " [TEST CLEAN] $@"
+ $(Q)$(RM) -rf -- $(TMPD)
+
+library-test.static: library-test.c $(libs_static)
+ @echo " [TEST PREP] $@"$(eval TMPD=$(shell mktemp -d))
+ $(Q)mkdir -p $(TMPD)/include/btrfs && \
+ cp $(libbtrfs_headers) $(TMPD)/include/btrfs && \
+ cd $(TMPD) && $(CC) -I$(TMPD)/include -o $@ $(addprefix $(ABSTOPDIR)/,$^) $(STATIC_LDFLAGS) $(STATIC_LIBS)
+ @echo " [TEST RUN] $@"
+ $(Q)cd $(TMPD) && ./$@
+ @echo " [TEST CLEAN] $@"
+ $(Q)$(RM) -rf -- $(TMPD)
+
+fssum: tests/fssum.c tests/sha224-256.c
+ @echo " [LD] $@"
+ $(Q)$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
+
+test-build: test-build-pre test-build-real
+
+test-build-pre:
+ $(MAKE) $(MAKEOPTS) clean-all
+ ./autogen.sh
+ ./configure
+
+test-build-real:
+ $(MAKE) $(MAKEOPTS) library-test
+ -$(MAKE) $(MAKEOPTS) library-test.static
+ $(MAKE) $(MAKEOPTS) -j 8 all
+ -$(MAKE) $(MAKEOPTS) -j 8 static
+ $(MAKE) $(MAKEOPTS) -j 8 $(progs_extra)
+
+manpages:
+ $(Q)$(MAKE) $(MAKEOPTS) -C Documentation
+
+tags: FORCE
+ @echo " [TAGS] $(TAGS_CMD)"
+ $(Q)$(TAGS_CMD) *.[ch] image/*.[ch] convert/*.[ch] mkfs/*.[ch]
+
+cscope: FORCE
+ @echo " [CSCOPE] $(CSCOPE_CMD)"
+ $(Q)ls -1 *.[ch] image/*.[ch] convert/*.[ch] mkfs/*.[ch] > cscope.files
+ $(Q)$(CSCOPE_CMD)
+
+clean-all: clean clean-doc clean-gen
+
+clean: $(CLEANDIRS)
+ @echo "Cleaning"
+ $(Q)$(RM) -f -- $(progs) *.o *.o.d \
+ kernel-lib/*.o kernel-lib/*.o.d \
+ kernel-shared/*.o kernel-shared/*.o.d \
+ image/*.o image/*.o.d \
+ convert/*.o convert/*.o.d \
+ mkfs/*.o mkfs/*.o.d check/*.o check/*.o.d \
+ dir-test ioctl-test quick-test library-test library-test-static \
+ mktables btrfs.static mkfs.btrfs.static fssum \
+ $(check_defs) \
+ $(libs) $(lib_links) \
+ $(progs_static) $(progs_extra) \
+ libbtrfsutil/*.o libbtrfsutil/*.o.d
+ifeq ($(PYTHON_BINDINGS),1)
+ $(Q)cd libbtrfsutil/python; \
+ $(PYTHON) setup.py $(SETUP_PY_Q) clean -a
+endif
+
+clean-doc:
+ @echo "Cleaning Documentation"
+ $(Q)$(MAKE) $(MAKEOPTS) -C Documentation clean
+
+clean-gen:
+ @echo "Cleaning Generated Files"
+ $(Q)$(RM) -rf -- version.h config.status config.cache connfig.log \
+ configure.lineno config.status.lineno Makefile.inc \
+ Documentation/Makefile tags \
+ cscope.files cscope.out cscope.in.out cscope.po.out \
+ config.log config.h config.h.in~ aclocal.m4 \
+ configure autom4te.cache/ config/
+
+$(CLEANDIRS):
+ @echo "Cleaning $(patsubst clean-%,%,$@)"
+ $(Q)$(MAKE) $(MAKEOPTS) -C $(patsubst clean-%,%,$@) clean
+
+install: $(libs) $(progs_install) $(INSTALLDIRS)
+ $(INSTALL) -m755 -d $(DESTDIR)$(bindir)
+ $(INSTALL) $(progs_install) $(DESTDIR)$(bindir)
+ $(INSTALL) fsck.btrfs $(DESTDIR)$(bindir)
+ # btrfsck is a link to btrfs in the src tree, make it so for installed file as well
+ $(LN_S) -f btrfs $(DESTDIR)$(bindir)/btrfsck
+ $(INSTALL) -m755 -d $(DESTDIR)$(libdir)
+ $(INSTALL) $(libs) $(DESTDIR)$(libdir)
+ cp -a $(lib_links) $(DESTDIR)$(libdir)
+ $(INSTALL) -m755 -d $(DESTDIR)$(incdir)/btrfs
+ $(INSTALL) -m644 $(libbtrfs_headers) $(DESTDIR)$(incdir)/btrfs
+ $(INSTALL) -m644 libbtrfsutil/btrfsutil.h $(DESTDIR)$(incdir)
+ifneq ($(udevdir),)
+ $(INSTALL) -m755 -d $(DESTDIR)$(udevruledir)
+ $(INSTALL) -m644 $(udev_rules) $(DESTDIR)$(udevruledir)
+endif
+
+ifeq ($(PYTHON_BINDINGS),1)
+install_python: libbtrfsutil_python
+ $(Q)cd libbtrfsutil/python; \
+ $(PYTHON) setup.py install --skip-build $(if $(DESTDIR),--root $(DESTDIR)) --prefix $(prefix)
+
+.PHONY: install_python
+endif
+
+install-static: $(progs_static) $(INSTALLDIRS)