1 # Require at least version 2.8.12 of CMake
2 cmake_minimum_required(VERSION 2.8.12)
7 set(CORECLR_SET_RPATH ON)
10 # Enable @rpath support for shared libraries.
12 endif(CORECLR_SET_RPATH)
14 if(CMAKE_VERSION VERSION_EQUAL 3.0 OR CMAKE_VERSION VERSION_GREATER 3.0)
15 cmake_policy(SET CMP0042 NEW)
18 set(CLR_DIR ${CMAKE_CURRENT_SOURCE_DIR})
19 set(VM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/vm)
20 set(GENERATED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/inc)
22 function(clr_unknown_arch)
24 message(FATAL_ERROR "Only AMD64, ARM64 and I386 are supported")
26 message(FATAL_ERROR "Only AMD64, ARM64 and ARM are supported")
30 if(CMAKE_SYSTEM_NAME STREQUAL Linux)
31 set(CLR_CMAKE_PLATFORM_UNIX 1)
32 if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
33 set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
34 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
35 set(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM 1)
36 # Because we don't use CMAKE_C_COMPILER/CMAKE_CXX_COMPILER to use clang
37 # we have to set the triple by adding a compiler argument
38 add_compile_options(-target armv7-linux-gnueabihf)
39 add_compile_options(-mthumb)
40 add_compile_options(-mfpu=vfpv3)
41 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
42 set(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM64 1)
46 set(CLR_CMAKE_PLATFORM_LINUX 1)
47 endif(CMAKE_SYSTEM_NAME STREQUAL Linux)
49 if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
50 set(CLR_CMAKE_PLATFORM_UNIX 1)
51 set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
52 set(CLR_CMAKE_PLATFORM_DARWIN 1)
53 if(CMAKE_VERSION VERSION_LESS "3.4.0")
54 set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_C_COMPILER} <FLAGS> <DEFINES> -o <OBJECT> -c <SOURCE>")
56 set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_C_COMPILER} <FLAGS> <DEFINES> <INCLUDES> -o <OBJECT> -c <SOURCE>")
57 endif(CMAKE_VERSION VERSION_LESS "3.4.0")
58 endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
60 if(CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
61 set(CLR_CMAKE_PLATFORM_UNIX 1)
62 set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
63 set(CLR_CMAKE_PLATFORM_FREEBSD 1)
64 endif(CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
66 if(CMAKE_SYSTEM_NAME STREQUAL OpenBSD)
67 set(CLR_CMAKE_PLATFORM_UNIX 1)
68 set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
69 set(CLR_CMAKE_PLATFORM_OPENBSD 1)
70 endif(CMAKE_SYSTEM_NAME STREQUAL OpenBSD)
72 if(CMAKE_SYSTEM_NAME STREQUAL NetBSD)
73 set(CLR_CMAKE_PLATFORM_UNIX 1)
74 set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
75 set(CLR_CMAKE_PLATFORM_NETBSD 1)
76 endif(CMAKE_SYSTEM_NAME STREQUAL NetBSD)
78 if(CMAKE_SYSTEM_NAME STREQUAL SunOS)
79 set(CLR_CMAKE_PLATFORM_UNIX 1)
82 OUTPUT_VARIABLE SUNOS_NATIVE_INSTRUCTION_SET
84 if(SUNOS_NATIVE_INSTRUCTION_SET MATCHES "amd64")
85 set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
86 set(CMAKE_SYSTEM_PROCESSOR "amd64")
90 set(CLR_CMAKE_PLATFORM_SUNOS 1)
91 endif(CMAKE_SYSTEM_NAME STREQUAL SunOS)
93 if(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
94 set(CLR_CMAKE_PLATFORM_ARCH_ARM 1)
95 elseif(CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM64)
96 set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1)
97 elseif(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
98 set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
100 if (CLR_CMAKE_TARGET_ARCH STREQUAL x64)
101 set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
102 set(IS_64BIT_BUILD 1)
103 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL x86)
104 set(CLR_CMAKE_PLATFORM_ARCH_I386 1)
105 set(IS_64BIT_BUILD 0)
106 elseif(CLR_CMAKE_TARGET_ARCH STREQUAL arm64)
107 set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1)
108 set(IS_64BIT_BUILD 1)
110 # CMAKE_CXX_COMPILER will default to the compiler installed with
111 # Visual studio. Overwrite it to the compiler on the path.
112 # TODO, remove when cmake generator supports Arm64 as a target.
114 find_program(PATH_CXX_COMPILER cl)
115 set(CMAKE_CXX_COMPILER ${PATH_CXX_COMPILER})
117 message("Overwriting the CMAKE_CXX_COMPILER.")
118 message(CMAKE_CXX_COMPILER found:${CMAKE_CXX_COMPILER})
124 if(CLR_CMAKE_PLATFORM_UNIX)
125 # Set flag to indicate if this will be a 64bit build
126 # CMAKE_SYSTEM_PROCESSOR returns the value of `uname -p`.
127 # For the AMD/Intel 64bit architecure two different strings are common.
128 # Linux and Darwin identify it as "x86_64" while FreeBSD uses the
129 # "amd64" string. Accept either of the two here.
130 if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
131 set(IS_64BIT_BUILD 1)
132 endif (CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
133 endif(CLR_CMAKE_PLATFORM_UNIX)
135 # Ensure that python is present
136 find_program(PYTHON python)
137 if (PYTHON STREQUAL "PYTHON-NOTFOUND")
138 message(FATAL_ERROR "PYTHON not found: Please install Python 2.7.9 or later from https://www.python.org/downloads/")
142 enable_language(ASM_MASM)
144 # Ensure that MC is present
146 if (MC STREQUAL "MC-NOTFOUND")
147 message(FATAL_ERROR "MC not found")
152 # Ensure that awk is present
153 find_program(AWK awk)
154 if (AWK STREQUAL "AWK-NOTFOUND")
155 message(FATAL_ERROR "AWK not found")
158 if (CMAKE_SYSTEM_NAME STREQUAL Darwin)
160 # Ensure that dsymutil and strip is present
161 find_program(DSYMUTIL dsymutil)
162 if (DSYMUTIL STREQUAL "DSYMUTIL-NOTFOUND")
163 message(FATAL_ERROR "dsymutil not found")
165 find_program(STRIP strip)
166 if (STRIP STREQUAL "STRIP-NOTFOUND")
167 message(FATAL_ERROR "strip not found")
170 else (CMAKE_SYSTEM_NAME STREQUAL Darwin)
172 # Ensure that objcopy is present
173 find_program(OBJCOPY objcopy)
174 if (OBJCOPY STREQUAL "OBJCOPY-NOTFOUND")
175 message(FATAL_ERROR "objcopy not found")
177 endif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
180 # Build a list of compiler definitions by putting -D in front of each define.
181 function(get_compile_definitions DefinitionName)
182 # Get the current list of definitions
183 get_directory_property(COMPILE_DEFINITIONS_LIST COMPILE_DEFINITIONS)
185 foreach(DEFINITION IN LISTS COMPILE_DEFINITIONS_LIST)
186 if (${DEFINITION} MATCHES "^\\$<\\$<CONFIG:([^>]+)>:([^>]+)>$")
187 # The entries that contain generator expressions must have the -D inside of the
188 # expression. So we transform e.g. $<$<CONFIG:Debug>:_DEBUG> to $<$<CONFIG:Debug>:-D_DEBUG>
189 set(DEFINITION "$<$<CONFIG:${CMAKE_MATCH_1}>:-D${CMAKE_MATCH_2}>")
191 set(DEFINITION -D${DEFINITION})
193 list(APPEND DEFINITIONS ${DEFINITION})
195 set(${DefinitionName} ${DEFINITIONS} PARENT_SCOPE)
196 endfunction(get_compile_definitions)
198 # Build a list of include directories by putting -I in front of each include dir.
199 function(get_include_directories IncludeDirectories)
200 get_directory_property(dirs INCLUDE_DIRECTORIES)
201 foreach(dir IN LISTS dirs)
202 list(APPEND INC_DIRECTORIES -I${dir})
204 set(${IncludeDirectories} ${INC_DIRECTORIES} PARENT_SCOPE)
205 endfunction(get_include_directories)
207 # Set the passed in RetSources variable to the list of sources with added current source directory
208 # to form absolute paths.
209 # The parameters after the RetSources are the input files.
210 function(convert_to_absolute_path RetSources)
212 foreach(Source IN LISTS Sources)
213 list(APPEND AbsolutePathSources ${CMAKE_CURRENT_SOURCE_DIR}/${Source})
215 set(${RetSources} ${AbsolutePathSources} PARENT_SCOPE)
216 endfunction(convert_to_absolute_path)
218 #Preprocess exports definition file
219 function(preprocess_def_file inputFilename outputFilename)
220 get_compile_definitions(PREPROCESS_DEFINITIONS)
223 OUTPUT ${outputFilename}
224 COMMAND ${CMAKE_CXX_COMPILER} /P /EP /TC ${PREPROCESS_DEFINITIONS} /Fi${outputFilename} ${inputFilename}
225 DEPENDS ${inputFilename}
226 COMMENT "Preprocessing ${inputFilename}"
229 set_source_files_properties(${outputFilename}
230 PROPERTIES GENERATED TRUE)
233 function(generate_exports_file inputFilename outputFilename)
235 if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
236 set(AWK_SCRIPT generateexportedsymbols.awk)
238 set(AWK_SCRIPT generateversionscript.awk)
239 endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
242 OUTPUT ${outputFilename}
243 COMMAND ${AWK} -f ${CMAKE_SOURCE_DIR}/${AWK_SCRIPT} ${inputFilename} >${outputFilename}
244 DEPENDS ${inputFilename} ${CMAKE_SOURCE_DIR}/${AWK_SCRIPT}
245 COMMENT "Generating exports file ${outputFilename}"
247 set_source_files_properties(${outputFilename}
248 PROPERTIES GENERATED TRUE)
251 function(add_precompiled_header header cppFile targetSources)
253 set(precompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/stdafx.pch")
255 set_source_files_properties(${cppFile}
256 PROPERTIES COMPILE_FLAGS "/Yc\"${header}\" /Fp\"${precompiledBinary}\""
257 OBJECT_OUTPUTS "${precompiledBinary}")
258 set_source_files_properties(${${targetSources}}
259 PROPERTIES COMPILE_FLAGS "/Yu\"${header}\" /Fp\"${precompiledBinary}\""
260 OBJECT_DEPENDS "${precompiledBinary}")
261 # Add cppFile to SourcesVar
262 set(${targetSources} ${${targetSources}} ${cppFile} PARENT_SCOPE)
266 function(strip_symbols targetName outputFilename)
267 if(CLR_CMAKE_PLATFORM_UNIX)
268 if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE)
270 # On the older version of cmake (2.8.12) used on Ubuntu 14.04 the TARGET_FILE
271 # generator expression doesn't work correctly returning the wrong path and on
272 # the newer cmake versions the LOCATION property isn't supported anymore.
273 if(CMAKE_VERSION VERSION_EQUAL 3.0 OR CMAKE_VERSION VERSION_GREATER 3.0)
274 set(strip_source_file $<TARGET_FILE:${targetName}>)
276 get_property(strip_source_file TARGET ${targetName} PROPERTY LOCATION)
279 if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
280 set(strip_destination_file ${strip_source_file}.dwarf)
286 COMMAND ${DSYMUTIL} --flat --minimize ${strip_source_file}
287 COMMAND ${STRIP} -u -r ${strip_source_file}
288 COMMENT Stripping symbols from ${strip_source_file} into file ${strip_destination_file}
290 else(CMAKE_SYSTEM_NAME STREQUAL Darwin)
291 set(strip_destination_file ${strip_source_file}.dbg)
297 COMMAND ${OBJCOPY} --only-keep-debug ${strip_source_file} ${strip_destination_file}
298 COMMAND ${OBJCOPY} --strip-unneeded ${strip_source_file}
299 COMMAND ${OBJCOPY} --add-gnu-debuglink=${strip_destination_file} ${strip_source_file}
300 COMMENT Stripping symbols from ${strip_source_file} into file ${strip_destination_file}
302 endif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
304 set(${outputFilename} ${strip_destination_file} PARENT_SCOPE)
305 endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE)
306 endif(CLR_CMAKE_PLATFORM_UNIX)
309 function(install_clr targetName)
310 strip_symbols(${targetName} strip_destination_file)
312 # On the older version of cmake (2.8.12) used on Ubuntu 14.04 the TARGET_FILE
313 # generator expression doesn't work correctly returning the wrong path and on
314 # the newer cmake versions the LOCATION property isn't supported anymore.
315 if(CMAKE_VERSION VERSION_EQUAL 3.0 OR CMAKE_VERSION VERSION_GREATER 3.0)
316 set(install_source_file $<TARGET_FILE:${targetName}>)
318 get_property(install_source_file TARGET ${targetName} PROPERTY LOCATION)
321 install(PROGRAMS ${install_source_file} DESTINATION .)
323 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/${targetName}.pdb DESTINATION PDB)
325 install(FILES ${strip_destination_file} DESTINATION .)
331 if (CMAKE_CONFIGURATION_TYPES) # multi-configuration generator?
332 set(CMAKE_CONFIGURATION_TYPES "Debug;Checked;Release;RelWithDebInfo" CACHE STRING "" FORCE)
333 endif (CMAKE_CONFIGURATION_TYPES)
335 set(CMAKE_C_FLAGS_CHECKED ${CLR_C_FLAGS_CHECKED_INIT} CACHE STRING "Flags used by the compiler during checked builds.")
336 set(CMAKE_CXX_FLAGS_CHECKED ${CLR_CXX_FLAGS_CHECKED_INIT} CACHE STRING "Flags used by the compiler during checked builds.")
337 set(CMAKE_EXE_LINKER_FLAGS_CHECKED "")
338 set(CMAKE_SHARED_LINKER_FLAGS_CHECKED "")
341 # For multi-configuration toolset (as Visual Studio)
342 # set the different configuration defines.
343 foreach (Config DEBUG CHECKED RELEASE RELWITHDEBINFO)
344 foreach (Definition IN LISTS CLR_DEFINES_${Config}_INIT)
345 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:${Config}>:${Definition}>)
346 endforeach (Definition)
349 elseif (CLR_CMAKE_PLATFORM_UNIX)
350 # Set the values to display when interactively configuring CMAKE_BUILD_TYPE
351 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "DEBUG;CHECKED;RELEASE;RELWITHDEBINFO")
353 # Use uppercase CMAKE_BUILD_TYPE for the string comparisons below
354 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE)
356 # For single-configuration toolset
357 # set the different configuration defines.
358 if (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG)
360 set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS ${CLR_DEFINES_DEBUG_INIT})
361 elseif (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED)
363 set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS ${CLR_DEFINES_CHECKED_INIT})
364 elseif (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE)
366 set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS ${CLR_DEFINES_RELEASE_INIT})
367 elseif (UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO)
368 # And then RELWITHDEBINFO
369 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${CLR_DEFINES_RELWITHDEBINFO_INIT})
371 message(FATAL_ERROR "Unknown build type! Set CMAKE_BUILD_TYPE to DEBUG, CHECKED, RELEASE, or RELWITHDEBINFO!")
376 if (CLR_CMAKE_PLATFORM_UNIX)
377 add_definitions(-DPLATFORM_UNIX=1)
379 if(CLR_CMAKE_PLATFORM_LINUX)
380 if(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
381 message("Detected Linux x86_64")
382 add_definitions(-DLINUX64)
383 elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
384 message("Detected Linux ARM")
385 add_definitions(-DLINUX32)
386 elseif(CLR_CMAKE_PLATFORM_ARCH_ARM64)
387 message("Detected Linux ARM64")
388 add_definitions(-DLINUX64)
392 endif(CLR_CMAKE_PLATFORM_LINUX)
394 if(CLR_CMAKE_PLATFORM_DARWIN)
395 message("Detected OSX x86_64")
396 endif(CLR_CMAKE_PLATFORM_DARWIN)
398 if(CLR_CMAKE_PLATFORM_FREEBSD)
399 message("Detected FreeBSD amd64")
400 endif(CLR_CMAKE_PLATFORM_FREEBSD)
402 # Disable frame pointer optimizations so profilers can get better call stacks
403 add_compile_options(-fno-omit-frame-pointer)
405 # The -fms-extensions enable the stuff like __if_exists, __declspec(uuid()), etc.
406 add_compile_options(-fms-extensions )
407 #-fms-compatibility Enable full Microsoft Visual C++ compatibility
408 #-fms-extensions Accept some non-standard constructs supported by the Microsoft compiler
410 if(CLR_CMAKE_PLATFORM_DARWIN)
411 # We cannot enable "stack-protector-strong" on OS X due to a bug in clang compiler (current version 7.0.2)
412 add_compile_options(-fstack-protector)
414 add_compile_options(-fstack-protector-strong)
415 endif(CLR_CMAKE_PLATFORM_DARWIN)
417 # set the CLANG sanitizer flags for debug build
418 if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED)
419 # obtain settings from running enablesanitizers.sh
420 string(FIND "$ENV{DEBUG_SANITIZERS}" "asan" __ASAN_POS)
421 string(FIND "$ENV{DEBUG_SANITIZERS}" "ubsan" __UBSAN_POS)
422 if ((${__ASAN_POS} GREATER -1) OR (${__UBSAN_POS} GREATER -1))
423 set(CLR_SANITIZE_CXX_FLAGS "${CLR_SANITIZE_CXX_FLAGS} -fsanitize-blacklist=${CMAKE_CURRENT_SOURCE_DIR}/sanitizerblacklist.txt -fsanitize=")
424 set(CLR_SANITIZE_LINK_FLAGS "${CLR_SANITIZE_LINK_FLAGS} -fsanitize=")
425 if (${__ASAN_POS} GREATER -1)
426 set(CLR_SANITIZE_CXX_FLAGS "${CLR_SANITIZE_CXX_FLAGS}address,")
427 set(CLR_SANITIZE_LINK_FLAGS "${CLR_SANITIZE_LINK_FLAGS}address,")
428 message("Address Sanitizer (asan) enabled")
430 if (${__UBSAN_POS} GREATER -1)
431 # all sanitizier flags are enabled except alignment (due to heavy use of __unaligned modifier)
432 set(CLR_SANITIZE_CXX_FLAGS "${CLR_SANITIZE_CXX_FLAGS}bool,bounds,enum,float-cast-overflow,float-divide-by-zero,function,integer,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,unreachable,vla-bound,vptr")
433 set(CLR_SANITIZE_LINK_FLAGS "${CLR_SANITIZE_LINK_FLAGS}undefined")
434 message("Undefined Behavior Sanitizer (ubsan) enabled")
437 # -fdata-sections -ffunction-sections: each function has own section instead of one per .o file (needed for --gc-sections)
438 # -fPIC: enable Position Independent Code normally just for shared libraries but required when linking with address sanitizer
439 # -O1: optimization level used instead of -O0 to avoid compile error "invalid operand for inline asm constraint"
440 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${CLR_SANITIZE_CXX_FLAGS} -fdata-sections -ffunction-sections -fPIC -O1")
441 set(CMAKE_CXX_FLAGS_CHECKED "${CMAKE_CXX_FLAGS_CHECKED} ${CLR_SANITIZE_CXX_FLAGS} -fdata-sections -ffunction-sections -fPIC -O1")
443 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} ${CLR_SANITIZE_LINK_FLAGS}")
444 set(CMAKE_EXE_LINKER_FLAGS_CHECKED "${CMAKE_EXE_LINKER_FLAGS_CHECKED} ${CLR_SANITIZE_LINK_FLAGS}")
446 # -Wl and --gc-sections: drop unused sections\functions (similar to Windows /Gy function-level-linking)
447 set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} ${CLR_SANITIZE_LINK_FLAGS} -Wl,--gc-sections")
448 set(CMAKE_SHARED_LINKER_FLAGS_CHECKED "${CMAKE_SHARED_LINKER_FLAGS_CHECKED} ${CLR_SANITIZE_LINK_FLAGS} -Wl,--gc-sections")
450 endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED)
452 add_definitions(-DDISABLE_CONTRACTS)
453 # The -ferror-limit is helpful during the porting, it makes sure the compiler doesn't stop
454 # after hitting just about 20 errors.
455 add_compile_options(-ferror-limit=4096)
457 # All warnings that are not explicitly disabled are reported as errors
458 add_compile_options(-Werror)
461 add_compile_options(-Wno-unused-private-field)
462 add_compile_options(-Wno-unused-variable)
463 # Explicit constructor calls are not supported by clang (this->ClassName::ClassName())
464 add_compile_options(-Wno-microsoft)
465 # This warning is caused by comparing 'this' to NULL
466 add_compile_options(-Wno-tautological-compare)
467 # There are constants of type BOOL used in a condition. But BOOL is defined as int
468 # and so the compiler thinks that there is a mistake.
469 add_compile_options(-Wno-constant-logical-operand)
471 add_compile_options(-Wno-unknown-warning-option)
473 #These seem to indicate real issues
474 add_compile_options(-Wno-invalid-offsetof)
475 # The following warning indicates that an attribute __attribute__((__ms_struct__)) was applied
476 # to a struct or a class that has virtual members or a base class. In that case, clang
477 # may not generate the same object layout as MSVC.
478 add_compile_options(-Wno-incompatible-ms-struct)
480 endif(CLR_CMAKE_PLATFORM_UNIX)
483 # Compile options for targeting windows
485 # The following options are set by the razzle build
486 add_compile_options(/TP) # compile all files as C++
487 add_compile_options(/d2Zi+) # make optimized builds debugging easier
488 add_compile_options(/nologo) # Suppress Startup Banner
489 add_compile_options(/W3) # set warning level to 3
490 add_compile_options(/WX) # treat warnings as errors
491 add_compile_options(/Oi) # enable intrinsics
492 add_compile_options(/Oy-) # disable suppressing of the creation of frame pointers on the call stack for quicker function calls
493 add_compile_options(/U_MT) # undefine the predefined _MT macro
494 add_compile_options(/GF) # enable read-only string pooling
495 add_compile_options(/Gm-) # disable minimal rebuild
496 add_compile_options(/EHa) # enable C++ EH (w/ SEH exceptions)
497 add_compile_options(/Zp8) # pack structs on 8-byte boundary
498 add_compile_options(/Gy) # separate functions for linker
499 add_compile_options(/Zc:wchar_t-) # C++ language conformance: wchar_t is NOT the native type, but a typedef
500 add_compile_options(/Zc:forScope) # C++ language conformance: enforce Standard C++ for scoping rules
501 add_compile_options(/GR-) # disable C++ RTTI
502 add_compile_options(/FC) # use full pathnames in diagnostics
503 add_compile_options(/MP) # Build with Multiple Processes (number of processes equal to the number of processors)
504 add_compile_options(/GS) # Buffer Security Check
505 add_compile_options(/Zm200) # Specify Precompiled Header Memory Allocation Limit of 150MB
506 add_compile_options(/wd4960 /wd4961 /wd4603 /wd4627 /wd4838 /wd4456 /wd4457 /wd4458 /wd4459 /wd4091 /we4640)
507 add_compile_options(/Zi) # enable debugging information
509 if (CLR_CMAKE_PLATFORM_ARCH_I386)
510 add_compile_options(/Gz)
511 endif (CLR_CMAKE_PLATFORM_ARCH_I386)
513 add_compile_options($<$<OR:$<CONFIG:Release>,$<CONFIG:Relwithdebinfo>>:/GL>)
514 add_compile_options($<$<OR:$<OR:$<CONFIG:Release>,$<CONFIG:Relwithdebinfo>>,$<CONFIG:Checked>>:/O1>)
516 if (CLR_CMAKE_PLATFORM_ARCH_AMD64)
517 # The generator expression in the following command means that the /homeparams option is added only for debug builds
518 add_compile_options($<$<CONFIG:Debug>:/homeparams>) # Force parameters passed in registers to be written to the stack
519 endif (CLR_CMAKE_PLATFORM_ARCH_AMD64)
521 if(NOT CLR_CMAKE_PLATFORM_ARCH_ARM64)
522 # enable control-flow-guard support for native components for non-Arm64 builds
523 add_compile_options(/guard:cf)
524 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /guard:cf")
525 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /guard:cf")
526 endif (NOT CLR_CMAKE_PLATFORM_ARCH_ARM64)
528 # Incremental linking with CFG is broken until next VS release.
529 # This needs to be appended to the last for each build type to override the default flag.
530 set(NO_INCREMENTAL_LINKER_FLAGS "/INCREMENTAL:NO")
534 # Disable the following line for UNIX altjit on Windows
535 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /MANIFEST:NO") #Do not create Side-by-Side Assembly Manifest
536 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,6.00") #windows subsystem
537 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LARGEADDRESSAWARE") # can handle addresses larger than 2 gigabytes
538 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /RELEASE") #sets the checksum in the header
539 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NXCOMPAT") #Compatible with Data Execution Prevention
540 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DYNAMICBASE") #Use address space layout randomization
541 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUGTYPE:cv,fixup") #debugging format
542 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /PDBCOMPRESS") #shrink pdb size
543 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
544 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /IGNORE:4197,4013,4254,4070,4221")
546 set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221")
548 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /PDBCOMPRESS")
549 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:1572864")
551 # Debug build specific flags
552 set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/NOVCFEATURE ${NO_INCREMENTAL_LINKER_FLAGS}")
553 set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${NO_INCREMENTAL_LINKER_FLAGS}")
555 # Checked build specific flags
556 set(CMAKE_SHARED_LINKER_FLAGS_CHECKED "${CMAKE_SHARED_LINKER_FLAGS_CHECKED} /OPT:REF /OPT:NOICF /NOVCFEATURE ${NO_INCREMENTAL_LINKER_FLAGS}")
557 set(CMAKE_STATIC_LINKER_FLAGS_CHECKED "${CMAKE_STATIC_LINKER_FLAGS_CHECKED}")
558 set(CMAKE_EXE_LINKER_FLAGS_CHECKED "${CMAKE_EXE_LINKER_FLAGS_CHECKED} /OPT:REF /OPT:NOICF ${NO_INCREMENTAL_LINKER_FLAGS}")
560 # Release build specific flags
561 set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG /OPT:REF /OPT:ICF ${NO_INCREMENTAL_LINKER_FLAGS}")
562 set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG")
563 set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG /OPT:REF /OPT:ICF ${NO_INCREMENTAL_LINKER_FLAGS}")
565 # ReleaseWithDebugInfo build specific flags
566 set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /LTCG /OPT:REF /OPT:ICF ${NO_INCREMENTAL_LINKER_FLAGS}")
567 set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} /LTCG")
568 set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /LTCG /OPT:REF /OPT:ICF ${NO_INCREMENTAL_LINKER_FLAGS}")
570 # Temporary until cmake has VS generators for arm64
571 if(CLR_CMAKE_PLATFORM_ARCH_ARM64)
572 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /machine:arm64")
573 set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /machine:arm64")
574 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /machine:arm64")
575 endif(CLR_CMAKE_PLATFORM_ARCH_ARM64)
579 OPTION(CMAKE_ENABLE_CODE_COVERAGE "Enable code coverage" OFF)
581 if(CMAKE_ENABLE_CODE_COVERAGE)
583 if(CLR_CMAKE_PLATFORM_UNIX)
584 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPERCASE_CMAKE_BUILD_TYPE)
585 if(NOT UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG)
586 message( WARNING "Code coverage results with an optimised (non-Debug) build may be misleading" )
587 endif(NOT UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG)
589 add_compile_options(-fprofile-arcs)
590 add_compile_options(-ftest-coverage)
591 set(CLANG_COVERAGE_LINK_FLAGS "--coverage")
592 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CLANG_COVERAGE_LINK_FLAGS}")
593 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CLANG_COVERAGE_LINK_FLAGS}")
595 message(FATAL_ERROR "Code coverage builds not supported on current platform")
596 endif(CLR_CMAKE_PLATFORM_UNIX)
598 endif(CMAKE_ENABLE_CODE_COVERAGE)
600 # Start of projects that require usage of platform include files
602 if(CLR_CMAKE_PLATFORM_UNIX)
603 add_subdirectory(src/corefx)
604 endif(CLR_CMAKE_PLATFORM_UNIX)
607 add_definitions(-DBIT64=1)
608 endif(IS_64BIT_BUILD)
610 if (CLR_CMAKE_PLATFORM_ARCH_AMD64)
611 if (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
612 add_definitions(-DDBG_TARGET_AMD64_UNIX)
614 add_definitions(-D_TARGET_AMD64_=1)
615 add_definitions(-DDBG_TARGET_AMD64)
616 elseif (CLR_CMAKE_PLATFORM_ARCH_ARM64)
617 if (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM64)
618 add_definitions(-DDBG_TARGET_ARM64_UNIX)
620 add_definitions(-D_TARGET_ARM64_=1)
621 add_definitions(-DDBG_TARGET_ARM64)
622 elseif (CLR_CMAKE_PLATFORM_ARCH_ARM)
623 if (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
624 add_definitions(-DDBG_TARGET_ARM_UNIX)
625 endif (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
626 add_definitions(-D_TARGET_ARM_=1)
627 add_definitions(-DDBG_TARGET_ARM)
628 elseif (CLR_CMAKE_PLATFORM_ARCH_I386)
629 add_definitions(-D_TARGET_X86_=1)
630 add_definitions(-DDBG_TARGET_X86)
633 endif (CLR_CMAKE_PLATFORM_ARCH_AMD64)
635 if (CLR_CMAKE_PLATFORM_ARCH_AMD64)
636 add_definitions(-D_AMD64_)
637 add_definitions(-D_WIN64)
638 add_definitions(-DAMD64)
639 elseif (CLR_CMAKE_PLATFORM_ARCH_I386)
640 add_definitions(-D_X86_)
641 elseif (CLR_CMAKE_PLATFORM_ARCH_ARM)
642 add_definitions(-D_ARM_)
643 add_definitions(-DARM)
644 elseif (CLR_CMAKE_PLATFORM_ARCH_ARM64)
645 add_definitions(-D_ARM64_)
646 add_definitions(-DARM64)
647 add_definitions(-D_WIN64)
653 set(FEATURE_EVENT_TRACE 1)
655 if(CLR_CMAKE_PLATFORM_LINUX AND CLR_CMAKE_PLATFORM_ARCH_AMD64)
656 set(FEATURE_EVENT_TRACE 1)
659 if(CLR_CMAKE_PLATFORM_UNIX)
660 add_subdirectory(src/ToolBox/SOS/lldbplugin)
661 add_subdirectory(src/pal)
662 add_subdirectory(src/coreclr/hosts/unixcoreruncommon)
663 add_subdirectory(src/coreclr/hosts/unixcorerun)
664 add_subdirectory(src/coreclr/hosts/unixcoreconsole)
665 add_subdirectory(src/ildasm/unixcoreclrloader)
666 endif(CLR_CMAKE_PLATFORM_UNIX)
668 if(CLR_CMAKE_PLATFORM_DARWIN)
669 add_subdirectory(src/coreclr/hosts/osxbundlerun)
670 endif(CLR_CMAKE_PLATFORM_DARWIN)
672 # Add this subdir. We install the headers for the jit.
673 add_subdirectory(src/pal/prebuilt/inc)
675 add_subdirectory(src/debug/debug-pal)
678 add_subdirectory(src/gc/sample)
681 # End of projects that require usage of platform include files
683 # Enable for UNIX altjit on Windows - set(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64 1)
684 # Enable for UNIX altjit on Windows - add_definitions(-DCLR_CMAKE_PLATFORM_UNIX=1)
686 # Disable the following line for UNIX altjit on Windows
687 set(CMAKE_CXX_STANDARD_LIBRARIES "") # do not link against standard win32 libs i.e. kernel32, uuid, user32, etc.
689 # Include directory directives
691 # Include the basic prebuilt headers - required for getting fileversion resource details.
692 include_directories("src/pal/prebuilt/inc")
694 if (CLR_CMAKE_PLATFORM_UNIX)
695 include_directories("src/pal/inc")
696 include_directories("src/pal/inc/rt")
697 include_directories("src/pal/src/safecrt")
698 endif (CLR_CMAKE_PLATFORM_UNIX)
704 # Define the CRT lib references that link into Desktop imports
705 set(STATIC_MT_CRT_LIB "libcmt$<$<OR:$<CONFIG:Debug>,$<CONFIG:Checked>>:d>.lib")
706 set(STATIC_MT_VCRT_LIB "libvcruntime$<$<OR:$<CONFIG:Debug>,$<CONFIG:Checked>>:d>.lib")
707 set(STATIC_MT_CPP_LIB "libcpmt$<$<OR:$<CONFIG:Debug>,$<CONFIG:Checked>>:d>.lib")
709 # ARM64_TODO: Enable this for Windows Arm64
710 if (NOT CLR_CMAKE_PLATFORM_ARCH_ARM64)
711 # Define the uCRT lib reference
712 set(STATIC_MT_UCRT_LIB "libucrt$<$<OR:$<CONFIG:Debug>,$<CONFIG:Checked>>:d>.lib")
717 # Definition directives
719 if (CLR_CMAKE_PLATFORM_UNIX)
721 if(CLR_CMAKE_PLATFORM_DARWIN)
722 add_definitions(-D_XOPEN_SOURCE)
723 endif(CLR_CMAKE_PLATFORM_DARWIN)
725 if (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
726 add_definitions(-DUNIX_AMD64_ABI)
727 elseif (CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM)
728 add_definitions(-DUNIX_ARM_ABI)
731 endif(CLR_CMAKE_PLATFORM_UNIX)
733 add_definitions(-D_BLD_CLR)
734 add_definitions(-DDEBUGGING_SUPPORTED)
735 add_definitions(-DPROFILING_SUPPORTED)
738 add_definitions(-DWIN32)
739 add_definitions(-D_WIN32)
740 add_definitions(-DWINVER=0x0602)
741 add_definitions(-D_WIN32_WINNT=0x0602)
742 add_definitions(-DWIN32_LEAN_AND_MEAN=1)
743 if(CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_I386)
744 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
745 # Only enable edit and continue on windows x86 and x64
746 # exclude Linux, arm & arm64
747 add_definitions(-DEnC_SUPPORTED)
748 endif(CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_I386)
751 # Features - please keep them alphabetically sorted
753 add_definitions(-DFEATURE_APPDOMAIN_RESOURCE_MONITORING)
755 add_definitions(-DFEATURE_APPX)
757 if(CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_ARM OR CLR_CMAKE_PLATFORM_ARCH_ARM64)
758 add_definitions(-DFEATURE_ARRAYSTUB_AS_IL)
761 add_definitions(-DFEATURE_ASYNC_IO)
762 add_definitions(-DFEATURE_BCL_FORMATTING)
763 add_definitions(-DFEATURE_COLLECTIBLE_TYPES)
766 add_definitions(-DFEATURE_CLASSIC_COMINTEROP)
767 add_definitions(-DFEATURE_COMINTEROP)
768 add_definitions(-DFEATURE_COMINTEROP_APARTMENT_SUPPORT)
769 add_definitions(-DFEATURE_COMINTEROP_UNMANAGED_ACTIVATION)
770 add_definitions(-DFEATURE_COMINTEROP_WINRT_MANAGED_ACTIVATION)
773 add_definitions(-DFEATURE_CORECLR)
774 if (CLR_CMAKE_PLATFORM_UNIX)
775 add_definitions(-DFEATURE_COREFX_GLOBALIZATION)
776 endif(CLR_CMAKE_PLATFORM_UNIX)
777 add_definitions(-DFEATURE_CORESYSTEM)
778 add_definitions(-DFEATURE_CORRUPTING_EXCEPTIONS)
779 if(CLR_CMAKE_PLATFORM_UNIX)
780 add_definitions(-DFEATURE_DBGIPC_TRANSPORT_DI)
781 add_definitions(-DFEATURE_DBGIPC_TRANSPORT_VM)
782 endif(CLR_CMAKE_PLATFORM_UNIX)
783 if(FEATURE_EVENT_TRACE)
784 add_definitions(-DFEATURE_EVENT_TRACE=1)
785 if(CLR_CMAKE_PLATFORM_UNIX)
786 add_definitions(-DFEATURE_EVENTSOURCE_XPLAT=1)
787 endif(CLR_CMAKE_PLATFORM_UNIX)
788 endif(FEATURE_EVENT_TRACE)
789 add_definitions(-DFEATURE_EXCEPTIONDISPATCHINFO)
790 # NetBSD doesn't implement this feature
791 if(NOT CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
792 add_definitions(-DFEATURE_HIJACK)
793 endif(NOT CLR_CMAKE_PLATFORM_UNIX_TARGET_ARM AND NOT CMAKE_SYSTEM_NAME STREQUAL NetBSD)
794 add_definitions(-DFEATURE_HOST_ASSEMBLY_RESOLVER)
795 add_definitions(-DFEATURE_HOSTED_BINDER)
796 add_definitions(-DFEATURE_ICASTABLE)
797 if (CLR_CMAKE_PLATFORM_UNIX OR CLR_CMAKE_PLATFORM_ARCH_ARM64)
798 add_definitions(-DFEATURE_IMPLICIT_TLS)
799 set(FEATURE_IMPLICIT_TLS 1)
800 endif(CLR_CMAKE_PLATFORM_UNIX OR CLR_CMAKE_PLATFORM_ARCH_ARM64)
801 add_definitions(-DFEATURE_ISYM_READER)
802 add_definitions(-DFEATURE_LOADER_OPTIMIZATION)
803 add_definitions(-DFEATURE_MANAGED_ETW)
804 add_definitions(-DFEATURE_MANAGED_ETW_CHANNELS)
805 add_definitions(-DFEATURE_MAIN_CLR_MODULE_USES_CORE_NAME)
806 add_definitions(-DFEATURE_MERGE_CULTURE_SUPPORT_AND_ENGINE)
808 # Disable the following for UNIX altjit on Windows
809 add_definitions(-DFEATURE_MERGE_JIT_AND_ENGINE)
811 add_definitions(-DFEATURE_MULTICOREJIT)
812 add_definitions(-DFEATURE_NORM_IDNA_ONLY)
813 if(CLR_CMAKE_PLATFORM_UNIX)
814 add_definitions(-DFEATURE_PAL)
815 add_definitions(-DFEATURE_PAL_SXS)
816 add_definitions(-DFEATURE_PAL_ANSI)
817 endif(CLR_CMAKE_PLATFORM_UNIX)
818 if(CLR_CMAKE_PLATFORM_LINUX)
819 add_definitions(-DFEATURE_PERFMAP)
820 endif(CLR_CMAKE_PLATFORM_LINUX)
821 add_definitions(-DFEATURE_PREJIT)
822 add_definitions(-DFEATURE_RANDOMIZED_STRING_HASHING)
823 if(NOT DEFINED CLR_CMAKE_PLATFORM_ARCH_ARM64)
824 add_definitions(-DFEATURE_READYTORUN)
825 set(FEATURE_READYTORUN 1)
826 endif(NOT DEFINED CLR_CMAKE_PLATFORM_ARCH_ARM64)
829 if (CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_I386)
830 add_definitions(-DFEATURE_REJIT)
831 endif(CLR_CMAKE_PLATFORM_ARCH_AMD64 OR CLR_CMAKE_PLATFORM_ARCH_I386)
834 add_definitions(-DFEATURE_STANDALONE_SN)
835 add_definitions(-DFEATURE_STRONGNAME_DELAY_SIGNING_ALLOWED)
836 add_definitions(-DFEATURE_STRONGNAME_MIGRATION)
837 if (CLR_CMAKE_PLATFORM_UNIX OR CLR_CMAKE_PLATFORM_ARCH_ARM64)
838 add_definitions(-DFEATURE_STUBS_AS_IL)
839 endif(CLR_CMAKE_PLATFORM_UNIX OR CLR_CMAKE_PLATFORM_ARCH_ARM64)
840 add_definitions(-DFEATURE_SVR_GC)
841 add_definitions(-DFEATURE_SYMDIFF)
842 add_definitions(-DFEATURE_SYNTHETIC_CULTURES)
843 if(CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
844 add_definitions(-DFEATURE_UNIX_AMD64_STRUCT_PASSING)
845 add_definitions(-DFEATURE_UNIX_AMD64_STRUCT_PASSING_ITF)
846 endif (CLR_CMAKE_PLATFORM_UNIX_TARGET_AMD64)
847 add_definitions(-DFEATURE_USE_ASM_GC_WRITE_BARRIERS)
848 add_definitions(-DFEATURE_VERSIONING)
850 add_definitions(-DFEATURE_VERSIONING_LOG)
852 add_definitions(-DFEATURE_WIN32_REGISTRY)
853 add_definitions(-DFEATURE_WINDOWSPHONE)
854 add_definitions(-DFEATURE_WINMD_RESILIENT)
856 if(CLR_CMAKE_BUILD_TESTS)
857 add_subdirectory(tests)
858 endif(CLR_CMAKE_BUILD_TESTS)
860 if (CLR_CMAKE_PLATFORM_ARCH_AMD64)
861 set(ARCH_SOURCES_DIR amd64)
862 elseif (CLR_CMAKE_PLATFORM_ARCH_ARM64)
863 set(ARCH_SOURCES_DIR arm64)
864 elseif (CLR_CMAKE_PLATFORM_ARCH_ARM)
865 set(ARCH_SOURCES_DIR arm)
866 elseif (CLR_CMAKE_PLATFORM_ARCH_I386)
867 set(ARCH_SOURCES_DIR i386)
872 add_definitions(-D_SECURE_SCL=0)
873 add_definitions(-DUNICODE)
874 add_definitions(-D_UNICODE)
879 add_compile_options(/FIWarningControl.h) # force include of WarningControl.h
880 add_compile_options(/Zl) # omit default library name in .OBJ
883 # Microsoft.Dotnet.BuildTools.Coreclr version
884 set(BuildToolsVersion "1.0.4-prerelease")
885 set(BuildToolsDir "${CLR_DIR}/packages/Microsoft.DotNet.BuildTools.CoreCLR/${BuildToolsVersion}")
887 add_subdirectory(src)