diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b43c5f94..0eeaca999 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,36 @@ cmake_minimum_required(VERSION 2.8) include(CryptoNoteWallet.cmake) include(external/ext.cmake) +if (NOT ARCH OR ARCH STREQUAL "" OR ARCH STREQUAL "native" OR ARCH STREQUAL "default") + set(ARCH_ID "${CMAKE_SYSTEM_PROCESSOR}") +else() + set(ARCH_ID "${ARCH}") +endif() +string(TOLOWER "${ARCH_ID}" ARM_ID) +if (ARM_ID) + string(SUBSTRING "${ARM_ID}" 0 3 ARM_TEST) +endif() +if (ARM_TEST STREQUAL "arm") + set(ARM 1) + string(SUBSTRING "${ARM_ID}" 0 5 ARM_TEST) + if (ARM_TEST STREQUAL "armv6") + set(ARM6 1) + endif() + if (ARM_TEST STREQUAL "armv7") + set(ARM7 1) + endif() +endif() + +if (ARM_ID STREQUAL "aarch64" OR ARM_ID STREQUAL "arm64" OR ARM_ID STREQUAL "armv8-a") + set(ARM 1) + set(ARM8 1) + set(ARCH "armv8-a") +endif() + +if(ARCH_ID STREQUAL "ppc64le") + set(PPC64LE 1) +endif() + project(${CN_PROJECT_NAME}) execute_process(COMMAND git log -1 --pretty=format:%h @@ -231,12 +261,125 @@ elseif (UNIX) GET_TARGET_PROPERTY(QT_LIB_DIR "${Qt5Widgets_LIBRARIES}" LOCATION) GET_FILENAME_COMPONENT(QT_LIB_DIR "${QT_LIB_DIR}" PATH) - else(APPLE) + else() + include(TestCXXAcceptsFlag) set(PLATFORM_DIR Linux) list(REMOVE_ITEM HEADERS ${CMAKE_SOURCE_DIR}/src/gui/macdockiconhandler.h) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes -std=c++11") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -std=c11") - endif (APPLE) + + set(ARCH native CACHE STRING "CPU to build for: -march value or default to not pass -march at all") + message(STATUS "Building on ${CMAKE_SYSTEM_PROCESSOR} for ${ARCH}") + if ("${ARCH}" STREQUAL "default") + set(ARCH_FLAG "") + elseif(PPC64LE) + set(ARCH_FLAG "-mcpu=${ARCH}") + else() + set(ARCH_FLAG "-march=${ARCH}") + endif() + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -D_GNU_SOURCE") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -D_GNU_SOURCE") + + if (NOT ARM AND NOT PPC64LE) + message(STATUS "AES support enabled") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes") + elseif (PPC64LE) + message(STATUS "AES support not available on ppc64le") + elseif (ARM6) + message(STATUS "AES support not available on ARMv6") + elseif (ARM7) + message(STATUS "AES support not available on ARMv7") + elseif (ARM8) + CHECK_CXX_ACCEPTS_FLAG("-march=${ARCH}+crypto" ARCH_PLUS_CRYPTO) + if (ARCH_PLUS_CRYPTO) + message(STATUS "Crypto extensions enabled for ARMv8") + set(ARCH_FLAG "-march=${ARCH}+crypto") + else() + message(STATUS "Crypto extensions unavailable on your ARMv8 device") + endif() + else() + message(STATUS "AES support disabled") + endif() + + # Compiled binary malfunctions due to aliasing (GCC 6.1+) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-strict-aliasing") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing") + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH_FLAG}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH_FLAG}") + + if (ARM) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") + endif() + + if (ARM) + message(STATUS "Setting FPU Flags for ARM Processors") + # NB NEON hardware does not fully implement the IEEE 754 standard for floating-point arithmetic + # Need custom assembly code to take full advantage of NEON SIMD + # + # Cortex-A5/9 -mfpu=neon-fp16 + # Cortex-A7/15 -mfpu=neon-vfpv4 + # Cortex-A8 -mfpu=neon + # ARMv8 -FP and SIMD on by default for all ARM8v-A series, NO -mfpu setting needed + # + # For custom -mtune, processor IDs for ARMv8-A series: + # 0xd04 - Cortex-A35 + # 0xd07 - Cortex-A57 + # 0xd08 - Cortex-A72 + # 0xd03 - Cortex-A73 + if (NOT ARM8) + CHECK_CXX_ACCEPTS_FLAG(-mfpu=vfp3-d16 CXX_ACCEPTS_VFP3_D16) + CHECK_CXX_ACCEPTS_FLAG(-mfpu=vfp4 CXX_ACCEPTS_VFP4) + CHECK_CXX_ACCEPTS_FLAG(-mfloat-abi=hard CXX_ACCEPTS_MFLOAT_HARD) + CHECK_CXX_ACCEPTS_FLAG(-mfloat-abi=softfp CXX_ACCEPTS_MFLOAT_SOFTFP) + endif() + if (ARM8) + CHECK_CXX_ACCEPTS_FLAG(-mfix-cortex-a53-835769 CXX_ACCEPTS_MFIX_CORTEX_A53_835769) + CHECK_CXX_ACCEPTS_FLAG(-mfix-cortex-a53-843419 CXX_ACCEPTS_MFIX_CORTEX_A53_843419) + endif() + if (ARM6) + message(STATUS "Selecting VFP for ARMv6") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=vfp") + endif() + if (ARM7) + if (CXX_ACCEPTS_VFP3_D16 AND NOT CXX_ACCEPTS_VFP4) + message(STATUS "Selecting VFP3 for ARMv7") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp3-d16") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=vfp3-d16") + endif() + if (CXX_ACCEPTS_VFP4) + message(STATUS "Selecting VFP4 for ARMv7") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp4") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=vfp4") + endif() + if (CXX_ACCEPTS_MFLOAT_HARD) + message(STATUS "Setting Hardware ABI for Floating Point") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=hard") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=hard") + endif() + if (CXX_ACCEPTS_MFLOAT_SOFTFP AND NOT CXX_ACCEPTS_MFLOAT_HARD) + message(STATUS "Setting Software ABI for Floating Point") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=softfp") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp") + endif() + endif() + if (ARM8) + if (CXX_ACCEPTS_MFIX_CORTEX_A53_835769) + message(STATUS "Enabling Cortex-A53 workaround 835769") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfix-cortex-a53-835769") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfix-cortex-a53-835769") + endif() + if (CXX_ACCEPTS_MFIX_CORTEX_A53_843419) + message(STATUS "Enabling Cortex-A53 workaround 843419") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfix-cortex-a53-843419") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfix-cortex-a53-843419") + endif() + endif() + endif() + + endif() endif () include_directories(cryptonote/src/Platform/${PLATFORM_DIR})