[cmake] Backported a lot of CMake changes from rom-properties.

This commit is contained in:
David Korth 2022-07-12 18:04:42 -04:00
parent d68b84381b
commit 67de549aff
10 changed files with 141 additions and 86 deletions

View File

@ -0,0 +1,89 @@
# x86 instruction set flags.
# Determine CPU architecture.
IF(MSVC AND _MSVC_C_ARCHITECTURE_FAMILY)
# Check the MSVC architecture.
# Set CMAKE_SYSTEM_PROCESSOR to match, since it doesn't get
# set to the target architecture correctly.
# TODO: Verify 32-bit.
IF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "^[iI]?[xX3]86$")
SET(CPU_i386 1)
SET(CMAKE_SYSTEM_PROCESSOR "x86")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "x86")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "^[xX]64$")
SET(CPU_amd64 1)
SET(CMAKE_SYSTEM_PROCESSOR "AMD64")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "amd64")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "[iI][aA]64")
SET(CPU_ia64 1)
SET(CMAKE_SYSTEM_PROCESSOR "IA64")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ia64")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM")
SET(CPU_arm 1)
SET(CMAKE_SYSTEM_PROCESSOR "ARM")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64")
SET(CPU_arm64 1)
SET(CMAKE_SYSTEM_PROCESSOR "ARM64")
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm64")
ELSE()
MESSAGE(FATAL_ERROR "Unsupported value for _MSVC_C_ARCHITECTURE_FAMILY: ${_MSVC_C_ARCHITECTURE_FAMILY}")
ENDIF()
ELSE()
# TODO: Verify cross-compile functionality.
# TODO: ARM/ARM64 is untested.
STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" arch)
IF(arch MATCHES "^(i.|x)86$|^x86_64$|^amd64$")
IF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_amd64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "amd64")
ELSE()
SET(CPU_i386 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "x86")
ENDIF()
ELSEIF(arch STREQUAL "ia64")
SET(CPU_ia64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ia64")
ELSEIF(arch MATCHES "^arm(|v[1-7](.|h[fl]|hfe[lb]))?$" OR arch STREQUAL "aarch64")
IF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_arm64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm64")
ELSE()
SET(CPU_arm 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm")
ENDIF()
ELSEIF(arch MATCHES "^ppc")
IF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_arm64 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ppc64")
ELSE()
SET(CPU_arm 1)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ppc")
ENDIF()
ENDIF()
UNSET(arch)
ENDIF()
# i386/amd64: Flags for extended instruction sets.
IF(CPU_i386 OR CPU_amd64)
# MSVC does not require anything past /arch:SSE2 for SSSE3.
# ClangCL does require -mssse3, even on 64-bit.
IF(MSVC)
IF(CPU_i386)
SET(SSE2_FLAG "/arch:SSE2")
SET(SSSE3_FLAG "/arch:SSE2")
SET(SSE41_FLAG "/arch:SSE2")
ENDIF(CPU_i386)
IF(CMAKE_CXX_COMPILER_ID STREQUAL Clang)
SET(SSSE3_FLAG "-mssse3")
SET(SSE41_FLAG "-msse4.1")
ENDIF(CMAKE_CXX_COMPILER_ID STREQUAL Clang)
ELSE()
IF(CPU_i386)
SET(MMX_FLAG "-mmmx")
SET(SSE2_FLAG "-msse2")
ENDIF(CPU_i386)
SET(SSSE3_FLAG "-mssse3")
SET(SSE41_FLAG "-msse4.1")
ENDIF()
ENDIF(CPU_i386 OR CPU_amd64)

View File

@ -56,14 +56,26 @@ FUNCTION(CHECK_64BIT_TIME_SUPPORT)
ELSE()
# Try adding 64-bit time_t macros.
# Reference: https://sourceware.org/glibc/wiki/Y2038ProofnessDesign?rev=115
# NOTE: Requires LFS.
INCLUDE(CheckLargeFileSupport)
CHECK_LARGE_FILE_SUPPORT()
SET(TMP_TIME64_DEFINITIONS -D_TIME_BITS=64)
TRY_COMPILE(TMP_TIME64_FOUND "${CMAKE_BINARY_DIR}"
"${TIME64_SOURCE_PATH}/64BitTimeSupport.c"
COMPILE_DEFINITIONS ${TMP_TIME64_DEFINITIONS})
COMPILE_DEFINITIONS ${LFS_DEFINITIONS} ${TMP_TIME64_DEFINITIONS})
IF(TMP_TIME64_FOUND)
# TIME64 macros work.
MESSAGE(STATUS "Checking if time_t is 64-bit - yes, using -D_TIME_BITS=64")
SET(TMP_TIME64_FOUND_TIME_BITS 1)
# FIXME: glibc-2.34's fcntl()/ioctl() redirection is broken in C++ mode.
TRY_COMPILE(TMP_TIME64_FCNTL_OK "${CMAKE_BINARY_DIR}"
"${TIME64_SOURCE_PATH}/64BitTimeSupportFcntl.cpp"
COMPILE_DEFINITIONS ${LFS_DEFINITIONS} ${TMP_TIME64_DEFINITIONS})
IF(TMP_TIME64_FCNTL_OK)
MESSAGE(STATUS "Checking if time_t is 64-bit - yes, using -D_TIME_BITS=64")
SET(TMP_TIME64_FOUND_TIME_BITS 1)
ELSE()
MESSAGE(STATUS "Checking if time_t is 64-bit - no, redirection is broken in C++")
SET(TMP_TIME64_FOUND_TIME_BITS 1)
ENDIF()
ELSE()
# TIME64 macros failed.
MESSAGE(STATUS "Checking if time_t is 64-bit - no")

View File

@ -6,7 +6,7 @@
MACRO(CHECK_HIDDEN_VISIBILITY)
# Check for visibility symbols.
IF(NOT CMAKE_VERSION VERSION_LESS 3.3.0)
IF(POLICY CMP0063)
# CMake 3.3: Use CMake predefined variables.
# NOTE: CMake 3.0-3.2 do not apply these settings
# to static libraries, so we have to fall back to the

View File

@ -45,13 +45,13 @@ FUNCTION(CHECK_STACK_PROTECTOR_COMPILER_FLAG _result)
# CMake doesn't like "+" characters in variable names.
STRING(REPLACE "+" "_" CHECK_STACK_CFLAG_VARNAME "CHECK_CFLAG_${CHECK_STACK_CFLAG}")
SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
SET(SAFE_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
SET(CMAKE_REQUIRED_DEFINITIONS "${CHECK_STACK_CFLAG}")
SET(OLD_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
SET(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
SET(CMAKE_REQUIRED_DEFINITIONS ${CHECK_STACK_CFLAG})
IF(WIN32)
SET(CMAKE_REQUIRED_LIBRARIES "-lkernel32")
SET(CMAKE_REQUIRED_LIBRARIES kernel32)
ELSE(WIN32)
SET(CMAKE_REQUIRED_LIBRARIES "-lc")
SET(CMAKE_REQUIRED_LIBRARIES c)
ENDIF(WIN32)
# NOTE: We need a function that triggers stack smashing protection
# in order to determine if libssp is needed on MinGW-w64.
@ -95,8 +95,10 @@ int main(int argc, char *argv[])
puts(buf);
return 0;
}" ${CHECK_STACK_CFLAG_VARNAME})
SET(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
SET(CMAKE_REQUIRED_LIBRARIES "${SAFE_CMAKE_REQUIRED_LIBRARIES}")
SET(CMAKE_REQUIRED_DEFINITIONS ${OLD_CMAKE_REQUIRED_DEFINITIONS})
SET(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES})
UNSET(OLD_CMAKE_REQUIRED_INCLUDES)
UNSET(OLD_CMAKE_REQUIRED_LIBRARIES)
IF(${${CHECK_STACK_CFLAG_VARNAME}})
SET(_SYS_STACK_PROTECTOR_COMPILER_FLAG "${CHECK_STACK_CFLAG}" CACHE INTERNAL "CFLAG required for stack smashing protection.")

View File

@ -12,6 +12,7 @@ IF(NOT PACKAGE_NAME)
ENDIF(NOT PACKAGE_NAME)
# Architecture name for arch-specific paths.
INCLUDE(CPUInstructionSetFlags)
IF(CPU_amd64)
SET(arch "amd64")
ELSEIF(CPU_i386)
@ -22,21 +23,30 @@ ELSEIF(CPU_arm)
SET(arch "arm")
ELSEIF(CPU_arm64)
SET(arch "arm64")
ELSEIF(CPU_ppc)
SET(arch "ppc")
ELSEIF(CPU_ppc64)
SET(arch "ppc64")
ELSE()
MESSAGE(FATAL_ERROR "Unsupported CPU architecture, please fix!")
ENDIF()
INCLUDE(GNUInstallDirs)
IF(UNIX AND NOT APPLE)
# Unix-style install paths.
SET(DIR_INSTALL_EXE "${CMAKE_INSTALL_BINDIR}")
SET(DIR_INSTALL_DLL "${CMAKE_INSTALL_LIBDIR}")
SET(DIR_INSTALL_LIB "${CMAKE_INSTALL_LIBDIR}")
SET(DIR_INSTALL_TRANSLATIONS "share/${PACKAGE_NAME}/translations")
SET(DIR_INSTALL_DOC "share/doc/${PACKAGE_NAME}")
SET(DIR_INSTALL_DOC_ROOT "${DIR_INSTALL_DOC}")
SET(DIR_INSTALL_XDG_DESKTOP "share/applications")
SET(DIR_INSTALL_EXE_DEBUG "lib/debug/${CMAKE_INSTALL_PREFIX}/${DIR_INSTALL_EXE}")
SET(DIR_INSTALL_DLL_DEBUG "lib/debug/${CMAKE_INSTALL_PREFIX}/${DIR_INSTALL_DLL}")
SET(DIR_INSTALL_LIB_DEBUG "lib/debug/${CMAKE_INSTALL_PREFIX}/${DIR_INSTALL_LIB}")
# AppArmor profile directory
SET(DIR_INSTALL_APPARMOR "/etc/apparmor.d")
ELSEIF(APPLE)
# Mac OS X-style install paths.
# Install should be relative to the application bundle.
@ -47,6 +57,7 @@ ELSEIF(APPLE)
SET(DIR_INSTALL_TRANSLATIONS "share/${PACKAGE_NAME}/translations")
SET(DIR_INSTALL_DOC "share/doc/${PACKAGE_NAME}")
SET(DIR_INSTALL_DOC_ROOT "${DIR_INSTALL_DOC}")
UNSET(DIR_INSTALL_XDG_DESKTOP)
SET(DIR_INSTALL_EXE_DEBUG "lib/debug/${CMAKE_INSTALL_PREFIX}/${DIR_INSTALL_EXE}")
SET(DIR_INSTALL_DLL_DEBUG "lib/debug/${CMAKE_INSTALL_PREFIX}/${DIR_INSTALL_DLL}")
SET(DIR_INSTALL_LIB_DEBUG "lib/debug/${CMAKE_INSTALL_PREFIX}/${DIR_INSTALL_LIB}")
@ -54,12 +65,14 @@ ELSEIF(WIN32)
# Win32-style install paths.
# Files are installed relative to root, since the
# program is run out of its own directory.
SET(DIR_INSTALL_EXE ".")
SET(DIR_INSTALL_DLL ".")
SET(DIR_INSTALL_LIB ".")
SET(DIR_INSTALL_EXE "${arch}")
SET(DIR_INSTALL_DLL "${arch}")
SET(DIR_INSTALL_LIB "${arch}")
SET(DIR_INSTALL_TRANSLATIONS "translations")
SET(DIR_INSTALL_DOC "doc")
SET(DIR_INSTALL_DOC_ROOT ".")
UNSET(DIR_INSTALL_XDG_DESKTOP)
SET(DIR_INSTALL_EXE_DEBUG "debug")
# Installing debug symbols for DLLs in the
# same directory as the DLL.
SET(DIR_INSTALL_EXE_DEBUG "${DIR_INSTALL_EXE}")

View File

@ -37,18 +37,24 @@ IF(MSVC)
SET(OUTPUT_NAME_EXPR "${OUTPUT_NAME_EXPR_1}${OUTPUT_NAME_EXPR_2}")
SET(OUTPUT_NAME_FULL "${PREFIX_EXPR_FULL}${OUTPUT_NAME_EXPR}$<TARGET_PROPERTY:${_target},POSTFIX>")
SET(SPLITDEBUG_SOURCE "$<TARGET_FILE:${_target}>")
SET(SPLITDEBUG_TARGET "$<TARGET_FILE_DIR:${_target}>/${OUTPUT_NAME_FULL}.debug")
SET(OUTPUT_NAME_EXPR_1 "$<TARGET_PROPERTY:${_target},PREFIX>$<TARGET_PROPERTY:${_target},OUTPUT_NAME>$<TARGET_PROPERTY:${_target},POSTFIX>")
SET(OUTPUT_NAME_EXPR_2 "$<$<STREQUAL:$<TARGET_PROPERTY:${_target},OUTPUT_NAME>,>:$<TARGET_PROPERTY:${_target},PREFIX>${_target}$<TARGET_PROPERTY:${_target},POSTFIX>>")
# FIXME: "-dll" suffix seems to be missing here.
# If it's present in the target name, add it here.
IF(${_target} MATCHES "-dll$")
SET(_target_suffix "-dll")
ELSE()
UNSET(_target_suffix)
ENDIF()
# Set the target PDB filename.
SET_TARGET_PROPERTIES(${_target}
PROPERTIES PDB "$<TARGET_FILE_DIR:${_target}>/${OUTPUT_NAME_EXPR_1}${OUTPUT_NAME_EXPR_2}.pdb"
PROPERTIES PDB "$<TARGET_FILE_DIR:${_target}>/${OUTPUT_NAME_EXPR_1}${OUTPUT_NAME_EXPR_2}${_target_suffix}.pdb"
)
UNSET(OUTPUT_NAME_EXPR_1)
UNSET(OUTPUT_NAME_EXPR_2)
UNSET(_target_suffix)
ENDIF(MSVC)
ENDMACRO(SET_MSVC_DEBUG_PATH)

View File

@ -17,52 +17,6 @@ IF(NOT HAVE_STDINT_H)
MESSAGE(FATAL_ERROR "stdint.h is required.")
ENDIF(NOT HAVE_STDINT_H)
# CPU architecture.
IF(MSVC AND _MSVC_C_ARCHITECTURE_FAMILY)
# Check the MSVC architecture.
# Set CMAKE_SYSTEM_PROCESSOR to match, since it doesn't get
# set to the target architecture correctly.
# TODO: Verify 32-bit.
IF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "^[iI]?[xX3]86$")
SET(CPU_i386 1)
SET(CMAKE_SYSTEM_PROCESSOR "x86")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "^[xX]64$")
SET(CPU_amd64 1)
SET(CMAKE_SYSTEM_PROCESSOR "AMD64")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY MATCHES "[iI][aA]64")
SET(CPU_ia64 1)
SET(CMAKE_SYSTEM_PROCESSOR "IA64")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM")
SET(CPU_arm 1)
SET(CMAKE_SYSTEM_PROCESSOR "ARM")
ELSEIF(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64")
SET(CPU_arm64 1)
SET(CMAKE_SYSTEM_PROCESSOR "ARM64")
ELSE()
MESSAGE(FATAL_ERROR "Unsupported value for _MSVC_C_ARCHITECTURE_FAMILY: ${_MSVC_C_ARCHITECTURE_FAMILY}")
ENDIF()
ELSE()
# TODO: Verify cross-compile functionality.
# TODO: ARM/ARM64 is untested.
STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" arch)
IF(arch MATCHES "^(i.|x)86$|^x86_64$|^amd64$")
IF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_amd64 1)
ELSE()
SET(CPU_i386 1)
ENDIF()
ELSEIF(arch STREQUAL "ia64")
SET(CPU_ia64 1)
ELSEIF(arch MATCHES "^arm(|v[1-7](.|h[fl]|hfe[lb]))?$" OR arch STREQUAL "aarch64")
IF(CMAKE_CL_64 OR ("${CMAKE_SIZEOF_VOID_P}" EQUAL 8))
SET(CPU_arm64 1)
ELSE()
SET(CPU_arm 1)
ENDIF()
ENDIF()
UNSET(arch)
ENDIF()
# Common flag variables:
# [common]
# - RP_C_FLAGS_COMMON

