1 #----------------------------------------
2 # Detect and set platform variable names
3 # - for non-windows build platform & architecture is detected using inbuilt CMAKE variables and cross target component configure
4 # - for windows we use the passed in parameter to CMAKE to determine build arch
5 #----------------------------------------
6 if(CMAKE_SYSTEM_NAME STREQUAL Linux)
7 set(CLR_CMAKE_PLATFORM_UNIX 1)
8 if(CLR_CROSS_COMPONENTS_BUILD)
9 # CMAKE_HOST_SYSTEM_PROCESSOR returns the value of `uname -p` on host.
10 if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL amd64)
11 if(CLR_CMAKE_TARGET_ARCH STREQUAL "arm")
12 set(CLR_CMAKE_PLATFORM_UNIX_X86 1)
14 set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1)
16 elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL i686)
17 set(CLR_CMAKE_PLATFORM_UNIX_X86 1)
22 # CMAKE_SYSTEM_PROCESSOR returns the value of `uname -p` on target.
23 # For the AMD/Intel 64bit architecture two different strings are common.
24 # Linux and Darwin identify it as "x86_64" while FreeBSD and netbsd uses the
25 # "amd64" string. Accept either of the two here.
26 if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64)
27 set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1)
28 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
29 set(CLR_CMAKE_PLATFORM_UNIX_ARM 1)
30 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
31 set(CLR_CMAKE_PLATFORM_UNIX_ARM 1)
32 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
33 set(CLR_CMAKE_PLATFORM_UNIX_ARM64 1)
34 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686)
35 set(CLR_CMAKE_PLATFORM_UNIX_X86 1)
40 set(CLR_CMAKE_PLATFORM_LINUX 1)
43 if(DEFINED CLR_CMAKE_LINUX_ID)
44 if(CLR_CMAKE_LINUX_ID STREQUAL ubuntu)
45 set(CLR_CMAKE_TARGET_UBUNTU_LINUX 1)
46 elseif(CLR_CMAKE_LINUX_ID STREQUAL tizen)
47 set(CLR_CMAKE_TARGET_TIZEN_LINUX 1)
48 elseif(CLR_CMAKE_LINUX_ID STREQUAL alpine)
49 set(CLR_CMAKE_PLATFORM_ALPINE_LINUX 1)
51 if(CLR_CMAKE_LINUX_ID STREQUAL ubuntu)
52 set(CLR_CMAKE_PLATFORM_UBUNTU_LINUX 1)
54 endif(DEFINED CLR_CMAKE_LINUX_ID)
55 endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
57 if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
58 set(CLR_CMAKE_PLATFORM_UNIX 1)
59 set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1)
60 set(CLR_CMAKE_PLATFORM_DARWIN 1)
61 if(CMAKE_VERSION VERSION_LESS "3.4.0")
62 set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_C_COMPILER} <FLAGS> <DEFINES> -o <OBJECT> -c <SOURCE>")
64 set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_C_COMPILER} <FLAGS> <DEFINES> <INCLUDES> -o <OBJECT> -c <SOURCE>")
65 endif(CMAKE_VERSION VERSION_LESS "3.4.0")
66 endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
68 if(CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
69 set(CLR_CMAKE_PLATFORM_UNIX 1)
70 set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1)
71 set(CLR_CMAKE_PLATFORM_FREEBSD 1)
72 endif(CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
74 if(CMAKE_SYSTEM_NAME STREQUAL OpenBSD)
75 set(CLR_CMAKE_PLATFORM_UNIX 1)
76 set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1)
77 set(CLR_CMAKE_PLATFORM_OPENBSD 1)
78 endif(CMAKE_SYSTEM_NAME STREQUAL OpenBSD)
80 if(CMAKE_SYSTEM_NAME STREQUAL NetBSD)
81 set(CLR_CMAKE_PLATFORM_UNIX 1)
82 set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1)
83 set(CLR_CMAKE_PLATFORM_NETBSD 1)
84 endif(CMAKE_SYSTEM_NAME STREQUAL NetBSD)
86 if(CMAKE_SYSTEM_NAME STREQUAL SunOS)
87 set(CLR_CMAKE_PLATFORM_UNIX 1)
90 OUTPUT_VARIABLE SUNOS_NATIVE_INSTRUCTION_SET
92 if(SUNOS_NATIVE_INSTRUCTION_SET MATCHES "amd64")
93 set(CLR_CMAKE_PLATFORM_UNIX_AMD64 1)
94 set(CMAKE_SYSTEM_PROCESSOR "amd64")
98 set(CLR_CMAKE_PLATFORM_SUNOS 1)
99 endif(CMAKE_SYSTEM_NAME STREQUAL SunOS)
101 #--------------------------------------------
102 # This repo builds two set of binaries
103 # 1. binaries which execute on target arch machine
104 # - for such binaries host architecture & target architecture are same
106 # 2. binaries which execute on host machine but target another architecture
107 # - host architecture is different from target architecture
108 # - eg. crossgen.exe - runs on x64 machine and generates nis targeting arm64
109 # - for complete list of such binaries refer to file crosscomponents.cmake
110 #-------------------------------------------------------------
111 # Set HOST architecture variables
112 if(CLR_CMAKE_PLATFORM_UNIX_ARM)
113 set(CLR_CMAKE_PLATFORM_ARCH_ARM 1)
114 set(CLR_CMAKE_HOST_ARCH "arm")
115 elseif(CLR_CMAKE_PLATFORM_UNIX_ARM64)
116 set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1)
117 set(CLR_CMAKE_HOST_ARCH "arm64")
118 elseif(CLR_CMAKE_PLATFORM_UNIX_AMD64)
119 set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
120 set(CLR_CMAKE_HOST_ARCH "x64")
121 elseif(CLR_CMAKE_PLATFORM_UNIX_X86)
122 set(CLR_CMAKE_PLATFORM_ARCH_I386 1)
123 set(CLR_CMAKE_HOST_ARCH "x86")
125 # CLR_CMAKE_HOST_ARCH is passed in as param to cmake
126 if (CLR_CMAKE_HOST_ARCH STREQUAL x64)
127 set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
128 elseif(CLR_CMAKE_HOST_ARCH STREQUAL x86)
129 set(CLR_CMAKE_PLATFORM_ARCH_I386 1)
130 elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm)
131 set(CLR_CMAKE_PLATFORM_ARCH_ARM 1)
132 elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm64)
133 set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1)
139 # Set TARGET architecture variables
140 # Target arch will be a cmake param (optional) for both windows as well as non-windows build
141 # if target arch is not specified then host & target are same
142 if(NOT DEFINED CLR_CMAKE_TARGET_ARCH OR CLR_CMAKE_TARGET_ARCH STREQUAL "" )
143 set(CLR_CMAKE_TARGET_ARCH ${CLR_CMAKE_HOST_ARCH})
146 # Set target architecture variables
147 if (CLR_CMAKE_TARGET_ARCH STREQUAL x64)
148 set(CLR_CMAKE_TARGET_ARCH_AMD64 1)
149 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL x86)
150 set(CLR_CMAKE_TARGET_ARCH_I386 1)
151 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm64)
152 set(CLR_CMAKE_TARGET_ARCH_ARM64 1)
153 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm)
154 set(CLR_CMAKE_TARGET_ARCH_ARM 1)
159 # check if host & target arch combination are valid
160 if(NOT(CLR_CMAKE_TARGET_ARCH STREQUAL CLR_CMAKE_HOST_ARCH))
161 if(NOT((CLR_CMAKE_PLATFORM_ARCH_AMD64 AND CLR_CMAKE_TARGET_ARCH_ARM64) OR (CLR_CMAKE_PLATFORM_ARCH_I386 AND CLR_CMAKE_TARGET_ARCH_ARM)))
162 message(FATAL_ERROR "Invalid host and target arch combination")