diff --git a/.gitignore b/.gitignore index 0e560d51..230dfbd4 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 596bf93f..d9dd07a9 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,16 @@ progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \ btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert \ btrfs-find-root btrfs-restore btrfstune btrfs-show-super +# 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) -ffunction-sections -fdata-sections +STATIC_LDFLAGS = -static -Wl,--gc-sections +STATIC_LIBS = $(LIBS) -lpthread + # make C=1 to enable sparse ifdef C check = sparse $(CHECKFLAGS) @@ -51,9 +61,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 @@ -62,6 +81,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) @@ -151,7 +175,8 @@ install-man: clean : @echo "Cleaning" $(Q)rm -f $(progs) cscope.out *.o .*.d btrfs-convert btrfs-image btrfs-select-super \ - btrfs-zero-log btrfstune dir-test ioctl-test quick-test version.h + btrfs-zero-log btrfstune dir-test ioctl-test quick-test btrfs.static \ + version.h $(Q)$(MAKE) $(MAKEOPTS) -C man $@ install: $(progs) install-man