DESTDIR    ?= /usr/local
GCC_VERSION := $(shell gcc -dumpversion | (cut -d '.' -f1))

CFLAGS += -I. -I../include -I../kernel
CFLAGS += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64
CFLAGS += -Wall -Wextra -Werror
CFLAGS += -DNO_FALLOCATE=$(shell ./build-scripts/no_fallocate)

ifeq ($(shell test $(GCC_VERSION) -ge 7 && echo 1 || echo 0), 1)
# Ignore errors for snprintf truncation
CFLAGS += -Wno-format-truncation
endif

LIBCFLAGS  += $(CFLAGS) -fPIC
LIBLDFLAGS += -shared -lblkid -lrt

LDFLAGS    += ./libbsctl.a -lblkid -lrt
symlink = 				\
    if ! test -f ../$(1); then		\
	echo "  LN      $@"; 		\
	ln -s utils/$(1) ../$(1);	\
    fi
strip = @strip $@

SRCS = $(wildcard *.c)

all: versiongen bsctl libbsctl.so bsrw bswr

versiongen: 
	@$(MAKE) --silent -C ../include version.h

# contains dependencies for each object file including corresponding *.c and
# headers which are included by it
-include .depend

.depend: $(SRCS)
	@$(MAKE) --silent -C ../include version.h
	@rm -f $@
	@echo "  GEN     $@"
	@$(CC) $(CFLAGS) -MM $^ > $@;

%.o: %.c
	@echo "  CC      $<"
	@$(CC) $(LIBCFLAGS) -c $< -o $@

libbsctl.so: bsctl.o bsctl-error.o bsctl-ioctl.o bsctl-chlog.o bsctl-log.o fibmap.o \
             btrfs/log-to-phys.o btrfs/io.o btrfs/address-tree.o
	@echo "  LD      $@"
	@$(CC) -o $@ $(filter %.o,$^) $(LIBLDFLAGS)
	@$(call symlink,$@)
	$(strip)

libbsctl.a: bsctl.o bsctl-error.o bsctl-ioctl.o bsctl-chlog.o bsctl-log.o fibmap.o \
            btrfs/log-to-phys.o btrfs/io.o btrfs/address-tree.o
	@echo "  AR      $@"
	@ar rcs $@ $^

bsctl: bsctl-main.o libbsctl.a
	@echo "  LD      $@"
	@$(CC) -o $@ $(filter %.o,$^) -pthread $(LDFLAGS)
	@$(call symlink,$@)
	$(strip)

bsrw: bsrw.o libbsctl.a
	@echo "  LD      $@"
	@$(CC) -o $@ $(filter %.o,$^) -pthread -lm $(LDFLAGS)
	@$(call symlink,$@)
	$(strip)

bswr: bswr.o
	@echo "  LD      $@"
	@$(CC) -o $@ $(filter %.o,$^)
	@$(call symlink,$@)
	$(strip)

clean:
	rm -f ../bsctl ../bsrw ../bswr ../libbsctl.so ../bsrw-aafs
	rm -f *.o btrfs/*.o bsctl bsrw bswr bsrw-aafs
	rm -f libbsctl.so libbsctl.a
	rm -f ./.depend
	$(MAKE) -C ../include clean

install: all
	@install -d -m 755 '$(DESTDIR)/bin'
	@echo "  INSTALL bsctl $(DESTDIR)/bin"
	@install -m 755 bsctl '$(DESTDIR)/bin'
	@echo "  INSTALL bsrw  $(DESTDIR)/bin"
	@install -m 755 bsrw '$(DESTDIR)/bin'
	@echo "  INSTALL bswr  $(DESTDIR)/bin"
	@install -m 755 bswr '$(DESTDIR)/bin'

debug: CFLAGS += -ggdb3
debug: strip =
debug: all

.PHONY: all clean install FORCE versiongen
