CFLAGS += -O3
endif
-CPPFLAGS+= -DXXH_NAMESPACE=ZSTD_
+DEBUGLEVEL ?= 0
+CPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL)
ifeq ($(TARGET_SYSTEM),Windows_NT) # MinGW assumed
- CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting
+ CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting
endif
DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
-Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
-Wstrict-prototypes -Wundef -Wpointer-arith \
-Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
-Wredundant-decls -Wmissing-prototypes -Wc++-compat
-CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS)
-FLAGS = $(CPPFLAGS) $(CFLAGS)
+CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS)
+FLAGS = $(CPPFLAGS) $(CFLAGS)
HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
GREP_OPTIONS ?=
ZSTD_SUBDIR := common compress decompress dictBuilder legacy deprecated
vpath %.c $(ZSTD_SUBDIR)
-BUILD_DIR ?= obj
+UNAME := $(shell uname)
+ifeq ($(UNAME), Darwin)
+ HASH ?= md5
+endif
+ifeq ($(UNAME), FreeBSD)
+ HASH ?= gmd5sum
+endif
+ifeq ($(UNAME), OpenBSD)
+ HASH ?= md5
+endif
+HASH ?= md5sum
+
+HAVE_HASH := $(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0)
+ifeq ($(HAVE_HASH), 1)
+ HASH_VALUE := $(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16)
+ HASH_DIR := conf_$(HASH_VALUE)
+else
+ $(info warning : could not find hash function to differentiate builds with different flags)
+ HASH_DIR := 0
+endif
+
+
+BUILD_DIR ?= obj/$(HASH_DIR)
ZSTD_DYNLIB_DIR := $(BUILD_DIR)/dynlib
ZSTD_DYNLIB_OBJ := $(addprefix $(ZSTD_DYNLIB_DIR)/, $(ZSTD_LOCAL_OBJ))
ZSTD_STATLIB_DIR := $(BUILD_DIR)/statlib
all: lib
-libzstd.a: ARFLAGS = rcs
-libzstd.a: $(ZSTD_STATLIB_OBJ)
+$(ZSTD_STATLIB_DIR)/libzstd.a: ARFLAGS = rcs
+$(ZSTD_STATLIB_DIR)/libzstd.a: $(ZSTD_STATLIB_OBJ)
@echo compiling static library
$(Q)$(AR) $(ARFLAGS) $@ $^
+.PHONY: libzstd.a # must be run every time
+libzstd.a: $(ZSTD_STATLIB_DIR)/libzstd.a
+ $(Q)ln -sf $< $@
+
ifneq (,$(filter Windows%,$(TARGET_SYSTEM)))
LIBZSTD = dll\libzstd.dll
-$(LIBZSTD): $(ZSTD_FILES)
+$(ZSTD_DYNLIB_DIR)/$(LIBZSTD): $(ZSTD_FILES)
@echo compiling dynamic library $(LIBVER)
$(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll\libzstd.dll.a -shared $^ -o $@
else
LIBZSTD = libzstd.$(SHARED_EXT_VER)
-$(LIBZSTD): CFLAGS += -fPIC
-$(LIBZSTD): LDFLAGS += -shared -fvisibility=hidden
-$(LIBZSTD): $(ZSTD_DYNLIB_OBJ)
+$(ZSTD_DYNLIB_DIR)/$(LIBZSTD): CFLAGS += -fPIC
+$(ZSTD_DYNLIB_DIR)/$(LIBZSTD): LDFLAGS += -shared -fvisibility=hidden
+$(ZSTD_DYNLIB_DIR)/$(LIBZSTD): $(ZSTD_DYNLIB_OBJ)
@echo compiling dynamic library $(LIBVER)
$(Q)$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@
@echo creating versioned links
endif
+.PHONY: $(LIBZSTD) # must be run every time
+$(LIBZSTD): $(ZSTD_DYNLIB_DIR)/$(LIBZSTD)
+ $(Q)ln -sf $< $@
+
.PHONY: libzstd
libzstd : $(LIBZSTD)
$(Q)$(RM) -r *.dSYM # macOS-specific
$(Q)$(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc
$(Q)$(RM) dll/libzstd.dll dll/libzstd.lib libzstd-nomt*
- $(Q)$(RM) common/*.o compress/*.o decompress/*.o dictBuilder/*.o legacy/*.o deprecated/*.o
- $(Q)$(RM) -r $(ZSTD_STATLIB_DIR)/* $(ZSTD_DYNLIB_DIR)/*
+ $(Q)$(RM) -r obj/*
@echo Cleaning library completed
#-----------------------------------------------------------------------------