Merge pull request #2423 from facebook/no-ln

replace links by actual copies
diff --git a/lib/Makefile b/lib/Makefile
index d04caf6..869d766 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -243,7 +243,7 @@
 	$(AR) $(ARFLAGS) $@ $^
 
 libzstd.a: $(ZSTD_STATLIB)
-	ln -sf $< $@
+	cp -f $< $@
 
 endif
 
@@ -283,7 +283,7 @@
 	ln -sf $@ libzstd.$(SHARED_EXT)
 
 $(LIBZSTD): $(ZSTD_DYNLIB)
-	ln -sf $< $@
+	cp -f $< $@
 
 endif  # ifndef BUILD_DIR
 endif  # if windows
diff --git a/programs/Makefile b/programs/Makefile
index e525d8e..8641d0e 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -98,8 +98,6 @@
 ZSTD_ALL_OBJ := $(ZSTD_ALL_SRC:.c=.o)
 
 UNAME := $(shell uname)
-
-ifndef BUILD_DIR
 ifeq ($(UNAME), Darwin)
   HASH ?= md5
 else ifeq ($(UNAME), FreeBSD)
@@ -108,9 +106,10 @@
   HASH ?= md5
 endif
 HASH ?= md5sum
-
-HASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " ")
 HAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0)
+
+ifndef BUILD_DIR
+HASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " ")
 ifeq ($(HAVE_HASH),0)
   $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags)
   BUILD_DIR := obj/generic_noconf
@@ -232,9 +231,21 @@
 	@echo LINK $@
 	$(CC) $(FLAGS) $^ -o $@$(EXT) $(LDFLAGS)
 
+ifeq ($(HAVE_HASH),1)
+SRCBIN_HASH = $(shell cat $(BUILD_DIR)/zstd 2> $(VOID) | $(HASH) | cut -f 1 -d " ")
+DSTBIN_HASH = $(shell cat zstd 2> $(VOID) | $(HASH) | cut -f 1 -d " ")
+BIN_ISDIFFERENT = $(if $(filter $(SRCBIN_HASH),$(DSTBIN_HASH)),0,1)
+else
+BIN_ISDIFFERENT = 1
+endif
+
 zstd : $(BUILD_DIR)/zstd
-	ln -sf $< $@
-	@echo zstd build completed
+	if [ $(BIN_ISDIFFERENT) -eq 1 ]; then \
+		cp -f $< $@; \
+		echo zstd build completed; \
+	else \
+		echo zstd already built; \
+	fi
 
 endif  # BUILD_DIR