Fix CMake compiler feature misdetection on under SunCC (GH #472)

pull/474/head
Jeffrey Walton 2017-08-26 17:18:26 -04:00
parent 62c2ef2073
commit 64def346cd
No known key found for this signature in database
GPG Key ID: B36AB348921B1838
1 changed files with 228 additions and 205 deletions

View File

@ -17,7 +17,7 @@ if (NOT CMAKE_CONFIGURATION_TYPES AND
NOT CMAKE_CXX_FLAGS AND
CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif()
endif ()
set(cryptopp_VERSION_MAJOR 6)
set(cryptopp_VERSION_MINOR 0)
@ -36,10 +36,10 @@ option(BUILD_TESTING "Build library tests" ON)
option(BUILD_DOCUMENTATION "Use Doxygen to create the HTML based API documentation" OFF)
option(USE_INTERMEDIATE_OBJECTS_TARGET "Use a common intermediate objects target for the static and shared library targets" ON)
if(CMAKE_VERSION VERSION_LESS 2.8.8 AND USE_INTERMEDIATE_OBJECTS_TARGET)
if (CMAKE_VERSION VERSION_LESS 2.8.8 AND USE_INTERMEDIATE_OBJECTS_TARGET)
message(STATUS "Forcing USE_INTERMEDIATE_OBJECTS_TARGET to OFF - requires CMake >= 2.8.8")
set(USE_INTERMEDIATE_OBJECTS_TARGET OFF CACHE BOOL "Use a common intermediate objects target for the static and shared library targets" FORCE)
endif()
endif ()
option(DISABLE_ASM "Disable ASM" OFF)
option(DISABLE_SSSE3 "Disable SSSE3" OFF)
@ -59,50 +59,72 @@ set(CRYPTOPP_DATA_DIR "" CACHE PATH "Crypto++ test data directory")
# Always 1 ahead in Master. Also see http://groups.google.com/forum/#!topic/cryptopp-users/SFhqLDTQPG4
set(LIB_VER ${cryptopp_VERSION_MAJOR}${cryptopp_VERSION_MINOR}${cryptopp_VERSION_PATCH})
# Only set when cross-compiling, http://www.vtk.org/Wiki/CMake_Cross_Compiling
if (NOT (CMAKE_SYSTEM_VERSION AND CMAKE_SYSTEM_PROCESSOR))
set(CRYPTOPP_CROSS_COMPILE 1)
else()
set(CRYPTOPP_CROSS_COMPILE 0)
endif()
# Don't use RPATH's. The resulting binary could fail a security audit.
if (NOT CMAKE_VERSION VERSION_LESS 2.8.12)
set(CMAKE_MACOSX_RPATH 0)
endif()
endif ()
if(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel")
add_definitions(-wd68 -wd186 -wd279 -wd327 -wd161 -wd3180)
endif()
endif ()
# Also see http://github.com/weidai11/cryptopp/issues/395
if(DISABLE_ASM)
if (DISABLE_ASM)
add_definitions(-DCRYPTOPP_DISABLE_ASM)
endif()
if(DISABLE_SSSE3)
endif ()
if (DISABLE_SSSE3)
add_definitions(-DCRYPTOPP_DISABLE_SSSE3)
endif()
if(DISABLE_SSE4)
endif ()
if (DISABLE_SSE4)
add_definitions(-DCRYPTOPP_DISABLE_SSE4)
endif()
if(DISABLE_AESNI)
endif ()
if (DISABLE_AESNI)
add_definitions(-DCRYPTOPP_DISABLE_AESNI)
endif()
if(DISABLE_SHA)
endif ()
if (DISABLE_SHA)
add_definitions(-DCRYPTOPP_DISABLE_SHA)
endif()
if(NOT CRYPTOPP_DATA_DIR STREQUAL "")
endif ()
if (NOT CRYPTOPP_DATA_DIR STREQUAL "")
add_definitions(-DCRYPTOPP_DATA_DIR="${CRYPTOPP_DATA_DIR}")
endif()
endif ()
# CRYPTOPP_NATIVE_ARCH is set below once we know what it means to be "native"
###############################################################################
function(CheckCompilerOption option variable)
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "SunPro")
message(STATUS "Performing Test ${variable}")
execute_process(
COMMAND sh -c "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${option} -E -xdumpmacros /dev/null 2>&1"
COMMAND egrep -i -c "illegal value ignored"
RESULT_VARIABLE COMMAND_RESULT
OUTPUT_VARIABLE COMMAND_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (${COMMAND_RESULT} STREQUAL "1" AND ${COMMAND_OUTPUT} STREQUAL "0")
set("${${variable}}" 0 PARENT_SCOPE)
message(STATUS "Performing Test ${variable} - Success")
else ()
set("${${variable}}" 1 PARENT_SCOPE)
message(STATUS "Performing Test ${variable} - Failed")
endif ()
else ()
CHECK_CXX_COMPILER_FLAG(${option} ${variable})
endif ()
endfunction(CheckCompilerOption)
###############################################################################
function(DumpMachine output pattern)
execute_process(
COMMAND sh -c "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1"
COMMAND egrep -i -c "${pattern}" # grep cmd intentionally not set/expanded, see http://github.com/weidai11/cryptopp/issues/466
COMMAND egrep -i -c "${pattern}"
OUTPUT_VARIABLE ${output}
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(${output} "${${output}}" PARENT_SCOPE)
@ -123,23 +145,23 @@ DumpMachine(CRYPTOPP_ARM "\\<arm\\>|armhf|arm7l") # http://stackoverflow.com/q/
set(CRYPTOPP_SOLARIS 0)
# Test SunCC for a string like 'CC: Sun C++ 5.13 SunOS_i386'
if (CRYPTOPP_SOLARIS MATCHES "0")
if (${CRYPTOPP_SOLARIS} STREQUAL "0")
execute_process(COMMAND sh -c "${CMAKE_CXX_COMPILER} -V 2>&1"
COMMAND egrep -i -c "SunOS"
OUTPUT_VARIABLE CRYPTOPP_SOLARIS
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
endif ()
# Test GCC for a string like 'i386-pc-solaris2.11'
if (CRYPTOPP_SOLARIS MATCHES "0")
if (${CRYPTOPP_SOLARIS} STREQUAL "0")
execute_process(COMMAND sh -c "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1"
COMMAND egrep -i -c "Solaris"
OUTPUT_VARIABLE CRYPTOPP_SOLARIS
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
endif ()
# DumpMachine SunCC style
if (CMAKE_CXX_COMPILER_ID MATCHES "SunPro")
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "SunPro")
# SunCC is 32-bit, but it builds both 32 and 64 bit. Use
execute_process(COMMAND sh -c "${CMAKE_CXX_COMPILER} -V 2>&1"
@ -172,24 +194,26 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "SunPro")
OUTPUT_VARIABLE KERNEL_SPARC64
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(CRYPTOPP_NATIVE_ARCH MATCHES "1" AND KERNEL_I386)
# Build for 32-bit on 64-bit kernels unless Native Arch is
# specified. Note that this is a policy provided by Sun.
if (${CRYPTOPP_NATIVE_ARCH} STREQUAL "1" AND KERNEL_I386)
unset(CRYPTOPP_AMD64)
set(CRYPTOPP_I386 1)
elseif(CRYPTOPP_NATIVE_ARCH MATCHES "1" AND KERNEL_AMD64)
elseif (${CRYPTOPP_NATIVE_ARCH} STREQUAL "1" AND KERNEL_AMD64)
unset(CRYPTOPP_I386)
set(CRYPTOPP_AMD64 1)
elseif(CRYPTOPP_NATIVE_ARCH MATCHES "1" AND KERNEL_SPARC)
elseif (${CRYPTOPP_NATIVE_ARCH} STREQUAL "1" AND KERNEL_SPARC)
unset(KERNEL_SPARC64)
set(KERNEL_SPARC 1)
elseif(CRYPTOPP_NATIVE_ARCH MATCHES "1" AND KERNEL_SPARC64)
elseif (${CRYPTOPP_NATIVE_ARCH} STREQUAL "1" AND KERNEL_SPARC64)
unset(KERNEL_SPARC)
set(KERNEL_SPARC64 1)
endif()
endif()
endif ()
endif ()
###############################################################################
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
execute_process(COMMAND sh -c "${CMAKE_CXX_COMPILER} --version 2>&1"
COMMAND egrep -i -c "macports"
@ -215,7 +239,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
if (GAS210_OR_LATER EQUAL 0)
add_definitions(-DCRYPTOPP_DISABLE_ASM)
set(DISABLE_ASM 1)
endif()
endif ()
execute_process(COMMAND echo ${GAS_STRING}
COMMAND egrep -i -c "GNU assembler version (2\\.1[7-9]|2\\.[2-9]|[3-9])"
@ -223,7 +247,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
if (GAS217_OR_LATER EQUAL 0)
add_definitions(-DCRYPTOPP_DISABLE_SSSE3)
set(DISABLE_SSSE3 1)
endif()
endif ()
# OpenBSD and CentOS 5 needed this one due to ARIA and BLAKE2
execute_process(COMMAND echo ${GAS_STRING}
@ -232,7 +256,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
if (GAS218_OR_LATER EQUAL 0)
add_definitions(-DCRYPTOPP_DISABLE_SSE4)
set(DISABLE_SSE4 1)
endif()
endif ()
execute_process(COMMAND echo ${GAS_STRING}
COMMAND egrep -i -c "GNU assembler version (2\\.19|2\\.[2-9]|[3-9])"
@ -240,7 +264,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
if (GAS219_OR_LATER EQUAL 0)
add_definitions(-DCRYPTOPP_DISABLE_AESNI)
set(DISABLE_AESNI 1)
endif()
endif ()
# Ubuntu 10 and Ubuntu 12 needed this one
execute_process(COMMAND echo ${GAS_STRING}
@ -249,57 +273,51 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
if (GAS223_OR_LATER EQUAL 0)
add_definitions(-DCRYPTOPP_DISABLE_SHA)
set(DISABLE_SHA 1)
endif()
endif()
endif()
endif()
endif ()
endif ()
endif ()
endif ()
# TODO: what about ICC and LLVM on Windows?
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
if("${CMAKE_SYSTEM_VERSION}" MATCHES "10\\.0.*")
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC")
if (${CMAKE_SYSTEM_VERSION} MATCHES "10\\.0.*")
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D\"_WIN32_WINNT=0x0A00\"" )
endif()
endif ()
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FI\"winapifamily.h\"" )
endif()
endif ()
# Enable PIC for all targets except 32-bit x86.
# Avoid on 32-bit x86 due to register pressures.
# Enable PIC for all target machines except 32-bit i386 due to register pressures.
if (NOT CRYPTOPP_I386)
SET(CMAKE_POSITION_INDEPENDENT_CODE 1)
endif()
endif ()
# Solaris specific
if(CRYPTOPP_SOLARIS MATCHES "1" AND CMAKE_CXX_COMPILER_ID MATCHES "SunPro")
if (${CRYPTOPP_SOLARIS} STREQUAL "1")
# Determine 32-bit vs 64-bit
if (CRYPTOPP_AMD64 MATCHES "1" OR CRYPTOPP_SPARC64 MATCHES "1")
if (${CRYPTOPP_AMD64} STREQUAL "1" OR ${CRYPTOPP_SPARC64} STREQUAL "1")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
else()
else ()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
endif()
endif ()
# SunCC needs -template=no%extdef
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -template=no%extdef")
elseif(CRYPTOPP_SOLARIS MATCHES "1" AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
# Determine 32-bit vs 64-bit
if (CRYPTOPP_AMD64 MATCHES "1" OR CRYPTOPP_SPARC64 MATCHES "1")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
else()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
endif()
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "SunPro")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -template=no%extdef")
endif ()
# GCC needs to enable use of '/'
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,--divide")
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,--divide")
endif ()
endif()
endif ()
# Link is driven through the compiler, but CXXFLAGS are not used. Also see
# http://public.kitware.com/pipermail/cmake/2003-June/003967.html
if (NOT (WINDOWS OR WINDOWS_STORE OR WINDOWS_PHONE))
SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
endif ()
#============================================================================
# Sources & headers
@ -307,6 +325,11 @@ endif()
# Library headers
file(GLOB cryptopp_HEADERS *.h)
# Remove headers used to build test suite
list(REMOVE_ITEM cryptopp_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/bench.h
${CMAKE_CURRENT_SOURCE_DIR}/validate.h
)
# Test sources. You can use the GNUmakefile to generate the list: `make sources`.
file(GLOB cryptopp_SOURCES_TEST test.cpp bench1.cpp bench2.cpp validat0.cpp validat1.cpp validat2.cpp validat3.cpp adhoc.cpp datatest.cpp regtest1.cpp regtest2.cpp regtest3.cpp fipsalgt.cpp dlltest.cpp fipstest.cpp)
@ -332,298 +355,298 @@ set(cryptopp_SOURCES
${cryptopp_SOURCES}
)
if(MINGW OR WIN32)
if (MINGW OR WIN32)
list(APPEND cryptopp_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/winpipes.cpp)
endif()
endif ()
if(MSVC AND NOT DISABLE_ASM)
if(${CMAKE_GENERATOR} MATCHES ".*ARM")
if (MSVC AND NOT DISABLE_ASM)
if (${CMAKE_GENERATOR} MATCHES ".*ARM")
message(STATUS "Disabling ASM because ARM is specified as target platform.")
else()
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
else ()
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
list(APPEND cryptopp_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/x64dll.asm)
list(APPEND cryptopp_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/x64masm.asm)
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/x64dll.asm PROPERTIES COMPILE_FLAGS "/D_M_X64")
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/x64masm.asm PROPERTIES COMPILE_FLAGS "/D_M_X64")
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/rdrand.asm PROPERTIES COMPILE_FLAGS "/D_M_X64")
else()
else ()
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/x64dll.asm PROPERTIES COMPILE_FLAGS "/D_M_X86 /safeseh")
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/x64masm.asm PROPERTIES COMPILE_FLAGS "/D_M_X86 /safeseh")
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/rdrand.asm PROPERTIES COMPILE_FLAGS "/D_M_X86 /safeseh")
endif()
endif ()
list(APPEND cryptopp_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/rdrand.asm)
enable_language(ASM_MASM)
endif()
endif()
endif ()
endif ()
#============================================================================
# Architecture flags
#============================================================================
# New as of Pull Request 461, http://github.com/weidai11/cryptopp/pull/461.
if (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU"))
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
if (("${CRYPTOPP_AMD64}" STREQUAL "1") OR ("${CRYPTOPP_I386}" STREQUAL "1") OR ("${CRYPTOPP_X32}" STREQUAL "1"))
if (${CRYPTOPP_AMD64} STREQUAL "1" OR ${CRYPTOPP_I386} STREQUAL "1" OR ${CRYPTOPP_X32} STREQUAL "1")
CHECK_CXX_COMPILER_FLAG("-mssse3" CRYPTOPP_IA32_SSSE3)
CHECK_CXX_COMPILER_FLAG("-msse4.2" CRYPTOPP_IA32_SSE4)
CHECK_CXX_COMPILER_FLAG("-mssse3 -mpclmul" CRYPTOPP_IA32_CLMUL)
CHECK_CXX_COMPILER_FLAG("-msse4.1 -maes" CRYPTOPP_IA32_AES)
CHECK_CXX_COMPILER_FLAG("-msse4.2 -msha" CRYPTOPP_IA32_SHA)
CHECK_CXX_COMPILER_FLAG("-march=native" CRYPTOPP_IA32_NATIVE)
CheckCompilerOption("-mssse3" CRYPTOPP_IA32_SSSE3)
CheckCompilerOption("-msse4.2" CRYPTOPP_IA32_SSE4)
CheckCompilerOption("-mssse3 -mpclmul" CRYPTOPP_IA32_CLMUL)
CheckCompilerOption("-msse4.1 -maes" CRYPTOPP_IA32_AES)
CheckCompilerOption("-msse4.2 -msha" CRYPTOPP_IA32_SHA)
CheckCompilerOption("-march=native" CRYPTOPP_IA32_NATIVE)
# Deferred native arch; added to all CXXFLAGS
if (CRYPTOPP_NATIVE_ARCH AND "${CRYPTOPP_IA32_NATIVE}" STREQUAL "1")
if (${CRYPTOPP_NATIVE_ARCH} AND CRYPTOPP_IA32_NATIVE STREQUAL "1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
elseif(CRYPTOPP_NATIVE_ARCH)
elseif (${CRYPTOPP_NATIVE_ARCH})
message(WARNING "CRYPTOPP_NATIVE_ARCH enabled, but failed to detect native architecture")
endif()
endif ()
if ("${CRYPTOPP_IA32_SSSE3}" STREQUAL "1" AND NOT DISABLE_SSSE3)
if (${CRYPTOPP_IA32_SSSE3} STREQUAL "1" AND NOT DISABLE_SSSE3)
set_source_files_properties(aria-simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3")
if ("${CRYPTOPP_IA32_SSE4}" STREQUAL "1" AND NOT DISABLE_SSE4)
if (${CRYPTOPP_IA32_SSE4} STREQUAL "1" AND NOT DISABLE_SSE4)
set_source_files_properties(blake2-simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.2")
set_source_files_properties(crc-simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.2")
if ("${CRYPTOPP_IA32_CLMUL}" STREQUAL "1" AND NOT DISABLE_AES)
if (${CRYPTOPP_IA32_CLMUL} STREQUAL "1" AND NOT DISABLE_AES)
set_source_files_properties(gcm-simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3 -mpclmul")
endif()
if ("${CRYPTOPP_IA32_AES}" STREQUAL "1" AND NOT DISABLE_AES)
endif ()
if (${CRYPTOPP_IA32_AES} STREQUAL "1" AND NOT DISABLE_AES)
set_source_files_properties(rijndael-simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.1 -maes")
endif()
if ("${CRYPTOPP_IA32_SHA}" STREQUAL "1" AND NOT DISABLE_SHA)
endif ()
if (${CRYPTOPP_IA32_SHA} STREQUAL "1" AND NOT DISABLE_SHA)
set_source_files_properties(sha-simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.2 -msha")
set_source_files_properties(shacal2-simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.2 -msha")
endif()
endif()
endif()
endif ()
endif ()
endif ()
elseif (("${CRYPTOPP_AARCH32}" STREQUAL "1") OR ("${CRYPTOPP_AARCH64}" STREQUAL "1") OR ("${CRYPTOPP_ARMV8}" STREQUAL "1"))
elseif (${CRYPTOPP_AARCH32} STREQUAL "1" OR ${CRYPTOPP_AARCH64} STREQUAL "1")
CHECK_CXX_COMPILER_FLAG("-march=armv8-a" CRYPTOPP_ARMV8A_ASIMD)
CHECK_CXX_COMPILER_FLAG("-march=armv8-a+crc" CRYPTOPP_ARMV8A_CRC)
CHECK_CXX_COMPILER_FLAG("-march=armv8-a+crypto" CRYPTOPP_ARMV8A_CRYPTO)
CHECK_CXX_COMPILER_FLAG("-march=armv8-a" CRYPTOPP_ARMV8A_NATIVE)
CheckCompilerOption("-march=armv8-a" CRYPTOPP_ARMV8A_BASE)
CheckCompilerOption("-march=armv8-a+crc" CRYPTOPP_ARMV8A_CRC)
CheckCompilerOption("-march=armv8-a+crypto" CRYPTOPP_ARMV8A_CRYPTO)
CheckCompilerOption("-march=armv8-a" CRYPTOPP_ARMV8A_NATIVE)
# Deferred native arch; added to all CXXFLAGS
if (CRYPTOPP_NATIVE_ARCH AND "${CRYPTOPP_ARMV8A_NATIVE}" STREQUAL "1")
if (${CRYPTOPP_NATIVE_ARCH} AND ${CRYPTOPP_ARMV8A_NATIVE} STREQUAL "1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a")
elseif(CRYPTOPP_NATIVE_ARCH)
elseif (${CRYPTOPP_NATIVE_ARCH})
message(WARNING "CRYPTOPP_NATIVE_ARCH enabled, but failed to detect native architecture")
endif()
endif ()
if ("${CRYPTOPP_ARMV8A_ASIMD}" STREQUAL "1")
if (${CRYPTOPP_ARMV8A_BASE} STREQUAL "1")
set_source_files_properties(aria-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a")
set_source_files_properties(blake2-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a")
set_source_files_properties(neon-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a")
endif()
if ("${CRYPTOPP_ARMV8A_CRC}" STREQUAL "1")
endif ()
if (${CRYPTOPP_ARMV8A_CRC} STREQUAL "1")
set_source_files_properties(crc-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crc")
endif()
if ("${CRYPTOPP_ARMV8A_CRYPTO}" STREQUAL "1")
endif ()
if (${CRYPTOPP_ARMV8A_CRYPTO} STREQUAL "1")
set_source_files_properties(gcm-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto")
set_source_files_properties(rijndael-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto")
set_source_files_properties(sha-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto")
set_source_files_properties(shacal2-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto")
endif()
endif ()
elseif (("${CRYPTOPP_ARM}" STREQUAL "1") OR ("${CRYPTOPP_ARMHF}" STREQUAL "1"))
elseif (${CRYPTOPP_ARM} STREQUAL "1" OR ${CRYPTOPP_ARMHF} STREQUAL "1")
CHECK_CXX_COMPILER_FLAG("-march=armv7-a -mfloat-abi=hard -mfpu=neon" CRYPTOPP_ARMV7A_HARD)
CHECK_CXX_COMPILER_FLAG("-march=armv7-a -mfloat-abi=softfp -mfpu=neon" CRYPTOPP_ARMV7A_SOFTFP)
CheckCompilerOption("-march=armv7-a -mfloat-abi=hard -mfpu=neon" CRYPTOPP_ARMV7A_HARD)
CheckCompilerOption("-march=armv7-a -mfloat-abi=softfp -mfpu=neon" CRYPTOPP_ARMV7A_SOFTFP)
# Deferred native arch; added to all CXXFLAGS
if (CRYPTOPP_NATIVE_ARCH AND "${CRYPTOPP_ARMV7A_HARD}" STREQUAL "1")
if (${CRYPTOPP_NATIVE_ARCH} AND ${CRYPTOPP_ARMV7A_HARD} STREQUAL "1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mfloat-abi=hard -mfpu=neon")
elseif (CRYPTOPP_NATIVE_ARCH AND "${CRYPTOPP_ARMV7A_SOFTFP}" STREQUAL "1")
elseif (${CRYPTOPP_NATIVE_ARCH} AND ${CRYPTOPP_ARMV7A_SOFTFP} STREQUAL "1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp -mfpu=neon")
elseif(CRYPTOPP_NATIVE_ARCH)
elseif (CRYPTOPP_NATIVE_ARCH)
message(WARNING "CRYPTOPP_NATIVE_ARCH enabled, but failed to detect native architecture")
endif()
endif ()
if ("${CRYPTOPP_ARMV7A_HARD}" STREQUAL "1")
if (${CRYPTOPP_ARMV7A_HARD} STREQUAL "1")
# Need to set floating point ABI to something, like "hard" of "softfp". Most Linux use hard floats ("hard").
set_source_files_properties(aria-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
set_source_files_properties(blake2-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
set_source_files_properties(gcm-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon")
set_source_files_properties(neon-simd.cpp PROPERTIES COMPILE_FLAGS "-mfloat-abi=hard -mfpu=neon")
elseif ("${CRYPTOPP_ARMV7A_SOFTFP}" STREQUAL "1")
elseif (${CRYPTOPP_ARMV7A_SOFTFP} STREQUAL "1")
# Need to set floating point ABI to something, like "hard" of "softfp". Most Linux use hard floats ("hard").
set_source_files_properties(aria-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfloat-abi=softfp -mfpu=neon")
set_source_files_properties(blake2-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfloat-abi=softfp -mfpu=neon")
set_source_files_properties(gcm-simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfloat-abi=softfp -mfpu=neon")
set_source_files_properties(neon-simd.cpp PROPERTIES COMPILE_FLAGS "-mfloat-abi=softfp -mfpu=neon")
endif()
endif()
endif()
endif ()
endif ()
endif ()
# New as of Pull Request 461, http://github.com/weidai11/cryptopp/pull/461.
if (CMAKE_CXX_COMPILER_ID MATCHES "SunPro")
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "SunPro")
if ((CRYPTOPP_AMD64 MATCHES "1") OR (CRYPTOPP_I386 MATCHES "1") OR (CRYPTOPP_X32 MATCHES "1"))
if (${CRYPTOPP_AMD64} STREQUAL "1" OR ${CRYPTOPP_I386} STREQUAL "1" OR ${CRYPTOPP_X32} STREQUAL "1")
CHECK_CXX_COMPILER_FLAG("-xarch=ssse3" CRYPTOPP_IA32_SSSE3)
CHECK_CXX_COMPILER_FLAG("-xarch=sse4_2" CRYPTOPP_IA32_SSE4)
CHECK_CXX_COMPILER_FLAG("-xarch=aes" CRYPTOPP_IA32_CLMUL)
CHECK_CXX_COMPILER_FLAG("-xarch=aes" CRYPTOPP_IA32_AES)
CHECK_CXX_COMPILER_FLAG("-xarch=sha" CRYPTOPP_IA32_SHA)
CHECK_CXX_COMPILER_FLAG("-native" CRYPTOPP_IA32_NATIVE)
CheckCompilerOption("-xarch=ssse3" CRYPTOPP_IA32_SSSE3)
CheckCompilerOption("-xarch=sse4_2" CRYPTOPP_IA32_SSE4)
CheckCompilerOption("-xarch=aes" CRYPTOPP_IA32_CLMUL)
CheckCompilerOption("-xarch=aes" CRYPTOPP_IA32_AES)
CheckCompilerOption("-xarch=sha" CRYPTOPP_IA32_SHA)
CheckCompilerOption("-native" CRYPTOPP_IA32_NATIVE)
# Deferred native arch; added to all CXXFLAGS
if (CRYPTOPP_NATIVE_ARCH AND CRYPTOPP_IA32_NATIVE MATCHES "1")
if (${CRYPTOPP_NATIVE_ARCH} AND CRYPTOPP_IA32_NATIVE STREQUAL "1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -native")
elseif(CRYPTOPP_NATIVE_ARCH)
elseif (${CRYPTOPP_NATIVE_ARCH})
message(WARNING "CRYPTOPP_NATIVE_ARCH enabled, but failed to detect native architecture")
endif()
endif ()
if (CRYPTOPP_IA32_SSSE3 STREQUAL "1" AND NOT DISABLE_SSSE3)
if (${CRYPTOPP_IA32_SSSE3} STREQUAL "1" AND NOT DISABLE_SSSE3)
set_source_files_properties(aria-simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=ssse3")
if (CRYPTOPP_IA32_SSE4 MATCHES "1" AND NOT DISABLE_SSE4)
if (${CRYPTOPP_IA32_SSE4} STREQUAL "1" AND NOT DISABLE_SSE4)
set_source_files_properties(blake2-simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sse4_2")
set_source_files_properties(crc-simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sse4_2")
if (CRYPTOPP_IA32_CLMUL MATCHES "1" AND NOT DISABLE_AES)
if (${CRYPTOPP_IA32_CLMUL} STREQUAL "1" AND NOT DISABLE_AES)
set_source_files_properties(gcm-simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=aes")
endif()
if (CRYPTOPP_IA32_AES MATCHES "1" AND NOT DISABLE_AES)
endif ()
if (${CRYPTOPP_IA32_AES} STREQUAL "1" AND NOT DISABLE_AES)
set_source_files_properties(rijndael-simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=aes")
endif()
if (CRYPTOPP_IA32_SHA MATCHES "1" AND NOT DISABLE_SHA)
endif ()
if (${CRYPTOPP_IA32_SHA} STREQUAL "1" AND NOT DISABLE_SHA)
set_source_files_properties(sha-simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sha")
set_source_files_properties(shacal2-simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sha")
endif()
endif()
endif()
endif ()
endif ()
endif ()
elseif (CRYPTOPP_SPARC MATCHES "1" OR CRYPTOPP_SPARC64 MATCHES "1")
elseif (${CRYPTOPP_SPARC} STREQUAL "1" OR ${CRYPTOPP_SPARC64} STREQUAL "1")
# Sparc's need -xmemalign=4i
CHECK_CXX_COMPILER_FLAG("-xmemalign=4i" CRYPTOPP_SPARC_MEMALIGN)
CheckCompilerOption("-xmemalign=4i" CRYPTOPP_SPARC_MEMALIGN)
if (CRYPTOPP_SPARC_MEMALIGN MATCHES "1")
if (${CRYPTOPP_SPARC}_MEMALIGN STREQUAL "1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -xmemalign=4i")
endif()
endif ()
# Deferred native arch; added to all CXXFLAGS
if (CRYPTOPP_NATIVE_ARCH AND "${CRYPTOPP_SPARC_NATIVE}" STREQUAL "1")
if (${CRYPTOPP_NATIVE_ARCH} AND "${CRYPTOPP_SPARC_NATIVE}" STREQUAL "1")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -native")
elseif(CRYPTOPP_NATIVE_ARCH)
elseif (${CRYPTOPP_NATIVE_ARCH})
message(WARNING "CRYPTOPP_NATIVE_ARCH enabled, but failed to detect native architecture")
endif()
endif ()
endif()
endif()
endif ()
endif ()
#============================================================================
# Compile targets
#============================================================================
# Set global includes BEFORE adding any targets for legacy CMake versions
if(CMAKE_VERSION VERSION_LESS 2.8.12)
if (CMAKE_VERSION VERSION_LESS 2.8.12)
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
endif()
endif ()
if(USE_INTERMEDIATE_OBJECTS_TARGET)
if (USE_INTERMEDIATE_OBJECTS_TARGET)
add_library(cryptopp-object OBJECT ${cryptopp_SOURCES})
endif()
endif ()
if (BUILD_STATIC)
if(USE_INTERMEDIATE_OBJECTS_TARGET)
if (USE_INTERMEDIATE_OBJECTS_TARGET)
add_library(cryptopp-static STATIC $<TARGET_OBJECTS:cryptopp-object>)
else()
else ()
add_library(cryptopp-static STATIC ${cryptopp_SOURCES})
endif()
endif ()
if (NOT CMAKE_VERSION VERSION_LESS 2.8.12)
target_include_directories(cryptopp-static PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:include/cryptopp>)
endif()
endif()
endif ()
endif ()
if (BUILD_SHARED)
if(USE_INTERMEDIATE_OBJECTS_TARGET)
if (USE_INTERMEDIATE_OBJECTS_TARGET)
add_library(cryptopp-shared SHARED $<TARGET_OBJECTS:cryptopp-object>)
else()
else ()
add_library(cryptopp-shared SHARED ${cryptopp_SOURCES})
endif()
endif ()
if (NOT CMAKE_VERSION VERSION_LESS 2.8.12)
target_include_directories(cryptopp-shared PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:include/cryptopp>)
endif()
endif()
endif ()
endif ()
# Set filenames for targets to be "cryptopp"
if(NOT MSVC)
if (NOT MSVC)
set(COMPAT_VERSION ${cryptopp_VERSION_MAJOR}.${cryptopp_VERSION_MINOR})
if (BUILD_STATIC)
set_target_properties(cryptopp-static
PROPERTIES
OUTPUT_NAME cryptopp)
endif()
endif ()
if (BUILD_SHARED)
set_target_properties(cryptopp-shared
PROPERTIES
SOVERSION ${COMPAT_VERSION}
OUTPUT_NAME cryptopp)
endif()
endif()
endif ()
endif ()
# Targets, compatible with Crypto++ GNUMakefile
if (BUILD_STATIC)
add_custom_target(static)
add_dependencies(static cryptopp-static)
endif()
endif ()
if (BUILD_SHARED)
add_custom_target(dynamic)
add_dependencies(dynamic cryptopp-shared)
endif()
endif ()
#============================================================================
# Third-party libraries
#============================================================================
if(WIN32)
if (WIN32)
if (BUILD_STATIC)
target_link_libraries(cryptopp-static ws2_32)
endif()
endif ()
if (BUILD_SHARED)
target_link_libraries(cryptopp-shared ws2_32)
endif()
endif()
endif ()
endif ()
# This may need to be expanded to "Solaris"
if ("${UNAME_SYSTEM}" STREQUAL "SunOS")
if (BUILD_STATIC)
target_link_libraries(cryptopp-static nsl socket)
endif()
endif ()
if (BUILD_SHARED)
target_link_libraries(cryptopp-shared nsl socket)
endif()
endif()
endif ()
endif ()
find_package(Threads)
if (BUILD_STATIC)
target_link_libraries(cryptopp-static ${CMAKE_THREAD_LIBS_INIT})
endif()
endif ()
if (BUILD_SHARED)
target_link_libraries(cryptopp-shared ${CMAKE_THREAD_LIBS_INIT})
endif()
endif ()
#============================================================================
# Tests
#============================================================================
enable_testing()
if(BUILD_TESTING)
if (BUILD_TESTING)
add_executable(cryptest ${cryptopp_SOURCES_TEST})
target_link_libraries(cryptest cryptopp-static)
# Setting "cryptest" binary name to "cryptest.exe"
if(NOT WIN32)
if (NOT WIN32)
set_target_properties(cryptest PROPERTIES OUTPUT_NAME cryptest.exe)
endif()
if(NOT TARGET cryptest.exe)
endif ()
if (NOT TARGET cryptest.exe)
add_custom_target(cryptest.exe)
add_dependencies(cryptest.exe cryptest)
endif()
endif ()
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/TestData DESTINATION ${PROJECT_BINARY_DIR})
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/TestVectors DESTINATION ${PROJECT_BINARY_DIR})
@ -631,13 +654,13 @@ if(BUILD_TESTING)
add_test(NAME build_cryptest COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target cryptest)
add_test(NAME cryptest COMMAND $<TARGET_FILE:cryptest> v)
set_tests_properties(cryptest PROPERTIES DEPENDS build_cryptest)
endif()
endif ()
#============================================================================
# Doxygen documentation
#============================================================================
if(BUILD_DOCUMENTATION)
if (BUILD_DOCUMENTATION)
find_package(Doxygen REQUIRED)
set(in_source_DOCS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/html-docs")
@ -649,14 +672,14 @@ if(BUILD_DOCUMENTATION)
SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile
)
if(NOT ${in_source_DOCS_DIR} STREQUAL ${out_source_DOCS_DIR})
if (NOT ${in_source_DOCS_DIR} STREQUAL ${out_source_DOCS_DIR})
add_custom_command(
TARGET docs POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory "${in_source_DOCS_DIR}" "${out_source_DOCS_DIR}"
COMMAND ${CMAKE_COMMAND} -E remove_directory "${in_source_DOCS_DIR}"
)
endif()
endif()
endif ()
endif ()
#============================================================================
# Install
@ -674,33 +697,33 @@ if (BUILD_SHARED)
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
endif()
endif ()
# Development package
if (BUILD_STATIC)
install(TARGETS cryptopp-static EXPORT ${export_name} DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
endif ()
install(FILES ${cryptopp_HEADERS} DESTINATION include/cryptopp)
# CMake Package
if(NOT CMAKE_VERSION VERSION_LESS 2.8.8) # CMakePackageConfigHelpers is supported from 2.8.8
if (NOT CMAKE_VERSION VERSION_LESS 2.8.8) # CMakePackageConfigHelpers is supported from 2.8.8
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${PROJECT_BINARY_DIR}/cryptopp-config-version.cmake" VERSION ${cryptopp_VERSION_MAJOR}.${cryptopp_VERSION_MINOR}.${cryptopp_VERSION_PATCH} COMPATIBILITY SameMajorVersion)
install(FILES cryptopp-config.cmake ${PROJECT_BINARY_DIR}/cryptopp-config-version.cmake DESTINATION "lib/cmake/cryptopp")
install(EXPORT ${export_name} DESTINATION "lib/cmake/cryptopp")
endif()
endif ()
# Tests
if(BUILD_TESTING)
if (BUILD_TESTING)
install(TARGETS cryptest DESTINATION ${CMAKE_INSTALL_BINDIR})
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/TestData DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cryptopp)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/TestVectors DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cryptopp)
endif()
endif ()
# Documentation
if(BUILD_DOCUMENTATION)
if (BUILD_DOCUMENTATION)
install(DIRECTORY "${out_source_DOCS_DIR}" DESTINATION ${CMAKE_INSTALL_DOCDIR})
endif()
endif ()
# Print a configuration summary. We want CXX and CXXFLAGS, but they are not includd in ALL.
if (NOT CMAKE_VERSION VERSION_LESS 3.0.2)
@ -711,4 +734,4 @@ if (NOT CMAKE_VERSION VERSION_LESS 3.0.2)
feature_summary(WHAT ALL
VAR cryptoppFeatures)
message(STATUS "${cryptoppFeatures}")
endif()
endif ()