From a912ef0952c6e9c33e9613a41f29fd4af129182f Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 22 Oct 2020 18:48:06 -0700 Subject: [PATCH 1/8] can integrate later dynamic flags changes for example `libzstd-mt` is `differentiated from `libzstd` --- lib/Makefile | 88 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 31 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index 1f10c7ab..d7ce91aa 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -172,6 +172,10 @@ ZSTD_SUBDIR := common compress decompress dictBuilder legacy deprecated vpath %.c $(ZSTD_SUBDIR) UNAME := $(shell uname) + +BUILD_DIR ?= 0 + +ifeq ($(BUILD_DIR),0) ifeq ($(UNAME), Darwin) HASH ?= md5 endif @@ -183,22 +187,14 @@ ifeq ($(UNAME), OpenBSD) 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 +HAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) +ifeq ($(HAVE_HASH),0) + $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) + BUILD_DIR := obj/generic_noconf endif +endif # $(BUILD_DIR) == 0 -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 -ZSTD_STATLIB_OBJ := $(addprefix $(ZSTD_STATLIB_DIR)/, $(ZSTD_LOCAL_OBJ)) - # macOS linker doesn't support -soname, and use different extension # see : https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html ifeq ($(UNAME), Darwin) @@ -223,20 +219,35 @@ lib-all: all all: lib -$(ZSTD_STATLIB_DIR)/libzstd.a: ARFLAGS = rcs -$(ZSTD_STATLIB_DIR)/libzstd.a: | $(ZSTD_STATLIB_DIR) -$(ZSTD_STATLIB_DIR)/libzstd.a: $(ZSTD_STATLIB_OBJ) +ifeq ($(BUILD_DIR),0) +# determine a BUILD_DIR + +.PHONY: libzstd.a # not the actual recipe +libzstd.a: + $(Q)$(MAKE) $@ \ + BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16) \ + CPPFLAGS="$(CPPFLAGS)" + +else +# $(BUILD_DIR) is defined + +ZSTD_STATLIB := $(BUILD_DIR)/libzstd.a +ZSTD_STATLIB_OBJ := $(addprefix $(BUILD_DIR)/,$(ZSTD_LOCAL_OBJ)) +$(ZSTD_STATLIB): ARFLAGS = rcs +$(ZSTD_STATLIB): | $(BUILD_DIR) +$(ZSTD_STATLIB): $(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 +libzstd.a: $(BUILD_DIR)/libzstd.a $(Q)ln -sf $< $@ +endif + ifneq (,$(filter Windows%,$(TARGET_SYSTEM))) LIBZSTD = dll\libzstd.dll -$(LIBZSTD): $(LIBZSTD): $(ZSTD_FILES) @echo compiling dynamic library $(LIBVER) $(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll\libzstd.dll.a -shared $^ -o $@ @@ -244,10 +255,28 @@ $(LIBZSTD): $(ZSTD_FILES) else LIBZSTD = libzstd.$(SHARED_EXT_VER) -$(ZSTD_DYNLIB_DIR)/$(LIBZSTD): CFLAGS += -fPIC -$(ZSTD_DYNLIB_DIR)/$(LIBZSTD): LDFLAGS += -shared -fvisibility=hidden -$(ZSTD_DYNLIB_DIR)/$(LIBZSTD): | $(ZSTD_DYNLIB_DIR) -$(ZSTD_DYNLIB_DIR)/$(LIBZSTD): $(ZSTD_DYNLIB_OBJ) +$(LIBZSTD): CFLAGS += -fPIC +$(LIBZSTD): LDFLAGS += -shared -fvisibility=hidden + +ifeq ($(BUILD_DIR),0) +# determine a BUILD_DIR + +.PHONY: $(LIBZSTD) # not the actual recipe +$(LIBZSTD): + $(Q)$(MAKE) $@ \ + BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16) \ + CPPFLAGS="$(CPPFLAGS)" \ + CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" + +else +# $(BUILD_DIR) is defined + +ZSTD_DYNLIB := $(BUILD_DIR)/$(LIBZSTD) +ZSTD_DYNLIB_OBJ := $(addprefix $(BUILD_DIR)/,$(ZSTD_LOCAL_OBJ)) + +$(ZSTD_DYNLIB): | $(BUILD_DIR) +$(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ) @echo compiling dynamic library $(LIBVER) $(Q)$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ @echo creating versioned links @@ -255,10 +284,11 @@ $(ZSTD_DYNLIB_DIR)/$(LIBZSTD): $(ZSTD_DYNLIB_OBJ) $(Q)ln -sf $@ libzstd.$(SHARED_EXT) .PHONY: $(LIBZSTD) # must be run every time -$(LIBZSTD): $(ZSTD_DYNLIB_DIR)/$(LIBZSTD) +$(LIBZSTD): $(ZSTD_DYNLIB) $(Q)ln -sf $< $@ -endif +endif # if BUILD_DIR +endif # if windows .PHONY: libzstd libzstd : $(LIBZSTD) @@ -284,16 +314,12 @@ lib : libzstd.a libzstd DEPFLAGS = -MT $@ -MMD -MP -MF -$(ZSTD_DYNLIB_DIR)/%.o : %.c $(ZSTD_DYNLIB_DIR)/%.d | $(ZSTD_DYNLIB_DIR) +$(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/%.d | $(BUILD_DIR) @echo $@ - $(Q)$(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $< - -$(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR) - @echo $@ - $(Q)$(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $< + $(Q)$(COMPILE.c) $(DEPFLAGS) $(BUILD_DIR)/$*.d $(OUTPUT_OPTION) $< MKDIR ?= mkdir -$(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR): +$(BUILD_DIR): $(Q)$(MKDIR) -p $@ DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATLIB_OBJ:.o=.d) From a7ad05bf572ee576811f4eb1a3b4adfcadd53b51 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 23 Oct 2020 10:14:04 -0700 Subject: [PATCH 2/8] fixed building libzstd with manual BUILD_DIR and when HASH is not found --- lib/Makefile | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index d7ce91aa..2f6e21c2 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -224,23 +224,24 @@ ifeq ($(BUILD_DIR),0) .PHONY: libzstd.a # not the actual recipe libzstd.a: - $(Q)$(MAKE) $@ \ + $(Q)$(MAKE) --no-print-directory $@ \ BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16) \ CPPFLAGS="$(CPPFLAGS)" else # $(BUILD_DIR) is defined -ZSTD_STATLIB := $(BUILD_DIR)/libzstd.a -ZSTD_STATLIB_OBJ := $(addprefix $(BUILD_DIR)/,$(ZSTD_LOCAL_OBJ)) -$(ZSTD_STATLIB): ARFLAGS = rcs -$(ZSTD_STATLIB): | $(BUILD_DIR) +ZSTD_STATLIB_DIR := $(BUILD_DIR)/static +ZSTD_STATLIB := $(ZSTD_STATLIB_DIR)/libzstd.a +ZSTD_STATLIB_OBJ := $(addprefix $(ZSTD_STATLIB_DIR)/,$(ZSTD_LOCAL_OBJ)) +$(ZSTD_STATLIB): ARFLAGS ?= rcs +$(ZSTD_STATLIB): | $(ZSTD_STATLIB_DIR) $(ZSTD_STATLIB): $(ZSTD_STATLIB_OBJ) @echo compiling static library $(Q)$(AR) $(ARFLAGS) $@ $^ .PHONY: libzstd.a # must be run every time -libzstd.a: $(BUILD_DIR)/libzstd.a +libzstd.a: $(ZSTD_STATLIB) $(Q)ln -sf $< $@ endif @@ -263,7 +264,7 @@ ifeq ($(BUILD_DIR),0) .PHONY: $(LIBZSTD) # not the actual recipe $(LIBZSTD): - $(Q)$(MAKE) $@ \ + $(Q)$(MAKE) --no-print-directory $@ \ BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16) \ CPPFLAGS="$(CPPFLAGS)" \ CFLAGS="$(CFLAGS)" \ @@ -272,10 +273,11 @@ $(LIBZSTD): else # $(BUILD_DIR) is defined -ZSTD_DYNLIB := $(BUILD_DIR)/$(LIBZSTD) -ZSTD_DYNLIB_OBJ := $(addprefix $(BUILD_DIR)/,$(ZSTD_LOCAL_OBJ)) +ZSTD_DYNLIB_DIR := $(BUILD_DIR)/dynamic +ZSTD_DYNLIB := $(ZSTD_DYNLIB_DIR)/$(LIBZSTD) +ZSTD_DYNLIB_OBJ := $(addprefix $(ZSTD_DYNLIB_DIR)/,$(ZSTD_LOCAL_OBJ)) -$(ZSTD_DYNLIB): | $(BUILD_DIR) +$(ZSTD_DYNLIB): | $(ZSTD_DYNLIB_DIR) $(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ) @echo compiling dynamic library $(LIBVER) $(Q)$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ @@ -314,12 +316,16 @@ lib : libzstd.a libzstd DEPFLAGS = -MT $@ -MMD -MP -MF -$(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/%.d | $(BUILD_DIR) +$(ZSTD_DYNLIB_DIR)/%.o : %.c $(ZSTD_DYNLIB_DIR)/%.d | $(ZSTD_DYNLIB_DIR) @echo $@ - $(Q)$(COMPILE.c) $(DEPFLAGS) $(BUILD_DIR)/$*.d $(OUTPUT_OPTION) $< + $(Q)$(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $< + +$(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR) + @echo $@ + $(Q)$(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $< MKDIR ?= mkdir -$(BUILD_DIR): +$(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR): $(Q)$(MKDIR) -p $@ DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATLIB_OBJ:.o=.d) From b5d47287138a9feb4d03c2854c90bde6ef0a87fd Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 23 Oct 2020 10:22:52 -0700 Subject: [PATCH 3/8] simplified silent mode --- lib/Makefile | 77 ++++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index 2f6e21c2..fc9d6a6c 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -8,7 +8,8 @@ # You may select, at your option, one of the above-listed licenses. # ################################################################ -Q = $(if $(filter 1,$(V) $(VERBOSE)),,@) +# define silent mode as default (verbose mode with V=1 or VERBOSE=1) +$(V)$(VERBOSE).SILENT: # When cross-compiling from linux to windows, # you might need to specify this as "Windows." @@ -224,7 +225,7 @@ ifeq ($(BUILD_DIR),0) .PHONY: libzstd.a # not the actual recipe libzstd.a: - $(Q)$(MAKE) --no-print-directory $@ \ + $(MAKE) --no-print-directory $@ \ BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16) \ CPPFLAGS="$(CPPFLAGS)" @@ -238,11 +239,11 @@ $(ZSTD_STATLIB): ARFLAGS ?= rcs $(ZSTD_STATLIB): | $(ZSTD_STATLIB_DIR) $(ZSTD_STATLIB): $(ZSTD_STATLIB_OBJ) @echo compiling static library - $(Q)$(AR) $(ARFLAGS) $@ $^ + $(AR) $(ARFLAGS) $@ $^ .PHONY: libzstd.a # must be run every time libzstd.a: $(ZSTD_STATLIB) - $(Q)ln -sf $< $@ + ln -sf $< $@ endif @@ -264,7 +265,7 @@ ifeq ($(BUILD_DIR),0) .PHONY: $(LIBZSTD) # not the actual recipe $(LIBZSTD): - $(Q)$(MAKE) --no-print-directory $@ \ + $(MAKE) --no-print-directory $@ \ BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16) \ CPPFLAGS="$(CPPFLAGS)" \ CFLAGS="$(CFLAGS)" \ @@ -280,14 +281,14 @@ ZSTD_DYNLIB_OBJ := $(addprefix $(ZSTD_DYNLIB_DIR)/,$(ZSTD_LOCAL_OBJ)) $(ZSTD_DYNLIB): | $(ZSTD_DYNLIB_DIR) $(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ) @echo compiling dynamic library $(LIBVER) - $(Q)$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ + $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ @echo creating versioned links - $(Q)ln -sf $@ libzstd.$(SHARED_EXT_MAJOR) - $(Q)ln -sf $@ libzstd.$(SHARED_EXT) + ln -sf $@ libzstd.$(SHARED_EXT_MAJOR) + ln -sf $@ libzstd.$(SHARED_EXT) .PHONY: $(LIBZSTD) # must be run every time $(LIBZSTD): $(ZSTD_DYNLIB) - $(Q)ln -sf $< $@ + ln -sf $< $@ endif # if BUILD_DIR endif # if windows @@ -318,15 +319,15 @@ DEPFLAGS = -MT $@ -MMD -MP -MF $(ZSTD_DYNLIB_DIR)/%.o : %.c $(ZSTD_DYNLIB_DIR)/%.d | $(ZSTD_DYNLIB_DIR) @echo $@ - $(Q)$(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $< + $(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $< $(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR) @echo $@ - $(Q)$(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $< + $(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $< MKDIR ?= mkdir $(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR): - $(Q)$(MKDIR) -p $@ + $(MKDIR) -p $@ DEPFILES := $(ZSTD_DYNLIB_OBJ:.o=.d) $(ZSTD_STATLIB_OBJ:.o=.d) $(DEPFILES): @@ -341,13 +342,13 @@ libzstd-nomt: LDFLAGS += -shared -fPIC -fvisibility=hidden libzstd-nomt: $(ZSTD_NOMT_FILES) @echo compiling single-thread dynamic library $(LIBVER) @echo files : $(ZSTD_NOMT_FILES) - $(Q)$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ + $(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ clean: - $(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) -r obj/* + $(RM) -r *.dSYM # macOS-specific + $(RM) core *.o *.a *.gcda *.$(SHARED_EXT) *.$(SHARED_EXT).* libzstd.pc + $(RM) dll/libzstd.dll dll/libzstd.lib libzstd-nomt* + $(RM) -r obj/* @echo Cleaning library completed #----------------------------------------------------------------------------- @@ -408,7 +409,7 @@ INSTALL_DATA ?= $(INSTALL) -m 644 libzstd.pc: libzstd.pc: libzstd.pc.in @echo creating pkgconfig - $(Q)@sed $(SED_ERE_OPT) -e 's|@PREFIX@|$(PREFIX)|' \ + @sed $(SED_ERE_OPT) -e 's|@PREFIX@|$(PREFIX)|' \ -e 's|@LIBDIR@|$(PCLIBDIR)|' \ -e 's|@INCLUDEDIR@|$(PCINCDIR)|' \ -e 's|@VERSION@|$(VERSION)|' \ @@ -418,37 +419,37 @@ install: install-pc install-static install-shared install-includes @echo zstd static and shared library installed install-pc: libzstd.pc - $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/ - $(Q)$(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/ + $(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/ + $(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/ install-static: libzstd.a @echo Installing static library - $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ - $(Q)$(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR) + $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ + $(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR) install-shared: libzstd @echo Installing shared library - $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ - $(Q)$(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR) - $(Q)ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) - $(Q)ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT) + $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ + $(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR) + ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) + ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT) install-includes: @echo Installing includes - $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/ - $(Q)$(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR) - $(Q)$(INSTALL_DATA) common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR) - $(Q)$(INSTALL_DATA) dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR) + $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/ + $(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR) + $(INSTALL_DATA) common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR) + $(INSTALL_DATA) dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR) uninstall: - $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libzstd.a - $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT) - $(Q)$(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) - $(Q)$(RM) $(DESTDIR)$(LIBDIR)/$(LIBZSTD) - $(Q)$(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc - $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h - $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h - $(Q)$(RM) $(DESTDIR)$(INCLUDEDIR)/zdict.h + $(RM) $(DESTDIR)$(LIBDIR)/libzstd.a + $(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT) + $(RM) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) + $(RM) $(DESTDIR)$(LIBDIR)/$(LIBZSTD) + $(RM) $(DESTDIR)$(PKGCONFIGDIR)/libzstd.pc + $(RM) $(DESTDIR)$(INCLUDEDIR)/zstd.h + $(RM) $(DESTDIR)$(INCLUDEDIR)/zstd_errors.h + $(RM) $(DESTDIR)$(INCLUDEDIR)/zdict.h @echo zstd libraries successfully uninstalled endif From ffe8d9e428a2f24a1ccaf9ec6032db4930cb8b21 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 23 Oct 2020 10:27:12 -0700 Subject: [PATCH 4/8] fix partial lib test --- lib/Makefile | 4 ++-- tests/libzstd_partial_builds.sh | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index fc9d6a6c..bc45f9b0 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -226,7 +226,7 @@ ifeq ($(BUILD_DIR),0) .PHONY: libzstd.a # not the actual recipe libzstd.a: $(MAKE) --no-print-directory $@ \ - BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16) \ + BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | head -c 16) \ CPPFLAGS="$(CPPFLAGS)" else @@ -266,7 +266,7 @@ ifeq ($(BUILD_DIR),0) .PHONY: $(LIBZSTD) # not the actual recipe $(LIBZSTD): $(MAKE) --no-print-directory $@ \ - BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) | $(HASH) | head -c 16) \ + BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | head -c 16) \ CPPFLAGS="$(CPPFLAGS)" \ CFLAGS="$(CFLAGS)" \ LDFLAGS="$(LDFLAGS)" diff --git a/tests/libzstd_partial_builds.sh b/tests/libzstd_partial_builds.sh index b1c1e3b1..bee2dbda 100755 --- a/tests/libzstd_partial_builds.sh +++ b/tests/libzstd_partial_builds.sh @@ -22,7 +22,6 @@ mustBeAbsent() { } # default compilation : all features enabled -make clean > /dev/null $ECHO "testing default library compilation" CFLAGS= make -C $DIR/../lib libzstd.a > $INTOVOID nm $DIR/../lib/libzstd.a | $GREP "\.o" > tmplog From 89b961ea4679cda6c61287a6a7580a8d20ec0af4 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 23 Oct 2020 10:41:17 -0700 Subject: [PATCH 5/8] simplified silent mode maintenance --- lib/Makefile | 7 +++-- programs/Makefile | 71 ++++++++++++++++++++++++----------------------- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index bc45f9b0..0f502330 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -8,6 +8,9 @@ # You may select, at your option, one of the above-listed licenses. # ################################################################ +.PHONY: default +default: lib-release + # define silent mode as default (verbose mode with V=1 or VERBOSE=1) $(V)$(VERBOSE).SILENT: @@ -211,7 +214,7 @@ else endif -.PHONY: default lib-all all clean install uninstall +.PHONY: lib-all all clean install uninstall default: lib-release @@ -235,7 +238,7 @@ else ZSTD_STATLIB_DIR := $(BUILD_DIR)/static ZSTD_STATLIB := $(ZSTD_STATLIB_DIR)/libzstd.a ZSTD_STATLIB_OBJ := $(addprefix $(ZSTD_STATLIB_DIR)/,$(ZSTD_LOCAL_OBJ)) -$(ZSTD_STATLIB): ARFLAGS ?= rcs +$(ZSTD_STATLIB): ARFLAGS = rcs $(ZSTD_STATLIB): | $(ZSTD_STATLIB_DIR) $(ZSTD_STATLIB): $(ZSTD_STATLIB_OBJ) @echo compiling static library diff --git a/programs/Makefile b/programs/Makefile index 70fb2c32..3b10af57 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -15,8 +15,12 @@ # zstd-decompress : decompressor-only version of zstd # ########################################################################## -# verbose mode can be triggered by V=1 or VERBOSE=1 -Q = $(if $(filter 1,$(V) $(VERBOSE)),,@) +.PHONY: default +default: zstd-release + +# silent mode by default; verbose can be triggered by V=1 or VERBOSE=1 +$(V)$(VERBOSE).SILENT: + ZSTDDIR := ../lib @@ -193,9 +197,6 @@ endif endif -.PHONY: default -default: zstd-release - .PHONY: all all: zstd @@ -207,7 +208,7 @@ $(BUILD_DIR)/zstd : $(ZSTD_OBJ) @echo "$(ZLIB_MSG)" @echo "$(LZMA_MSG)" @echo "$(LZ4_MSG)" - $(Q)$(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) + $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) .PHONY: zstd zstd : CPPFLAGS += $(THREAD_CPP) $(ZLIBCPP) $(LZMACPP) $(LZ4CPP) @@ -217,7 +218,7 @@ ifneq (,$(filter Windows%,$(OS))) zstd : $(RES_FILE) endif zstd : $(BUILD_DIR)/zstd - $(Q)ln -sf $< $@ + ln -sf $< $@ @echo zstd build completed .PHONY: zstd-release @@ -315,11 +316,11 @@ endif .PHONY: clean clean: - $(Q)$(RM) core *.o tmp* result* *.gcda dictionary *.zst \ + $(RM) core *.o tmp* result* *.gcda dictionary *.zst \ zstd$(EXT) zstd32$(EXT) zstd-compress$(EXT) zstd-decompress$(EXT) \ zstd-small$(EXT) zstd-frugal$(EXT) zstd-nolegacy$(EXT) zstd4$(EXT) \ zstd-dictBuilder$(EXT) *.gcda default*.profraw default.profdata have_zlib$(EXT) - $(Q)$(RM) -r obj/* + $(RM) -r obj/* @echo Cleaning completed MD2ROFF = ronn @@ -356,10 +357,10 @@ DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/%.d | $(BUILD_DIR) @echo $@ - $(Q)$(COMPILE.c) $(DEPFLAGS) $(BUILD_DIR)/$*.d $(OUTPUT_OPTION) $< + $(COMPILE.c) $(DEPFLAGS) $(BUILD_DIR)/$*.d $(OUTPUT_OPTION) $< MKDIR ?= mkdir -$(BUILD_DIR): ; $(Q)$(MKDIR) -p $@ +$(BUILD_DIR): ; $(MKDIR) -p $@ DEPFILES := $(ZSTD_OBJ:.o=.d) $(DEPFILES): @@ -388,7 +389,7 @@ AWK = awk ## list: Print all targets and their descriptions (if provided) .PHONY: list list: - $(Q)TARGETS=$$($(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null \ + TARGETS=$$($(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null \ | $(AWK) -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' \ | $(EGREP) -v -e '^[^[:alnum:]]' | sort); \ { \ @@ -436,34 +437,34 @@ INSTALL_MAN ?= $(INSTALL_DATA) .PHONY: install install: zstd @echo Installing binaries - $(Q)$(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)/ $(DESTDIR)$(MAN1DIR)/ - $(Q)$(INSTALL_PROGRAM) zstd$(EXT) $(DESTDIR)$(BINDIR)/zstd$(EXT) - $(Q)ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdcat$(EXT) - $(Q)ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/unzstd$(EXT) - $(Q)ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdmt$(EXT) - $(Q)$(INSTALL_SCRIPT) zstdless $(DESTDIR)$(BINDIR)/zstdless - $(Q)$(INSTALL_SCRIPT) zstdgrep $(DESTDIR)$(BINDIR)/zstdgrep + $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)/ $(DESTDIR)$(MAN1DIR)/ + $(INSTALL_PROGRAM) zstd$(EXT) $(DESTDIR)$(BINDIR)/zstd$(EXT) + ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdcat$(EXT) + ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/unzstd$(EXT) + ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdmt$(EXT) + $(INSTALL_SCRIPT) zstdless $(DESTDIR)$(BINDIR)/zstdless + $(INSTALL_SCRIPT) zstdgrep $(DESTDIR)$(BINDIR)/zstdgrep @echo Installing man pages - $(Q)$(INSTALL_MAN) zstd.1 $(DESTDIR)$(MAN1DIR)/zstd.1 - $(Q)ln -sf zstd.1 $(DESTDIR)$(MAN1DIR)/zstdcat.1 - $(Q)ln -sf zstd.1 $(DESTDIR)$(MAN1DIR)/unzstd.1 - $(Q)$(INSTALL_MAN) zstdgrep.1 $(DESTDIR)$(MAN1DIR)/zstdgrep.1 - $(Q)$(INSTALL_MAN) zstdless.1 $(DESTDIR)$(MAN1DIR)/zstdless.1 + $(INSTALL_MAN) zstd.1 $(DESTDIR)$(MAN1DIR)/zstd.1 + ln -sf zstd.1 $(DESTDIR)$(MAN1DIR)/zstdcat.1 + ln -sf zstd.1 $(DESTDIR)$(MAN1DIR)/unzstd.1 + $(INSTALL_MAN) zstdgrep.1 $(DESTDIR)$(MAN1DIR)/zstdgrep.1 + $(INSTALL_MAN) zstdless.1 $(DESTDIR)$(MAN1DIR)/zstdless.1 @echo zstd installation completed .PHONY: uninstall uninstall: - $(Q)$(RM) $(DESTDIR)$(BINDIR)/zstdgrep - $(Q)$(RM) $(DESTDIR)$(BINDIR)/zstdless - $(Q)$(RM) $(DESTDIR)$(BINDIR)/zstdcat - $(Q)$(RM) $(DESTDIR)$(BINDIR)/unzstd - $(Q)$(RM) $(DESTDIR)$(BINDIR)/zstdmt - $(Q)$(RM) $(DESTDIR)$(BINDIR)/zstd - $(Q)$(RM) $(DESTDIR)$(MAN1DIR)/zstdless.1 - $(Q)$(RM) $(DESTDIR)$(MAN1DIR)/zstdgrep.1 - $(Q)$(RM) $(DESTDIR)$(MAN1DIR)/zstdcat.1 - $(Q)$(RM) $(DESTDIR)$(MAN1DIR)/unzstd.1 - $(Q)$(RM) $(DESTDIR)$(MAN1DIR)/zstd.1 + $(RM) $(DESTDIR)$(BINDIR)/zstdgrep + $(RM) $(DESTDIR)$(BINDIR)/zstdless + $(RM) $(DESTDIR)$(BINDIR)/zstdcat + $(RM) $(DESTDIR)$(BINDIR)/unzstd + $(RM) $(DESTDIR)$(BINDIR)/zstdmt + $(RM) $(DESTDIR)$(BINDIR)/zstd + $(RM) $(DESTDIR)$(MAN1DIR)/zstdless.1 + $(RM) $(DESTDIR)$(MAN1DIR)/zstdgrep.1 + $(RM) $(DESTDIR)$(MAN1DIR)/zstdcat.1 + $(RM) $(DESTDIR)$(MAN1DIR)/unzstd.1 + $(RM) $(DESTDIR)$(MAN1DIR)/zstd.1 @echo zstd programs successfully uninstalled endif From a6ee614a44f2e61ee6d3396b144c04847705f22f Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 23 Oct 2020 16:08:21 -0700 Subject: [PATCH 6/8] make zstd is now differentiated from zstd-nomt avoids mixing object files using different flags --- lib/Makefile | 11 +++++------ programs/Makefile | 46 ++++++++++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index 0f502330..39781ddd 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -182,15 +182,14 @@ BUILD_DIR ?= 0 ifeq ($(BUILD_DIR),0) ifeq ($(UNAME), Darwin) HASH ?= md5 -endif -ifeq ($(UNAME), FreeBSD) +else ifeq ($(UNAME), FreeBSD) HASH ?= gmd5sum -endif -ifeq ($(UNAME), OpenBSD) +else ifeq ($(UNAME), OpenBSD) HASH ?= md5 endif HASH ?= md5sum +HASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | head -c 16) HAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) ifeq ($(HAVE_HASH),0) $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) @@ -229,7 +228,7 @@ ifeq ($(BUILD_DIR),0) .PHONY: libzstd.a # not the actual recipe libzstd.a: $(MAKE) --no-print-directory $@ \ - BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | head -c 16) \ + BUILD_DIR=obj/$(HASH_DIR) \ CPPFLAGS="$(CPPFLAGS)" else @@ -269,7 +268,7 @@ ifeq ($(BUILD_DIR),0) .PHONY: $(LIBZSTD) # not the actual recipe $(LIBZSTD): $(MAKE) --no-print-directory $@ \ - BUILD_DIR=obj/conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | head -c 16) \ + BUILD_DIR=obj/$(HASH_DIR) \ CPPFLAGS="$(CPPFLAGS)" \ CFLAGS="$(CFLAGS)" \ LDFLAGS="$(LDFLAGS)" diff --git a/programs/Makefile b/programs/Makefile index 3b10af57..ce3c83ad 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -98,28 +98,25 @@ ZSTD_ALL_SRC := $(ZSTDLIB_LOCAL_SRC) $(ZSTD_CLI_SRC) ZSTD_ALL_OBJ := $(ZSTD_ALL_SRC:.c=.o) UNAME := $(shell uname) +BUILD_DIR ?= 0 + +ifeq ($(BUILD_DIR),0) ifeq ($(UNAME), Darwin) HASH ?= md5 -endif -ifeq ($(UNAME), FreeBSD) +else ifeq ($(UNAME), FreeBSD) HASH ?= gmd5sum -endif -ifeq ($(UNAME), OpenBSD) +else 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 +HASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | head -c 16) +HAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0) +ifeq ($(HAVE_HASH),0) + $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) + BUILD_DIR := obj/generic_noconf endif - -BUILD_DIR ?= obj/$(HASH_DIR) -ZSTD_OBJ := $(addprefix $(BUILD_DIR)/, $(ZSTD_ALL_OBJ)) +endif # $(BUILD_DIR) == 0 # Define *.exe as extension for Windows systems ifneq (,$(filter Windows%,$(OS))) @@ -203,6 +200,7 @@ all: zstd .PHONY: allVariants allVariants: zstd zstd-compress zstd-decompress zstd-small zstd-nolegacy zstd-dictBuilder +ZSTD_OBJ := $(addprefix $(BUILD_DIR)/, $(ZSTD_ALL_OBJ)) $(BUILD_DIR)/zstd : $(ZSTD_OBJ) @echo "$(THREAD_MSG)" @echo "$(ZLIB_MSG)" @@ -210,17 +208,34 @@ $(BUILD_DIR)/zstd : $(ZSTD_OBJ) @echo "$(LZ4_MSG)" $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) -.PHONY: zstd +.PHONY: zstd # must always be run zstd : CPPFLAGS += $(THREAD_CPP) $(ZLIBCPP) $(LZMACPP) $(LZ4CPP) zstd : LDFLAGS += $(THREAD_LD) $(ZLIBLD) $(LZMALD) $(LZ4LD) $(DEBUGFLAGS_LD) zstd : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) ifneq (,$(filter Windows%,$(OS))) zstd : $(RES_FILE) endif + +ifeq ($(BUILD_DIR),0) +# generate a BUILD_DIR from flags + +zstd: + $(MAKE) --no-print-directory $@ \ + BUILD_DIR=obj/$(HASH_DIR) \ + CPPFLAGS="$(CPPFLAGS)" \ + CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" + +else +# BUILD_DIR is defined + zstd : $(BUILD_DIR)/zstd ln -sf $< $@ @echo zstd build completed +endif + + .PHONY: zstd-release zstd-release: DEBUGFLAGS := -DBACKTRACE_ENABLE=0 zstd-release: DEBUGFLAGS_LD := @@ -372,7 +387,6 @@ include $(wildcard $(DEPFILES)) #----------------------------------------------------------------------------- # make install is validated only for Linux, macOS, BSD, Hurd and Solaris targets #----------------------------------------------------------------------------- -UNAME := $(shell uname) ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku)) HAVE_COLORNEVER = $(shell echo a | egrep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) From 456db0c3770856ea83de771b98fb6715fa4fb13a Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 23 Oct 2020 16:46:49 -0700 Subject: [PATCH 7/8] make install only rebuild binaries if they don't exist Now `make` followed by `make install` doesn't rebuild binaries also : only generated target directories if they don't already exist --- lib/Makefile | 20 ++++++++++++-------- programs/Makefile | 10 +++++++--- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index 39781ddd..a549b82b 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -320,11 +320,11 @@ lib : libzstd.a libzstd DEPFLAGS = -MT $@ -MMD -MP -MF $(ZSTD_DYNLIB_DIR)/%.o : %.c $(ZSTD_DYNLIB_DIR)/%.d | $(ZSTD_DYNLIB_DIR) - @echo $@ + @echo CC $@ $(COMPILE.c) $(DEPFLAGS) $(ZSTD_DYNLIB_DIR)/$*.d $(OUTPUT_OPTION) $< $(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR) - @echo $@ + @echo CC $@ $(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $< MKDIR ?= mkdir @@ -421,24 +421,28 @@ install: install-pc install-static install-shared install-includes @echo zstd static and shared library installed install-pc: libzstd.pc - $(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/ + [ -e $(DESTDIR)$(PKGCONFIGDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(PKGCONFIGDIR)/ $(INSTALL_DATA) libzstd.pc $(DESTDIR)$(PKGCONFIGDIR)/ -install-static: libzstd.a +install-static: + # only generate libzstd.a if it's not already present + [ -e libzstd.a ] || $(MAKE) libzstd.a-release + [ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ @echo Installing static library - $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ $(INSTALL_DATA) libzstd.a $(DESTDIR)$(LIBDIR) -install-shared: libzstd +install-shared: + # only generate libzstd.so if it's not already present + [ -e $(LIBZSTD) ] || $(MAKE) libzstd-release + [ -e $(DESTDIR)$(LIBDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ @echo Installing shared library - $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR)/ $(INSTALL_PROGRAM) $(LIBZSTD) $(DESTDIR)$(LIBDIR) ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) ln -sf $(LIBZSTD) $(DESTDIR)$(LIBDIR)/libzstd.$(SHARED_EXT) install-includes: + [ -e $(DESTDIR)$(INCLUDEDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/ @echo Installing includes - $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/ $(INSTALL_DATA) zstd.h $(DESTDIR)$(INCLUDEDIR) $(INSTALL_DATA) common/zstd_errors.h $(DESTDIR)$(INCLUDEDIR) $(INSTALL_DATA) dictBuilder/zdict.h $(DESTDIR)$(INCLUDEDIR) diff --git a/programs/Makefile b/programs/Makefile index ce3c83ad..e9ba02cd 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -206,6 +206,7 @@ $(BUILD_DIR)/zstd : $(ZSTD_OBJ) @echo "$(ZLIB_MSG)" @echo "$(LZMA_MSG)" @echo "$(LZ4_MSG)" + @echo LINK $@ $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) .PHONY: zstd # must always be run @@ -371,7 +372,7 @@ preview-man: clean-man man DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/%.o : %.c $(BUILD_DIR)/%.d | $(BUILD_DIR) - @echo $@ + @echo CC $@ $(COMPILE.c) $(DEPFLAGS) $(BUILD_DIR)/$*.d $(OUTPUT_OPTION) $< MKDIR ?= mkdir @@ -449,9 +450,12 @@ INSTALL_DATA ?= $(INSTALL) -m 644 INSTALL_MAN ?= $(INSTALL_DATA) .PHONY: install -install: zstd +install: + # generate zstd only if not already present + [ -e zstd ] || $(MAKE) zstd-release + [ -e $(DESTDIR)$(BINDIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)/ + [ -e $(DESTDIR)$(MAN1DIR) ] || $(INSTALL) -d -m 755 $(DESTDIR)$(MAN1DIR)/ @echo Installing binaries - $(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)/ $(DESTDIR)$(MAN1DIR)/ $(INSTALL_PROGRAM) zstd$(EXT) $(DESTDIR)$(BINDIR)/zstd$(EXT) ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/zstdcat$(EXT) ln -sf zstd$(EXT) $(DESTDIR)$(BINDIR)/unzstd$(EXT) From f6ecf1568f147b13b30646aa5ee7342763382c38 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 28 Oct 2020 09:39:15 -0700 Subject: [PATCH 8/8] minor Makefile refactor hopefully improving readability --- lib/Makefile | 61 +++++++++++++++++++++-------------------------- programs/Makefile | 52 +++++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 59 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index a549b82b..c6197e2d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -15,12 +15,9 @@ default: lib-release $(V)$(VERBOSE).SILENT: # When cross-compiling from linux to windows, -# you might need to specify this as "Windows." -# Fedora build fails without it. -# -# Note: mingw-w64 build from linux to windows -# does not fail on other tested distros (ubuntu, debian) -# even without manually specifying the TARGET_SYSTEM. +# one might need to specify TARGET_SYSTEM as "Windows." +# Building from Fedora fails without it. +# (but Ubuntu and Debian don't need to set anything) TARGET_SYSTEM ?= $(OS) # Version numbers @@ -35,8 +32,8 @@ LIBVER := $(shell echo $(LIBVER_SCRIPT)) VERSION?= $(LIBVER) CCVER := $(shell $(CC) --version) -# This is a helper variable that configures a bunch of other variables to new, -# space-optimized defaults. +# ZSTD_LIB_MINIFY is a helper variable that +# configures a bunch of other variables to space-optimized defaults. ZSTD_LIB_MINIFY ?= 0 ifneq ($(ZSTD_LIB_MINIFY), 0) HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0) @@ -177,9 +174,7 @@ vpath %.c $(ZSTD_SUBDIR) UNAME := $(shell uname) -BUILD_DIR ?= 0 - -ifeq ($(BUILD_DIR),0) +ifndef BUILD_DIR ifeq ($(UNAME), Darwin) HASH ?= md5 else ifeq ($(UNAME), FreeBSD) @@ -195,7 +190,7 @@ ifeq ($(HAVE_HASH),0) $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) BUILD_DIR := obj/generic_noconf endif -endif # $(BUILD_DIR) == 0 +endif # BUILD_DIR # macOS linker doesn't support -soname, and use different extension @@ -212,27 +207,31 @@ else SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER) endif +SET_CACHE_DIRECTORY = \ + $(MAKE) --no-print-directory $@ \ + BUILD_DIR=obj/$(HASH_DIR) \ + CPPFLAGS="$(CPPFLAGS)" \ + CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" + .PHONY: lib-all all clean install uninstall -default: lib-release - # alias lib-all: all all: lib -ifeq ($(BUILD_DIR),0) -# determine a BUILD_DIR +.PHONY: libzstd.a # must be run every time + +ifndef BUILD_DIR +# determine BUILD_DIR from compilation flags -.PHONY: libzstd.a # not the actual recipe libzstd.a: - $(MAKE) --no-print-directory $@ \ - BUILD_DIR=obj/$(HASH_DIR) \ - CPPFLAGS="$(CPPFLAGS)" + $(SET_CACHE_DIRECTORY) else -# $(BUILD_DIR) is defined +# BUILD_DIR is defined ZSTD_STATLIB_DIR := $(BUILD_DIR)/static ZSTD_STATLIB := $(ZSTD_STATLIB_DIR)/libzstd.a @@ -243,7 +242,6 @@ $(ZSTD_STATLIB): $(ZSTD_STATLIB_OBJ) @echo compiling static library $(AR) $(ARFLAGS) $@ $^ -.PHONY: libzstd.a # must be run every time libzstd.a: $(ZSTD_STATLIB) ln -sf $< $@ @@ -256,25 +254,21 @@ $(LIBZSTD): $(ZSTD_FILES) @echo compiling dynamic library $(LIBVER) $(CC) $(FLAGS) -DZSTD_DLL_EXPORT=1 -Wl,--out-implib,dll\libzstd.dll.a -shared $^ -o $@ -else +else # not Windows LIBZSTD = libzstd.$(SHARED_EXT_VER) +.PHONY: $(LIBZSTD) # must be run every time $(LIBZSTD): CFLAGS += -fPIC $(LIBZSTD): LDFLAGS += -shared -fvisibility=hidden -ifeq ($(BUILD_DIR),0) -# determine a BUILD_DIR +ifndef BUILD_DIR +# determine BUILD_DIR from compilation flags -.PHONY: $(LIBZSTD) # not the actual recipe $(LIBZSTD): - $(MAKE) --no-print-directory $@ \ - BUILD_DIR=obj/$(HASH_DIR) \ - CPPFLAGS="$(CPPFLAGS)" \ - CFLAGS="$(CFLAGS)" \ - LDFLAGS="$(LDFLAGS)" + $(SET_CACHE_DIRECTORY) else -# $(BUILD_DIR) is defined +# BUILD_DIR is defined ZSTD_DYNLIB_DIR := $(BUILD_DIR)/dynamic ZSTD_DYNLIB := $(ZSTD_DYNLIB_DIR)/$(LIBZSTD) @@ -288,11 +282,10 @@ $(ZSTD_DYNLIB): $(ZSTD_DYNLIB_OBJ) ln -sf $@ libzstd.$(SHARED_EXT_MAJOR) ln -sf $@ libzstd.$(SHARED_EXT) -.PHONY: $(LIBZSTD) # must be run every time $(LIBZSTD): $(ZSTD_DYNLIB) ln -sf $< $@ -endif # if BUILD_DIR +endif # ifndef BUILD_DIR endif # if windows .PHONY: libzstd diff --git a/programs/Makefile b/programs/Makefile index e9ba02cd..3443014c 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -98,9 +98,8 @@ ZSTD_ALL_SRC := $(ZSTDLIB_LOCAL_SRC) $(ZSTD_CLI_SRC) ZSTD_ALL_OBJ := $(ZSTD_ALL_SRC:.c=.o) UNAME := $(shell uname) -BUILD_DIR ?= 0 -ifeq ($(BUILD_DIR),0) +ifndef BUILD_DIR ifeq ($(UNAME), Darwin) HASH ?= md5 else ifeq ($(UNAME), FreeBSD) @@ -116,7 +115,7 @@ ifeq ($(HAVE_HASH),0) $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags) BUILD_DIR := obj/generic_noconf endif -endif # $(BUILD_DIR) == 0 +endif # BUILD_DIR # Define *.exe as extension for Windows systems ifneq (,$(filter Windows%,$(OS))) @@ -193,6 +192,13 @@ ifeq ($(BACKTRACE), 1) endif endif +SET_CACHE_DIRECTORY = \ + $(MAKE) --no-print-directory $@ \ + BUILD_DIR=obj/$(HASH_DIR) \ + CPPFLAGS="$(CPPFLAGS)" \ + CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" + .PHONY: all all: zstd @@ -200,6 +206,23 @@ all: zstd .PHONY: allVariants allVariants: zstd zstd-compress zstd-decompress zstd-small zstd-nolegacy zstd-dictBuilder +.PHONY: zstd # must always be run +zstd : CPPFLAGS += $(THREAD_CPP) $(ZLIBCPP) $(LZMACPP) $(LZ4CPP) +zstd : LDFLAGS += $(THREAD_LD) $(ZLIBLD) $(LZMALD) $(LZ4LD) $(DEBUGFLAGS_LD) +zstd : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) +ifneq (,$(filter Windows%,$(OS))) +zstd : $(RES_FILE) +endif + +ifndef BUILD_DIR +# generate BUILD_DIR from flags + +zstd: + $(SET_CACHE_DIRECTORY) + +else +# BUILD_DIR is defined + ZSTD_OBJ := $(addprefix $(BUILD_DIR)/, $(ZSTD_ALL_OBJ)) $(BUILD_DIR)/zstd : $(ZSTD_OBJ) @echo "$(THREAD_MSG)" @@ -209,32 +232,11 @@ $(BUILD_DIR)/zstd : $(ZSTD_OBJ) @echo LINK $@ $(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS) -.PHONY: zstd # must always be run -zstd : CPPFLAGS += $(THREAD_CPP) $(ZLIBCPP) $(LZMACPP) $(LZ4CPP) -zstd : LDFLAGS += $(THREAD_LD) $(ZLIBLD) $(LZMALD) $(LZ4LD) $(DEBUGFLAGS_LD) -zstd : CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT) -ifneq (,$(filter Windows%,$(OS))) -zstd : $(RES_FILE) -endif - -ifeq ($(BUILD_DIR),0) -# generate a BUILD_DIR from flags - -zstd: - $(MAKE) --no-print-directory $@ \ - BUILD_DIR=obj/$(HASH_DIR) \ - CPPFLAGS="$(CPPFLAGS)" \ - CFLAGS="$(CFLAGS)" \ - LDFLAGS="$(LDFLAGS)" - -else -# BUILD_DIR is defined - zstd : $(BUILD_DIR)/zstd ln -sf $< $@ @echo zstd build completed -endif +endif # BUILD_DIR .PHONY: zstd-release