307 lines
13 KiB
CMake
307 lines
13 KiB
CMake
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")
|
|
set(
|
|
XCENGINE_PROJECT_ASSETS_DIR
|
|
"${CMAKE_SOURCE_DIR}/project/Assets"
|
|
CACHE PATH
|
|
"Project asset root scanned for user C# scripts")
|
|
set(
|
|
XCENGINE_PROJECT_MANAGED_OUTPUT_DIR
|
|
"${CMAKE_SOURCE_DIR}/project/Library/ScriptAssemblies"
|
|
CACHE PATH
|
|
"Output directory for project managed assemblies")
|
|
set(
|
|
XCENGINE_PROJECT_SCRIPT_CORE_DLL
|
|
"${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/XCEngine.ScriptCore.dll"
|
|
CACHE FILEPATH
|
|
"Generated script core assembly copied into the project script assembly directory")
|
|
set(
|
|
XCENGINE_PROJECT_GAME_SCRIPTS_DLL
|
|
"${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/GameScripts.dll"
|
|
CACHE FILEPATH
|
|
"Generated project game scripts assembly")
|
|
set(
|
|
XCENGINE_PROJECT_MONO_MSCORLIB_PATH
|
|
"${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/mscorlib.dll"
|
|
CACHE FILEPATH
|
|
"Mono corlib copied into the project script assembly directory")
|
|
set(
|
|
XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR
|
|
"${CMAKE_BINARY_DIR}/managed/ProjectScriptAssemblies"
|
|
CACHE PATH
|
|
"Output directory for scripting tests that validate project asset assemblies"
|
|
)
|
|
set(
|
|
XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL
|
|
"${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}/XCEngine.ScriptCore.dll"
|
|
CACHE FILEPATH
|
|
"ScriptCore assembly used by scripting tests for project asset assembly validation"
|
|
)
|
|
set(
|
|
XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL
|
|
"${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}/GameScripts.dll"
|
|
CACHE FILEPATH
|
|
"GameScripts assembly used by scripting tests for project asset assembly validation"
|
|
)
|
|
set(
|
|
XCENGINE_SCRIPTING_TEST_PROJECT_MONO_MSCORLIB_PATH
|
|
"${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}/mscorlib.dll"
|
|
CACHE FILEPATH
|
|
"Mono corlib copied into the scripting test project assembly directory"
|
|
)
|
|
|
|
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/Behaviour.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Camera.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/Input.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/InternalCalls.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/KeyCode.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Light.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MeshFilter.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MeshRenderer.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MonoBehaviour.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Object.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Quaternion.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/SerializeField.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/AddComponentProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/EnumFieldProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/FieldMetadataProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/GetComponentsProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/ScriptComponentApiProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/RuntimeGameObjectProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/HierarchyProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/InputProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/LifecycleProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/MeshComponentProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/MeshRendererEdgeCaseProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/ObjectApiProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/SerializeFieldProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TagLayerProbe.cs
|
|
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TickLogProbe.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
|
|
)
|
|
|
|
file(
|
|
GLOB_RECURSE
|
|
XCENGINE_PROJECT_GAME_SCRIPT_SOURCES
|
|
CONFIGURE_DEPENDS
|
|
LIST_DIRECTORIES FALSE
|
|
"${XCENGINE_PROJECT_ASSETS_DIR}/*.cs")
|
|
list(SORT XCENGINE_PROJECT_GAME_SCRIPT_SOURCES)
|
|
|
|
if(NOT XCENGINE_PROJECT_GAME_SCRIPT_SOURCES)
|
|
set(XCENGINE_PROJECT_SCRIPT_PLACEHOLDER "${CMAKE_CURRENT_BINARY_DIR}/Generated/EmptyProjectGameScripts.cs")
|
|
file(GENERATE
|
|
OUTPUT "${XCENGINE_PROJECT_SCRIPT_PLACEHOLDER}"
|
|
CONTENT "namespace XCEngine.Generated { public static class EmptyProjectGameScriptsMarker {} }\n")
|
|
set(XCENGINE_PROJECT_GAME_SCRIPT_SOURCES "${XCENGINE_PROJECT_SCRIPT_PLACEHOLDER}")
|
|
endif()
|
|
|
|
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
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${XCENGINE_SCRIPT_CORE_DLL}
|
|
${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
|
|
DEPENDS ${XCENGINE_SCRIPT_CORE_DLL}
|
|
VERBATIM
|
|
COMMENT "Copying XCEngine.ScriptCore.dll into the scripting test project assembly directory")
|
|
|
|
add_custom_command(
|
|
OUTPUT ${XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}
|
|
COMMAND ${XCENGINE_DOTNET_EXECUTABLE} ${XCENGINE_CSC_DLL}
|
|
/nologo
|
|
/target:library
|
|
/langversion:latest
|
|
/nostdlib+
|
|
/out:${XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL}
|
|
${XCENGINE_MANAGED_FRAMEWORK_REFERENCES}
|
|
/reference:${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
|
|
${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES}
|
|
DEPENDS ${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES} ${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
|
|
VERBATIM
|
|
COMMENT "Building scripting test GameScripts.dll from project asset scripts")
|
|
|
|
add_custom_command(
|
|
OUTPUT ${XCENGINE_SCRIPTING_TEST_PROJECT_MONO_MSCORLIB_PATH}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${XCENGINE_MONO_MSCORLIB_PATH}
|
|
${XCENGINE_SCRIPTING_TEST_PROJECT_MONO_MSCORLIB_PATH}
|
|
DEPENDS ${XCENGINE_MONO_MSCORLIB_PATH}
|
|
VERBATIM
|
|
COMMENT "Copying mscorlib.dll into the scripting test project assembly directory")
|
|
|
|
add_custom_target(
|
|
xcengine_test_project_managed_assemblies
|
|
DEPENDS
|
|
${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
|
|
${XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL}
|
|
${XCENGINE_SCRIPTING_TEST_PROJECT_MONO_MSCORLIB_PATH}
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${XCENGINE_SCRIPT_CORE_DLL}
|
|
${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
|
|
DEPENDS ${XCENGINE_SCRIPT_CORE_DLL}
|
|
VERBATIM
|
|
COMMENT "Copying XCEngine.ScriptCore.dll into the project script assembly directory")
|
|
|
|
add_custom_command(
|
|
OUTPUT ${XCENGINE_PROJECT_GAME_SCRIPTS_DLL}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}
|
|
COMMAND ${XCENGINE_DOTNET_EXECUTABLE} ${XCENGINE_CSC_DLL}
|
|
/nologo
|
|
/target:library
|
|
/langversion:latest
|
|
/nostdlib+
|
|
/out:${XCENGINE_PROJECT_GAME_SCRIPTS_DLL}
|
|
${XCENGINE_MANAGED_FRAMEWORK_REFERENCES}
|
|
/reference:${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
|
|
${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES}
|
|
DEPENDS ${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES} ${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
|
|
VERBATIM
|
|
COMMENT "Building project GameScripts.dll from project asset scripts")
|
|
|
|
add_custom_command(
|
|
OUTPUT ${XCENGINE_PROJECT_MONO_MSCORLIB_PATH}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${XCENGINE_MONO_MSCORLIB_PATH}
|
|
${XCENGINE_PROJECT_MONO_MSCORLIB_PATH}
|
|
DEPENDS ${XCENGINE_MONO_MSCORLIB_PATH}
|
|
VERBATIM
|
|
COMMENT "Copying mscorlib.dll into the project script assembly directory")
|
|
|
|
add_custom_target(
|
|
xcengine_project_managed_assemblies ALL
|
|
DEPENDS
|
|
${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
|
|
${XCENGINE_PROJECT_GAME_SCRIPTS_DLL}
|
|
${XCENGINE_PROJECT_MONO_MSCORLIB_PATH}
|
|
)
|
|
|