diff options
Diffstat (limited to 'cmake/scripts/common/ArchSetup.cmake')
-rw-r--r-- | cmake/scripts/common/ArchSetup.cmake | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/cmake/scripts/common/ArchSetup.cmake b/cmake/scripts/common/ArchSetup.cmake new file mode 100644 index 0000000..a59fcb5 --- /dev/null +++ b/cmake/scripts/common/ArchSetup.cmake @@ -0,0 +1,201 @@ +# This script configures the build for a given architecture. +# Flags and stringified arch is set up. +# General compiler tests belongs here. +# +# On return, the following variables are set: +# CMAKE_SYSTEM_NAME - a lowercased system name +# CPU - the CPU on the target +# ARCH - the system architecture +# ARCH_DEFINES - list of compiler definitions for this architecture +# SYSTEM_DEFINES - list of compiler definitions for this system +# DEP_DEFINES - compiler definitions for system dependencies (e.g. LIRC) +# + the results of compiler tests etc. + +# workaround a bug in older cmake, where binutils wouldn't be set after deleting CMakeCache.txt +include(CMakeFindBinUtils) + +include(CheckCXXSourceCompiles) +include(CheckSymbolExists) +include(CheckFunctionExists) +include(CheckIncludeFile) +include(CheckTypeSize) + +# Macro to check if a given builtin function exists +# Arguments: +# func the function to check +# var the compiler definition to set if type exists +# On return: +# If type was found, the definition is added to SYSTEM_DEFINES +macro(check_builtin func var) + check_cxx_source_compiles(" + int main() + { + ${func}; + }" ${var}) + if(${var}) + list(APPEND SYSTEM_DEFINES -D${var}=1) + endif() +endmacro() + + +# -------- Main script --------- +message(STATUS "System type: ${CMAKE_SYSTEM_NAME}") + +if(WITH_CPU) + set(CPU ${WITH_CPU}) +elseif(NOT KODI_DEPENDSBUILD) + set(CPU ${CMAKE_SYSTEM_PROCESSOR}) +endif() + +if(CMAKE_TOOLCHAIN_FILE) + if(NOT EXISTS "${CMAKE_TOOLCHAIN_FILE}") + message(FATAL_ERROR "Toolchain file ${CMAKE_TOOLCHAIN_FILE} does not exist.") + elseif(KODI_DEPENDSBUILD AND (NOT DEPENDS_PATH OR NOT NATIVEPREFIX)) + message(FATAL_ERROR "Toolchain did not define DEPENDS_PATH or NATIVEPREFIX. Possibly outdated depends.") + endif() +endif() + +# While CMAKE_CROSSCOMPILING is set unconditionally if there's a toolchain file, +# this variable is set if we can execute build artefacts on the host system (for example unit tests). +if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL CMAKE_SYSTEM_PROCESSOR AND + CMAKE_HOST_SYSTEM_NAME STREQUAL CMAKE_SYSTEM_NAME) + if(NOT DEFINED HOST_CAN_EXECUTE_TARGET) + set(HOST_CAN_EXECUTE_TARGET TRUE) + endif() +else() + if(NOT HOST_CAN_EXECUTE_TARGET) + set(HOST_CAN_EXECUTE_TARGET FALSE) + endif() +endif() + +# system specific arch setup +if(NOT EXISTS ${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/ArchSetup.cmake) + message(FATAL_ERROR "Couldn't find configuration for '${CORE_SYSTEM_NAME}' " + "Either the platform is not (yet) supported " + "or a toolchain file has to be specified. " + "Consult ${CMAKE_SOURCE_DIR}/cmake/README.md for instructions. " + "Note: Specifying a toolchain requires a clean build directory!") +endif() +include(${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/ArchSetup.cmake) + +# No TARBALL_DIR given, or no arch specific default set +if(NOT TARBALL_DIR) + set(TARBALL_DIR ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/download) +endif() + +message(STATUS "Core system type: ${CORE_SYSTEM_NAME}") +message(STATUS "Platform: ${CORE_PLATFORM_NAME}") +message(STATUS "CPU: ${CPU}, ARCH: ${ARCH}") +message(STATUS "Cross-Compiling: ${CMAKE_CROSSCOMPILING}") +message(STATUS "Execute build artefacts on host: ${CORE_HOST_IS_TARGET}") +message(STATUS "Depends based build: ${KODI_DEPENDSBUILD}") + +check_symbol_exists(posix_fadvise fcntl.h HAVE_POSIX_FADVISE) +check_symbol_exists(PRIdMAX inttypes.h HAVE_INTTYPES_H) +check_builtin("long* temp=0; long ret=__sync_add_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_ADD_AND_FETCH) +check_builtin("long* temp=0; long ret=__sync_sub_and_fetch(temp, 1)" HAS_BUILTIN_SYNC_SUB_AND_FETCH) +check_builtin("long* temp=0; long ret=__sync_val_compare_and_swap(temp, 1, 1)" HAS_BUILTIN_SYNC_VAL_COMPARE_AND_SWAP) +check_include_file(sys/inotify.h HAVE_INOTIFY) +if(HAVE_INOTIFY) + list(APPEND SYSTEM_DEFINES -DHAVE_INOTIFY=1) +endif() +if(HAVE_POSIX_FADVISE) + list(APPEND SYSTEM_DEFINES -DHAVE_POSIX_FADVISE=1) +endif() +check_function_exists(localtime_r HAVE_LOCALTIME_R) +if(HAVE_LOCALTIME_R) + list(APPEND SYSTEM_DEFINES -DHAVE_LOCALTIME_R=1) +endif() +check_function_exists(gmtime_r HAVE_GMTIME_R) +if(HAVE_GMTIME_R) +list(APPEND SYSTEM_DEFINES -DHAVE_GMTIME_R=1) +endif() +if(HAVE_INTTYPES_H) + list(APPEND SYSTEM_DEFINES -DHAVE_INTTYPES_H=1) +endif() + +set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE") +check_symbol_exists("STATX_BTIME" "linux/stat.h" HAVE_STATX) +if(HAVE_STATX) + check_function_exists("statx" FOUND_STATX_FUNCTION) + if(FOUND_STATX_FUNCTION) + message(STATUS "statx is available") + list(APPEND ARCH_DEFINES "-DHAVE_STATX=1") + else() + message(STATUS "statx flags found but no linkable function : C library too old ?") + endif() +else() + message(STATUS "statx() not found") +endif() +set(CMAKE_REQUIRED_DEFINITIONS "") + +find_package(SSE) +foreach(_sse SSE SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AVX AVX2) + if(${${_sse}_FOUND}) + # enable SSE versions up to 4.1 by default, if available + if(NOT ${_sse} MATCHES "AVX" AND NOT ${_sse} STREQUAL "SSE4_2") + option(ENABLE_${_sse} "Enable ${_sse}" ON) + else() + option(ENABLE_${_sse} "Enable ${_sse}" OFF) + endif() + endif() + if(ENABLE_${_sse}) + set(HAVE_${_sse} TRUE CACHE STRING "${_sse} enabled") + list(APPEND ARCH_DEFINES -DHAVE_${_sse}=1) + endif() +endforeach() + +if(NOT DEFINED NEON OR NEON) + option(ENABLE_NEON "Enable NEON optimization" ${NEON}) + if(ENABLE_NEON) + message(STATUS "NEON optimization enabled") + add_definitions(-DHAS_NEON) + if(NEON_FLAGS) + add_options(ALL_LANGUAGES ALL_BUILDS ${NEON_FLAGS}) + endif() + endif() +endif() + +if(NOT MSVC) + # these options affect all code built by cmake including external projects. + add_options(ALL_LANGUAGES ALL_BUILDS + -Wall + -Wdouble-promotion + -Wmissing-field-initializers + -Wsign-compare + -Wextra + -Wno-unused-parameter # from -Wextra + ) + + if(CMAKE_COMPILER_IS_GNUCXX) + add_options(ALL_LANGUAGES ALL_BUILDS + -Wno-cast-function-type # from -Wextra + ) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + add_options(ALL_LANGUAGES ALL_BUILDS + -Wno-bad-function-cast + -Wno-deprecated + ) + endif() + + add_options(CXX ALL_BUILDS + -Wnon-virtual-dtor + ) + + add_options(ALL_LANGUAGES DEBUG + -g + -D_DEBUG + ) + + # these options affect only core code + if(NOT CORE_COMPILE_OPTIONS) + set(CORE_COMPILE_OPTIONS + -Werror=double-promotion + -Werror=missing-field-initializers + -Werror=sign-compare + ) + endif() +endif() + +# set for compile info to help detect binary addons +set(APP_SHARED_LIBRARY_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}") |