Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

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()