View File

@ -81,7 +81,7 @@ IF(ENABLE_COVERAGE)
SET(RP_CXX_FLAGS_COMMON "${RP_CXX_FLAGS_COMMON} ${RP_C_FLAGS_COVERAGE}")
# Link gcov to all targets.
SET(GCOV_LIBRARY "-lgcov")
SET(GCOV_LIBRARY "gcov")
FOREACH(VAR "" C_ CXX_)
IF(CMAKE_${VAR}STANDARD_LIBRARIES)
SET(CMAKE_${VAR}STANDARD_LIBRARIES "${CMAKE_${VAR}STANDARD_LIBRARIES} ${GCOV_LIBRARY}")

View File

@ -70,12 +70,6 @@ ENDIF()
SET(CMAKE_ASM_MASM_FLAGS "/W0 /safeseh" CACHE STRING
"Flags used by the assembler during all build types.")
# CPU architecture.
STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" arch)
# CPU architecture.
STRING(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" arch)
# Check if CMAKE_SIZEOF_VOID_P is set correctly.
IF(NOT CMAKE_SIZEOF_VOID_P)
# CMAKE_SIZEOF_VOID_P isn't set.

View File

@ -23,21 +23,6 @@ SET(RP_CXX_FLAGS_WIN32 "${RP_CXX_FLAGS_WIN32} -D_CRT_SECURE_CPP_OVERLOAD_STANDAR
SET(RP_CXX_FLAGS_WIN32 "${RP_CXX_FLAGS_WIN32} -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1")
SET(RP_CXX_FLAGS_WIN32 "${RP_CXX_FLAGS_WIN32} -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_MEMORY=1")
# Determine the processorArchitecture for the manifest files.
IF(CPU_i386)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "x86")
ELSEIF(CPU_amd64)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "amd64")
ELSEIF(CPU_ia64)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "ia64")
ELSEIF(CPU_arm)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm")
ELSEIF(CPU_arm64)
SET(WIN32_MANIFEST_PROCESSOR_ARCHITECTURE "arm64")
ELSE()
MESSAGE(FATAL_ERROR "Unsupported CPU architecture, please fix!")
ENDIF()
# Compiler-specific Win32 flags.
IF(MSVC)
INCLUDE(cmake/platform/win32-msvc.cmake)