1 include(CheckPIESupported)
2 include(${CMAKE_CURRENT_LIST_DIR}/functions.cmake)
4 # If set, indicates that this is not an officially supported release
5 # Keep in sync with IsPrerelease in Directory.Build.props
8 #----------------------------------------
9 # Detect and set platform variable names
10 # - for non-windows build platform & architecture is detected using inbuilt CMAKE variables and cross target component configure
11 # - for windows we use the passed in parameter to CMAKE to determine build arch
12 #----------------------------------------
13 set(CLR_CMAKE_HOST_OS ${CMAKE_SYSTEM_NAME})
14 if(CLR_CMAKE_HOST_OS STREQUAL Linux)
15 set(CLR_CMAKE_HOST_UNIX 1)
16 if(CLR_CROSS_COMPONENTS_BUILD)
17 # CMAKE_HOST_SYSTEM_PROCESSOR returns the value of `uname -p` on host.
18 if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL amd64)
19 if(CLR_CMAKE_TARGET_ARCH STREQUAL "arm" OR CLR_CMAKE_TARGET_ARCH STREQUAL "armel")
20 if(CMAKE_CROSSCOMPILING)
21 set(CLR_CMAKE_HOST_UNIX_X86 1)
23 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
26 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
28 elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL i686)
29 set(CLR_CMAKE_HOST_UNIX_X86 1)
34 # CMAKE_SYSTEM_PROCESSOR returns the value of `uname -p` on target.
35 # For the AMD/Intel 64bit architecture two different strings are common.
36 # Linux and Darwin identify it as "x86_64" while FreeBSD and netbsd uses the
37 # "amd64" string. Accept either of the two here.
38 if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64)
39 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
40 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
41 set(CLR_CMAKE_HOST_UNIX_ARM 1)
42 set(CLR_CMAKE_HOST_UNIX_ARMV7L 1)
43 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL arm OR CMAKE_SYSTEM_PROCESSOR STREQUAL armv7-a)
44 set(CLR_CMAKE_HOST_UNIX_ARM 1)
45 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
46 set(CLR_CMAKE_HOST_UNIX_ARM64 1)
47 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686)
48 set(CLR_CMAKE_HOST_UNIX_X86 1)
53 set(CLR_CMAKE_HOST_LINUX 1)
56 set(LINUX_ID_FILE "/etc/os-release")
57 if(CMAKE_CROSSCOMPILING)
58 set(LINUX_ID_FILE "${CMAKE_SYSROOT}${LINUX_ID_FILE}")
61 if(EXISTS ${LINUX_ID_FILE})
63 COMMAND bash -c "source ${LINUX_ID_FILE} && echo \$ID"
64 OUTPUT_VARIABLE CLR_CMAKE_LINUX_ID
65 OUTPUT_STRIP_TRAILING_WHITESPACE)
68 if(DEFINED CLR_CMAKE_LINUX_ID)
69 if(CLR_CMAKE_LINUX_ID STREQUAL tizen)
70 set(CLR_CMAKE_TARGET_TIZEN_LINUX 1)
71 set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID})
72 elseif(CLR_CMAKE_LINUX_ID STREQUAL alpine)
73 set(CLR_CMAKE_HOST_ALPINE_LINUX 1)
74 set(CLR_CMAKE_HOST_OS ${CLR_CMAKE_LINUX_ID})
76 endif(DEFINED CLR_CMAKE_LINUX_ID)
77 endif(CLR_CMAKE_HOST_OS STREQUAL Linux)
79 if(CLR_CMAKE_HOST_OS STREQUAL Darwin)
80 set(CLR_CMAKE_HOST_UNIX 1)
81 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
82 set(CLR_CMAKE_HOST_OSX 1)
83 set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_C_COMPILER} <FLAGS> <DEFINES> <INCLUDES> -o <OBJECT> -c <SOURCE>")
84 endif(CLR_CMAKE_HOST_OS STREQUAL Darwin)
86 if(CLR_CMAKE_HOST_OS STREQUAL iOS)
87 set(CLR_CMAKE_HOST_UNIX 1)
88 set(CLR_CMAKE_HOST_IOS 1)
89 if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
90 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
91 elseif(CMAKE_OSX_ARCHITECTURES MATCHES "armv7")
92 set(CLR_CMAKE_HOST_UNIX_ARM 1)
93 elseif(CMAKE_OSX_ARCHITECTURES MATCHES "arm64")
94 set(CLR_CMAKE_HOST_UNIX_ARM64 1)
98 endif(CLR_CMAKE_HOST_OS STREQUAL iOS)
100 if(CLR_CMAKE_HOST_OS STREQUAL tvOS)
101 set(CLR_CMAKE_HOST_UNIX 1)
102 set(CLR_CMAKE_HOST_TVOS 1)
103 if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
104 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
105 elseif(CMAKE_OSX_ARCHITECTURES MATCHES "arm64")
106 set(CLR_CMAKE_HOST_UNIX_ARM64 1)
110 endif(CLR_CMAKE_HOST_OS STREQUAL tvOS)
112 if(CLR_CMAKE_HOST_OS STREQUAL Android)
113 set(CLR_CMAKE_HOST_UNIX 1)
114 set(CLR_CMAKE_HOST_LINUX 1)
115 set(CLR_CMAKE_HOST_ANDROID 1)
116 if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
117 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
118 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7-a)
119 set(CLR_CMAKE_HOST_UNIX_ARM 1)
120 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
121 set(CLR_CMAKE_HOST_UNIX_ARM64 1)
122 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686)
123 set(CLR_CMAKE_HOST_UNIX_X86 1)
127 endif(CLR_CMAKE_HOST_OS STREQUAL Android)
129 if(CLR_CMAKE_HOST_OS STREQUAL FreeBSD)
130 set(CLR_CMAKE_HOST_UNIX 1)
131 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
132 set(CLR_CMAKE_HOST_FREEBSD 1)
133 endif(CLR_CMAKE_HOST_OS STREQUAL FreeBSD)
135 if(CLR_CMAKE_HOST_OS STREQUAL OpenBSD)
136 set(CLR_CMAKE_HOST_UNIX 1)
137 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
138 set(CLR_CMAKE_HOST_OPENBSD 1)
139 endif(CLR_CMAKE_HOST_OS STREQUAL OpenBSD)
141 if(CLR_CMAKE_HOST_OS STREQUAL NetBSD)
142 set(CLR_CMAKE_HOST_UNIX 1)
143 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
144 set(CLR_CMAKE_HOST_NETBSD 1)
145 endif(CLR_CMAKE_HOST_OS STREQUAL NetBSD)
147 if(CLR_CMAKE_HOST_OS STREQUAL SunOS)
148 set(CLR_CMAKE_HOST_UNIX 1)
151 OUTPUT_VARIABLE SUNOS_NATIVE_INSTRUCTION_SET)
153 if(SUNOS_NATIVE_INSTRUCTION_SET MATCHES "amd64")
154 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
155 set(CMAKE_SYSTEM_PROCESSOR "amd64")
160 set(CLR_CMAKE_HOST_SUNOS 1)
161 endif(CLR_CMAKE_HOST_OS STREQUAL SunOS)
163 if(CLR_CMAKE_HOST_OS STREQUAL Windows)
164 set(CLR_CMAKE_HOST_OS Windows_NT)
165 set(CLR_CMAKE_HOST_WIN32 1)
166 endif(CLR_CMAKE_HOST_OS STREQUAL Windows)
168 if(CLR_CMAKE_HOST_OS STREQUAL Emscripten)
169 #set(CLR_CMAKE_HOST_UNIX 1) # TODO: this should be reenabled but it activates a bunch of additional compiler flags in configurecompiler.cmake
170 set(CLR_CMAKE_HOST_UNIX_WASM 1)
171 endif(CLR_CMAKE_HOST_OS STREQUAL Emscripten)
173 #--------------------------------------------
174 # This repo builds two set of binaries
175 # 1. binaries which execute on target arch machine
176 # - for such binaries host architecture & target architecture are same
178 # 2. binaries which execute on host machine but target another architecture
179 # - host architecture is different from target architecture
180 # - eg. crossgen.exe - runs on x64 machine and generates nis targeting arm64
181 # - for complete list of such binaries refer to file crosscomponents.cmake
182 #-------------------------------------------------------------
183 # Set HOST architecture variables
184 if(CLR_CMAKE_HOST_UNIX_ARM)
185 set(CLR_CMAKE_HOST_ARCH_ARM 1)
186 set(CLR_CMAKE_HOST_ARCH "arm")
188 if(CLR_CMAKE_HOST_UNIX_ARMV7L)
189 set(CLR_CMAKE_HOST_ARCH_ARMV7L 1)
191 elseif(CLR_CMAKE_HOST_UNIX_ARM64)
192 set(CLR_CMAKE_HOST_ARCH_ARM64 1)
193 set(CLR_CMAKE_HOST_ARCH "arm64")
194 elseif(CLR_CMAKE_HOST_UNIX_AMD64)
195 set(CLR_CMAKE_HOST_ARCH_AMD64 1)
196 set(CLR_CMAKE_HOST_ARCH "x64")
197 elseif(CLR_CMAKE_HOST_UNIX_X86)
198 set(CLR_CMAKE_HOST_ARCH_I386 1)
199 set(CLR_CMAKE_HOST_ARCH "x86")
200 elseif(CLR_CMAKE_HOST_UNIX_WASM)
201 set(CLR_CMAKE_HOST_ARCH_WASM 1)
202 set(CLR_CMAKE_HOST_ARCH "wasm")
204 # CLR_CMAKE_HOST_ARCH is passed in as param to cmake
205 if (CLR_CMAKE_HOST_ARCH STREQUAL x64)
206 set(CLR_CMAKE_HOST_ARCH_AMD64 1)
207 elseif(CLR_CMAKE_HOST_ARCH STREQUAL x86)
208 set(CLR_CMAKE_HOST_ARCH_I386 1)
209 elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm)
210 set(CLR_CMAKE_HOST_ARCH_ARM 1)
211 elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm64)
212 set(CLR_CMAKE_HOST_ARCH_ARM64 1)
218 # Set TARGET architecture variables
219 # Target arch will be a cmake param (optional) for both windows as well as non-windows build
220 # if target arch is not specified then host & target are same
221 if(NOT DEFINED CLR_CMAKE_TARGET_ARCH OR CLR_CMAKE_TARGET_ARCH STREQUAL "" )
222 set(CLR_CMAKE_TARGET_ARCH ${CLR_CMAKE_HOST_ARCH})
224 # This is required for "arm" targets (CMAKE_SYSTEM_PROCESSOR "armv7l"),
225 # for which this flag otherwise won't be set up below
226 if (CLR_CMAKE_HOST_ARCH_ARMV7L)
227 set(CLR_CMAKE_TARGET_ARCH_ARMV7L 1)
231 # Set target architecture variables
232 if (CLR_CMAKE_TARGET_ARCH STREQUAL x64)
233 set(CLR_CMAKE_TARGET_ARCH_AMD64 1)
234 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL x86)
235 set(CLR_CMAKE_TARGET_ARCH_I386 1)
236 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm64)
237 set(CLR_CMAKE_TARGET_ARCH_ARM64 1)
238 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm)
239 set(CLR_CMAKE_TARGET_ARCH_ARM 1)
240 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL armel)
241 set(CLR_CMAKE_TARGET_ARCH_ARM 1)
242 set(CLR_CMAKE_TARGET_ARCH_ARMV7L 1)
244 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL wasm)
245 set(CLR_CMAKE_TARGET_ARCH_WASM 1)
250 # Set TARGET architecture variables
251 # Target os will be a cmake param (optional) for both windows as well as non-windows build
252 # if target os is not specified then host & target os are same
253 if (NOT DEFINED CLR_CMAKE_TARGET_OS OR CLR_CMAKE_TARGET_OS STREQUAL "" )
254 set(CLR_CMAKE_TARGET_OS ${CLR_CMAKE_HOST_OS})
257 if(CLR_CMAKE_TARGET_OS STREQUAL Linux)
258 set(CLR_CMAKE_TARGET_UNIX 1)
259 set(CLR_CMAKE_TARGET_LINUX 1)
260 endif(CLR_CMAKE_TARGET_OS STREQUAL Linux)
262 if(CLR_CMAKE_TARGET_OS STREQUAL tizen)
263 set(CLR_CMAKE_TARGET_UNIX 1)
264 set(CLR_CMAKE_TARGET_LINUX 1)
265 set(CLR_CMAKE_TARGET_TIZEN_LINUX 1)
266 endif(CLR_CMAKE_TARGET_OS STREQUAL tizen)
268 if(CLR_CMAKE_TARGET_OS STREQUAL alpine)
269 set(CLR_CMAKE_TARGET_UNIX 1)
270 set(CLR_CMAKE_TARGET_LINUX 1)
271 set(CLR_CMAKE_TARGET_ALPINE_LINUX 1)
272 endif(CLR_CMAKE_TARGET_OS STREQUAL alpine)
274 if(CLR_CMAKE_TARGET_OS STREQUAL Android)
275 set(CLR_CMAKE_TARGET_UNIX 1)
276 set(CLR_CMAKE_TARGET_LINUX 1)
277 set(CLR_CMAKE_TARGET_ANDROID 1)
278 endif(CLR_CMAKE_TARGET_OS STREQUAL Android)
280 if(CLR_CMAKE_TARGET_OS STREQUAL Darwin)
281 set(CLR_CMAKE_TARGET_UNIX 1)
282 set(CLR_CMAKE_TARGET_OSX 1)
283 endif(CLR_CMAKE_TARGET_OS STREQUAL Darwin)
285 if(CLR_CMAKE_TARGET_OS STREQUAL iOS)
286 set(CLR_CMAKE_TARGET_UNIX 1)
287 set(CLR_CMAKE_TARGET_IOS 1)
288 endif(CLR_CMAKE_TARGET_OS STREQUAL iOS)
290 if(CLR_CMAKE_TARGET_OS STREQUAL tvOS)
291 set(CLR_CMAKE_TARGET_UNIX 1)
292 set(CLR_CMAKE_TARGET_TVOS 1)
293 endif(CLR_CMAKE_TARGET_OS STREQUAL tvOS)
295 if(CLR_CMAKE_TARGET_OS STREQUAL FreeBSD)
296 set(CLR_CMAKE_TARGET_UNIX 1)
297 set(CLR_CMAKE_TARGET_FREEBSD 1)
298 endif(CLR_CMAKE_TARGET_OS STREQUAL FreeBSD)
300 if(CLR_CMAKE_TARGET_OS STREQUAL OpenBSD)
301 set(CLR_CMAKE_TARGET_UNIX 1)
302 set(CLR_CMAKE_TARGET_OPENBSD 1)
303 endif(CLR_CMAKE_TARGET_OS STREQUAL OpenBSD)
305 if(CLR_CMAKE_TARGET_OS STREQUAL NetBSD)
306 set(CLR_CMAKE_TARGET_UNIX 1)
307 set(CLR_CMAKE_TARGET_NETBSD 1)
308 endif(CLR_CMAKE_TARGET_OS STREQUAL NetBSD)
310 if(CLR_CMAKE_TARGET_OS STREQUAL SunOS)
311 set(CLR_CMAKE_TARGET_UNIX 1)
312 set(CLR_CMAKE_TARGET_SUNOS 1)
313 endif(CLR_CMAKE_TARGET_OS STREQUAL SunOS)
315 if(CLR_CMAKE_TARGET_OS STREQUAL Emscripten)
316 set(CLR_CMAKE_TARGET_UNIX 1)
317 set(CLR_CMAKE_TARGET_LINUX 1)
318 set(CLR_CMAKE_TARGET_EMSCRIPTEN 1)
319 endif(CLR_CMAKE_TARGET_OS STREQUAL Emscripten)
321 if(CLR_CMAKE_TARGET_UNIX)
322 if(CLR_CMAKE_TARGET_ARCH STREQUAL x64)
323 set(CLR_CMAKE_TARGET_UNIX_AMD64 1)
324 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL armel)
325 set(CLR_CMAKE_TARGET_UNIX_ARM 1)
326 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm)
327 set(CLR_CMAKE_TARGET_UNIX_ARM 1)
328 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm64)
329 set(CLR_CMAKE_TARGET_UNIX_ARM64 1)
330 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL x86)
331 set(CLR_CMAKE_TARGET_UNIX_X86 1)
332 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL wasm)
333 set(CLR_CMAKE_TARGET_UNIX_WASM 1)
338 set(CLR_CMAKE_TARGET_WIN32 1)
339 endif(CLR_CMAKE_TARGET_UNIX)
341 # check if host & target os/arch combination are valid
342 if (CLR_CMAKE_TARGET_OS STREQUAL CLR_CMAKE_HOST_OS)
343 if(NOT(CLR_CMAKE_TARGET_ARCH STREQUAL CLR_CMAKE_HOST_ARCH))
344 if(NOT((CLR_CMAKE_HOST_ARCH_AMD64 AND CLR_CMAKE_TARGET_ARCH_ARM64) OR (CLR_CMAKE_HOST_ARCH_I386 AND CLR_CMAKE_TARGET_ARCH_ARM) OR (CLR_CMAKE_HOST_ARCH_AMD64 AND CLR_CMAKE_TARGET_ARCH_ARM)))
345 message(FATAL_ERROR "Invalid platform and target arch combination")
349 if(NOT (CLR_CMAKE_HOST_OS STREQUAL Windows_NT))
350 message(FATAL_ERROR "Invalid host and target os/arch combination. Host OS: ${CLR_CMAKE_HOST_OS}")
352 if(NOT (CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_ALPINE_LINUX))
353 message(FATAL_ERROR "Invalid host and target os/arch combination. Target OS: ${CLR_CMAKE_TARGET_OS}")
355 if(NOT ((CLR_CMAKE_HOST_ARCH_AMD64 AND (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64)) OR (CLR_CMAKE_HOST_ARCH_I386 AND CLR_CMAKE_TARGET_ARCH_ARM)))
356 message(FATAL_ERROR "Invalid host and target os/arch combination. Host Arch: ${CLR_CMAKE_HOST_ARCH} Target Arch: ${CLR_CMAKE_TARGET_ARCH}")
360 if(NOT CLR_CMAKE_TARGET_EMSCRIPTEN)
361 # Skip check_pie_supported call on Android as ld from llvm toolchain with NDK API level 21
362 # complains about missing linker flag `-no-pie` (while level 28's ld does support this flag,
363 # but since we know that PIE is supported, we can safely skip this redundant check).
365 # The default linker on Solaris also does not support PIE.
366 if(NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_SUNOS)
367 # All code we build should be compiled as position independent
368 get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
369 if("CXX" IN_LIST languages)
370 set(CLR_PIE_LANGUAGE CXX)
372 set(CLR_PIE_LANGUAGE C)
374 check_pie_supported(OUTPUT_VARIABLE PIE_SUPPORT_OUTPUT LANGUAGES ${CLR_PIE_LANGUAGE})
375 if(NOT MSVC AND NOT CMAKE_${CLR_PIE_LANGUAGE}_LINK_PIE_SUPPORTED)
376 message(WARNING "PIE is not supported at link time: ${PIE_SUPPORT_OUTPUT}.\n"
377 "PIE link options will not be passed to linker.")
381 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
384 string(TOLOWER "${CMAKE_BUILD_TYPE}" LOWERCASE_CMAKE_BUILD_TYPE)
385 if(LOWERCASE_CMAKE_BUILD_TYPE STREQUAL debug)
386 # Clear _FORTIFY_SOURCE=2, if set
387 string(REPLACE "-D_FORTIFY_SOURCE=2 " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
388 string(REPLACE "-D_FORTIFY_SOURCE=2 " "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")