cmake_minimum_required(VERSION 3.15) project(XCEngineManaged NONE) if(NOT XCENGINE_ENABLE_MONO_SCRIPTING) return() endif() if(NOT WIN32) message(FATAL_ERROR "XCENGINE_ENABLE_MONO_SCRIPTING currently requires Windows.") endif() find_program(XCENGINE_DOTNET_EXECUTABLE dotnet REQUIRED) set( XCENGINE_MANAGED_OUTPUT_DIR "${CMAKE_BINARY_DIR}/managed" CACHE PATH "Output directory for generated managed assemblies") execute_process( COMMAND ${XCENGINE_DOTNET_EXECUTABLE} --list-sdks OUTPUT_VARIABLE XCENGINE_DOTNET_SDK_LIST OUTPUT_STRIP_TRAILING_WHITESPACE) string(REGEX MATCHALL "[0-9]+\\.[0-9]+\\.[0-9]+" XCENGINE_DOTNET_SDK_VERSIONS "${XCENGINE_DOTNET_SDK_LIST}") if(NOT XCENGINE_DOTNET_SDK_VERSIONS) message(FATAL_ERROR "Failed to locate a .NET SDK for managed scripting assemblies.") endif() list(GET XCENGINE_DOTNET_SDK_VERSIONS -1 XCENGINE_DOTNET_SDK_VERSION) set(XCENGINE_CSC_DLL "C:/Program Files/dotnet/sdk/${XCENGINE_DOTNET_SDK_VERSION}/Roslyn/bincore/csc.dll") set(XCENGINE_NET472_REFERENCE_DIR "C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.7.2") set(XCENGINE_MONO_CORLIB_DIR "${XCENGINE_MONO_ROOT_DIR}/binary" CACHE PATH "Directory containing the bundled Mono corlib") set(XCENGINE_MONO_MSCORLIB_PATH "${XCENGINE_MONO_CORLIB_DIR}/mscorlib.dll") set(XCENGINE_SCRIPT_CORE_DLL "${XCENGINE_MANAGED_OUTPUT_DIR}/XCEngine.ScriptCore.dll" CACHE FILEPATH "Generated XCEngine.ScriptCore assembly") set(XCENGINE_GAME_SCRIPTS_DLL "${XCENGINE_MANAGED_OUTPUT_DIR}/GameScripts.dll" CACHE FILEPATH "Generated GameScripts assembly") foreach(XCENGINE_REQUIRED_PATH "${XCENGINE_CSC_DLL}" "${XCENGINE_NET472_REFERENCE_DIR}/mscorlib.dll" "${XCENGINE_NET472_REFERENCE_DIR}/System.dll" "${XCENGINE_NET472_REFERENCE_DIR}/System.Core.dll" "${XCENGINE_MONO_MSCORLIB_PATH}") if(NOT EXISTS "${XCENGINE_REQUIRED_PATH}") message(FATAL_ERROR "Required managed scripting dependency is missing: ${XCENGINE_REQUIRED_PATH}") endif() endforeach() set(XCENGINE_SCRIPT_CORE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Camera.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Behaviour.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Component.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Debug.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/GameObject.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/InternalCalls.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Light.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MonoBehaviour.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Quaternion.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Space.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Time.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Transform.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Vector2.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Vector3.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Vector4.cs ) set(XCENGINE_GAME_SCRIPT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/BuiltinComponentProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/HierarchyProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/LifecycleProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformConversionProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformMotionProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformOrientationProbe.cs ${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformSpaceProbe.cs ) set(XCENGINE_MANAGED_FRAMEWORK_REFERENCES /reference:${XCENGINE_NET472_REFERENCE_DIR}/mscorlib.dll /reference:${XCENGINE_NET472_REFERENCE_DIR}/System.dll /reference:${XCENGINE_NET472_REFERENCE_DIR}/System.Core.dll ) add_custom_command( OUTPUT ${XCENGINE_SCRIPT_CORE_DLL} COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_MANAGED_OUTPUT_DIR} COMMAND ${XCENGINE_DOTNET_EXECUTABLE} ${XCENGINE_CSC_DLL} /nologo /target:library /langversion:latest /nostdlib+ /out:${XCENGINE_SCRIPT_CORE_DLL} ${XCENGINE_MANAGED_FRAMEWORK_REFERENCES} ${XCENGINE_SCRIPT_CORE_SOURCES} DEPENDS ${XCENGINE_SCRIPT_CORE_SOURCES} VERBATIM COMMENT "Building XCEngine.ScriptCore.dll") add_custom_command( OUTPUT ${XCENGINE_GAME_SCRIPTS_DLL} COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_MANAGED_OUTPUT_DIR} COMMAND ${XCENGINE_DOTNET_EXECUTABLE} ${XCENGINE_CSC_DLL} /nologo /target:library /langversion:latest /nostdlib+ /out:${XCENGINE_GAME_SCRIPTS_DLL} ${XCENGINE_MANAGED_FRAMEWORK_REFERENCES} /reference:${XCENGINE_SCRIPT_CORE_DLL} ${XCENGINE_GAME_SCRIPT_SOURCES} DEPENDS ${XCENGINE_GAME_SCRIPT_SOURCES} ${XCENGINE_SCRIPT_CORE_DLL} VERBATIM COMMENT "Building GameScripts.dll") add_custom_command( OUTPUT ${XCENGINE_MANAGED_OUTPUT_DIR}/mscorlib.dll COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_MANAGED_OUTPUT_DIR} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${XCENGINE_MONO_MSCORLIB_PATH} ${XCENGINE_MANAGED_OUTPUT_DIR}/mscorlib.dll DEPENDS ${XCENGINE_MONO_MSCORLIB_PATH} VERBATIM COMMENT "Copying mscorlib.dll for Mono runtime resolution") add_custom_target( xcengine_managed_assemblies DEPENDS ${XCENGINE_SCRIPT_CORE_DLL} ${XCENGINE_GAME_SCRIPTS_DLL} ${XCENGINE_MANAGED_OUTPUT_DIR}/mscorlib.dll )