# ################################################################ # xxHash Makefile # Copyright (C) Yann Collet 2012-2015 # # GPL v2 License # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # You can contact the author at : # - xxHash source repository : http://code.google.com/p/xxhash/ # ################################################################ # xxhsum : provides 32/64 bits hash of one or multiple files, or stdin # ################################################################ # Version numbers LIBVER_MAJOR_SCRIPT:=`sed -n '/define XXH_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < xxhash.h` LIBVER_MINOR_SCRIPT:=`sed -n '/define XXH_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < xxhash.h` LIBVER_PATCH_SCRIPT:=`sed -n '/define XXH_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < xxhash.h` LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT)) LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT)) LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT)) LIBVER := $(LIBVER_MAJOR).$(LIBVER_MINOR).$(LIBVER_PATCH) # SSE4 detection HAVE_SSE4 := $(shell $(CC) -dM -E - < /dev/null | grep "SSE4" > /dev/null && echo 1 || echo 0) ifeq ($(HAVE_SSE4), 1) NOSSE4 := -mno-sse4 else NOSSE4 := endif CFLAGS ?= -O2 $(NOSSE4) # disables potential auto-vectorization CFLAGS += -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ -Wstrict-prototypes -Wundef FLAGS = $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(MOREFLAGS) XXHSUM_VERSION=$(LIBVER) MD2ROFF = ronn MD2ROFF_FLAGS = --roff --warnings --manual="User Commands" --organization="xxhsum $(XXHSUM_VERSION)" # Define *.exe as extension for Windows systems ifneq (,$(filter Windows%,$(OS))) EXT =.exe else EXT = endif # OS X 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 ($(shell uname), Darwin) SHARED_EXT = dylib SHARED_EXT_MAJOR = $(LIBVER_MAJOR).$(SHARED_EXT) SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT) SONAME_FLAGS = -install_name $(LIBDIR)/libxxhash.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER) else SONAME_FLAGS = -Wl,-soname=libxxhash.$(SHARED_EXT).$(LIBVER_MAJOR) SHARED_EXT = so SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR) SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER) endif LIBXXH = libxxhash.$(SHARED_EXT_VER) .PHONY: default default: lib xxhsum_and_links .PHONY: all all: lib xxhsum xxhsum_inlinedXXH xxhsum32: CFLAGS += -m32 xxhsum xxhsum32: xxhash.c xxhsum.c $(CC) $(FLAGS) $^ -o $@$(EXT) .PHONY: xxhsum_and_links xxhsum_and_links: xxhsum ln -sf xxhsum xxh32sum ln -sf xxhsum xxh64sum xxhsum_inlinedXXH: xxhsum.c $(CC) $(FLAGS) -DXXH_PRIVATE_API $^ -o $@$(EXT) # library libxxhash.a: ARFLAGS = rcs libxxhash.a: xxhash.o @echo compiling static library @$(AR) $(ARFLAGS) $@ $^ $(LIBXXH): LDFLAGS += -shared ifeq (,$(filter Windows%,$(OS))) $(LIBXXH): LDFLAGS += -fPIC endif $(LIBXXH): xxhash.c @echo compiling dynamic library $(LIBVER) @$(CC) $(FLAGS) $^ $(LDFLAGS) $(SONAME_FLAGS) -o $@ @echo creating versioned links @ln -sf $@ libxxhash.$(SHARED_EXT_MAJOR) @ln -sf $@ libxxhash.$(SHARED_EXT) libxxhash : $(LIBXXH) lib: libxxhash.a libxxhash # tests .PHONY: check check: xxhsum # stdin ./xxhsum < xxhash.c # multiple files ./xxhsum xxhash.* xxhsum.* # internal bench ./xxhsum -bi1 # file bench ./xxhsum -bi1 xxhash.c .PHONY: test-mem test-mem: xxhsum # memory tests valgrind --leak-check=yes --error-exitcode=1 ./xxhsum -bi1 xxhash.c valgrind --leak-check=yes --error-exitcode=1 ./xxhsum -H0 xxhash.c valgrind --leak-check=yes --error-exitcode=1 ./xxhsum -H1 xxhash.c .PHONY: test32 test32: clean xxhsum32 @echo ---- test 32-bit ---- ./xxhsum32 -bi1 xxhash.c test-xxhsum-c: xxhsum # xxhsum to/from pipe ./xxhsum lib* | ./xxhsum -c - ./xxhsum -H0 lib* | ./xxhsum -c - # xxhsum to/from file, shell redirection ./xxhsum lib* > .test.xxh64 ./xxhsum -H0 lib* > .test.xxh32 ./xxhsum -c .test.xxh64 ./xxhsum -c .test.xxh32 ./xxhsum -c < .test.xxh64 ./xxhsum -c < .test.xxh32 # xxhsum -c warns improperly format lines. cat .test.xxh64 .test.xxh32 | ./xxhsum -c - cat .test.xxh32 .test.xxh64 | ./xxhsum -c - # Expects "FAILED" echo "0000000000000000 LICENSE" | ./xxhsum -c -; test $$? -eq 1 echo "00000000 LICENSE" | ./xxhsum -c -; test $$? -eq 1 # Expects "FAILED open or read" echo "0000000000000000 test-expects-file-not-found" | ./xxhsum -c -; test $$? -eq 1 echo "00000000 test-expects-file-not-found" | ./xxhsum -c -; test $$? -eq 1 @$(RM) -f .test.xxh32 .test.xxh64 armtest: clean @echo ---- test ARM compilation ---- $(MAKE) xxhsum CC=arm-linux-gnueabi-gcc MOREFLAGS="-Werror -static" clangtest: clean @echo ---- test clang compilation ---- $(MAKE) all CC=clang MOREFLAGS="-Werror -Wconversion -Wno-sign-conversion" gpptest: clean @echo ---- test g++ compilation ---- $(MAKE) all CC=g++ CFLAGS="-O3 -Wall -Wextra -Wundef -Wshadow -Wcast-align -Werror" c90test: clean @echo ---- test strict C90 compilation [xxh32 only] ---- $(CC) -std=c90 -Werror -pedantic -DXXH_NO_LONG_LONG -c xxhash.c $(RM) xxhash.o usan: CC=clang usan: clean @echo ---- check undefined behavior - sanitize ---- $(MAKE) clean test CC=$(CC) MOREFLAGS="-g -fsanitize=undefined -fno-sanitize-recover=all" staticAnalyze: clean @echo ---- static analyzer - scan-build ---- CFLAGS="-g -Werror" scan-build --status-bugs -v $(MAKE) all namespaceTest: $(CC) -c xxhash.c $(CC) -DXXH_NAMESPACE=TEST_ -c xxhash.c -o xxhash2.o $(CC) xxhash.o xxhash2.o xxhsum.c -o xxhsum2 # will fail if one namespace missing (symbol collision) $(RM) *.o xxhsum2 # clean xxhsum.1: xxhsum.1.md cat $^ | $(MD2ROFF) $(MD2ROFF_FLAGS) | sed -n '/^\.\\\".*/!p' > $@ man: xxhsum.1 clean-man: $(RM) xxhsum.1 preview-man: clean-man man man ./xxhsum.1 test: all namespaceTest check test-xxhsum-c c90test test-all: test test32 armtest clangtest gpptest usan listL120 trailingWhitespace staticAnalyze .PHONY: listL120 listL120: # extract lines >= 120 characters in *.{c,h}, by Takayuki Matsuoka (note : $$, for Makefile compatibility) find . -type f -name '*.c' -o -name '*.h' | while read -r filename; do awk 'length > 120 {print FILENAME "(" FNR "): " $$0}' $$filename; done .PHONY: trailingWhitespace trailingWhitespace: ! grep -E "`printf '[ \\t]$$'`" *.1 *.c *.h LICENSE Makefile cmake_unofficial/CMakeLists.txt .PHONY: clean clean: @$(RM) -r *.dSYM # Mac OS-X specific @$(RM) core *.o libxxhash.* @$(RM) xxhsum$(EXT) xxhsum32$(EXT) xxhsum_inlinedXXH$(EXT) xxh32sum xxh64sum @echo cleaning completed #----------------------------------------------------------------------------- # make install is validated only for the following targets #----------------------------------------------------------------------------- ifneq (,$(filter $(shell uname),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS)) .PHONY: list list: @$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | xargs DESTDIR ?= # directory variables : GNU conventions prefer lowercase # see https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html # support both lower and uppercase (BSD), use uppercase in script prefix ?= /usr/local PREFIX ?= $(prefix) exec_prefix ?= $(PREFIX) libdir ?= $(exec_prefix)/lib LIBDIR ?= $(libdir) includedir ?= $(PREFIX)/include INCLUDEDIR ?= $(includedir) bindir ?= $(exec_prefix)/bin BINDIR ?= $(bindir) datarootdir ?= $(PREFIX)/share mandir ?= $(datarootdir)/man man1dir ?= $(mandir)/man1 ifneq (,$(filter $(shell uname),OpenBSD FreeBSD NetBSD DragonFly SunOS)) MANDIR ?= $(PREFIX)/man/man1 else MANDIR ?= $(man1dir) endif ifneq (,$(filter $(shell uname),SunOS)) INSTALL ?= ginstall else INSTALL ?= install endif INSTALL_PROGRAM ?= $(INSTALL) INSTALL_DATA ?= $(INSTALL) -m 644 .PHONY: install install: lib xxhsum @echo Installing libxxhash @$(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR) @$(INSTALL_DATA) libxxhash.a $(DESTDIR)$(LIBDIR) @$(INSTALL_PROGRAM) $(LIBXXH) $(DESTDIR)$(LIBDIR) @ln -sf $(LIBXXH) $(DESTDIR)$(LIBDIR)/libxxhash.$(SHARED_EXT_MAJOR) @ln -sf $(LIBXXH) $(DESTDIR)$(LIBDIR)/libxxhash.$(SHARED_EXT) @$(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR) # includes @$(INSTALL_DATA) xxhash.h $(DESTDIR)$(INCLUDEDIR) @echo Installing xxhsum @$(INSTALL) -d -m 755 $(DESTDIR)$(BINDIR)/ $(DESTDIR)$(MANDIR)/ @$(INSTALL_PROGRAM) xxhsum $(DESTDIR)$(BINDIR)/xxhsum @ln -sf xxhsum $(DESTDIR)$(BINDIR)/xxh32sum @ln -sf xxhsum $(DESTDIR)$(BINDIR)/xxh64sum @echo Installing man pages @$(INSTALL_DATA) xxhsum.1 $(DESTDIR)$(MANDIR)/xxhsum.1 @ln -sf xxhsum.1 $(DESTDIR)$(MANDIR)/xxh32sum.1 @ln -sf xxhsum.1 $(DESTDIR)$(MANDIR)/xxh64sum.1 @echo xxhash installation completed .PHONY: uninstall uninstall: @$(RM) $(DESTDIR)$(LIBDIR)/libxxhash.a @$(RM) $(DESTDIR)$(LIBDIR)/libxxhash.$(SHARED_EXT) @$(RM) $(DESTDIR)$(LIBDIR)/libxxhash.$(SHARED_EXT_MAJOR) @$(RM) $(DESTDIR)$(LIBDIR)/$(LIBXXH) @$(RM) $(DESTDIR)$(INCLUDEDIR)/xxhash.h @$(RM) $(DESTDIR)$(BINDIR)/xxh32sum @$(RM) $(DESTDIR)$(BINDIR)/xxh64sum @$(RM) $(DESTDIR)$(BINDIR)/xxhsum @$(RM) $(DESTDIR)$(MANDIR)/xxh32sum.1 @$(RM) $(DESTDIR)$(MANDIR)/xxh64sum.1 @$(RM) $(DESTDIR)$(MANDIR)/xxhsum.1 @echo xxhsum successfully uninstalled endif