From f30b1f2c75977a32a69732815ed32962e46ee2d4 Mon Sep 17 00:00:00 2001 From: phistere Date: Mon, 17 May 2021 11:41:10 -0500 Subject: [PATCH] Work in Progress: template changes, getting external projects w/ SDK to work --- .../DefaultProject/Template/CMakeLists.txt | 151 ++++++++++++------ .../Template/EngineFinder.cmake | 64 ++++++++ Templates/DefaultProject/template.json | 6 + 3 files changed, 174 insertions(+), 47 deletions(-) create mode 100644 Templates/DefaultProject/Template/EngineFinder.cmake diff --git a/Templates/DefaultProject/Template/CMakeLists.txt b/Templates/DefaultProject/Template/CMakeLists.txt index ad0a4c869d..c92607a789 100644 --- a/Templates/DefaultProject/Template/CMakeLists.txt +++ b/Templates/DefaultProject/Template/CMakeLists.txt @@ -23,64 +23,121 @@ function(add_vs_debugger_arguments) endforeach() endfunction() -set(o3de_project_path ${CMAKE_CURRENT_LIST_DIR}) -set(o3de_project_json ${o3de_project_path}/project.json) - if(NOT PROJECT_NAME) cmake_minimum_required(VERSION 3.19) project(${Name} LANGUAGES C CXX VERSION 1.0.0.0 ) + include(EngineFinder.cmake OPTIONAL) + find_package(o3de REQUIRED) + o3de_initialize() + add_vs_debugger_arguments() +else() + # Add the project_name to global LY_PROJECTS_TARGET_NAME property + file(READ "${CMAKE_CURRENT_LIST_DIR}/project.json" project_json) - # set this project as the only project - set(LY_PROJECTS ${CMAKE_CURRENT_LIST_DIR}) - - # o3de manifest - include(o3de_manifest.cmake) - - ################################################################################ - # Set the engine_path and resolve this engines restricted path if it has one - ################################################################################ - o3de_engine_path(${o3de_project_json} o3de_engine_path) - o3de_project_name(${o3de_project_json} o3de_project_name) - o3de_restricted_path(${o3de_project_json} o3de_project_restricted_path) - message(STATUS "O3DE Project Name: ${o3de_project_name}") - message(STATUS "O3DE Project Path: ${o3de_project_path}") - if(o3de_project_restricted_path) - message(STATUS "O3DE Project Restricted Path: ${o3de_project_restricted_path}") + string(JSON project_target_name ERROR_VARIABLE json_error GET ${project_json} "project_name") + if(json_error) + message(FATAL_ERROR "Unable to read key 'project_name' from 'project.json'") endif() - # add the engines cmake folder to the CMAKE_MODULE_PATH - list(APPEND CMAKE_MODULE_PATH "${o3de_engine_path}/cmake") + set_property(GLOBAL APPEND PROPERTY LY_PROJECTS_TARGET_NAME ${project_target_name}) + + add_subdirectory(Code) +endif() + + + +# #! Adds the --project-path argument to the VS IDE debugger command arguments +# function(add_vs_debugger_arguments) +# # Inject the project root into the --project-path argument into the Visual Studio Debugger arguments by defaults +# list(APPEND app_targets ${Name}.GameLauncher ${Name}.ServerLauncher) +# list(APPEND app_targets AssetBuilder AssetProcessor AssetProcessorBatch Editor) +# foreach(app_target IN LISTS app_targets) +# if (TARGET ${app_target}) +# set_property(TARGET ${app_target} APPEND PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "--project-path=\"${CMAKE_CURRENT_LIST_DIR}\"") +# endif() +# endforeach() +# endfunction() + +# set(o3de_project_path ${CMAKE_CURRENT_LIST_DIR}) +# set(o3de_project_json ${o3de_project_path}/project.json) + +# if(NOT PROJECT_NAME) +# cmake_minimum_required(VERSION 3.19) +# project(${Name} +# LANGUAGES C CXX +# VERSION 1.0.0.0 +# ) + +# # set this project as the only project +# set(LY_PROJECTS ${CMAKE_CURRENT_LIST_DIR}) + +# # o3de manifest +# include(o3de_manifest.cmake) + +# ################################################################################ +# # Set the engine_path and resolve this engines restricted path if it has one +# ################################################################################ +# o3de_engine_path(${o3de_project_json} o3de_engine_path) +# o3de_project_name(${o3de_project_json} o3de_project_name) +# o3de_restricted_path(${o3de_project_json} o3de_project_restricted_path) +# message(STATUS "O3DE Project Name: ${o3de_project_name}") +# message(STATUS "O3DE Project Path: ${o3de_project_path}") +# if(o3de_project_restricted_path) +# message(STATUS "O3DE Project Restricted Path: ${o3de_project_restricted_path}") +# endif() + +# # add the engines cmake folder to the CMAKE_MODULE_PATH +# list(APPEND CMAKE_MODULE_PATH "${o3de_engine_path}/cmake") + +# # add subdirectory on the engine path for this project +# #add_subdirectory(${o3de_engine_path} o3de) +# find_package(o3de REQUIRED) +# o3de_initialize() + +# # add this --project-path arguments to visual studio debugger +# add_vs_debugger_arguments() + +# else() +# ###################################################### +# # the engine is calling add sub_directory() on us +# ###################################################### +# o3de_project_name(${o3de_project_json} o3de_project_name) +# o3de_restricted_path(${o3de_project_json} o3de_project_restricted_path) + +# # Currently we are in the folder: ${CMAKE_CURRENT_LIST_DIR} +# # Get the platform specific folder ${pal_dir} for the folder: ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} +# # Note: ly_get_list_relative_pal_filename will take care of the details for us, as this may be a restricted platform +# # in which case it will see if that platform is present here or in the restricted folder. +# # i.e. It could here: TestDP/Platform/ or +# # //TestDP +# ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} ${o3de_project_restricted_path} ${o3de_project_path} ${o3de_project_name}) + +# # Now that we have the platform abstraction layer (PAL) folder for this folder, thats where we will find the +# # project cmake for this platform. +# include(${pal_dir}/${PAL_PLATFORM_NAME_LOWERCASE}_project.cmake) + +# # Add the project_name to global LY_PROJECTS_TARGET_NAME property +# set_property(GLOBAL APPEND PROPERTY LY_PROJECTS_TARGET_NAME ${o3de_project_name}) + +# add_subdirectory(Code) +# endif() + + + + + + + + + + + + - # add subdirectory on the engine path for this project - add_subdirectory(${o3de_engine_path} o3de) - # add this --project-path arguments to visual studio debugger - add_vs_debugger_arguments() -else() - ###################################################### - # the engine is calling add sub_directory() on us - ###################################################### - o3de_project_name(${o3de_project_json} o3de_project_name) - o3de_restricted_path(${o3de_project_json} o3de_project_restricted_path) - - # Currently we are in the folder: ${CMAKE_CURRENT_LIST_DIR} - # Get the platform specific folder ${pal_dir} for the folder: ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} - # Note: ly_get_list_relative_pal_filename will take care of the details for us, as this may be a restricted platform - # in which case it will see if that platform is present here or in the restricted folder. - # i.e. It could here: TestDP/Platform/ or - # //TestDP - ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} ${o3de_project_restricted_path} ${o3de_project_path} ${o3de_project_name}) - - # Now that we have the platform abstraction layer (PAL) folder for this folder, thats where we will find the - # project cmake for this platform. - include(${pal_dir}/${PAL_PLATFORM_NAME_LOWERCASE}_project.cmake) - # Add the project_name to global LY_PROJECTS_TARGET_NAME property - set_property(GLOBAL APPEND PROPERTY LY_PROJECTS_TARGET_NAME ${o3de_project_name}) - add_subdirectory(Code) -endif() diff --git a/Templates/DefaultProject/Template/EngineFinder.cmake b/Templates/DefaultProject/Template/EngineFinder.cmake new file mode 100644 index 0000000000..5f791f5e3d --- /dev/null +++ b/Templates/DefaultProject/Template/EngineFinder.cmake @@ -0,0 +1,64 @@ +# +# 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. +# +# This file is copied during engine registration. Edits to this file will be lost next +# time a registration happens. + +include_guard() + +# Read the engine name from the project_json file +file(READ ${CMAKE_CURRENT_LIST_DIR}/project.json project_json) +string(JSON LY_ENGINE_NAME_TO_USE ERROR_VARIABLE json_error GET ${project_json} engine) +if(json_error) + message(FATAL_ERROR "Unable to read key 'engine' from 'project.json', error: ${json_error}") +endif() + +# Read the list of paths from ~.o3de/o3de_manifest.json +if($ENV{USERPROFILE} AND EXISTS $ENV{USERPROFILE}) + set(manifest_path $ENV{USERPROFILE}/.o3de/o3de_manifest.json) # Windows +else() + set(manifest_path $ENV{HOME}/.o3de/o3de_manifest.json) # Unix +endif() + +if(EXISTS ${manifest_path}) + file(READ ${manifest_path} manifest_json) + + string(JSON engine_paths_count ERROR_VARIABLE json_error LENGTH ${manifest_json} engine_paths) + if(json_error) + message(FATAL_ERROR "Unable to read key 'engine_paths' from '${manifest_path}', error: ${json_error}") + endif() + + string(JSON engine_paths_type ERROR_VARIABLE json_error TYPE ${manifest_json} engine_paths) + if(json_error OR NOT ${engine_paths_type} STREQUAL "OBJECT") + message(FATAL_ERROR "Type of 'engine_paths' in '${manifest_path}' is not a JSON Object, error: ${json_error}") + endif() + + math(EXPR engine_paths_count "${engine_paths_count}-1") + foreach(engine_path_index RANGE ${engine_paths_count}) + string(JSON engine_name ERROR_VARIABLE json_error MEMBER ${manifest_json} engine_paths ${engine_path_index}) + if(json_error) + message(FATAL_ERROR "Unable to read 'engine_paths/${engine_path_index}' from '${manifest_path}', error: ${json_error}") + endif() + + if(LY_ENGINE_NAME_TO_USE STREQUAL engine_name) + string(JSON engine_path ERROR_VARIABLE json_error GET ${manifest_json} engine_paths ${engine_name}) + if(json_error) + message(FATAL_ERROR "Unable to read value from 'engine_paths/${engine_name}', error: ${json_error}") + endif() + + if(engine_path) + list(APPEND CMAKE_MODULE_PATH "${engine_path}/cmake") + break() + endif() + endif() + endforeach() +else() + message(FATAL_ERROR "Engine registration is required before configuring a project. Please register an engine by running 'scripts/o3de register --this-engine'") +endif() diff --git a/Templates/DefaultProject/template.json b/Templates/DefaultProject/template.json index 56278a6b04..e823b6df19 100644 --- a/Templates/DefaultProject/template.json +++ b/Templates/DefaultProject/template.json @@ -24,6 +24,12 @@ "isTemplated": true, "isOptional": false }, + { + "file": "EngineFinder.cmake", + "origin": "EngineFinder.cmake", + "isTemplated": false, + "isOptional": false + }, { "file": "Code/${NameLower}_files.cmake", "origin": "Code/${NameLower}_files.cmake",