Files
XCEngine/managed/CMakeLists.txt

133 lines
5.4 KiB
CMake
Raw Normal View History

2026-03-26 22:10:43 +08:00
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
2026-03-26 22:10:43 +08:00
${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
2026-03-26 22:10:43 +08:00
${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
2026-03-26 22:10:43 +08:00
${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/TransformSpaceProbe.cs
2026-03-26 22:10:43 +08:00
)
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
)