1 set(CMAKE_INCLUDE_CURRENT_DIR ON)
2 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
4 include_directories("./jitstd")
5 include_directories("../inc")
7 if (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64 OR (CLR_CMAKE_TARGET_ARCH_I386 AND NOT CLR_CMAKE_PLATFORM_UNIX))
8 add_definitions(-DFEATURE_SIMD)
9 add_definitions(-DFEATURE_HW_INTRINSICS)
12 # JIT_BUILD disables certain PAL_TRY debugging features
13 add_definitions(-DJIT_BUILD=1)
16 set(JIT_RESOURCES Native.rc)
64 register_arg_convention.cpp
81 # Add header files to Visual Studio vcxproj, not required for unixes
82 # change has effect on editor experience and has no impact on build
91 bitsetasuint64inclass.h
102 compilerbitsettraits.h
103 compilerbitsettraits.hpp
129 hwintrinsiclistxarch.h
130 ICorJitInfo_API_names.h
131 ICorJitInfo_API_wrapper.hpp
164 register_arg_convention.h
197 # The following defines all the source files used by the "legacy" back-end (#ifdef LEGACY_BACKEND).
198 # It is always safe to include both legacy and non-legacy files in the build, as everything is properly
199 # #ifdef'ed, though it makes the build slightly slower to do so. Note there is only a legacy backend for
202 set(JIT_ARM_LEGACY_SOURCES
206 set(JIT_I386_LEGACY_SOURCES
211 # Define all the architecture-specific source files
213 set( JIT_AMD64_SOURCES
223 hwintrinsiccodegenxarch.cpp
227 ${JIT_ARM_LEGACY_SOURCES}
240 set( JIT_I386_SOURCES
241 ${JIT_I386_LEGACY_SOURCES}
252 hwintrinsiccodegenxarch.cpp
255 set( JIT_ARM64_SOURCES
270 if(CLR_CMAKE_TARGET_ARCH_AMD64)
271 set(JIT_ARCH_SOURCES ${JIT_AMD64_SOURCES})
272 elseif(CLR_CMAKE_TARGET_ARCH_ARM)
273 set(JIT_ARCH_SOURCES ${JIT_ARM_SOURCES})
274 elseif(CLR_CMAKE_TARGET_ARCH_I386)
275 set(JIT_ARCH_SOURCES ${JIT_I386_SOURCES})
276 elseif(CLR_CMAKE_TARGET_ARCH_ARM64)
277 set(JIT_ARCH_SOURCES ${JIT_ARM64_SOURCES})
288 convert_to_absolute_path(SOURCES ${SOURCES})
289 convert_to_absolute_path(JIT_ARCH_SOURCES ${JIT_ARCH_SOURCES})
291 # Also convert the per-architecture sources to absolute paths, if the subdirs want to use them.
293 convert_to_absolute_path(JIT_AMD64_SOURCES ${JIT_AMD64_SOURCES})
294 convert_to_absolute_path(JIT_ARM_SOURCES ${JIT_ARM_SOURCES})
295 convert_to_absolute_path(JIT_I386_SOURCES ${JIT_I386_SOURCES})
296 convert_to_absolute_path(JIT_ARM64_SOURCES ${JIT_ARM64_SOURCES})
299 add_precompiled_header(jitpch.h ../jitpch.cpp SOURCES)
301 # Create .def file containing a list of exports preceeded by
302 # 'EXPORTS'. The file "ClrJit.exports" already contains the list, so we
303 # massage it into the correct format here to create "ClrJit.exports.def".
304 set(JIT_EXPORTS_FILE ${CMAKE_CURRENT_BINARY_DIR}/ClrJit.exports.def)
305 set(JIT_EXPORTS_FILE_TEMP ${JIT_EXPORTS_FILE}.txt)
306 file(READ "ClrJit.exports" exports_list)
307 file(WRITE ${JIT_EXPORTS_FILE_TEMP} "LIBRARY CLRJIT\n")
308 file(APPEND ${JIT_EXPORTS_FILE_TEMP} "EXPORTS\n")
309 file(APPEND ${JIT_EXPORTS_FILE_TEMP} ${exports_list})
311 # Copy the file only if it has changed.
312 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
313 ${JIT_EXPORTS_FILE_TEMP} ${JIT_EXPORTS_FILE})
315 set(SHARED_LIB_SOURCES ${SOURCES} ${JIT_EXPORTS_FILE})
317 set(JIT_EXPORTS_IN_FILE ${CMAKE_CURRENT_BINARY_DIR}/clrjit.exports.in)
318 file(READ "${CMAKE_CURRENT_LIST_DIR}/ClrJit.exports" jit_exports)
319 file(READ "${CMAKE_CURRENT_LIST_DIR}/ClrJit.PAL.exports" pal_exports)
320 file(WRITE ${JIT_EXPORTS_IN_FILE} ${jit_exports})
321 file(APPEND ${JIT_EXPORTS_IN_FILE} "\n")
322 file(APPEND ${JIT_EXPORTS_IN_FILE} ${pal_exports})
324 set(JIT_EXPORTS_FILE ${CMAKE_CURRENT_BINARY_DIR}/clrjit.exports)
325 generate_exports_file(${JIT_EXPORTS_IN_FILE} ${JIT_EXPORTS_FILE})
327 if(CMAKE_SYSTEM_NAME STREQUAL Linux OR CMAKE_SYSTEM_NAME STREQUAL FreeBSD OR CMAKE_SYSTEM_NAME STREQUAL NetBSD)
328 # This is required to force using our own PAL, not one that we are loaded with.
329 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic -Bsymbolic-functions")
331 set(JIT_EXPORTS_LINKER_OPTION -Wl,--version-script=${JIT_EXPORTS_FILE})
332 elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
333 set(JIT_EXPORTS_LINKER_OPTION -Wl,-exported_symbols_list,${JIT_EXPORTS_FILE})
336 set(SHARED_LIB_SOURCES ${SOURCES})
339 add_custom_target(jit_exports DEPENDS ${JIT_EXPORTS_FILE})
341 set(RYUJIT_LINK_LIBRARIES
346 if(CLR_CMAKE_PLATFORM_UNIX)
347 list(APPEND RYUJIT_LINK_LIBRARIES
353 list(APPEND RYUJIT_LINK_LIBRARIES
355 ${STATIC_MT_VCRT_LIB}
368 endif(CLR_CMAKE_PLATFORM_UNIX)
370 if (FEATURE_MERGE_JIT_AND_ENGINE)
371 # Despite the directory being named "dll", it creates a static library "clrjit_static" to link into the VM.
372 add_subdirectory(dll)
373 add_subdirectory(crossgen)
374 endif (FEATURE_MERGE_JIT_AND_ENGINE)
376 add_subdirectory(standalone)
378 if (CLR_CMAKE_TARGET_ARCH_ARM)
379 # Build arm32 legacy_backend to run on both x86 host (crossgen build) and arm host (native).
380 add_subdirectory(legacyjit)
381 endif (CLR_CMAKE_TARGET_ARCH_ARM)
383 if (CLR_CMAKE_PLATFORM_ARCH_I386 OR CLR_CMAKE_PLATFORM_ARCH_AMD64)
384 # On x86, build RyuJIT/ARM32 cross-compiling altjit.
385 # On amd64, build RyuJIT/ARM64 cross-compiling altjit.
386 add_subdirectory(protononjit)
389 if (CLR_CMAKE_PLATFORM_ARCH_I386)
390 # On x86, build RyuJIT/ARM32 cross-compiling altjit for ARM_SOFTFP (armel).
391 add_subdirectory(armelnonjit)
394 if ((CLR_CMAKE_PLATFORM_ARCH_I386 OR CLR_CMAKE_PLATFORM_ARCH_AMD64) AND WIN32)
395 # On Windows, build altjit that targets the Linux ABI:
396 # On x86, build Linux/x86 altjit. This enables UNIX_X86_ABI.
397 # On amd64, build Linux/AMD64 altjit. This enables UNIX_AMD64_ABI and FEATURE_UNIX_AMD64_STRUCT_PASSING.
398 add_subdirectory(linuxnonjit)
401 if (CLR_CMAKE_PLATFORM_ARCH_I386 AND WIN32)
402 # On Windows x86, build altjit generating Windows/ARM32 code using LEGACY_BACKEND.
403 # (Note: we could also create linuxlegacynonjit for generating Linux/ARM32 code using LEGACY_BACKEND, if needed.)
404 add_subdirectory(legacynonjit)
405 endif (CLR_CMAKE_PLATFORM_ARCH_I386 AND WIN32)