Add native configurations for SunOS (#34756)
[platform/upstream/dotnet/runtime.git] / eng / native / configureplatform.cmake
1 include(CheckPIESupported)
2 include(${CMAKE_CURRENT_LIST_DIR}/functions.cmake)
3
4 # If set, indicates that this is not an officially supported release
5 # Keep in sync with IsPrerelease in Directory.Build.props
6 set(PRERELEASE 1)
7
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)
22                 else()
23                     set(CLR_CMAKE_HOST_UNIX_AMD64 1)
24                 endif()
25             else()
26                 set(CLR_CMAKE_HOST_UNIX_AMD64 1)
27             endif()
28         elseif(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL i686)
29             set(CLR_CMAKE_HOST_UNIX_X86 1)
30         else()
31             clr_unknown_arch()
32         endif()
33     else()
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)
49         else()
50             clr_unknown_arch()
51         endif()
52     endif()
53     set(CLR_CMAKE_HOST_LINUX 1)
54
55     # Detect Linux ID
56     set(LINUX_ID_FILE "/etc/os-release")
57     if(CMAKE_CROSSCOMPILING)
58         set(LINUX_ID_FILE "${CMAKE_SYSROOT}${LINUX_ID_FILE}")
59     endif()
60
61     if(EXISTS ${LINUX_ID_FILE})
62         execute_process(
63             COMMAND bash -c "source ${LINUX_ID_FILE} && echo \$ID"
64             OUTPUT_VARIABLE CLR_CMAKE_LINUX_ID
65             OUTPUT_STRIP_TRAILING_WHITESPACE)
66     endif()
67
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})
75         endif()
76     endif(DEFINED CLR_CMAKE_LINUX_ID)
77 endif(CLR_CMAKE_HOST_OS STREQUAL Linux)
78
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)
85
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)
95     else()
96         clr_unknown_arch()
97     endif()
98 endif(CLR_CMAKE_HOST_OS STREQUAL iOS)
99
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)
107     else()
108         clr_unknown_arch()
109     endif()
110 endif(CLR_CMAKE_HOST_OS STREQUAL tvOS)
111
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)
124     else()
125         clr_unknown_arch()
126     endif()
127 endif(CLR_CMAKE_HOST_OS STREQUAL Android)
128
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)
134
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)
140
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)
146
147 if(CLR_CMAKE_HOST_OS STREQUAL SunOS)
148     set(CLR_CMAKE_HOST_UNIX 1)
149     EXECUTE_PROCESS(
150         COMMAND isainfo -n
151         OUTPUT_VARIABLE SUNOS_NATIVE_INSTRUCTION_SET)
152
153     if(SUNOS_NATIVE_INSTRUCTION_SET MATCHES "amd64")
154         set(CLR_CMAKE_HOST_UNIX_AMD64 1)
155         set(CMAKE_SYSTEM_PROCESSOR "amd64")
156     else()
157         clr_unknown_arch()
158     endif()
159
160     set(CLR_CMAKE_HOST_SUNOS 1)
161 endif(CLR_CMAKE_HOST_OS STREQUAL SunOS)
162
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)
167
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)
172
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
177 #        - eg. coreclr.dll
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")
187
188     if(CLR_CMAKE_HOST_UNIX_ARMV7L)
189         set(CLR_CMAKE_HOST_ARCH_ARMV7L 1)
190     endif()
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")
203 elseif(WIN32)
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)
213     else()
214         clr_unknown_arch()
215     endif()
216 endif()
217
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})
223
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)
228   endif()
229 endif()
230
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)
243     set(ARM_SOFTFP 1)
244   elseif(CLR_CMAKE_TARGET_ARCH STREQUAL wasm)
245     set(CLR_CMAKE_TARGET_ARCH_WASM 1)
246   else()
247     clr_unknown_arch()
248 endif()
249
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})
255 endif()
256
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)
261
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)
267
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)
273
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)
279
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)
284
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)
289
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)
294
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)
299
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)
304
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)
309
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)
314
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)
320
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)
334     else()
335         clr_unknown_arch()
336     endif()
337 else()
338     set(CLR_CMAKE_TARGET_WIN32 1)
339 endif(CLR_CMAKE_TARGET_UNIX)
340
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")
346         endif()
347     endif()
348 else()
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}")
351     endif()
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}")
354     endif()
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}")
357     endif()
358 endif()
359
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).
364     #
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)
371         else()
372             set(CLR_PIE_LANGUAGE C)
373         endif()
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.")
378         endif()
379     endif()
380
381     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
382 endif()
383
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}")
389 endif()