| # We assume X64 unless HH_POWER, HH_ARM, or HH_AARCH64 are defined. | |
| override CPPFLAGS += -I. | |
| override CXXFLAGS += -std=c++11 -Wall -O3 -fPIC -pthread | |
| override LDFLAGS += -pthread | |
| PREFIX ?= /usr/local | |
| INCDIR ?= $(PREFIX)/include | |
| LIBDIR ?= $(PREFIX)/lib | |
| SIP_OBJS := $(addprefix obj/, \ | |
| sip_hash.o \ | |
| sip_tree_hash.o \ | |
| scalar_sip_tree_hash.o \ | |
| ) | |
| DISPATCHER_OBJS := $(addprefix obj/, \ | |
| arch_specific.o \ | |
| instruction_sets.o \ | |
| nanobenchmark.o \ | |
| os_specific.o \ | |
| ) | |
| HIGHWAYHASH_OBJS := $(DISPATCHER_OBJS) obj/hh_portable.o | |
| HIGHWAYHASH_TEST_OBJS := $(DISPATCHER_OBJS) obj/highwayhash_test_portable.o | |
| VECTOR_TEST_OBJS := $(DISPATCHER_OBJS) obj/vector_test_portable.o | |
| # aarch64 and ARM use the same code, although ARM usually needs an extra flag for NEON. | |
| ifdef HH_ARM | |
| CXXFLAGS += -mfloat-abi=hard -march=armv7-a -mfpu=neon | |
| HH_AARCH64 = 1 | |
| endif | |
| ifdef HH_AARCH64 | |
| HH_X64 = | |
| HIGHWAYHASH_OBJS += obj/hh_neon.o | |
| HIGHWAYHASH_TEST_OBJS += obj/highwayhash_test_neon.o | |
| VECTOR_TEST_OBJS += obj/vector_test_neon.o | |
| else | |
| ifdef HH_POWER | |
| HH_X64 = | |
| HIGHWAYHASH_OBJS += obj/hh_vsx.o | |
| HIGHWAYHASH_TEST_OBJS += obj/highwayhash_test_vsx.o | |
| else | |
| HH_X64 = 1 | |
| HIGHWAYHASH_OBJS += obj/hh_avx2.o obj/hh_sse41.o | |
| HIGHWAYHASH_TEST_OBJS += obj/highwayhash_test_avx2.o obj/highwayhash_test_sse41.o | |
| VECTOR_TEST_OBJS += obj/vector_test_avx2.o obj/vector_test_sse41.o | |
| endif | |
| endif | |
| # In case highwayhash_test defines PRINT_RESULTS. | |
| HIGHWAYHASH_TEST_OBJS += $(HIGHWAYHASH_OBJS) | |
| all: $(addprefix bin/, \ | |
| profiler_example nanobenchmark_example vector_test sip_hash_test \ | |
| highwayhash_test benchmark) lib/libhighwayhash.a | |
| obj/%.o: highwayhash/%.cc | |
| @mkdir -p -- $(dir $@) | |
| $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ | |
| bin/%: obj/%.o | |
| @mkdir -p -- $(dir $@) | |
| $(CXX) $(LDFLAGS) $^ -o $@ | |
| .DELETE_ON_ERROR: | |
| deps.mk: $(wildcard highwayhash/*.cc) $(wildcard highwayhash/*.h) Makefile | |
| set -eu; for file in highwayhash/*.cc; do \ | |
| target=obj/$${file##*/}; target=$${target%.*}.o; \ | |
| [ "$$target" = "obj/highwayhash_target.o" ] || \ | |
| [ "$$target" = "obj/data_parallel_benchmark.o" ] || \ | |
| [ "$$target" = "obj/data_parallel_test.o" ] || \ | |
| $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -DHH_DISABLE_TARGET_SPECIFIC -MM -MT \ | |
| "$$target" "$$file"; \ | |
| done | sed -e ':b' -e 's-../[^./]*/--' -e 'tb' >$@ | |
| -include deps.mk | |
| bin/profiler_example: $(DISPATCHER_OBJS) | |
| bin/nanobenchmark_example: $(DISPATCHER_OBJS) obj/nanobenchmark.o | |
| ifdef HH_X64 | |
| # TODO: Portability: Have AVX2 be optional so benchmarking can be done on older machines. | |
| obj/sip_tree_hash.o: CXXFLAGS+=-mavx2 | |
| # (Compiled from same source file with different compiler flags) | |
| obj/highwayhash_test_avx2.o: CXXFLAGS+=-mavx2 | |
| obj/highwayhash_test_sse41.o: CXXFLAGS+=-msse4.1 | |
| obj/hh_avx2.o: CXXFLAGS+=-mavx2 | |
| obj/hh_sse41.o: CXXFLAGS+=-msse4.1 | |
| obj/vector_test_avx2.o: CXXFLAGS+=-mavx2 | |
| obj/vector_test_sse41.o: CXXFLAGS+=-msse4.1 | |
| obj/benchmark.o: CXXFLAGS+=-mavx2 | |
| endif | |
| ifdef HH_POWER | |
| obj/highwayhash_test_vsx.o: CXXFLAGS+=-mvsx | |
| obj/hh_vsx.o: CXXFLAGS+=-mvsx | |
| obj/benchmark.o: CXXFLAGS+=-mvsx | |
| # Skip file - vector library/test not supported on PPC | |
| obj/vector_test_target.o: CXXFLAGS+=-DHH_DISABLE_TARGET_SPECIFIC | |
| obj/vector_test.o: CXXFLAGS+=-DHH_DISABLE_TARGET_SPECIFIC | |
| endif | |
| lib/libhighwayhash.a: $(SIP_OBJS) $(HIGHWAYHASH_OBJS) obj/c_bindings.o | |
| @mkdir -p -- $(dir $@) | |
| $(AR) rcs $@ $^ | |
| lib/libhighwayhash.so: $(SIP_OBJS) $(HIGHWAYHASH_OBJS) obj/c_bindings.o | |
| @mkdir -p -- $(dir $@) | |
| $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $^ -o $@.0 -Wl,-soname,libhighwayhash.so.0 | |
| @cd $(dir $@); ln -s libhighwayhash.so.0 libhighwayhash.so | |
| bin/highwayhash_test: $(HIGHWAYHASH_TEST_OBJS) | |
| bin/benchmark: obj/benchmark.o $(HIGHWAYHASH_TEST_OBJS) | |
| bin/benchmark: $(SIP_OBJS) $(HIGHWAYHASH_OBJS) | |
| bin/vector_test: $(VECTOR_TEST_OBJS) | |
| clean: | |
| [ ! -d obj ] || $(RM) -r -- obj/ | |
| distclean: clean | |
| [ ! -d bin ] || $(RM) -r -- bin/ | |
| [ ! -d lib ] || $(RM) -r -- lib/ | |
| # Mode bits are from issue #58, thanks to yurivict for suggesting. | |
| # Also added owner-write for stripping the .so in post-install. | |
| install: lib/libhighwayhash.a lib/libhighwayhash.so | |
| mkdir -p $(DESTDIR)/$(LIBDIR) | |
| mkdir -p $(DESTDIR)/$(INCDIR)/highwayhash | |
| install -m0444 lib/libhighwayhash.a $(DESTDIR)/$(LIBDIR) | |
| install -m0755 lib/libhighwayhash.so $(DESTDIR)/$(LIBDIR) | |
| install -m0444 highwayhash/*.h $(DESTDIR)/$(INCDIR)/highwayhash/ | |
| post-install: | |
| ${STRIP_CMD} $(DESTDIR)/$(LIBDIR)/libhighwayhash.so | |
| .PHONY: clean distclean all install post-install |