diff --git a/CMakeLists.txt b/CMakeLists.txt index 67816a7..86d6898 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,11 +16,30 @@ cmake_minimum_required(VERSION 3.15) # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, see . -IF(APPLE) - IF("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "") - SET(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "Build architectures for Mac OS X" FORCE) - ENDIF() -ENDIF(APPLE) +if(APPLE) + # Too early cmake has not yet set it + if((NOT DEFINED CMAKE_SYSTEM_PROCESSOR) AND (NOT DEFINED AARU_MACOS_TARGET_ARCH)) + execute_process(COMMAND uname -m OUTPUT_VARIABLE AARU_MACOS_TARGET_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + + if(NOT DEFINED AARU_MACOS_TARGET_ARCH) + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64") + SET(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Build architectures for macOS" FORCE) + elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64") + SET(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "Build architectures for macOS" FORCE) + else() + message(FATAL_ERROR "Unknown system processor ${CMAKE_SYSTEM_PROCESSOR} for macOS") + endif() + elseif(AARU_MACOS_TARGET_ARCH STREQUAL "x86_64") + SET(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Build architectures for macOS" FORCE) + elseif(AARU_MACOS_TARGET_ARCH STREQUAL "arm64") + SET(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "Build architectures for macOS" FORCE) + else() + message(FATAL_ERROR "Unknown Aaru target architecture ${AARU_MACOS_TARGET_ARCH} for macOS") + endif() + + SET(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") +endif(APPLE) project("Aaru.Compression.Native" C) @@ -38,6 +57,9 @@ if("${CMAKE_C_PLATFORM_ID}" MATCHES "MinGW") add_link_options(-static-libgcc) endif() +if(DEFINED AARU_MACOS_TARGET_ARCH) + message("Requested target architecture: ${AARU_MACOS_TARGET_ARCH}") +endif() message("Detected system processor: ${CMAKE_SYSTEM_PROCESSOR}") message("Detected vs platform name: ${CMAKE_C_COMPILER_ARCHITECTURE_ID}") message("Detected compiler: ${CMAKE_C_COMPILER_ID}") @@ -50,38 +72,51 @@ if("${CMAKE_SIZEOF_VOID_P}" MATCHES "8" OR "${CMAKE_C_COMPILER_ARCHITECTURE_ID}" set(ARCHITECTURE_IS_64BIT TRUE) endif() -if("${CMAKE_BUILD_TYPE}" MATCHES "Release") - add_compile_definitions(NDEBUG) +if("${CMAKE_BUILD_TYPE}" MATCHES "Release" OR "${CMAKE_BUILD_TYPE}" MATCHES "RelWithDebInfo" OR "${CMAKE_BUILD_TYPE}" MATCHES "MinSizeRel") + if("${CMAKE_BUILD_TYPE}" MATCHES "Release") + add_compile_definitions(NDEBUG) + endif() if("${CMAKE_C_COMPILER_ID}" MATCHES "MSVC") - add_compile_options("/O2" "/fp:fast") - if(${CMAKE_C_COMPILER_ARCHITECTURE_ID} MATCHES "X86" OR ${CMAKE_C_COMPILER_ARCHITECTURE_ID} MATCHES "x64") + add_compile_options("/O2 /Ob2 /Oi /Ot /Oy /Og /fp:fast") + if(${CMAKE_C_COMPILER_ARCHITECTURE_ID} MATCHES "X86") add_compile_options("/arch:SSE2") + elseif (${CMAKE_C_COMPILER_ARCHITECTURE_ID} MATCHES "ARM") + add_compile_options("/arch:VFPv4") endif() else() - add_compile_options(-ffast-math -O3) + add_compile_options(-ffast-math -Ofast) + + if("${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang") + if(${AARU_MACOS_TARGET_ARCH} MATCHES "x86_64") + add_compile_options(-march=ivybridge -mtune=westmere -msse4.2) + elseif(${AARU_MACOS_TARGET_ARCH} MATCHES "arm64") + add_compile_options(-mcpu=apple-m1 -mtune=apple-m1) + endif() + endif () if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "AMD64") if(NOT "${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang") - add_compile_options(-march=core2 -mtune=westmere -mfpmath=sse) + add_compile_options(-march=westmere -mtune=skylake -mfpmath=sse) + add_compile_options(-msse4.2) endif() - add_compile_options(-msse3) - if(NOT "${CMAKE_C_PLATFORM_ID}" MATCHES "MinGW") add_compile_options(-flto) endif() elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") if(NOT "${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang") - add_compile_options(-march=armv8-a) + add_compile_options(-mtune=cortex-a53) endif() if(NOT "${CMAKE_C_PLATFORM_ID}" MATCHES "MinGW") add_compile_options(-flto) endif() - elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv7l" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") - if(NOT "${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang") - add_compile_options(-march=armv7+fp -mfpu=vfpv3-d16) + elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "armv7l" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" AND NOT "${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang") + if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") + add_compile_options(-mtune=cortex-a53 -mcpu=cortex-a7) + else() + add_compile_options(-mtune=cortex-a53 -march=armv7-a+neon-vfpv4) endif() elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips") if(NOT "${CMAKE_C_PLATFORM_ID}" MATCHES "MinGW") @@ -101,24 +136,24 @@ include(3rdparty/lzfse.cmake) include(3rdparty/lzip.cmake) include(3rdparty/lzma.cmake) -MACRO(TARGET_LINK_LIBRARIES_WHOLE_ARCHIVE target) +macro(TARGET_LINK_LIBRARIES_WHOLE_ARCHIVE target) if("${CMAKE_C_COMPILER_ID}" MATCHES "MSVC") - FOREACH(arg IN LISTS ARGN) + foreach(arg IN LISTS ARGN) SET_TARGET_PROPERTIES( ${target} PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:${lib}" ) - ENDFOREACH() - ELSE() + endforeach() + else() if("${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang") SET(LINK_FLAGS "-Wl,-all_load") SET(UNDO_FLAGS "-Wl") - ELSE() + else() SET(LINK_FLAGS "-Wl,--whole-archive") SET(UNDO_FLAGS "-Wl,--no-whole-archive") - ENDIF() + endif() TARGET_LINK_LIBRARIES(${target} ${LINK_FLAGS} ${ARGN} ${UNDO_FLAGS}) - ENDIF() -ENDMACRO() + endif() +endmacro() TARGET_LINK_LIBRARIES_WHOLE_ARCHIVE("Aaru.Compression.Native" libzstd_static m)