diff --git a/CMakeLists.txt b/CMakeLists.txt index b4392b4..47fbe68 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,98 @@ cmake_minimum_required(VERSION 3.13) + +# This file is part of the Aaru Data Preservation Suite. +# Copyright (c) 2019-2022 Natalia Portillo. +# +# This library is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# 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) + project(libaaruformat C) -set(CMAKE_C_STANDARD 90) add_compile_definitions(__STDC_FORMAT_MACROS=1) +if("${CMAKE_C_COMPILER_ID}" MATCHES "MSVC" AND "${CMAKE_C_COMPILER_ARCHITECTURE_ID}" MATCHES "ARMV7") + set(CMAKE_C_STANDARD 11) +else() + set(CMAKE_C_STANDARD 99) +endif() + +if("${CMAKE_C_PLATFORM_ID}" MATCHES "MinGW") + if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm") + set(WIN32 TRUE) + endif() + + add_link_options(-static-libgcc) +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}") +message("Detected build type: ${CMAKE_BUILD_TYPE}") +message("Detected platform: ${CMAKE_C_PLATFORM_ID}") +message("Size of (void*): ${CMAKE_SIZEOF_VOID_P}") + +# Check if target is 64-bit +if("${CMAKE_SIZEOF_VOID_P}" MATCHES "8" OR "${CMAKE_C_COMPILER_ARCHITECTURE_ID}" MATCHES "x64" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "AMD64" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64") + set(ARCHITECTURE_IS_64BIT TRUE) +endif() + +if("${CMAKE_BUILD_TYPE}" MATCHES "Release") + add_compile_definitions(NDEBUG) + + 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("/arch:SSE2") + endif() + else() + add_compile_options(-ffast-math -O3) + + 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) + 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) + 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) + endif() + elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips") + if(NOT "${CMAKE_C_PLATFORM_ID}" MATCHES "MinGW") + add_compile_options(-flto) + endif() + endif() + endif() +endif() + add_library(aaruformat SHARED include/aaruformat/consts.h include/aaruformat/enums.h include/aaru.h include/aaruformat.h include/aaruformat/decls.h include/aaruformat/structs.h src/identify.c src/open.c include/aaruformat/context.h src/close.c include/aaruformat/errors.h src/read.c include/aaruformat/crc64.h src/cst.c src/ecc_cd.c src/helpers.c @@ -11,4 +100,29 @@ add_library(aaruformat SHARED include/aaruformat/consts.h include/aaruformat/enu include_directories(include include/aaruformat) +MACRO(TARGET_LINK_LIBRARIES_WHOLE_ARCHIVE target) + if("${CMAKE_C_COMPILER_ID}" MATCHES "MSVC") + FOREACH(arg IN LISTS ARGN) + SET_TARGET_PROPERTIES( + ${target} PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:${lib}" + ) + ENDFOREACH() + ELSE() + if("${CMAKE_C_COMPILER_ID}" MATCHES "AppleClang") + SET(LINK_FLAGS "-Wl,-all_load") + SET(UNDO_FLAGS "-Wl,-noall_load") + ELSE() + SET(LINK_FLAGS "-Wl,--whole-archive") + SET(UNDO_FLAGS "-Wl,--no-whole-archive") + ENDIF() + TARGET_LINK_LIBRARIES(${target} ${LINK_FLAGS} ${ARGN} ${UNDO_FLAGS}) + ENDIF() +ENDMACRO() + +if(NOT "${CMAKE_C_PLATFORM_ID}" MATCHES "MinGW" OR (NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" AND NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")) + set_property(TARGET aaruformat PROPERTY POSITION_INDEPENDENT_CODE TRUE) +else() + set_property(TARGET aaruformat PROPERTY POSITION_INDEPENDENT_CODE FALSE) +endif() + add_subdirectory(tests) \ No newline at end of file