blob: c8ae551261ccef160738d990df834b8e6b0ebf08 [file] [log] [blame] [edit]
project(highwayhash C CXX)
cmake_minimum_required(VERSION 3.18)
# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make
# it prominent in the GUI.
option(BUILD_SHARED_LIBS "Build library as shared." OFF)
# Force PIC on unix when building shared libs
# see: https://en.wikipedia.org/wiki/Position-independent_code
if(BUILD_SHARED_LIBS AND UNIX)
option(CMAKE_POSITION_INDEPENDENT_CODE "Build with Position Independant Code." ON)
endif()
set(PROCESSOR_IS_ARM FALSE)
set(PROCESSOR_IS_AARCH64 FALSE)
set(PROCESSOR_IS_X86 FALSE)
set(PROCESSOR_IS_POWER FALSE)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)")
set(PROCESSOR_IS_AARCH64 TRUE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
set(PROCESSOR_IS_ARM TRUE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
set(PROCESSOR_IS_X86 TRUE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
set(PROCESSOR_IS_POWER TRUE)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CLANG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -O3 -fPIC -pthread -Wno-maybe-uninitialized")
if(PROCESSOR_IS_ARM)
# aarch64 and ARM use the same code, although ARM usually needs an extra flag for NEON.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard -march=armv7-a -mfpu=neon")
endif()
endif()
#
# library : highwayhash
#
set(HH_INCLUDES
${PROJECT_SOURCE_DIR}/highwayhash/c_bindings.h
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash.h
)
set(HH_SOURCES
${PROJECT_SOURCE_DIR}/highwayhash/c_bindings.cc
${PROJECT_SOURCE_DIR}/highwayhash/hh_portable.cc
${PROJECT_SOURCE_DIR}/highwayhash/arch_specific.cc
${PROJECT_SOURCE_DIR}/highwayhash/scalar_sip_tree_hash.cc
${PROJECT_SOURCE_DIR}/highwayhash/sip_hash.cc
${PROJECT_SOURCE_DIR}/highwayhash/sip_tree_hash.cc
${PROJECT_SOURCE_DIR}/highwayhash/hh_portable.h
${PROJECT_SOURCE_DIR}/highwayhash/state_helpers.h
${PROJECT_SOURCE_DIR}/highwayhash/arch_specific.h
${PROJECT_SOURCE_DIR}/highwayhash/compiler_specific.h
${PROJECT_SOURCE_DIR}/highwayhash/load3.h
${PROJECT_SOURCE_DIR}/highwayhash/vector128.h
${PROJECT_SOURCE_DIR}/highwayhash/vector256.h
${PROJECT_SOURCE_DIR}/highwayhash/endianess.h
${PROJECT_SOURCE_DIR}/highwayhash/iaca.h
${PROJECT_SOURCE_DIR}/highwayhash/hh_types.h
${PROJECT_SOURCE_DIR}/highwayhash/hh_buffer.h
${PROJECT_SOURCE_DIR}/highwayhash/scalar_sip_tree_hash.h
${PROJECT_SOURCE_DIR}/highwayhash/sip_hash.h
${PROJECT_SOURCE_DIR}/highwayhash/sip_tree_hash.h
)
if(PROCESSOR_IS_ARM OR PROCESSOR_IS_AARCH64)
list(APPEND HH_SOURCES ${PROJECT_SOURCE_DIR}/highwayhash/hh_neon.cc)
list(APPEND HH_SOURCES ${PROJECT_SOURCE_DIR}/highwayhash/hh_neon.h)
elseif(PROCESSOR_IS_POWER)
list(APPEND HH_SOURCES ${PROJECT_SOURCE_DIR}/highwayhash/hh_vsx.cc)
list(APPEND HH_SOURCES ${PROJECT_SOURCE_DIR}/highwayhash/hh_vsx.h)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/benchmark.cc
PROPERTIES COMPILE_FLAGS -mvsx)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/hh_vsx.cc
PROPERTIES COMPILE_FLAGS -mvsx)
elseif(PROCESSOR_IS_X86)
list(APPEND HH_SOURCES ${PROJECT_SOURCE_DIR}/highwayhash/hh_avx2.cc)
list(APPEND HH_SOURCES ${PROJECT_SOURCE_DIR}/highwayhash/hh_sse41.cc)
list(APPEND HH_SOURCES ${PROJECT_SOURCE_DIR}/highwayhash/hh_avx2.h)
list(APPEND HH_SOURCES ${PROJECT_SOURCE_DIR}/highwayhash/hh_sse41.h)
# TODO: Portability: Have AVX2 be optional so benchmarking can be done on older machines.
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/benchmark.cc
PROPERTIES COMPILE_FLAGS -mavx2)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/sip_tree_hash.cc
PROPERTIES COMPILE_FLAGS -mavx2)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/hh_avx2.cc
PROPERTIES COMPILE_FLAGS -mavx2)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/hh_sse41.cc
PROPERTIES COMPILE_FLAGS -msse4.1)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/hh_portable.cc
PROPERTIES COMPILE_FLAGS -DHH_TARGET_NAME=Portable)
else()
# Unknown architecture.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHH_DISABLE_TARGET_SPECIFIC")
endif()
add_library(highwayhash ${HH_INCLUDES} ${HH_SOURCES})
set_target_properties(highwayhash PROPERTIES PUBLIC_HEADER "${HH_INCLUDES}")
target_include_directories(highwayhash
PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
)
target_include_directories(highwayhash
PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/highwayhash>
)
if(NOT WIN32 AND NOT ANDROID)
target_link_libraries(highwayhash pthread)
endif()
add_library(highwayhash::highwayhash ALIAS highwayhash)
#
# Tests & Similar
#
add_library(nanobenchmark OBJECT
${PROJECT_SOURCE_DIR}/highwayhash/nanobenchmark.h
${PROJECT_SOURCE_DIR}/highwayhash/nanobenchmark.cc
${PROJECT_SOURCE_DIR}/highwayhash/instruction_sets.h
${PROJECT_SOURCE_DIR}/highwayhash/os_specific.h
${PROJECT_SOURCE_DIR}/highwayhash/profiler.h
${PROJECT_SOURCE_DIR}/highwayhash/tsc_timer.h
${PROJECT_SOURCE_DIR}/highwayhash/instruction_sets.cc
${PROJECT_SOURCE_DIR}/highwayhash/os_specific.cc
)
target_include_directories(nanobenchmark PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
add_executable(highwayhash_test)
target_sources(highwayhash_test PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test.cc
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_portable.cc
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_target.h
)
target_link_libraries(highwayhash_test highwayhash nanobenchmark)
add_executable(vector_test)
target_sources(vector_test PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/vector_test.cc
${PROJECT_SOURCE_DIR}/highwayhash/vector_test_portable.cc
${PROJECT_SOURCE_DIR}/highwayhash/vector_test_target.h
)
target_link_libraries(vector_test highwayhash nanobenchmark)
if(PROCESSOR_IS_ARM OR PROCESSOR_IS_AARCH64)
target_sources(highwayhash_test PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_neon.cc
)
target_sources(vector_test PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/vector_test_neon.cc
)
elseif(PROCESSOR_IS_X86)
target_sources(highwayhash_test PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_avx2.cc
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_sse41.cc
)
target_sources(vector_test PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/vector_test_avx2.cc
${PROJECT_SOURCE_DIR}/highwayhash/vector_test_sse41.cc
)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_avx2.cc
PROPERTIES COMPILE_FLAGS -mavx2)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_sse41.cc
PROPERTIES COMPILE_FLAGS -msse4.1)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/vector_test_avx2.cc
PROPERTIES COMPILE_FLAGS -mavx2)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/vector_test_sse41.cc
PROPERTIES COMPILE_FLAGS -msse4.1)
elseif(PROCESSOR_IS_POWER)
target_sources(highwayhash_test PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_vsx.cc
)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/highwayhash_test_vsx.cc
PROPERTIES COMPILE_FLAGS -mvsx)
set_source_files_properties(
${PROJECT_SOURCE_DIR}/highwayhash/vector_test.cc
PROPERTIES COMPILE_FLAGS -DHH_DISABLE_TARGET_SPECIFIC)
endif()
add_executable(sip_hash_test)
target_sources(sip_hash_test PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/sip_hash_test.cc
)
target_link_libraries(sip_hash_test highwayhash)
add_executable(example)
target_sources(example PRIVATE
${PROJECT_SOURCE_DIR}/highwayhash/example.cc
)
target_link_libraries(example highwayhash)