343 lines
8.3 KiB
CMake
343 lines
8.3 KiB
CMake
# Sets the following variables:
|
|
#
|
|
# Architecture:
|
|
# - CMU_ARCH_ARM
|
|
# - CMU_ARCH_AVR
|
|
# - CMU_ARCH_EMSCRIPTEN
|
|
# - CMU_ARCH_MIPS
|
|
# - CMU_ARCH_MSP430
|
|
# - CMU_ARCH_PPC
|
|
# - CMU_ARCH_RISCV
|
|
# - CMU_ARCH_X86
|
|
#
|
|
# (Pointer) Bitness:
|
|
# - CMU_BITS_{16,32,64,128}
|
|
#
|
|
# Object formats:
|
|
# - CMU_OBJFMT_ELF
|
|
# - CMU_OBJFMT_COFF
|
|
# - CMU_OBJFMT_MACHO
|
|
#
|
|
# OS Families:
|
|
# - CMU_OS_POSIX
|
|
# - CMU_OS_BSD
|
|
# - CMU_OS_APPLE
|
|
#
|
|
# Specific OS:
|
|
# - CMU_OS_ANDROID
|
|
# - CMU_OS_DRAGONFLY
|
|
# - CMU_OS_EMSCRIPTEN
|
|
# - CMU_OS_FREEBSD
|
|
# - CMU_OS_IOS
|
|
# - CMU_OS_LINUX
|
|
# - CMU_OS_NETBSD
|
|
# - CMU_OS_OPENBSD
|
|
# - CMU_OS_OSX
|
|
# - CMU_OS_SOLARIS
|
|
# - CMU_OS_FREESTANDING
|
|
# - CMU_OS_UNKNOWN
|
|
# - CMU_OS_WINDOWS
|
|
#
|
|
# Compilers:
|
|
# - CMU_COMP_CLANG
|
|
# - CMU_COMP_COMPCERT
|
|
# - CMU_COMP_GCC
|
|
# - CMU_COMP_GNUC
|
|
# - CMU_COMP_IBMXL
|
|
# - CMU_COMP_INTEL
|
|
# - CMU_COMP_MSVC
|
|
# - CMU_COMP_UNKNOWN
|
|
# - CMU_COMP_ZAPCC
|
|
#
|
|
# Endianess:
|
|
# - CMU_LITTLE_ENDIAN
|
|
# - CMU_BIG_ENDIAN
|
|
#
|
|
# Other:
|
|
# - CMU_BUILD_TYPE: uppercase version of CMAKE_BUILD_TYPE
|
|
# - CMU_SIZEOF_VOID_P
|
|
# - CMU_LANG_C
|
|
# - CMU_LANG_CXX
|
|
|
|
# if(COMMAND include_guard)
|
|
# include_guard(GLOBAL)
|
|
# endif()
|
|
|
|
macro(cmu_error)
|
|
message(SEND_ERROR ${ARGV})
|
|
endmacro()
|
|
|
|
macro(cmu_warning)
|
|
message(WARNING ${ARGV})
|
|
endmacro()
|
|
|
|
macro(cmu_info)
|
|
message(STATUS ${ARGV})
|
|
endmacro()
|
|
|
|
set(CMU_SIZEOF_VOID_P "${CMAKE_SIZEOF_VOID_P}")
|
|
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64|(^i.86$)")
|
|
set(CMU_LITTLE_ENDIAN True)
|
|
if(CMAKE_SYSTEM_NAME MATCHES "Emscripten")
|
|
set(CMU_ARCH_EMSCRIPTEN True)
|
|
if(NOT CMU_SIZEOF_VOID_P)
|
|
set(CMU_SIZEOF_VOID_P 4)
|
|
set(CMU_ARCH "emscripten")
|
|
endif()
|
|
else()
|
|
set(CMU_ARCH_X86 True)
|
|
if(CMU_SIZEOF_VOID_P EQUAL 4)
|
|
set(CMU_ARCH "x86")
|
|
else()
|
|
set(CMU_ARCH "x86_64")
|
|
endif()
|
|
endif()
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|^arm")
|
|
set(CMU_ARCH_ARM True)
|
|
if(CMU_SIZEOF_VOID_P EQUAL 4)
|
|
set(CMU_ARCH "arm")
|
|
else()
|
|
set(CMU_ARCH "aarch64")
|
|
endif()
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "riscv")
|
|
set(CMU_LITTLE_ENDIAN True)
|
|
set(CMU_ARCH_RISCV True)
|
|
if(CMU_SIZEOF_VOID_P EQUAL 4)
|
|
set(CMU_ARCH "riscv32")
|
|
else()
|
|
set(CMU_ARCH "riscv64")
|
|
endif()
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc|powerpc")
|
|
set(CMU_ARCH_PPC True)
|
|
if(CMU_SIZEOF_VOID_P EQUAL 4)
|
|
set(CMU_ARCH "power")
|
|
else()
|
|
set(CMU_ARCH "ppc64")
|
|
endif()
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "mips")
|
|
set(CMU_ARCH_MIPS True)
|
|
if(CMU_SIZEOF_VOID_P EQUAL 4)
|
|
set(CMU_ARCH "mips")
|
|
else()
|
|
set(CMU_ARCH "mips64")
|
|
endif()
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "msp430")
|
|
set(CMU_LITTLE_ENDIAN True)
|
|
set(CMU_ARCH_MSP430 True)
|
|
if(NOT CMU_SIZEOF_VOID_P)
|
|
set(CMU_SIZEOF_VOID_P 2)
|
|
endif()
|
|
set(CMU_ARCH "msp430")
|
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "avr")
|
|
set(CMU_LITTLE_ENDIAN True)
|
|
set(CMU_ARCH_AVR True)
|
|
if(NOT CMU_SIZEOF_VOID_P)
|
|
set(CMU_SIZEOF_VOID_P 2)
|
|
endif()
|
|
set(CMU_ARCH "avr")
|
|
else()
|
|
message(
|
|
ERROR
|
|
"Unsupported architecture: CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}"
|
|
)
|
|
endif()
|
|
|
|
if(NOT (CMU_LITTLE_ENDIAN OR CMU_BIG_ENDIAN))
|
|
include(TestBigEndian)
|
|
test_big_endian(cmu_test_big_endian_result)
|
|
if(cmu_test_big_endian_result)
|
|
set(CMU_BIG_ENDIAN True)
|
|
else()
|
|
set(CMU_LITTLE_ENDIAN True)
|
|
endif()
|
|
endif()
|
|
|
|
if(UNIX)
|
|
set(CMU_OS_POSIX True)
|
|
endif()
|
|
|
|
if(WIN32)
|
|
set(CMU_OS_WINDOWS True)
|
|
set(CMU_OBJFMT_COFF True)
|
|
elseif(Apple)
|
|
set(CMU_OS_APPLE True)
|
|
set(CMU_OS_POSIX True)
|
|
set(CMU_OBJFMT_MACHO True)
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR IOS)
|
|
set(CMU_OS_IOS True)
|
|
else()
|
|
set(CMU_OS_OSX True)
|
|
endif()
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "Emscripten")
|
|
set(CMU_OS_EMSCRIPTEN True)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
set(CMU_OS_LINUX True)
|
|
set(CMU_OS_POSIX True)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
|
set(CMU_OS_POSIX True)
|
|
set(CMU_OS_BSD True)
|
|
set(CMU_OS_FREEBSD True)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
|
set(CMU_OS_POSIX True)
|
|
set(CMU_OS_BSD True)
|
|
set(CMU_OS_OPENBSD True)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly")
|
|
set(CMU_OS_POSIX True)
|
|
set(CMU_OS_BSD True)
|
|
set(CMU_OS_DRAGONFLY True)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD")
|
|
set(CMU_OS_POSIX True)
|
|
set(CMU_OS_BSD True)
|
|
set(CMU_OS_NETBSD True)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES "SunOS|Solaris")
|
|
set(CMU_OS_POSIX True)
|
|
set(CMU_OS_SOLARIS True)
|
|
elseif(CMAKE_SYSTEM_NAME MATCHES Generic)
|
|
if(CMU_ARCH_AVR OR CMU_ARCH_MSP430)
|
|
set(CMU_OS_FREESTANDING)
|
|
else()
|
|
set(CMU_OS_UNKNOWN True)
|
|
endif()
|
|
else()
|
|
set(CMU_OS_UNKNOWN True)
|
|
endif()
|
|
|
|
if(CMU_OS_POSIX AND NOT CMU_OBJFMT_MACHO)
|
|
set(CMU_OBJFMT_ELF True)
|
|
endif()
|
|
|
|
get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
|
|
foreach(lang ${languages})
|
|
if(lang STREQUAL "CXX")
|
|
set(CMU_LANG_CXX True)
|
|
elseif(lang STREQUAL "C")
|
|
set(CMU_LANG_C True)
|
|
endif()
|
|
endforeach()
|
|
|
|
if(NOT (CMU_LANG_C OR CMU_LANG_CXX))
|
|
cmu_error("Neither C nor C++ is enabled")
|
|
endif()
|
|
|
|
if(CMU_LANG_CXX)
|
|
set(comp_id "${CMAKE_CXX_COMPILER_ID}")
|
|
set(comp_name "${CMAKE_CXX_COMPILER}")
|
|
set(comp_version "${CMAKE_CXX_COMPILER_VERSION}")
|
|
else()
|
|
set(comp_id "${CMAKE_C_COMPILER_ID}")
|
|
set(comp_name "${CMAKE_C_COMPILER}")
|
|
set(comp_version "${CMAKE_C_COMPILER_VERSION}")
|
|
endif()
|
|
|
|
if(CMU_LANG_CXX AND CMU_LANG_C)
|
|
if(NOT (CMAKE_C_COMPILER_ID STREQUAL CMAKE_CXX_COMPILER_ID))
|
|
cmu_error("C and C++ compilers inconsistent: ${CMAKE_C_COMPILER_ID} vs. ${CMAKE_CXX_COMPILER_ID}")
|
|
endif()
|
|
endif()
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
|
set(CMU_COMP_GNUC True)
|
|
endif()
|
|
|
|
set(CMU_COMP_CLANG_VERSION 0)
|
|
set(CMU_COMP_COMPCERT_VERSION 0)
|
|
set(CMU_COMP_GCC_VERSION 0)
|
|
set(CMU_COMP_GNUC_VERSION 0)
|
|
set(CMU_COMP_IBMXL_VERSION 0)
|
|
set(CMU_COMP_INTEL_VERSION 0)
|
|
set(CMU_COMP_MSVC_VERSION 0)
|
|
set(CMU_COMP_ZAPCC_VERSION 0)
|
|
|
|
if(comp_id MATCHES "clang-cl")
|
|
set(CMU_COMP_CLANG True)
|
|
set(CMU_COMP_MSVC True)
|
|
set(CMU_COMP_GNUC True)
|
|
set(CMU_COMP clang)
|
|
elseif(MSVC OR MSVC_IDE OR CMAKE_COMPILER_2005 OR comp_id STREQUAL "MSVC")
|
|
set(CMU_COMP_MSVC True)
|
|
if(NOT comp_version)
|
|
cmu_error("Failed to detect MSVC version")
|
|
endif()
|
|
set(CMU_COMP_MSVC_VERSION "${comp_version}")
|
|
set(CMU_COMP "msvc")
|
|
elseif(comp_name MATCHES "zapcc[+]?[+]?")
|
|
set(CMU_COMP_ZAPCC True)
|
|
set(CMU_COMP_CLANG True)
|
|
set(CMU_COMP_GNUC True)
|
|
if(NOT comp_version)
|
|
cmu_error("Failed to detect zapcc version")
|
|
endif()
|
|
set(CMU_COMP_CLANG_VERSION "${comp_version}")
|
|
set(CMU_COMP_ZAPCC_VERSION "${comp_version}")
|
|
set(CMU_COMP_GNUC_VERSION 4.2.1)
|
|
set(CMU_COMP "clang")
|
|
elseif(comp_name MATCHES "clang[+]?[+]?" OR comp_id STREQUAL "Clang")
|
|
set(CMU_COMP_CLANG True)
|
|
set(CMU_COMP_GNUC True)
|
|
if(NOT comp_version)
|
|
cmu_error("Failed to detect clang version")
|
|
endif()
|
|
set(CMU_COMP_CLANG_VERSION "${comp_version}")
|
|
set(CMU_COMP_GNUC_VERSION 4.2.1)
|
|
set(CMU_COMP "clang")
|
|
elseif(comp_name MATCHES "icp?c" OR comp_id STREQUAL "Intel")
|
|
set(CMU_COMP_INTEL True)
|
|
set(CMU_COMP_GNUC True)
|
|
if(NOT comp_version)
|
|
cmu_error("Failed to detect intel compiler version")
|
|
endif()
|
|
set(CMU_COMP_INTEL_VERSION "${comp_version}")
|
|
#FIXME: detect __GNUC__, __GNUC_MINOR__...
|
|
set(CMU_COMP "intel")
|
|
elseif(comp_id STREQUAL "GNU")
|
|
set(CMU_COMP_GCC True)
|
|
set(CMU_COMP_GNUC True)
|
|
if(NOT comp_version)
|
|
cmu_error("Failed to detect gcc version")
|
|
endif()
|
|
set(CMU_COMP_GCC_VERSION "${comp_version}")
|
|
set(CMU_COMP_GNUC_VERSION "${comp_version}")
|
|
set(CMU_COMP "gcc")
|
|
elseif(comp_name MATCHES "ccomp")
|
|
set(CMU_COMP_COMPCERT True)
|
|
#FIXME: detect compiler version
|
|
set(CMU_COMP "compcert")
|
|
elseif(comp_id STREQUAL "XL")
|
|
set(CMU_COMP_IBMXL True)
|
|
set(CMU_COMP_GNUC True)
|
|
if(NOT comp_version)
|
|
cmu_error("Failed to detect IBM XL version")
|
|
endif()
|
|
set(CMU_IBMXL_VERSION "${comp_version}")
|
|
set(CMU_COMP "ibmxl")
|
|
else()
|
|
set(CMU_COMP_UNKNOWN True)
|
|
set(CMU_COMP)
|
|
endif()
|
|
|
|
if(CMU_SIZEOF_VOID_P EQUAL 2)
|
|
set(CMU_BITS_16 True)
|
|
set(CMU_BITS 16)
|
|
elseif(CMU_SIZEOF_VOID_P EQUAL 4)
|
|
set(CMU_BITS_32 True)
|
|
set(CMU_BITS 32)
|
|
elseif(CMU_SIZEOF_VOID_P EQUAL 8)
|
|
set(CMU_BITS_64 True)
|
|
set(CMU_BITS 64)
|
|
elseif(CMU_SIZEOF_VOID_P EQUAL 16)
|
|
set(CMU_BITS_128 True)
|
|
set(CMU_BITS 128)
|
|
else()
|
|
cmu_error("Failed to detect bitness of architecture")
|
|
endif()
|
|
|
|
string(TOUPPER "${CMAKE_BUILD_TYPE}" CMU_BUILD_TYPE)
|
|
|
|
if(CMU_BUILD_TYPE STREQUAL DEBUG)
|
|
elseif(CMU_BUILD_TYPE STREQUAL RELWITHDEBINFO)
|
|
elseif(CMU_BUILD_TYPE STREQUAL RELEASE OR BUILD_TYPE STREQUAL MINSIZEREL)
|
|
else()
|
|
cmu_warning("unknown build type: \"${CMAKE_BUILD_TYPE}\"")
|
|
endif()
|