Sometimes, when you least expect it, a static binary is what you need to
rescue your data... Or just get a good enough handle on things to make
it work again ;)

"make static" is a gift to you, dear user with filesystem problems!

Anyway, on a more serious note, changed the cflags and ldflags so that
we create a smaller binary, 1.1MB stripped on my 64 bit system
(2.7MB with debug data)

Signed-off-by: Ian Kumlien <po...@demius.net>
---

This is v2 of the patch, David Sterba raised some questions on IRC
and quite correctly pointed out severe problems with the old patch.

The old patch depended on you doing make static from a clean state,
any objects compiled dynamically would ruin the resulting binary.

This version separates all objects and the resulting binary ;)

 .gitignore |  2 ++
 Makefile   | 26 +++++++++++++++++++++++++-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 0e560d5..230dfbd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,10 @@
 *.o
+*.static.o
 .*.o.d
 version.h
 man/*.gz
 btrfs
+btrfs.static
 btrfs-debug-tree
 btrfs-map-logical
 btrfs-show
diff --git a/Makefile b/Makefile
index d9a05f8..d40a9b4 100644
--- a/Makefile
+++ b/Makefile
@@ -40,6 +40,16 @@ progs = btrfsctl mkfs.btrfs btrfs-show btrfs-vol btrfs \
        btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert \
        btrfs-find-root btrfstune
 
+# Create all the static targets
+static_objects = $(patsubst %.o, %.static.o, $(objects))
+static_cmds_objects = $(patsubst %.o, %.static.o, $(cmds_objects))
+static_progs = $(patsubst %.o, %.static.o, $(progs))
+
+# Define static compilation flags
+STATIC_CFLAGS = $(CFLAGS) -static -ffunction-sections -fdata-sections
+STATIC_LDFLAGS = -Wl,--gc-sections
+STATIC_LIBS = $(LIBS) -lpthread
+
 # make C=1 to enable sparse
 ifdef C
        check = sparse $(CHECKFLAGS)
@@ -52,9 +62,18 @@ endif
        @echo "    [CC]     $@"
        $(Q)$(CC) $(DEPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $<
 
+%.static.o: %.c
+       @echo "    [CC]     $@"
+       $(Q)$(CC) $(DEPFLAGS) $(AM_CFLAGS) $(STATIC_CFLAGS) -c $< -o $@
 
 all: version.h $(progs) manpages
 
+#
+# NOTE: For static compiles, you need to have all the required libs 
+#      static equivalent available
+#
+static: version.h btrfs.static
+
 version.h:
        $(Q)bash version.sh
 
@@ -63,6 +82,11 @@ btrfs: $(objects) btrfs.o help.o $(cmds_objects)
        $(Q)$(CC) $(CFLAGS) -o btrfs btrfs.o help.o $(cmds_objects) \
                $(objects) $(LDFLAGS) $(LIBS) -lpthread
 
+btrfs.static: $(static_objects) btrfs.static.o help.static.o 
$(static_cmds_objects)
+       @echo "    [LD]     $@"
+       $(Q)$(CC) $(STATIC_CFLAGS) -o btrfs.static btrfs.static.o help.static.o 
$(static_cmds_objects) \
+               $(static_objects) $(STATIC_LDFLAGS) $(STATIC_LIBS)
+
 calc-size: $(objects) calc-size.o
        @echo "    [LD]     $@"
        $(Q)$(CC) $(CFLAGS) -o calc-size calc-size.o $(objects) $(LDFLAGS) 
$(LIBS)
@@ -135,7 +159,7 @@ install-man:
 
 clean :
        @echo "Cleaning"
-       $(Q)rm -f $(progs) cscope.out *.o .*.d btrfs-convert btrfs-image \
+       $(Q)rm -f $(progs) cscope.out *.o .*.d btrfs-convert btrfs-image 
btrfs.static \
              btrfs-zero-log btrfstune dir-test ioctl-test quick-test version.h
        $(Q)$(MAKE) $(MAKEOPTS) -C man $@
 
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to