Files
o3de/Code/LauncherUnified/launcher_generator.cmake
T
lumberyard-employee-dm 9a0b93c9ff Fixed generation of Monolithic builds StaticModules.inl (#947)
* Fixed generation of Monolithic builds StaticModules.inl
A project's gem module RUNTIME_DEPENDENCIES were not visited to
determine any dependent gem modules that needed to load.
Therefore the CreateStaticModules function were missing
CreateModuleClass_* function calls required initialize the gem's AZ::Module
derived class in monolithic builds

* Removed the logic to strip the Gem:: and Project:: prefix from the Server Launcher gem dependencies

When associating gem dependencies with the server target there was CMake logic left over in it to strip the beginning of the target name if it began with "Gem::" or "Project::"
2021-05-26 12:18:26 -05:00

211 lines
10 KiB
CMake

#
# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
# its licensors.
#
# For complete copyright and license terms please see the LICENSE at the root of this
# distribution (the "License"). All use of this software is governed by the License,
# or, if provided, by the license below or the license accompanying this file. Do not
# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
set_property(GLOBAL PROPERTY LAUNCHER_UNIFIED_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
# Launcher targets for a project need to be generated when configuring a project.
# When building the engine source, this file will be included by LauncherUnified's CMakeLists.txt
# When using an installed engine, this file will be included by the FindLauncherGenerator.cmake script
get_property(LY_PROJECTS_TARGET_NAME GLOBAL PROPERTY LY_PROJECTS_TARGET_NAME)
foreach(project_name project_path IN ZIP_LISTS LY_PROJECTS_TARGET_NAME LY_PROJECTS)
# Computes the realpath to the project
# If the project_path is relative, it is evaluated relative to the ${LY_ROOT_FOLDER}
# Otherwise the the absolute project_path is returned with symlinks resolved
file(REAL_PATH ${project_path} project_real_path BASE_DIRECTORY ${LY_ROOT_FOLDER})
if(NOT project_name)
if(NOT EXISTS ${project_real_path}/project.json)
message(FATAL_ERROR "The specified project path of ${project_real_path} does not contain a project.json file")
else()
# Add the project_name to global LY_PROJECTS_TARGET_NAME property
file(READ "${project_real_path}/project.json" project_json)
string(JSON project_name ERROR_VARIABLE json_error GET ${project_json} "project_name")
if(json_error)
message(FATAL_ERROR "There is an error reading the \"project_name\" key from the '${project_real_path}/project.json' file: ${json_error}")
endif()
message(WARNING "The project located at path ${project_real_path} has a valid \"project name\" of '${project_name}' read from it's project.json file."
" This indicates that the ${project_real_path}/CMakeLists.txt is not properly appending the \"project name\" "
"to the LY_PROJECTS_TARGET_NAME global property. Other configuration errors might occur")
endif()
endif()
################################################################################
# Monolithic game
################################################################################
if(LY_MONOLITHIC_GAME)
# In the monolithic case, we need to register the gem modules, to do so we will generate a StaticModules.inl
# file from StaticModules.in
set_property(GLOBAL APPEND PROPERTY LY_STATIC_MODULE_PROJECTS_NAME ${project_name})
get_property(game_gem_dependencies GLOBAL PROPERTY LY_DELAYED_DEPENDENCIES_${project_name}.GameLauncher)
set(game_build_dependencies
${game_gem_dependencies}
Legacy::CrySystem
)
if(PAL_TRAIT_BUILD_SERVER_SUPPORTED)
get_property(server_gem_dependencies GLOBAL PROPERTY LY_DELAYED_DEPENDENCIES_${project_name}.ServerLauncher)
set(server_build_dependencies
${server_gem_dependencies}
Legacy::CrySystem
)
endif()
else()
set(game_runtime_dependencies
Legacy::CrySystem
)
endif()
################################################################################
# Game
################################################################################
ly_add_target(
NAME ${project_name}.GameLauncher ${PAL_TRAIT_LAUNCHERUNIFIED_LAUNCHER_TYPE}
NAMESPACE AZ
FILES_CMAKE
${CMAKE_CURRENT_LIST_DIR}/launcher_project_files.cmake
PLATFORM_INCLUDE_FILES
${pal_dir}/launcher_project_${PAL_PLATFORM_NAME_LOWERCASE}.cmake
COMPILE_DEFINITIONS
PRIVATE
# Adds the name of the project/game
LY_PROJECT_NAME="${project_name}"
# Adds the ${project_name}_GameLauncher target as a define so for the Settings Registry to use
# when loading .setreg file specializations
# This is needed so that only gems for the project game launcher are loaded
LY_CMAKE_TARGET="${project_name}_GameLauncher"
INCLUDE_DIRECTORIES
PRIVATE
.
${CMAKE_CURRENT_BINARY_DIR}/${project_name}.GameLauncher/Includes # required for StaticModules.inl
BUILD_DEPENDENCIES
PRIVATE
AZ::Launcher.Static
AZ::Launcher.Game.Static
${game_build_dependencies}
RUNTIME_DEPENDENCIES
${game_runtime_dependencies}
)
# Needs to be set manually after ly_add_target to prevent the default location overriding it
set_target_properties(${project_name}.GameLauncher
PROPERTIES
FOLDER ${project_name}
)
################################################################################
# Server
################################################################################
if(PAL_TRAIT_BUILD_SERVER_SUPPORTED)
get_property(server_projects GLOBAL PROPERTY LY_LAUNCHER_SERVER_PROJECTS)
if(${project_name} IN_LIST server_projects)
ly_add_target(
NAME ${project_name}.ServerLauncher APPLICATION
NAMESPACE AZ
FILES_CMAKE
${CMAKE_CURRENT_LIST_DIR}/launcher_project_files.cmake
PLATFORM_INCLUDE_FILES
${pal_dir}/launcher_project_${PAL_PLATFORM_NAME_LOWERCASE}.cmake
COMPILE_DEFINITIONS
PRIVATE
# Adds the name of the project/game
LY_PROJECT_NAME="${project_name}"
# Adds the ${project_name}_ServerLauncher target as a define so for the Settings Registry to use
# when loading .setreg file specializations
# This is needed so that only gems for the project server launcher are loaded
LY_CMAKE_TARGET="${project_name}_ServerLauncher"
INCLUDE_DIRECTORIES
PRIVATE
.
${CMAKE_CURRENT_BINARY_DIR}/${project_name}.ServerLauncher/Includes # required for StaticModules.inl
BUILD_DEPENDENCIES
PRIVATE
AZ::Launcher.Static
AZ::Launcher.Server.Static
${server_build_dependencies}
RUNTIME_DEPENDENCIES
${server_runtime_dependencies}
)
# Needs to be set manually after ly_add_target to prevent the default location overriding it
set_target_properties(${project_name}.ServerLauncher
PROPERTIES
FOLDER ${project_name}
)
endif()
endif()
endforeach()
#! Defer generation of the StaticModules.inl file needed in monolithic builds until after all the CMake targets are known
# This is that the GEM_MODULE target runtime dependencies can be parsed to discover the list of dependent modules
# to load
function(ly_delayed_generate_static_modules_inl)
if(LY_MONOLITHIC_GAME)
get_property(launcher_unified_binary_dir GLOBAL PROPERTY LAUNCHER_UNIFIED_BINARY_DIR)
get_property(project_names GLOBAL PROPERTY LY_STATIC_MODULE_PROJECTS_NAME)
foreach(project_name ${project_names})
unset(extern_module_declarations)
unset(module_invocations)
unset(all_game_gem_dependencies)
ly_get_gem_load_dependencies(all_game_gem_dependencies ${project_name}.GameLauncher)
foreach(game_gem_dependency ${all_game_gem_dependencies})
# To match the convention on how gems targets vs gem modules are named,
# we remove the ".Static" from the suffix
# Replace "." with "_"
string(REPLACE "." "_" game_gem_dependency ${game_gem_dependency})
string(APPEND extern_module_declarations "extern \"C\" AZ::Module* CreateModuleClass_Gem_${game_gem_dependency}();\n")
string(APPEND module_invocations " modulesOut.push_back(CreateModuleClass_Gem_${game_gem_dependency}());\n")
endforeach()
configure_file(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/StaticModules.in
${launcher_unified_binary_dir}/${project_name}.GameLauncher/Includes/StaticModules.inl
)
if(PAL_TRAIT_BUILD_SERVER_SUPPORTED)
get_property(server_gem_dependencies GLOBAL PROPERTY LY_STATIC_MODULE_PROJECTS_DEPENDENCIES_${project_name}.ServerLauncher)
unset(extern_module_declarations)
unset(module_invocations)
unset(all_server_gem_dependencies)
ly_get_gem_load_dependencies(all_server_gem_dependencies ${project_name}.ServerLauncher)
foreach(server_gem_dependency ${server_gem_dependencies})
ly_get_gem_load_dependencies(server_gem_load_dependencies ${server_gem_dependency})
list(APPEND all_server_gem_dependencies ${server_gem_load_dependencies} ${server_gem_dependency})
endforeach()
foreach(server_gem_dependency ${all_server_gem_dependencies})
# Replace "." with "_"
string(REPLACE "." "_" server_gem_dependency ${server_gem_dependency})
string(APPEND extern_module_declarations "extern \"C\" AZ::Module* CreateModuleClass_Gem_${server_gem_dependency}();\n")
string(APPEND module_invocations " modulesOut.push_back(CreateModuleClass_Gem_${server_gem_dependency}());\n")
endforeach()
configure_file(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/StaticModules.in
${launcher_unified_binary_dir}/${project_name}.ServerLauncher/Includes/StaticModules.inl
)
endif()
endforeach()
endif()
endfunction()