function(clr_unknown_arch) if (WIN32) message(FATAL_ERROR "Only AMD64, ARM64, ARM and I386 are supported") elseif(CLR_CROSS_COMPONENTS_BUILD) message(FATAL_ERROR "Only AMD64, I386 host are supported for linux cross-architecture component") else() message(FATAL_ERROR "Only AMD64, ARM64 and ARM are supported") endif() endfunction() #---------------------------------------- # Detect and set platform variable names # - for non-windows build platform & architecture is detected using inbuilt CMAKE variables and cross target component configure # - for windows we use the passed in parameter to CMAKE to determine build arch #---------------------------------------- if(CMAKE_SYSTEM_NAME STREQUAL Linux) set(CLR_CMAKE_PLATFORM_UNIX 1) if(CLR_CROSS_COMPONENTS_BUILD) # CMAKE_HOST_SYSTEM_PROCESSOR returns the value of `uname -p` on host. if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL amd64) if(CLR_CMAKE_TARGET_ARCH STREQUAL "arm") set(CLR_CMAKE_PLATFORM_UNIX_X86 1) else() set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1) endif() elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL i686) set(CLR_CMAKE_PLATFORM_UNIX_X86 1) else() clr_unknown_arch() endif() else() # CMAKE_SYSTEM_PROCESSOR returns the value of `uname -p` on target. # For the AMD/Intel 64bit architecture two different strings are common. # Linux and Darwin identify it as "x86_64" while FreeBSD and netbsd uses the # "amd64" string. Accept either of the two here. if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1) elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l) set(CLR_CMAKE_PLATFORM_UNIX_ARM 1) elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL arm) set(CLR_CMAKE_PLATFORM_UNIX_ARM 1) elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) set(CLR_CMAKE_PLATFORM_UNIX_ARM64 1) elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) set(CLR_CMAKE_PLATFORM_UNIX_X86 1) else() clr_unknown_arch() endif() endif() set(CLR_CMAKE_PLATFORM_LINUX 1) # Detect Linux ID if(DEFINED CLR_CMAKE_LINUX_ID) if(CLR_CMAKE_LINUX_ID STREQUAL ubuntu) set(CLR_CMAKE_TARGET_UBUNTU_LINUX 1) elseif(CLR_CMAKE_LINUX_ID STREQUAL tizen) set(CLR_CMAKE_TARGET_TIZEN_LINUX 1) elseif(CLR_CMAKE_LINUX_ID STREQUAL alpine) set(CLR_CMAKE_PLATFORM_ALPINE_LINUX 1) endif() if(CLR_CMAKE_LINUX_ID STREQUAL ubuntu) set(CLR_CMAKE_PLATFORM_UBUNTU_LINUX 1) endif() endif(DEFINED CLR_CMAKE_LINUX_ID) #else() # message(FATAL_ERROR "Currently only Linux is supported but you can try") endif(CMAKE_SYSTEM_NAME STREQUAL Linux) # Set HOST architecture variables if(CLR_CMAKE_PLATFORM_UNIX_ARM) set(CLR_CMAKE_PLATFORM_ARCH_ARM 1) set(CLR_CMAKE_HOST_ARCH "arm") elseif(CLR_CMAKE_PLATFORM_UNIX_ARM64) set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1) set(CLR_CMAKE_HOST_ARCH "arm64") elseif(CLR_CMAKE_PLATFORM_UNIX_AMD64) set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1) set(CLR_CMAKE_HOST_ARCH "x64") elseif(CLR_CMAKE_PLATFORM_UNIX_X86) set(CLR_CMAKE_PLATFORM_ARCH_I386 1) set(CLR_CMAKE_HOST_ARCH "x86") elseif(WIN32) # CLR_CMAKE_HOST_ARCH is passed in as param to cmake if (CLR_CMAKE_HOST_ARCH STREQUAL x64) set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1) elseif(CLR_CMAKE_HOST_ARCH STREQUAL x86) set(CLR_CMAKE_PLATFORM_ARCH_I386 1) elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm) set(CLR_CMAKE_PLATFORM_ARCH_ARM 1) elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm64) set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1) else() clr_unknown_arch() endif() endif() # Set TARGET architecture variables if(NOT DEFINED CLR_CMAKE_TARGET_ARCH OR CLR_CMAKE_TARGET_ARCH STREQUAL "" ) set(CLR_CMAKE_TARGET_ARCH ${CLR_CMAKE_HOST_ARCH}) endif() # Set target architecture variables if (CLR_CMAKE_TARGET_ARCH STREQUAL x64) set(CLR_CMAKE_TARGET_ARCH_AMD64 1) elseif(CLR_CMAKE_TARGET_ARCH STREQUAL x86) set(CLR_CMAKE_TARGET_ARCH_I386 1) elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm64) set(CLR_CMAKE_TARGET_ARCH_ARM64 1) elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm) set(CLR_CMAKE_TARGET_ARCH_ARM 1) else() clr_unknown_arch() endif() # Definitions (for platform) if (CLR_CMAKE_PLATFORM_ARCH_AMD64) add_definitions(-D_AMD64_) add_definitions(-D_WIN64) add_definitions(-DAMD64) add_definitions(-DBIT64=1) elseif (CLR_CMAKE_PLATFORM_ARCH_I386) add_definitions(-D_X86_) elseif (CLR_CMAKE_PLATFORM_ARCH_ARM) add_definitions(-D_ARM_) add_definitions(-DARM) elseif (CLR_CMAKE_PLATFORM_ARCH_ARM64) add_definitions(-D_ARM64_) add_definitions(-DARM64) add_definitions(-D_WIN64) add_definitions(-DBIT64=1) else () clr_unknown_arch() endif () # Definitions (for target) if (CLR_CMAKE_TARGET_ARCH_AMD64) if (CLR_CMAKE_PLATFORM_UNIX) add_definitions(-DDBG_TARGET_AMD64_UNIX) endif() add_definitions(-D_TARGET_AMD64_=1) add_definitions(-DDBG_TARGET_64BIT=1) add_definitions(-DDBG_TARGET_AMD64=1) add_definitions(-DDBG_TARGET_WIN64=1) elseif (CLR_CMAKE_TARGET_ARCH_ARM64) if (CLR_CMAKE_PLATFORM_UNIX) add_definitions(-DDBG_TARGET_ARM64_UNIX) endif() add_definitions(-D_TARGET_ARM64_=1) add_definitions(-DDBG_TARGET_64BIT=1) add_definitions(-DDBG_TARGET_ARM64=1) add_definitions(-DDBG_TARGET_WIN64=1) add_definitions(-DFEATURE_MULTIREG_RETURN) elseif (CLR_CMAKE_TARGET_ARCH_ARM) if (CLR_CMAKE_PLATFORM_UNIX) add_definitions(-DDBG_TARGET_ARM_UNIX) elseif (WIN32 AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD) # Set this to ensure we can use Arm SDK for Desktop binary linkage when doing native (Arm32) build add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1) add_definitions(-D_ARM_WORKAROUND_) endif (CLR_CMAKE_PLATFORM_UNIX) add_definitions(-D_TARGET_ARM_=1) add_definitions(-DDBG_TARGET_32BIT=1) add_definitions(-DDBG_TARGET_ARM=1) elseif (CLR_CMAKE_TARGET_ARCH_I386) add_definitions(-D_TARGET_X86_=1) add_definitions(-DDBG_TARGET_32BIT=1) add_definitions(-DDBG_TARGET_X86=1) else () clr_unknown_arch() endif (CLR_CMAKE_TARGET_ARCH_AMD64)