O3de updates restricted download (#229)

* fix project centric set current
* Adding newline to project.json template
* Adding newline to engine.json
* Changed register -this-engine to be data driven
* adding build server support
* fix log dir
* fix add remove
* fix template creation for restricted
* fix typos and descriptions
* Add newline to the end of template.json
* Adding newline to the end of assets_scan_folders.seteg
* current_project in global project that creates/edits the .o3de/Registry/bootstrap.setreg
* fix the build server flags
* fix the o3de manifest server portion
* disable project manager tests for now. Its changed too much and lytestools is not working at the moment. I will get back to this later.
* fix the Mac build config
* disable project_test, this is the project manager. It has changed too much for these tests to work at the moment. I'll get back to them

Co-authored-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com>
main
Colin Byrne 5 years ago committed by GitHub
parent b2523217c3
commit 43b474a4b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -25,13 +25,37 @@ include(cmake/LySet.cmake)
include(cmake/Version.cmake)
include(cmake/OutputDirectory.cmake)
# Set the engine_path and engine_json
set(o3de_engine_path ${CMAKE_CURRENT_LIST_DIR})
set(o3de_engine_json ${o3de_engine_path}/engine.json)
if(NOT PROJECT_NAME)
project(O3DE
LANGUAGES C CXX
VERSION ${LY_VERSION_STRING}
)
# o3de manifest
include(cmake/o3de_manifest.cmake)
endif()
################################################################################
# Resolve this engines name and restricted path
################################################################################
o3de_engine_name(${o3de_engine_json} o3de_engine_name)
o3de_restricted_path(${o3de_engine_json} o3de_engine_restricted_path)
message(STATUS "O3DE Engine Name: ${o3de_engine_name}")
message(STATUS "O3DE Engine Path: ${o3de_engine_path}")
if(o3de_engine_restricted_path)
message(STATUS "O3DE Engine Restricted Path: ${o3de_engine_restricted_path}")
endif()
# add the engines cmake folder to the CMAKE_MODULE_PATH
list(APPEND CMAKE_MODULE_PATH "${o3de_engine_path}/cmake")
################################################################################
# Initialize
################################################################################
include(cmake/GeneralSettings.cmake)
include(cmake/FileUtil.cmake)
include(cmake/PAL.cmake)
@ -60,20 +84,19 @@ include(cmake/Projects.cmake)
if(NOT INSTALLED_ENGINE)
# Add the rest of the targets
add_subdirectory(Code)
add_subdirectory(Gems)
else()
ly_find_o3de_packages()
endif()
# Add external subdirectories listed in the manifest
list(APPEND LY_EXTERNAL_SUBDIRS ${o3de_engine_external_subdirectories})
set(enabled_platforms
${PAL_PLATFORM_NAME}
${LY_PAL_TOOLS_ENABLED})
foreach(restricted_platform ${PAL_RESTRICTED_PLATFORMS})
if(restricted_platform IN_LIST enabled_platforms)
add_subdirectory(restricted/${restricted_platform})
endif()
endforeach()
# Add any engine restricted platforms as external subdirs
o3de_add_engine_restricted_platform_external_subdirs()
if(NOT INSTALLED_ENGINE)
add_subdirectory(scripts)

@ -169,5 +169,10 @@ namespace AZ::Utils
template AZ::Outcome<AZStd::vector<int8_t>, AZStd::string> ReadFile(AZStd::string_view filePath, size_t maxFileSize);
template AZ::Outcome<AZStd::vector<uint8_t>, AZStd::string> ReadFile(AZStd::string_view filePath, size_t maxFileSize);
AZ::IO::FixedMaxPathString GetO3deManifestDirectory()
{
AZ::IO::FixedMaxPath path = GetHomeDirectory();
path /= ".o3de";
return path.Native();
}
}

@ -88,6 +88,9 @@ namespace AZ
//! Retrieves the project name from the settings registry
AZ::SettingsRegistryInterface::FixedValueString GetProjectName();
//! Retrieves the full directory to the Home directory, i.e. "<userhome> or overrideHomeDirectory"
AZ::IO::FixedMaxPathString GetHomeDirectory();
//! Retrieves the full directory to the O3DE manifest directory, i.e. "<userhome>/.o3de"
AZ::IO::FixedMaxPathString GetO3deManifestDirectory();

@ -14,7 +14,7 @@
namespace AZ::Utils
{
AZ::IO::FixedMaxPathString GetO3deManifestDirectory()
AZ::IO::FixedMaxPathString GetHomeDirectory()
{
return {};
}

@ -25,8 +25,19 @@ namespace AZ
void NativeErrorMessageBox(const char*, const char*) {}
AZ::IO::FixedMaxPathString GetO3deManifestDirectory()
AZ::IO::FixedMaxPathString GetHomeDirectory()
{
constexpr AZStd::string_view overrideHomeDirKey = "/Amazon/Settings/override_home_dir";
AZ::IO::FixedMaxPathString overrideHomeDir;
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
{
if (settingsRegistry->Get(overrideHomeDir, overrideHomeDirKey))
{
AZ::IO::FixedMaxPath path{overrideHomeDir};
return path.Native();
}
}
if (const char* homePath = std::getenv("HOME"); homePath != nullptr)
{
AZ::IO::FixedMaxPath path{homePath};

@ -22,15 +22,25 @@ namespace AZ::Utils
::MessageBox(0, message, title, MB_OK | MB_ICONERROR);
}
AZ::IO::FixedMaxPathString GetO3deManifestDirectory()
AZ::IO::FixedMaxPathString GetHomeDirectory()
{
constexpr AZStd::string_view overrideHomeDirKey = "/Amazon/Settings/override_home_dir";
AZ::IO::FixedMaxPathString overrideHomeDir;
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
{
if (settingsRegistry->Get(overrideHomeDir, overrideHomeDirKey))
{
AZ::IO::FixedMaxPath path{overrideHomeDir};
return path.Native();
}
}
char userProfileBuffer[AZ::IO::MaxPathLength]{};
size_t variableSize = 0;
auto err = getenv_s(&variableSize, userProfileBuffer, AZ::IO::MaxPathLength, "USERPROFILE");
if (!err)
{
AZ::IO::FixedMaxPath path{ userProfileBuffer };
path /= ".o3de";
return path.Native();
}

@ -1,5 +1,5 @@
{
"gem_name": "AtomLyIntegration_AtomFont",
"gem_name": "AtomFont",
"Dependencies": [
],
"GemFormatVersion": 4,

@ -1,83 +0,0 @@
#
# 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.
#
add_subdirectory(TextureAtlas)
add_subdirectory(LmbrCentral)
add_subdirectory(LyShine)
add_subdirectory(Maestro)
add_subdirectory(SceneProcessing)
add_subdirectory(SurfaceData)
add_subdirectory(EMotionFX)
add_subdirectory(Achievements)
add_subdirectory(CameraFramework)
add_subdirectory(HttpRequestor)
add_subdirectory(Gestures)
add_subdirectory(FastNoise)
add_subdirectory(GradientSignal)
add_subdirectory(AudioSystem)
add_subdirectory(AudioEngineWwise)
add_subdirectory(GraphCanvas)
add_subdirectory(DebugDraw)
add_subdirectory(ImGui)
add_subdirectory(InAppPurchases)
add_subdirectory(LocalUser)
add_subdirectory(LyShineExamples)
add_subdirectory(ExpressionEvaluation)
add_subdirectory(MessagePopup)
add_subdirectory(PhysX)
add_subdirectory(PhysXDebug)
add_subdirectory(ScriptEvents)
add_subdirectory(AssetValidation)
add_subdirectory(VirtualGamepad)
add_subdirectory(SaveData)
add_subdirectory(Camera)
add_subdirectory(GameState)
add_subdirectory(Vegetation)
add_subdirectory(GameStateSamples)
add_subdirectory(SliceFavorites)
add_subdirectory(Metastream)
add_subdirectory(ScriptCanvas)
add_subdirectory(ScriptedEntityTweener)
add_subdirectory(StartingPointMovement)
add_subdirectory(StartingPointInput)
add_subdirectory(ScriptCanvasPhysics)
add_subdirectory(StartingPointCamera)
add_subdirectory(Presence)
add_subdirectory(ScriptCanvasTesting)
add_subdirectory(TestAssetBuilder)
add_subdirectory(ScriptCanvasDeveloper)
add_subdirectory(CustomAssetExample)
add_subdirectory(AutomatedLauncherTesting)
add_subdirectory(NvCloth)
add_subdirectory(AssetMemoryAnalyzer)
add_subdirectory(CertificateManager)
add_subdirectory(TickBusOrderViewer)
add_subdirectory(MultiplayerCompression)
add_subdirectory(Multiplayer)
add_subdirectory(SceneLoggingExample)
add_subdirectory(VideoPlaybackFramework)
add_subdirectory(CrashReporting)
add_subdirectory(Twitch)
add_subdirectory(EditorPythonBindings)
add_subdirectory(QtForPython)
add_subdirectory(Microphone)
add_subdirectory(Atom)
add_subdirectory(AtomLyIntegration)
add_subdirectory(RADTelemetry)
add_subdirectory(GraphModel)
add_subdirectory(LandscapeCanvas)
add_subdirectory(WhiteBox)
add_subdirectory(Blast)
add_subdirectory(PythonAssetBuilder)
add_subdirectory(Prefab)
add_subdirectory(AWSClientAuth)
add_subdirectory(AWSCore)
add_subdirectory(AWSMetrics)

@ -1,5 +1,5 @@
{
"gem_name": "EmotionFX",
"gem_name": "EMotionFX",
"Dependencies": [
{
"Uuid": "ff06785f7145416b9d46fde39098cb0c",

@ -9,13 +9,18 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# {END_LICENSE}
set(o3de_gem_path ${CMAKE_CURRENT_LIST_DIR})
set(o3de_gem_json ${o3de_gem_path}/gem.json)
o3de_gem_name(${o3de_gem_json} o3de_gem_name)
o3de_restricted_path(${o3de_gem_json} o3de_gem_restricted_path)
# Currently we are in the DefaultProjectSource folder: ${CMAKE_CURRENT_LIST_DIR}
# Get the platform specific folder ${pal_dir} for the current 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: DefaultProjectSource/Platform/<platorm_name> or
# <restricted_folder>/<platform_name>/DefaultProjectSource
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME})
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} ${o3de_gem_restricted_path} ${o3de_gem_path} ${o3de_gem_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.

@ -15,7 +15,7 @@
# in which case it will see if that platform is present here or in the restricted folder.
# i.e. It could here in our gem : Gems/${Name}/Code/Platform/<platorm_name> or
# <restricted_folder>/<platform_name>/Gems/${Name}/Code
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME})
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} ${o3de_gem_restricted_path} ${o3de_gem_path} ${o3de_gem_name})
# Now that we have the platform abstraction layer (PAL) folder for this folder, thats where we will find the
# traits for this platform. Traits for a platform are defines for things like whether or not something in this gem

@ -4,7 +4,11 @@
"license": "What license ${Name} uses goes here: i.e. https://opensource.org/licenses/MIT",
"display_name": "${Name}",
"summary": "A short description of ${Name}.",
"canonical_tags": ["Gem"],
"user_tags": ["${Name}"],
"canonical_tags": [
"Gem"
],
"user_tags": [
"${Name}"
],
"icon_path": "preview.png"
}

@ -1,5 +1,7 @@
{
"template_name": "DefaultGem",
"restricted": "o3de",
"restricted_platform_relative_path": "Templates",
"origin": "The primary repo for DefaultGem goes here: i.e. http://www.mydomain.com",
"license": "What license DefaultGem uses goes here: i.e. https://opensource.org/licenses/MIT",
"display_name": "DefaultGem",
@ -270,6 +272,10 @@
}
],
"createDirectories": [
{
"dir": "Assets",
"origin": "Assets"
},
{
"dir": "Code",
"origin": "Code"
@ -339,4 +345,4 @@
"origin": "Platform/iOS"
}
]
}
}

@ -23,38 +23,64 @@ 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)
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'")
# 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()
set_property(GLOBAL APPEND PROPERTY LY_PROJECTS_TARGET_NAME ${project_target_name})
# 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)
# Currently we are in the ${Name} folder: ${CMAKE_CURRENT_LIST_DIR}
# Get the platform specific folder ${pal_dir} for the current folder: ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}
# 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: ${Name}/Platform/<platorm_name> or
# <restricted_folder>/<platform_name>/${Name}
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME})
# i.e. It could here: TestDP/Platform/<platorm_name> or
# <restricted_folder>/<platform_name>/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()

@ -15,7 +15,7 @@
# in which case it will see if that platform is present here or in the restricted folder.
# i.e. It could here : ${Name}/Code/Platform/<platorm_name> or
# <restricted_folder>/<platform_name>/${Name}/Code
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME})
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
# traits for this platform. Traits for a platform are defines for things like whether or not something in this project

@ -1,56 +0,0 @@
# {BEGIN_LICENSE}
#
# 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.
#
# {END_LICENSE}
# 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
file(TO_CMAKE_PATH "$ENV{USERPROFILE}" home_directory) # Windows
if((NOT home_directory) OR (NOT EXISTS ${home_directory}))
file(TO_CMAKE_PATH "$ENV{HOME}" home_directory)# Unix
endif()
if (NOT home_directory)
message(FATAL_ERROR "Cannot find user home directory, the o3de manifest cannot be found")
endif()
# Set manifest path to path in the user home directory
set(manifest_path ${home_directory}/.o3de/o3de_manifest.json)
if(EXISTS ${manifest_path})
file(READ ${manifest_path} manifest_json)
string(JSON engines_count ERROR_VARIABLE json_error LENGTH ${manifest_json} engines)
if(json_error)
message(FATAL_ERROR "Unable to read key 'engines' from '${manifest_path}', error: ${json_error}")
endif()
math(EXPR engines_count "${engines_count}-1")
foreach(engine_path_index RANGE ${engines_count})
string(JSON engine_path ERROR_VARIABLE json_error GET ${manifest_json} engines ${engine_path_index})
if(${json_error})
message(FATAL_ERROR "Unable to read engines[${engine_path_index}] '${manifest_path}', error: ${json_error}")
endif()
list(APPEND CMAKE_MODULE_PATH "${engine_path}/cmake")
endforeach()
endif()

@ -1,3 +1,4 @@
// {BEGIN_LICENSE}
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
@ -9,6 +10,7 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// {END_LICENSE}
#pragma once

@ -4,8 +4,12 @@
"license": "What license ${Name} uses goes here: i.e. https://opensource.org/licenses/MIT",
"display_name": "${Name}",
"summary": "A short description of ${Name}.",
"canonical_tags": ["Project"],
"user_tags": ["${Name}"],
"canonical_tags": [
"Project"
],
"user_tags": [
"${Name}"
],
"icon_path": "preview.png",
"engine": "o3de"
}
}

@ -1,5 +1,7 @@
{
"template_name": "DefaultProject",
"restricted": "o3de",
"restricted_platform_relative_path": "Templates",
"origin": "The primary repo for DefaultProject goes here: i.e. http://www.mydomain.com",
"license": "What license DefaultProject uses goes here: i.e. https://opensource.org/licenses/MIT",
"display_name": "DefaultProject",
@ -268,12 +270,6 @@
"isTemplated": false,
"isOptional": false
},
{
"file": "EngineFinder.cmake",
"origin": "EngineFinder.cmake",
"isTemplated": true,
"isOptional": false
},
{
"file": "Platform/Android/android_project.cmake",
"origin": "Platform/Android/android_project.cmake",
@ -568,6 +564,12 @@
"isTemplated": true,
"isOptional": false
},
{
"file": "ShaderLib/raytracingscenesrg.srgi",
"origin": "ShaderLib/raytracingscenesrg.srgi",
"isTemplated": true,
"isOptional": false
},
{
"file": "ShaderLib/scenesrg.srgi",
"origin": "ShaderLib/scenesrg.srgi",

@ -22,7 +22,7 @@ file(GLOB detection_files "cmake/Platform/*/PALDetection_*.cmake")
foreach(detection_file ${detection_files})
include(${detection_file})
endforeach()
file(GLOB detection_files "restricted/*/cmake/PALDetection_*.cmake")
file(GLOB detection_files ${o3de_engine_restricted_path}/*/cmake/PALDetection_*.cmake)
foreach(detection_file ${detection_files})
include(${detection_file})
endforeach()
@ -36,43 +36,99 @@ string(TOLOWER ${PAL_HOST_PLATFORM_NAME} PAL_HOST_PLATFORM_NAME_LOWERCASE)
ly_set(PAL_HOST_PLATFORM_NAME_LOWERCASE ${PAL_HOST_PLATFORM_NAME_LOWERCASE})
set(PAL_RESTRICTED_PLATFORMS)
file(GLOB pal_restricted_files "restricted/*/cmake/PAL_*.cmake")
string(LENGTH ${o3de_engine_restricted_path} engine_restricted_length)
file(GLOB pal_restricted_files ${o3de_engine_restricted_path}/*/cmake/PAL_*.cmake)
foreach(pal_restricted_file ${pal_restricted_files})
string(FIND ${pal_restricted_file} "restricted/" start)
math(EXPR start "${start} + 11")
string(FIND ${pal_restricted_file} "/cmake/PAL" end)
if(${end} GREATER -1)
math(EXPR length "${end} - ${start}")
string(SUBSTRING ${pal_restricted_file} ${start} ${length} platform)
math(EXPR platform_length "${end} - ${engine_restricted_length} - 1")
math(EXPR platform_start "${engine_restricted_length} + 1")
string(SUBSTRING ${pal_restricted_file} ${platform_start} ${platform_length} platform)
list(APPEND PAL_RESTRICTED_PLATFORMS "${platform}")
endif()
endforeach()
ly_set(PAL_RESTRICTED_PLATFORMS ${PAL_RESTRICTED_PLATFORMS})
function(ly_get_absolute_pal_filename out_name in_name)
if(${ARGC} GREATER 2)
set(repo_dir ${ARGV2})
else()
if(DEFINED LY_ROOT_FOLDER)
set(repo_dir ${LY_ROOT_FOLDER})
else()
set(repo_dir ${CMAKE_CURRENT_SOURCE_DIR})
set(full_name ${in_name})
if(${ARGC} GREATER 4)
# The user has supplied an object restricted path, the object path and the object name for consideration
set(object_restricted_path ${ARGV2})
set(object_path ${ARGV3})
set(object_name ${ARGV4})
# if the file is not in the object path then we cannot determine a PAL file for it
file(RELATIVE_PATH relative_path ${object_path} ${full_name})
if (NOT (IS_ABSOLUTE relative_path OR relative_path MATCHES [[^(\.\./)+(.*)]]))
if (NOT EXISTS ${full_name})
string(REGEX MATCH "${object_path}/(.*)/Platform/([^/]*)/?(.*)$" match ${full_name})
if(NOT CMAKE_MATCH_1)
string(REGEX MATCH "${object_path}/Platform/([^/]*)/?(.*)$" match ${full_name})
set(full_name ${object_restricted_path}/${CMAKE_MATCH_1}/${object_name})
if(CMAKE_MATCH_2)
string(APPEND full_name "/" ${CMAKE_MATCH_2})
endif()
elseif("${CMAKE_MATCH_2}" IN_LIST PAL_RESTRICTED_PLATFORMS)
set(full_name ${object_restricted_path}/${CMAKE_MATCH_2}/${object_name}/${CMAKE_MATCH_1})
if(CMAKE_MATCH_3)
string(APPEND full_name "/" ${CMAKE_MATCH_3})
endif()
endif()
endif()
endif()
endif()
set(${out_name} ${full_name} PARENT_SCOPE)
set(full_name ${in_name})
if (NOT EXISTS ${full_name})
string(REGEX MATCH "${repo_dir}/(.*)/Platform/([^/]*)/?(.*)$" match ${full_name})
if(PAL_RESTRICTED_PLATFORMS)
if("${CMAKE_MATCH_2}" IN_LIST PAL_RESTRICTED_PLATFORMS)
set(full_name ${repo_dir}/restricted/${CMAKE_MATCH_2}/${CMAKE_MATCH_1})
if(NOT "${CMAKE_MATCH_3}" STREQUAL "")
string(APPEND full_name "/" ${CMAKE_MATCH_3})
elseif(${ARGC} GREATER 3)
# The user has supplied an object restricted path, the object path for consideration
set(object_restricted_path ${ARGV2})
set(object_path ${ARGV3})
# if the file is not in the object path then we cannot determine a PAL file for it
file(RELATIVE_PATH relative_path ${object_path} ${full_name})
if (NOT (IS_ABSOLUTE relative_path OR relative_path MATCHES [[^(\.\./)+(.*)]]))
if (NOT EXISTS ${full_name})
string(REGEX MATCH "${object_path}/(.*)/Platform/([^/]*)/?(.*)$" match ${full_name})
if(NOT CMAKE_MATCH_1)
string(REGEX MATCH "${object_path}/Platform/([^/]*)/?(.*)$" match ${full_name})
set(full_name ${object_restricted_path}/${CMAKE_MATCH_1})
if(CMAKE_MATCH_2)
string(APPEND full_name "/" ${CMAKE_MATCH_2})
endif()
elseif("${CMAKE_MATCH_2}" IN_LIST PAL_RESTRICTED_PLATFORMS)
set(full_name ${object_restricted_path}/${CMAKE_MATCH_2}/${CMAKE_MATCH_1})
if(CMAKE_MATCH_3)
string(APPEND full_name "/" ${CMAKE_MATCH_3})
endif()
endif()
endif()
endif()
set(${out_name} ${full_name} PARENT_SCOPE)
else()
# The user has not supplied any path so we must assume it is the o3de engine restricted and o3de engine path
# if the file is not in the o3de engine path then we cannot determine a PAL file for it
file(RELATIVE_PATH relative_path ${o3de_engine_path} ${full_name})
if (NOT (IS_ABSOLUTE relative_path OR relative_path MATCHES [[^(\.\./)+(.*)]]))
if (NOT EXISTS ${full_name})
string(REGEX MATCH "${o3de_engine_path}/(.*)/Platform/([^/]*)/?(.*)$" match ${full_name})
if(NOT CMAKE_MATCH_1)
string(REGEX MATCH "${o3de_engine_path}/Platform/([^/]*)/?(.*)$" match ${full_name})
set(full_name ${o3de_engine_restricted_path}/${CMAKE_MATCH_1})
if(CMAKE_MATCH_2)
string(APPEND full_name "/" ${CMAKE_MATCH_2})
endif()
elseif("${CMAKE_MATCH_2}" IN_LIST PAL_RESTRICTED_PLATFORMS)
set(full_name ${o3de_engine_restricted_path}/${CMAKE_MATCH_2}/${CMAKE_MATCH_1})
if(CMAKE_MATCH_3)
string(APPEND full_name "/" ${CMAKE_MATCH_3})
endif()
endif()
endif()
endif()
set(${out_name} ${full_name} PARENT_SCOPE)
endif()
set(${out_name} ${full_name} PARENT_SCOPE)
endfunction()
function(ly_get_list_relative_pal_filename out_name in_name)
@ -93,3 +149,25 @@ set(LY_DISABLE_TEST_MODULES FALSE CACHE BOOL "Option to forcibly disable the inc
if(LY_DISABLE_TEST_MODULES)
ly_set(PAL_TRAIT_BUILD_TESTS_SUPPORTED FALSE)
endif()
################################################################################
# Add each restricted platform in the engines restricted folder
# If the enabled restricted platform does not have a folder add one.
# If the restricted platform folder does not have a CMakeLists.txt, create one
# so the add_subdirectory on the external folder does not fail.
################################################################################
function(o3de_add_engine_restricted_platform_external_subdirs)
foreach(restricted_platform ${PAL_RESTRICTED_PLATFORMS})
if(restricted_platform IN_LIST enabled_platforms)
set(o3de_engine_restricted_platform_folder ${o3de_engine_restricted_path}/${restricted_platform})
if(NOT EXISTS ${o3de_engine_restricted_platform_folder})
file(MAKE_DIRECTORY ${o3de_engine_restricted_platform_folder})
endif()
set(o3de_engine_restricted_platform_folder_cmakelists ${o3de_engine_restricted_platform_folder}/CMakeLists.txt)
if(NOT EXISTS ${o3de_engine_restricted_platform_folder_cmakelists})
file(TOUCH ${o3de_engine_restricted_platform_folder_cmakelists})
endif()
list(APPEND LY_EXTERNAL_SUBDIRS ${o3de_engine_restricted_platform_folder})
endif()
endforeach()
endfunction()

@ -1,634 +0,0 @@
#
# 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.
#
import argparse
import logging
import os
import sys
import pathlib
from cmake.Tools import utils
from cmake.Tools import common
logger = logging.getLogger()
logging.basicConfig()
def add_gem_dependency(cmake_file: str,
gem_target: str) -> int:
"""
adds a gem dependency to a cmake file
:param cmake_file: path to the cmake file
:param gem_target: name of the cmake target
:return: 0 for success or non 0 failure code
"""
if not os.path.isfile(cmake_file):
logger.error(f'Failed to locate cmake file {cmake_file}')
return 1
# on a line by basis, see if there already is Gem::{gem_name}
# find the first occurrence of a gem, copy its formatting and replace
# the gem name with the new one and append it
# if the gem is already present fail
t_data = []
added = False
with open(cmake_file, 'r') as s:
for line in s:
if f'Gem::{gem_target}' in line:
logger.warning(f'{gem_target} is already a gem dependency.')
return 0
if not added and r'Gem::' in line:
new_gem = ' ' * line.find(r'Gem::') + f'Gem::{gem_target}\n'
t_data.append(new_gem)
added = True
t_data.append(line)
# if we didn't add it the set gem dependencies could be empty so
# add a new gem, if empty the correct format is 1 tab=4spaces
if not added:
index = 0
for line in t_data:
index = index + 1
if r'set(GEM_DEPENDENCIES' in line:
t_data.insert(index, f' Gem::{gem_target}\n')
added = True
break
# if we didn't add it then it's not here, add a whole new one
if not added:
t_data.append('\n')
t_data.append('set(GEM_DEPENDENCIES\n')
t_data.append(f' Gem::{gem_target}\n')
t_data.append(')\n')
# write the cmake
os.unlink(cmake_file)
with open(cmake_file, 'w') as s:
s.writelines(t_data)
return 0
def get_project_gem_list(project_path: str,
platform: str = 'Common') -> set:
runtime_gems = get_gem_list(get_dependencies_cmake(project_path, 'runtime', platform))
tool_gems = get_gem_list(get_dependencies_cmake(project_path, 'tool', platform))
server_gems = get_gem_list(get_dependencies_cmake(project_path, 'server', platform))
return runtime_gems.union(tool_gems.union(server_gems))
def get_gem_list(cmake_file: str) -> set:
"""
Gets a list of declared gem dependencies of a cmake file
:param cmake_file: path to the cmake file
:return: set of gems found
"""
if not os.path.isfile(cmake_file):
logger.error(f'Failed to locate cmake file {cmake_file}')
return set()
gem_list = set()
with open(cmake_file, 'r') as s:
for line in s:
gem_name = line.split('Gem::')
if len(gem_name) > 1:
# Only take the name as everything leading up to the first '.' if found
# Gem naming conventions will have GemName.Editor, GemName.Server, and GemName
# as different targets of the GemName Gem
gem_list.add(gem_name[1].split('.')[0].replace('\n', ''))
return gem_list
def remove_gem_dependency(cmake_file: str,
gem_target: str) -> int:
"""
removes a gem dependency from a cmake file
:param cmake_file: path to the cmake file
:param gem_target: cmake target name
:return: 0 for success or non 0 failure code
"""
if not os.path.isfile(cmake_file):
logger.error(f'Failed to locate cmake file {cmake_file}')
return 1
# on a line by basis, remove any line with Gem::{gem_name}
t_data = []
# Remove the gem from the cmake_dependencies file by skipping the gem name entry
removed = False
with open(cmake_file, 'r') as s:
for line in s:
if f'Gem::{gem_target}' in line:
removed = True
else:
t_data.append(line)
if not removed:
logger.error(f'Failed to remove Gem::{gem_target} from cmake file {cmake_file}')
return 1
# write the cmake
os.unlink(cmake_file)
with open(cmake_file, 'w') as s:
s.writelines(t_data)
return 0
def add_gem_subdir(cmake_file: str,
gem_name: str) -> int:
"""
adds a gem subdir to a cmake file
:param cmake_file: path to the cmake file
:param gem_name: name of the gem to add
:return: 0 for success or non 0 failure code
"""
if not os.path.isfile(cmake_file):
logger.error(f'Failed to locate cmake file {cmake_file}')
return 1
if not utils.validate_identifier(gem_name):
logger.error(f'{gem_name} is not a valid gem name')
return 1
# on a line by basis, see if there already is Gem::{gem_name}
# find the first occurrence of a gem, copy its formatting and replace
# the gem name with the new one and append it
# if the gem is already present fail
t_data = []
added = False
add_line = f'add_subdirectory({gem_name})'
with open(cmake_file, 'r') as s:
for line in s:
if add_line in line:
logger.info(f'{add_line} is already in {cmake_file} - skipping.')
return 0
if not added and r'add_subdirectory(' in line:
new_gem = ' ' * line.find(r'add_subdirectory(') + f'add_subdirectory({gem_name})\n'
t_data.append(new_gem)
added = True
t_data.append(line)
if not added:
logger.error(f'Failed to add add_subdirectory({gem_name}) from {cmake_file}.')
return 1
# write the cmake
os.unlink(cmake_file)
with open(cmake_file, 'w') as s:
s.writelines(t_data)
return 0
def remove_gem_subdir(cmake_file: str,
gem_name: str) -> int:
"""
removes a gem subdir form a cmake file
:param cmake_file: path to the cmake file
:param gem_name: name of the gem to remove
:return: 0 for success or non 0 failure code
"""
if not os.path.isfile(cmake_file):
logger.error(f'Failed to locate cmake file {cmake_file}')
return 1
# on a line by basis, remove any line with Gem::{gem_name}
t_data = []
# Remove the gem from the cmake_dependencies file by skipping the gem name entry
removed = False
with open(cmake_file, 'r') as s:
for line in s:
if f'add_subdirectory({gem_name})' in line:
removed = True
else:
t_data.append(line)
if not removed:
logger.error(f'Failed to remove add_subdirectory({gem_name}) from {cmake_file}')
return 1
# write the cmake
os.unlink(cmake_file)
with open(cmake_file, 'w') as s:
s.writelines(t_data)
return 0
def get_dependencies_cmake(project_path: str,
dependency_type: str = 'runtime',
platform: str = 'Common') -> str:
if not project_path:
return ''
if platform == 'Common':
dependencies_file = f'{dependency_type}_dependencies.cmake'
gem_path = os.path.join(project_path, 'Gem', 'Code', dependencies_file)
if os.path.isfile(gem_path):
return gem_path
return os.path.join(project_path, 'Code', dependencies_file)
else:
dependencies_file = f'{platform.lower()}_{dependency_type}_dependencies.cmake'
gem_path = os.path.join(project_path, 'Gem', 'Code', 'Platform', platform, dependencies_file)
if os.path.isfile(gem_path):
return gem_path
return os.path.join(project_path, 'Code', 'Platform', platform, dependencies_file)
# this function is making some not so good assumptions about gem naming
def find_all_gems(gem_folder_list: list) -> list:
"""
Find all Modules which appear to be gems living within a list of folders
This method can be replaced or improved on with something more deterministic when LYN-1942 is done
:param gem_folder_list:
:return: list of gem objects containing gem Name and Path
"""
module_gems = {}
for folder in gem_folder_list:
root_len = len(os.path.normpath(folder).split(os.sep))
for root, dirs, files in os.walk(folder):
for file in files:
if file == 'CMakeLists.txt':
with open(os.path.join(root, file), 'r') as s:
for line in s:
trimmed = line.lstrip()
if trimmed.startswith('NAME '):
trimmed = trimmed.rstrip(' \n')
split_trimmed = trimmed.split(' ')
# Is this a type indicating a gem lives here
if len(split_trimmed) == 3 and split_trimmed[2] in ['MODULE', 'GEM_MODULE',
'${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE}']:
# Hold our "Name parts" such as Gem.MyGem.Editor as ['Gem', 'MyGem', 'Editor']
name_split = split_trimmed[1].split('.')
split_folders = os.path.normpath(root).split(os.sep)
# This verifies we were passed a folder lower in the folder structure than the
# gem we've found, so we'll name it by the first directory. This is the common
# case currently of being handed "Gems" where things that live under Gems are
# known by the directory name
if len(split_folders) > root_len:
# Assume the gem is named by the root folder. May modules may exist
# together within the gem that are added collectively
gem_name = split_folders[root_len]
else:
# We were passed the folder with the gem already inside it, we have to name
# it by the gem name we found
gem_name = name_split[0]
this_gem = module_gems.get(gem_name, None)
if not this_gem:
if len(split_folders) > root_len:
# Assume the gem is named by the root folder. May modules may exist
# together within the gem that are added collectively
this_gem = {'Name': gem_name,
'Path': os.path.join(folder, split_folders[root_len])}
else:
this_gem = {'Name': gem_name, 'Path': folder}
# Add any module types we know to be tools only here
if len(name_split) > 1 and name_split[1] in ['Editor', 'Builder']:
this_gem['Tools'] = True
else:
this_gem['Runtime'] = True
this_gem['Tools'] = True
module_gems[gem_name] = this_gem
break
return sorted(list(module_gems.values()), key=lambda x: x.get('Name'))
def find_gem_modules(gem_folder: str) -> list:
"""
Find all gem modules which appear to be gems living in this folder
:param gem_folder: the folder to walk down
:return: list of gem targets
"""
module_identifiers = [
'MODULE',
'GEM_MODULE',
'${PAL_TRAIT_MONOLITHIC_DRIVEN_MODULE_TYPE}'
]
modules = []
for root, dirs, files in os.walk(gem_folder):
for file in files:
if file == 'CMakeLists.txt':
with open(os.path.join(root, file), 'r') as s:
for line in s:
trimmed = line.lstrip()
if trimmed.startswith('NAME '):
trimmed = trimmed.rstrip(' \n')
split_trimmed = trimmed.split(' ')
if len(split_trimmed) == 3 and split_trimmed[2] in module_identifiers:
modules.append(split_trimmed[1])
return modules
def add_remove_gem(add: bool,
dev_root: str,
gem_path: str,
gem_target: str,
project_path: str,
dependencies_file: str or None,
project_restricted_path: str = 'restricted',
runtime_dependency: bool = False,
tool_dependency: bool = False,
server_dependency: bool = False,
platforms: str = 'Common',
gem_cmake: str = None) -> int:
"""
add a gem to a project
:param add: should we add a gem, if false we remove a gem
:param dev_root: the dev root of the engine
:param gem_path: path to the gem to add
:param gem_target: the name of teh cmake gem module
:param project_path: path to the project to add the gem to
:param dependencies_file: if this dependency goes/is in a specific file
:param project_restricted_path: path to the projects restricted folder
:param runtime_dependency: bool to specify this is a runtime gem for the game
:param tool_dependency: bool to specify this is a tool gem for the editor
:param server_dependency: bool to specify this is a server gem for the server
:param platforms: str to specify common or which specific platforms
:param gem_cmake: str to specify that this gem should be removed from the Gems/CMakeLists.txt
:return: 0 for success or non 0 failure code
"""
# if no dev root error
if not dev_root:
logger.error('Dev root cannot be empty.')
return 1
if not os.path.isabs(dev_root):
dev_root = os.path.abspath(dev_root)
dev_root = pathlib.Path(dev_root)
if not dev_root.is_dir():
logger.error(f'Dev root {dev_root} is not a folder.')
return 1
# if no project path error
if not project_path:
logger.error('Project path cannot be empty.')
return 1
if not os.path.isabs(project_path):
project_path = f'{dev_root}/{project_path}'
project_path = pathlib.Path(project_path)
if not project_path.is_dir():
logger.error(f'Project path {project_path} is not a folder.')
return 1
project_restricted_path = project_restricted_path.replace('\\', '/')
if not os.path.isabs(project_restricted_path):
project_restricted_path = f'{dev_root}/{project_restricted_path}'
project_restricted_path = pathlib.Path(project_restricted_path)
if not project_restricted_path.is_dir():
logger.error(f'Project Restricted path {project_restricted_path} is not a folder.')
return 1
# if no gem path error
if not gem_path:
logger.error('Gem path cannot be empty.')
return 1
if not os.path.isabs(gem_path):
gem_path = f'{dev_root}/Gems/{gem_path}'
gem_path = pathlib.Path(gem_path)
# make sure this gem already exists if we're adding. We can always remove a gem.
if add and not gem_path.is_dir():
logger.error(f'{gem_path} dir does not exist.')
return 1
# find all available modules in this gem_path
modules = find_gem_modules(gem_path)
if len(modules) == 0:
logger.error(f'No gem modules found.')
return 1
# if gem target not specified, see if there is only 1 module
if not gem_target:
if len(modules) == 1:
gem_target = modules[0]
else:
logger.error(f'Gem target not specified: {modules}')
return 1
elif gem_target not in modules:
logger.error(f'Gem target not in gem modules: {modules}')
return 1
# gem cmake list text file is assumed to be in the parent folder is not specified
if add or isinstance(gem_cmake, str):
if not gem_cmake:
gem_cmake = gem_path.parent / 'CMakeLists.txt'
if not os.path.isabs(gem_cmake):
gem_cmake = f'{dev_root}/{gem_cmake}'
gem_cmake = pathlib.Path(gem_cmake)
if not gem_cmake.is_file():
logger.error(f'CMakeLists.txt file {gem_cmake} does not exist.')
return 1
# if the user has not specified either we will assume they meant the most common which is runtime
if not runtime_dependency and not tool_dependency and not server_dependency and not dependencies_file:
logger.warning("Dependency type not specified: Assuming '--runtime-dependency'")
runtime_dependency = True
ret_val = 0
# if the user has specified the dependencies file then ignore the runtime_dependency and tool_dependency flags
if dependencies_file:
dependencies_file = pathlib.Path(dependencies_file)
# make sure this is a project has a dependencies_file
if not dependencies_file.is_file():
logger.error(f'Dependencies file {dependencies_file} is not present.')
return 1
if add:
# add the dependency
ret_val = add_gem_dependency(dependencies_file, gem_target)
else:
# remove the dependency
ret_val = remove_gem_dependency(dependencies_file, gem_target)
else:
if ',' in platforms:
platforms = platforms.split(',')
else:
platforms = [platforms]
for platform in platforms:
if runtime_dependency:
# make sure this is a project has a runtime_dependencies.cmake file
project_runtime_dependencies_file = pathlib.Path(get_dependencies_cmake(project_path, 'runtime', platform))
if not project_runtime_dependencies_file.is_file():
logger.error(f'Runtime dependencies file {project_runtime_dependencies_file} is not present.')
return 1
if add:
# add the dependency
ret_val = add_gem_dependency(project_runtime_dependencies_file, gem_target)
else:
# remove the dependency
ret_val = remove_gem_dependency(project_runtime_dependencies_file, gem_target)
if (ret_val == 0 or not add) and tool_dependency:
# make sure this is a project has a tool_dependencies.cmake file
project_tool_dependencies_file = pathlib.Path(get_dependencies_cmake(project_path, 'tool', platform))
if not project_tool_dependencies_file.is_file():
logger.error(f'Tool dependencies file {project_tool_dependencies_file} is not present.')
return 1
if add:
# add the dependency
ret_val = add_gem_dependency(project_tool_dependencies_file, gem_target)
else:
# remove the dependency
ret_val = remove_gem_dependency(project_tool_dependencies_file, gem_target)
if (ret_val == 0 or not add) and server_dependency:
# make sure this is a project has a tool_dependencies.cmake file
project_server_dependencies_file = pathlib.Path(get_dependencies_cmake(project_path, 'server', platform))
if not project_server_dependencies_file.is_file():
logger.error(f'Server dependencies file {project_server_dependencies_file} is not present.')
return 1
if add:
# add the dependency
ret_val = add_gem_dependency(project_server_dependencies_file, gem_target)
else:
# remove the dependency
ret_val = remove_gem_dependency(project_server_dependencies_file, gem_target)
if add:
# add the gem subdir to the CMakeList.txt
ret_val = add_gem_subdir(gem_cmake, gem_path.name)
elif gem_cmake:
# remove the gem subdir from the CMakeList.txt
ret_val = remove_gem_subdir(gem_cmake, gem_path.name)
return ret_val
def _run_add_gem(args: argparse) -> int:
return add_remove_gem(True,
common.determine_engine_root(),
args.gem_path,
args.gem_target,
args.project_path,
args.dependencies_file,
args.project_restricted_path,
args.runtime_dependency,
args.tool_dependency,
args.server_dependency,
args.platforms,
args.add_to_cmake)
def _run_remove_gem(args: argparse) -> int:
return add_remove_gem(False,
common.determine_engine_root(),
args.gem_path,
args.gem_target,
args.project_path,
args.dependencies_file,
args.project_restricted_path,
args.runtime_dependency,
args.tool_dependency,
args.server_dependency,
args.platforms,
args.remove_from_cmake)
def add_args(parser, subparsers) -> None:
"""
add_args is called to add expected parser arguments and subparsers arguments to each command such that it can be
invoked locally or aggregated by a central python file.
Ex. Directly run from this file alone with: python add_remove_gem.py add_gem --gem TestGem --project TestProject
OR
lmbr.py can aggregate commands by importing add_remove_gem, call add_args and
execute: python lmbr.py add_gem --gem TestGem --project TestProject
:param parser: the caller instantiates a parser and passes it in here
:param subparsers: the caller instantiates subparsers and passes it in here
"""
add_gem_subparser = subparsers.add_parser('add-gem')
add_gem_subparser.add_argument('-pp', '--project-path', type=str, required=True,
help='The path to the project, can be absolute or dev root relative')
add_gem_subparser.add_argument('-prp', '--project-restricted-path', type=str, required=False,
default='restricted',
help='The path to the projects restricted folder, can be absolute or dev root'
' relative')
add_gem_subparser.add_argument('-gp', '--gem-path', type=str, required=True,
help='The path to the gem, can be absolute or dev root/Gems relative')
add_gem_subparser.add_argument('-gt', '--gem-target', type=str, required=False,
help='The cmake target name to add. If not specified it will assume gem_name')
add_gem_subparser.add_argument('-df', '--dependencies-file', type=str, required=False,
help='The cmake dependencies file in which the gem dependencies are specified.'
'If not specified it will assume ')
add_gem_subparser.add_argument('-rd', '--runtime-dependency', action='store_true', required=False,
default=False,
help='Optional toggle if this gem should be added as a runtime dependency')
add_gem_subparser.add_argument('-td', '--tool-dependency', action='store_true', required=False,
default=False,
help='Optional toggle if this gem should be added as a tool dependency')
add_gem_subparser.add_argument('-sd', '--server-dependency', action='store_true', required=False,
default=False,
help='Optional toggle if this gem should be added as a server dependency')
add_gem_subparser.add_argument('-pl', '--platforms', type=str, required=False,
default='Common',
help='Optional list of platforms this gem should be added to.'
' Ex. --platforms Mac,Windows,Linux')
add_gem_subparser.add_argument('-a', '--add-to-cmake', type=str, required=False,
default=None,
help='Add the gem folder to the CMakeLists.txt so that it builds. If not'
' specified it will assume the CMakeLists.txt file in the parent folder of'
' the gem_path.')
add_gem_subparser.set_defaults(func=_run_add_gem)
remove_gem_subparser = subparsers.add_parser('remove-gem')
remove_gem_subparser.add_argument('-pp', '--project-path', type=str, required=True,
help='The path to the project, can be absolute or dev root relative')
remove_gem_subparser.add_argument('-prp', '--project-restricted-path', type=str, required=False,
default='restricted',
help='The path to the projects restricted folder, can be absolute or dev root'
' relative')
remove_gem_subparser.add_argument('-gp', '--gem-path', type=str, required=True,
help='The path to the gem, can be absolute or dev root/Gems relative')
remove_gem_subparser.add_argument('-gt', '--gem-target', type=str, required=False,
help='The cmake target name to add. If not specified it will assume gem_name')
remove_gem_subparser.add_argument('-df', '--dependencies-file', type=str, required=False,
help='The cmake dependencies file in which the gem dependencies are specified.'
'If not specified it will assume ')
remove_gem_subparser.add_argument('-rd', '--runtime-dependency', action='store_true', required=False,
default=False,
help='Optional toggle if this gem should be removed as a runtime dependency')
remove_gem_subparser.add_argument('-td', '--tool-dependency', action='store_true', required=False,
default=False,
help='Optional toggle if this gem should be removed as a server dependency')
remove_gem_subparser.add_argument('-sd', '--server-dependency', action='store_true', required=False,
default=False,
help='Optional toggle if this gem should be removed as a server dependency')
remove_gem_subparser.add_argument('-pl', '--platforms', type=str, required=False,
default='Common',
help='Optional list of platforms this gem should be removed from'
' Ex. --platforms Mac,Windows,Linux')
remove_gem_subparser.add_argument('-r', '--remove-from-cmake', type=str, required=False,
default=None,
help='Remove the gem folder from the CMakeLists.txt that includes it so that it '
'no longer builds build. If not specified it will assume you dont want to'
' remove it.')
remove_gem_subparser.set_defaults(func=_run_remove_gem)
if __name__ == "__main__":
# parse the command line args
the_parser = argparse.ArgumentParser()
# add subparsers
the_subparsers = the_parser.add_subparsers(help='sub-command help')
# add args to the parser
add_args(the_parser, the_subparsers)
# parse args
the_args = the_parser.parse_args()
# run
ret = the_args.func(the_args)
# return
sys.exit(ret)

@ -1,117 +0,0 @@
#
# 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.
#
import argparse
import logging
import os
import sys
import re
from cmake.Tools import common
logger = logging.getLogger()
logging.basicConfig()
def set_current_project(dev_root: str,
project_path: str) -> int:
"""
set what the current project is
:param dev_root: the dev root of the engine
:param project_path: the path of the project you want to set
:return: 0 for success or non 0 failure code
"""
project_path = project_path.strip()
if not project_path.isalnum():
logger.error('Project Name invalid. Set current project failed.')
return 1
try:
with open(os.path.join(dev_root, 'bootstrap.cfg'), 'r') as s:
data = s.read()
data = re.sub(r'(.*project_path\s*?[=:]\s*?)([^\n]+)\n', r'\1 {}\n'.format(project_path),
data, flags=re.IGNORECASE)
if os.path.isfile(os.path.join(dev_root, 'bootstrap.cfg')):
os.unlink(os.path.join(dev_root, 'bootstrap.cfg'))
with open(os.path.join(dev_root, 'bootstrap.cfg'), 'w') as s:
s.write(data)
except Exception as e:
logger.error('Set current project failed.' + str(e))
return 1
return 0
def get_current_project(dev_root: str) -> str:
"""
get what the current project set is
:param dev_root: the dev root of the engine
:return: project_path or None on failure
"""
try:
with open(os.path.join(dev_root, 'bootstrap.cfg'), 'r') as s:
data = s.read()
project_path = re.search(r'(.*project_path\s*?[=:]\s*?)(?P<project_path>[^\n]+)\n',
data, flags=re.IGNORECASE).group('project_path').strip()
except Exception as e:
logger.error('Failed to get current project. Exception: ' + str(e))
return ''
return project_path
def _run_get_current_project(args: argparse) -> int:
project_path = get_current_project(common.determine_engine_root())
if project_path:
print(project_path)
return 0
return 1
def _run_set_current_project(args: argparse) -> int:
return set_current_project(common.determine_engine_root(), args.project_path)
def add_args(parser, subparsers) -> None:
"""
add_args is called to add expected parser arguments and subparsers arguments to each command such that it can be
invoked locally or aggregated by a central python file.
Ex. Directly run from this file alone with: python current_project.py set_current_project --project TestProject
OR
lmbr.py can aggregate commands by importing current_project, call add_args and
execute: python lmbr.py set_current_project --project TestProject
:param parser: the caller instantiates a parser and passes it in here
:param subparsers: the caller instantiates subparsers and passes it in here
"""
get_current_project_subparser = subparsers.add_parser('get-current-project')
get_current_project_subparser.set_defaults(func=_run_get_current_project)
set_current_project_subparser = subparsers.add_parser('set-current-project')
set_current_project_subparser.add_argument('-pp', '--project-path', required=True,
help='The path to the project, can be absolute or dev root relative')
set_current_project_subparser.set_defaults(func=_run_set_current_project)
if __name__ == "__main__":
# parse the command line args
the_parser = argparse.ArgumentParser()
# add subparsers
the_subparsers = the_parser.add_subparsers(help='sub-command help')
# add args to the parser
add_args(the_parser, the_subparsers)
# parse args
the_args = the_parser.parse_args()
# run
ret = the_args.func(the_args)
# return
sys.exit(ret)

File diff suppressed because it is too large Load Diff

@ -0,0 +1,168 @@
#
# 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.
#
import argparse
import logging
import os
import sys
import re
import pathlib
import json
import cmake.Tools.registration as registration
logger = logging.getLogger()
logging.basicConfig()
def set_global_project(project_name: str or None,
project_path: str or pathlib.Path or None) -> int:
"""
set what the current project is
:param project_name: the name of the project you want to set, resolves project_path
:param project_path: the path of the project you want to set
:return: 0 for success or non 0 failure code
"""
if project_path and project_name:
logger.error(f'Project Name and Project Path provided, these are mutually exclusive.')
return 1
if not project_name and not project_path:
logger.error('Must specify either a Project name or Project Path.')
return 1
if project_name and not project_path:
project_path = registration.get_registered(project_name=project_name)
if not project_path:
logger.error(f'Project Path {project_path} has not been registered.')
return 1
project_path = pathlib.Path(project_path).resolve()
bootstrap_setreg_file = registration.get_o3de_registry_folder() / 'bootstrap.setreg'
if bootstrap_setreg_file.is_file():
with bootstrap_setreg_file.open('r') as f:
try:
json_data = json.load(f)
except Exception as e:
logger.error(f'Bootstrap.setreg failed to load: {str(e)}')
else:
try:
json_data["Amazon"]["AzCore"]["Bootstrap"]["project_path"] = project_path
except Exception as e:
logger.error(f'Bootstrap.setreg failed to load: {str(e)}')
else:
try:
os.unlink(bootstrap_setreg_file)
except Exception as e:
logger.error(f'Failed to unlink bootstrap file {bootstrap_setreg_file}: {str(e)}')
return 1
else:
json_data = {}
json_data.update({"Amazon":{"AzCore":{"Bootstrap":{"project_path":project_path.as_posix()}}}})
with bootstrap_setreg_file.open('w') as s:
s.write(json.dumps(json_data, indent=4))
return 0
def get_global_project() -> pathlib.Path or None:
"""
get what the current project set is
:return: project_path or None on failure
"""
bootstrap_setreg_file = registration.get_o3de_registry_folder() / 'bootstrap.setreg'
if not bootstrap_setreg_file.is_file():
logger.error(f'Bootstrap.setreg file {bootstrap_setreg_file} does not exist.')
return None
with bootstrap_setreg_file.open('r') as f:
try:
json_data = json.load(f)
except Exception as e:
logger.error(f'Bootstrap.setreg failed to load: {str(e)}')
else:
try:
project_path = json_data["Amazon"]["AzCore"]["Bootstrap"]["project_path"]
except Exception as e:
logger.error(f'Bootstrap.setreg cannot find Amazon:AzCore:Bootstrap:project_path: {str(e)}')
else:
return pathlib.Path(project_path).resolve()
return None
def _run_get_global_project(args: argparse) -> int:
if args.override_home_folder:
registration.override_home_folder = args.override_home_folder
project_path = get_global_project()
if project_path:
print(project_path.as_posix())
return 0
return 1
def _run_set_global_project(args: argparse) -> int:
if args.override_home_folder:
registration.override_home_folder = args.override_home_folder
return set_global_project(args.project_name,
args.project_path)
def add_args(parser, subparsers) -> None:
"""
add_args is called to add expected parser arguments and subparsers arguments to each command such that it can be
invoked locally or aggregated by a central python file.
Ex. Directly run from this file alone with: python global_project.py set_global_project --project-name TestProject
OR
o3de.py can aggregate commands by importing global_project, call add_args and
execute: python o3de.py set_global_project --project-path C:/TestProject
:param parser: the caller instantiates a parser and passes it in here
:param subparsers: the caller instantiates subparsers and passes it in here
"""
get_global_project_subparser = subparsers.add_parser('get-global-project')
get_global_project_subparser.add_argument('-ohf', '--override-home-folder', type=str, required=False,
help='By default the home folder is the user folder, override it to this folder.')
get_global_project_subparser.set_defaults(func=_run_get_global_project)
set_global_project_subparser = subparsers.add_parser('set-global-project')
group = set_global_project_subparser.add_mutually_exclusive_group(required=True)
group.add_argument('-pn', '--project-name', required=False,
help='The name of the project. If supplied this will resolve the --project-path.')
group.add_argument('-pp', '--project-path', required=False,
help='The path to the project')
set_global_project_subparser.add_argument('-ohf', '--override-home-folder', type=str, required=False,
help='By default the home folder is the user folder, override it to this folder.')
set_global_project_subparser.set_defaults(func=_run_set_global_project)
if __name__ == "__main__":
# parse the command line args
the_parser = argparse.ArgumentParser()
# add subparsers
the_subparsers = the_parser.add_subparsers(help='sub-command help')
# add args to the parser
add_args(the_parser, the_subparsers)
# parse args
the_args = the_parser.parse_args()
# run
ret = the_args.func(the_args)
# return
sys.exit(ret)

File diff suppressed because it is too large Load Diff

@ -0,0 +1,986 @@
#
# 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 the user home directory
set(O3DE_HOME_PATH "" CACHE PATH "Override the user home to this path")
if(O3DE_HOME_PATH)
set(home_directory ${O3DE_HOME_PATH})
elseif(CMAKE_HOST_WIN32)
file(TO_CMAKE_PATH "$ENV{USERPROFILE}" home_directory)
else()
file(TO_CMAKE_PATH "$ENV{HOME}" home_directory)
endif()
if (NOT home_directory)
message(FATAL_ERROR "Cannot find user home directory, without the user home directory the o3de manifest cannot be found")
endif()
# Optionally delete the home directory
if(O3DE_DELETE_HOME_PATH)
message(STATUS "O3DE_DELETE_HOME_PATH=${O3DE_DELETE_HOME_PATH}")
if(EXISTS ${home_directory}/.o3de)
message(STATUS "Deleting ${home_directory}/.o3de")
file(REMOVE_RECURSE ${home_directory}/.o3de)
else()
message(STATUS "Home path ${home_directory}/.o3de doesnt exist.")
endif()
endif()
########################################################################################################################
# If O3DE_REGISTER_ENGINE_PATH variable is set on the commandline this will allow registration of anything using
# O3DE_REGISTER_ENGINE_PATH o3de script. This is handy for situations like build servers which download the code and
# are expected to build without the need for someone to register o3de objects like this engine by manually typing it in.
# If O3DE_REGISTER_THIS_ENGINE=TRUE is set on the commandline when O3DE_REGISTER_ENGINE_PATH is also set this will call:
# O3DE_REGISTER_ENGINE_PATH/scripts>o3de register --this-engine --override-home-folder <home_directory>
# Note: register --this-engine will automatically register anything it finds in known folders, so if you put your
# o3de objects like projects/gems/templates/restricted/etc... in known folders for those types they will get registered
# automatically. Known folders for types are your .o3de/Projects and .o3de/Gems etc. So if I wanted my project to be
# registered and built by this build server I could simply put them in those known folders on the build server and they
# would get registered automatically by this call.
# OR
# I could put them on the commandline as well. This would be the way if the o3de objects we need to regiater are NOT
# in known folders or you do not intend to call with O3DE_REGISTER_THIS_ENGINE=TRUE Ex.
# -DO3DE_REGISTER_ENGINE_PATH=C:\this\engine
# -DO3DE_REGISTER_PROJECT_PATHS=C:\ThisGame;C:\ThatGame
# -DO3DE_REGISTER_GEM_PATHS=C:\ThisGem;C:\ThatGem;C:\And\Some\Other\Gem
# -DO3DE_REGISTER_RESTRICTED_PATHS=C:\this\engine\Restricted;C:\ThisGame\Restricted;C:\ThisGem\Restricted
########################################################################################################################
if(O3DE_REGISTER_ENGINE_PATH)
message(STATUS "O3DE_REGISTER_ENGINE_PATH=${O3DE_REGISTER_ENGINE_PATH}")
if(O3DE_REGISTER_THIS_ENGINE)
message(STATUS "O3DE_REGISTER_THIS_ENGINE=${O3DE_REGISTER_THIS_ENGINE}")
message(STATUS "register --this-engine")
if(CMAKE_HOST_WIN32)
execute_process(
COMMAND cmd /c ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.bat register --this-engine --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_this_engine_cmd_result
)
else()
execute_process(
COMMAND sh ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.sh register --this-engine --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_this_engine_cmd_result
)
endif()
if(o3de_register_this_engine_cmd_result)
message(FATAL_ERROR "An error occured trying to register --this-engine: ${o3de_register_this_engine_cmd_result}")
else()
message(STATUS "Engine ${O3DE_REGISTER_ENGINE_PATH} registration successfull.")
endif()
endif()
if(O3DE_REGISTER_RESTRICTED_PATHS)
message(STATUS "O3DE_REGISTER_RESTRICTED_PATHS=${O3DE_REGISTER_RESTRICTED_PATHS}")
foreach(restricted_path ${O3DE_REGISTER_RESTRICTED_PATHS})
if(CMAKE_HOST_WIN32)
execute_process(
COMMAND cmd /c ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.bat register --restricted-path ${restricted_path} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_restricted_cmd_result
)
else()
execute_process(
COMMAND sh ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.sh register --restricted-path ${restricted_path} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_restricted_cmd_result
)
endif()
if(o3de_register_restricted_cmd_result)
message(FATAL_ERROR "An error occured trying to ${O3DE_REGISTER_ENGINE_PATH}/scripts>o3de register --restricted-path ${restricted_path} --override-home-folder ${home_directory}: ${o3de_register_restricted_cmd_result}")
else()
message(STATUS "Restricted ${restricted_path} registration successfull.")
endif()
endforeach()
endif()
if(O3DE_REGISTER_PROJECT_PATHS)
message(STATUS "O3DE_REGISTER_PROJECT_PATHS=${O3DE_REGISTER_PROJECT_PATHS}")
foreach(project_path ${O3DE_REGISTER_PROJECT_PATHS})
if(CMAKE_HOST_WIN32)
execute_process(
COMMAND cmd /c ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.bat register --project-path ${project_path} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_project_cmd_result
)
else()
execute_process(
COMMAND sh ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.sh register --project-path ${project_path} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_project_cmd_result
)
endif()
if(o3de_register_project_cmd_result)
message(FATAL_ERROR "An error occured trying to ${O3DE_REGISTER_ENGINE_PATH}/scripts>o3de register --project-path ${project_path} --override-home-folder ${home_directory}")
else()
message(STATUS "Project ${project_path} registration successfull.")
endif()
endforeach()
endif()
if(O3DE_REGISTER_GEM_PATHS)
message(STATUS "O3DE_REGISTER_GEM_PATHS=${O3DE_REGISTER_GEM_PATHS}")
foreach(gem_path ${O3DE_REGISTER_GEM_PATHS})
if(CMAKE_HOST_WIN32)
execute_process(
COMMAND cmd /c ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.bat register --gem-path ${gem_path} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_gem_cmd_result
)
else()
execute_process(
COMMAND sh ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.sh register --gem-path ${gem_path} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_gem_cmd_result
)
endif()
if(o3de_register_gem_cmd_result)
message(FATAL_ERROR "An error occured trying to ${O3DE_REGISTER_ENGINE_PATH}/scripts>o3de register --gem-path ${gem_path} --override-home-folder ${home_directory}")
else()
message(STATUS "Gem ${gem_path} registration successfull.")
endif()
endforeach()
endif()
if(O3DE_REGISTER_TEMPLATE_PATHS)
message(STATUS "O3DE_REGISTER_TEMPLATE_PATHS=${O3DE_REGISTER_TEMPLATE_PATHS}")
foreach(template_path ${O3DE_REGISTER_TEMPLATE_PATHS})
if(CMAKE_HOST_WIN32)
execute_process(
COMMAND cmd /c ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.bat register --template-path ${template_path} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_template_cmd_result
)
else()
execute_process(
COMMAND sh ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.sh register --template-path ${template_path} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_template_cmd_result
)
endif()
if(o3de_register_template_cmd_result)
message(FATAL_ERROR "An error occured trying to ${O3DE_REGISTER_ENGINE_PATH}/scripts>o3de register --template-path ${template_path} --override-home-folder ${home_directory}")
else()
message(STATUS "Template ${template_path} registration successfull.")
endif()
endforeach()
endif()
if(O3DE_REGISTER_REPO_URIS)
message(STATUS "O3DE_REGISTER_REPO_URIS=${O3DE_REGISTER_REPO_URIS}")
foreach(repo_uri ${O3DE_REGISTER_REPO_URIS})
if(CMAKE_HOST_WIN32)
execute_process(
COMMAND cmd /c ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.bat register --repo-uri ${repo_uri} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_repo_cmd_result
)
else()
execute_process(
COMMAND sh ${O3DE_REGISTER_ENGINE_PATH}/scripts/o3de.sh register --repo-uri ${repo_uri} --override-home-folder ${home_directory}
RESULT_VARIABLE o3de_register_repo_cmd_result
)
endif()
if(o3de_register_repo_cmd_result)
message(FATAL_ERROR "An error occured trying to ${O3DE_REGISTER_ENGINE_PATH}/scripts>o3de register --repo-uri ${repo_uri} --override-home-folder ${home_directory}")
else()
message(STATUS "Repo ${repo_uri} registration successfull.")
endif()
endforeach()
endif()
endif()
################################################################################
# o3de manifest
################################################################################
# Set manifest json path to the <home_directory>/.o3de/o3de_manifest.json
set(o3de_manifest_json_path ${home_directory}/.o3de/o3de_manifest.json)
if(NOT EXISTS ${o3de_manifest_json_path})
message(FATAL_ERROR "${o3de_manifest_json_path} not found. You must o3de register --this-engine.")
endif()
file(READ ${o3de_manifest_json_path} manifest_json_data)
################################################################################
# o3de manifest name
################################################################################
string(JSON o3de_manifest_name ERROR_VARIABLE json_error GET ${manifest_json_data} o3de_manifest_name)
message(STATUS "o3de_manifest_name: ${o3de_manifest_name}")
if(json_error)
message(FATAL_ERROR "Unable to read repo_name from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
################################################################################
# o3de origin
################################################################################
string(JSON o3de_origin ERROR_VARIABLE json_error GET ${manifest_json_data} origin)
if(json_error)
message(FATAL_ERROR "Unable to read origin from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
################################################################################
# o3de default engines folder
################################################################################
string(JSON o3de_default_engines_folder ERROR_VARIABLE json_error GET ${manifest_json_data} default_engines_folder)
message(STATUS "default_engines_folder: ${o3de_default_engines_folder}")
if(json_error)
message(FATAL_ERROR "Unable to read default_engines_folder from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
################################################################################
# o3de default projects folder
################################################################################
string(JSON o3de_default_projects_folder ERROR_VARIABLE json_error GET ${manifest_json_data} default_projects_folder)
message(STATUS "default_projects_folder: ${o3de_default_projects_folder}")
if(json_error)
message(FATAL_ERROR "Unable to read default_projects_folder from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
################################################################################
# o3de default gems folder
################################################################################
string(JSON o3de_default_gems_folder ERROR_VARIABLE json_error GET ${manifest_json_data} default_gems_folder)
message(STATUS "default_gems_folder: ${o3de_default_gems_folder}")
if(json_error)
message(FATAL_ERROR "Unable to read default_gems_folder from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
################################################################################
# o3de default templates folder
################################################################################
string(JSON o3de_default_templates_folder ERROR_VARIABLE json_error GET ${manifest_json_data} default_templates_folder)
message(STATUS "default_templates_folder: ${o3de_default_templates_folder}")
if(json_error)
message(FATAL_ERROR "Unable to read default_templates_folder from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
################################################################################
# o3de default restricted folder
################################################################################
string(JSON o3de_default_restricted_folder ERROR_VARIABLE json_error GET ${manifest_json_data} default_restricted_folder)
message(STATUS "default_restricted_folder: ${o3de_default_restricted_folder}")
if(json_error)
message(FATAL_ERROR "Unable to read default_restricted_folder from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
################################################################################
# o3de projects
################################################################################
string(JSON o3de_projects_count ERROR_VARIABLE json_error LENGTH ${manifest_json_data} projects)
if(json_error)
message(FATAL_ERROR "Unable to read key 'projects' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_projects_count} GREATER 0)
math(EXPR o3de_projects_count "${o3de_projects_count}-1")
foreach(projects_index RANGE ${o3de_projects_count})
string(JSON projects_path ERROR_VARIABLE json_error GET ${manifest_json_data} projects ${projects_index})
if(json_error)
message(FATAL_ERROR "Unable to read projects[${projects_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_projects ${projects_path})
list(APPEND o3de_global_projects ${projects_path})
endforeach()
endif()
################################################################################
# o3de gems
################################################################################
string(JSON o3de_gems_count ERROR_VARIABLE json_error LENGTH ${manifest_json_data} gems)
if(json_error)
message(FATAL_ERROR "Unable to read key 'gems' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_gems_count} GREATER 0)
math(EXPR o3de_gems_count "${o3de_gems_count}-1")
foreach(gems_index RANGE ${o3de_gems_count})
string(JSON gems_path ERROR_VARIABLE json_error GET ${manifest_json_data} gems ${gems_index})
if(json_error)
message(FATAL_ERROR "Unable to read gems[${gems_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_gems ${gems_path})
list(APPEND o3de_global_gems ${gems_path})
endforeach()
endif()
################################################################################
# o3de templates
################################################################################
string(JSON o3de_templates_count ERROR_VARIABLE json_error LENGTH ${manifest_json_data} templates)
if(json_error)
message(FATAL_ERROR "Unable to read key 'templates' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_templates_count} GREATER 0)
math(EXPR o3de_templates_count "${o3de_templates_count}-1")
foreach(templates_index RANGE ${o3de_templates_count})
string(JSON templates_path ERROR_VARIABLE json_error GET ${manifest_json_data} templates ${templates_index})
if(json_error)
message(FATAL_ERROR "Unable to read templates[${templates_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_templates ${templates_path})
list(APPEND o3de_global_templates ${templates_path})
endforeach()
endif()
################################################################################
# o3de repos
################################################################################
string(JSON o3de_repos_count ERROR_VARIABLE json_error LENGTH ${manifest_json_data} repos)
if(json_error)
message(FATAL_ERROR "Unable to read key 'repos' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_repos_count} GREATER 0)
math(EXPR o3de_repos_count "${o3de_repos_count}-1")
foreach(repos_index RANGE ${o3de_repos_count})
string(JSON repo_uri ERROR_VARIABLE json_error GET ${manifest_json_data} repos ${repos_index})
if(json_error)
message(FATAL_ERROR "Unable to read repos[${repos_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_repos ${repo_uri})
list(APPEND o3de_global_repos ${repo_uri})
endforeach()
endif()
################################################################################
# o3de restricted
################################################################################
string(JSON o3de_restricted_count ERROR_VARIABLE json_error LENGTH ${manifest_json_data} restricted)
if(json_error)
message(FATAL_ERROR "Unable to read key 'restricted' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_restricted_count} GREATER 0)
math(EXPR o3de_restricted_count "${o3de_restricted_count}-1")
foreach(restricted_index RANGE ${o3de_restricted_count})
string(JSON restricted_path ERROR_VARIABLE json_error GET ${manifest_json_data} restricted ${restricted_index})
if(json_error)
message(FATAL_ERROR "Unable to read restricted[${restricted_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_restricted ${restricted_path})
list(APPEND o3de_global_restricted ${restricted_path})
endforeach()
endif()
################################################################################
# o3de engines
################################################################################
string(JSON o3de_engines_count ERROR_VARIABLE json_error LENGTH ${manifest_json_data} engines)
if(json_error)
message(FATAL_ERROR "Unable to read key 'engines' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_engines_count} GREATER 0)
math(EXPR o3de_engines_count "${o3de_engines_count}-1")
# Either the engine_path and engine_json are set in which case the user is configuring from the engine
# or project_path and project_json are set in which case the user is configuring from the project.
# We need to know which engine_path the user is using so if the project_json is set then we need
# to read the project_json and disambiguate the engine_path.
if(NOT o3de_engine_path)
if(NOT o3de_project_json)
message(FATAL_ERROR "Neither o3de_engine_path nor o3de_project_json defined. Cannot determine engine!")
endif()
# get the name of the engine this project uses
file(READ ${o3de_project_json} project_json_data)
string(JSON project_engine_name ERROR_VARIABLE json_error GET ${project_json_data} engine)
if(json_error)
message(FATAL_ERROR "Unable to read 'engine' from '${o3de_project_json}', error: ${json_error}")
endif()
# search each engine in order from the manifest to find the matching engine name
foreach(engines_index RANGE ${o3de_engines_count})
string(JSON engine_data ERROR_VARIABLE json_error GET ${manifest_json_data} engines ${engines_index})
if(json_error)
message(FATAL_ERROR "Unable to read engines[${engines_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
# get this engines path
string(JSON this_engine_path ERROR_VARIABLE json_error GET ${engine_data} path)
if(json_error)
message(FATAL_ERROR "Unable to read engine path from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
# add this engine to the engines list
list(APPEND o3de_engines ${this_engine_path})
# use path to get the engine.json
set(this_engine_json ${this_engine_path}/engine.json)
# read the name of this engine
file(READ ${this_engine_json} this_engine_json_data)
string(JSON this_engine_name ERROR_VARIABLE json_error GET ${this_engine_json_data} engine_name)
if(json_error)
message(FATAL_ERROR "Unable to read engine_name from '${this_engine_json}', error: ${json_error}")
endif()
# see if this engines name is the same as the one this projects should use
if(${this_engine_name} STREQUAL ${project_engine_name})
message(STATUS "Found engine: '${project_engine_name}' at ${this_engine_path}")
set(o3de_engine_path ${this_engine_path})
break()
endif()
endforeach()
endif()
endif()
#we should have an engine_path at this point
if(NOT o3de_engine_path)
message(FATAL_ERROR "o3de_engine_path not defined. Cannot determine engine!")
endif()
# now that we have an engine_path read in that engines o3de resources
if(${o3de_engines_count} GREATER -1)
foreach(engines_index RANGE ${o3de_engines_count})
string(JSON engine_data ERROR_VARIABLE json_error GET ${manifest_json_data} engines ${engines_index})
if(json_error)
message(FATAL_ERROR "Unable to read engines[${engines_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
# get this engines path
string(JSON this_engine_path ERROR_VARIABLE json_error GET ${engine_data} path)
if(json_error)
message(FATAL_ERROR "Unable to read engine path from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_engine_path} STREQUAL ${this_engine_path})
################################################################################
# o3de engine projects
################################################################################
string(JSON o3de_engine_projects_count ERROR_VARIABLE json_error LENGTH ${engine_data} projects)
if(json_error)
message(FATAL_ERROR "Unable to read key 'projects' from '${engine_data}', error: ${json_error}")
endif()
if(${o3de_engine_projects_count} GREATER 0)
math(EXPR o3de_engine_projects_count "${o3de_engine_projects_count}-1")
foreach(engine_projects_index RANGE ${o3de_engine_projects_count})
string(JSON engine_projects_path ERROR_VARIABLE json_error GET ${engine_data} projects ${engine_projects_index})
if(json_error)
message(FATAL_ERROR "Unable to read engine projects[${projects_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_projects ${engine_projects_path})
list(APPEND o3de_engine_projects ${engine_projects_path})
endforeach()
endif()
################################################################################
# o3de engine gems
################################################################################
string(JSON o3de_engine_gems_count ERROR_VARIABLE json_error LENGTH ${engine_data} gems)
if(json_error)
message(FATAL_ERROR "Unable to read key 'gems' from '${engine_data}', error: ${json_error}")
endif()
if(${o3de_engine_gems_count} GREATER 0)
math(EXPR o3de_engine_gems_count "${o3de_engine_gems_count}-1")
foreach(engine_gems_index RANGE ${o3de_engine_gems_count})
string(JSON engine_gems_path ERROR_VARIABLE json_error GET ${engine_data} gems ${engine_gems_index})
if(json_error)
message(FATAL_ERROR "Unable to read engine gems[${gems_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_gems ${engine_gems_path})
list(APPEND o3de_engine_gems ${engine_gems_path})
endforeach()
endif()
################################################################################
# o3de engine templates
################################################################################
string(JSON o3de_engine_templates_count ERROR_VARIABLE json_error LENGTH ${engine_data} templates)
if(json_error)
message(FATAL_ERROR "Unable to read key 'templates' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_engine_gems_count} GREATER 0)
math(EXPR o3de_engine_templates_count "${o3de_engine_templates_count}-1")
foreach(engine_templates_index RANGE ${o3de_engine_templates_count})
string(JSON engine_templates_path ERROR_VARIABLE json_error GET ${engine_data} templates ${engine_templates_index})
if(json_error)
message(FATAL_ERROR "Unable to read engine templates[${templates_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_templates ${engine_templates_path})
list(APPEND o3de_engine_templates ${engine_templates_path})
endforeach()
endif()
################################################################################
# o3de engine restricted
################################################################################
string(JSON o3de_engine_restricted_count ERROR_VARIABLE json_error LENGTH ${engine_data} restricted)
if(json_error)
message(FATAL_ERROR "Unable to read key 'restricted' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_engine_restricted_count} GREATER 0)
math(EXPR o3de_engine_restricted_count "${o3de_engine_restricted_count}-1")
foreach(engine_restricted_index RANGE ${o3de_engine_restricted_count})
string(JSON engine_restricted_path ERROR_VARIABLE json_error GET ${engine_data} restricted ${engine_restricted_index})
if(json_error)
message(FATAL_ERROR "Unable to read engine restricted[${engine_restricted_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_restricted ${engine_restricted_path})
list(APPEND o3de_engine_restricted ${engine_restricted_path})
endforeach()
endif()
################################################################################
# o3de engine external_subdirectories
################################################################################
string(JSON o3de_external_subdirectories_count ERROR_VARIABLE json_error LENGTH ${engine_data} external_subdirectories)
if(json_error)
message(FATAL_ERROR "Unable to read key 'external_subdirectories' from '${o3de_manifest_json_path}', error: ${json_error}")
endif()
if(${o3de_external_subdirectories_count} GREATER 0)
math(EXPR o3de_external_subdirectories_count "${o3de_external_subdirectories_count}-1")
foreach(external_subdirectories_index RANGE ${o3de_external_subdirectories_count})
string(JSON external_subdirectories_path ERROR_VARIABLE json_error GET ${engine_data} external_subdirectories ${external_subdirectories_index})
if(json_error)
message(FATAL_ERROR "Unable to read engine external_subdirectories[${gems_index}] '${o3de_manifest_json_path}', error: ${json_error}")
endif()
list(APPEND o3de_engine_external_subdirectories ${external_subdirectories_path})
endforeach()
endif()
break()
endif()
endforeach()
endif()
################################################################################
#! o3de_engine_id:
#
# \arg:engine returns the engine association element from an o3de json
# \arg:o3de_json_file name of the o3de json file
################################################################################
function(o3de_engine_id o3de_json_file engine)
file(READ ${o3de_json_file} json_data)
string(JSON engine_entry ERROR_VARIABLE json_error GET ${json_data} engine)
if(json_error)
message(WARNING "Unable to read engine from '${o3de_json_file}', error: ${json_error}")
message(WARNING "Setting engine to engine default 'o3de'")
set(engine_entry "o3de")
endif()
if(engine_entry)
set(${engine} ${engine_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_project_id:
#
# \arg:project returns the project association element from an o3de json
# \arg:o3de_json_file name of the o3de json file
################################################################################
function(o3de_project_id o3de_json_file project)
file(READ ${o3de_json_file} json_data)
string(JSON project_entry ERROR_VARIABLE json_error GET ${json_data} project)
if(json_error)
message(FATAL_ERROR "Unable to read project from '${o3de_json_file}', error: ${json_error}")
endif()
if(project_entry)
set(${project} ${project_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_gem_id:
#
# \arg:gem returns the gem association element from an o3de json
# \arg:o3de_json_file name of the o3de json file
################################################################################
function(o3de_gem_id o3de_json_file gem)
file(READ ${o3de_json_file} json_data)
string(JSON gem_entry ERROR_VARIABLE json_error GET ${json_data} gem)
if(json_error)
message(FATAL_ERROR "Unable to read gem from '${o3de_json_file}', error: ${json_error}")
endif()
if(gem_entry)
set(${gem} ${gem_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_template_id:
#
# \arg:template returns the template association element from an o3de json
# \arg:o3de_json_file name of the o3de json file
################################################################################
function(o3de_template_id o3de_json_file template)
file(READ ${o3de_json_file} json_data)
string(JSON template_entry ERROR_VARIABLE json_error GET ${json_data} template)
if(json_error)
message(FATAL_ERROR "Unable to read template from '${o3de_json_file}', error: ${json_error}")
endif()
if(template_entry)
set(${template} ${template_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_repo_id:
#
# \arg:repo returns the repo association element from an o3de json
# \arg:o3de_json_file name of the o3de json file
################################################################################
function(o3de_repo_id o3de_json_file repo)
file(READ ${o3de_json_file} json_data)
string(JSON repo_entry ERROR_VARIABLE json_error GET ${json_data} repo)
if(json_error)
message(FATAL_ERROR "Unable to read repo from '${o3de_json_file}', error: ${json_error}")
endif()
if(repo_entry)
set(${repo} ${repo_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_restricted_id:
#
# \arg:restricted returns the restricted association element from an o3de json, otherwise engine 'o3de' is assumed
# \arg:o3de_json_file name of the o3de json file
################################################################################
function(o3de_restricted_id o3de_json_file restricted)
file(READ ${o3de_json_file} json_data)
string(JSON restricted_entry ERROR_VARIABLE json_error GET ${json_data} restricted)
if(json_error)
message(WARNING "Unable to read restricted from '${o3de_json_file}', error: ${json_error}")
message(WARNING "Setting restricted to engine default 'o3de'")
set(restricted_entry "o3de")
endif()
if(restricted_entry)
set(${restricted} ${restricted_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_find_engine_folder:
#
# \arg:engine_path returns the path of the o3de engine folder with name engine_name
# \arg:engine_name name of the engine
################################################################################
function(o3de_find_engine_folder engine_name engine_path)
foreach(engine_entry ${o3de_engines})
set(engine_json_file ${engine_entry}/engine.json)
file(READ ${engine_json_file} engine_json)
string(JSON this_engine_name ERROR_VARIABLE json_error GET ${engine_json} engine_name)
if(json_error)
message(WARNING "Unable to read engine_name from '${engine_json_file}', error: ${json_error}")
else()
if(this_engine_name STREQUAL engine_name)
set(${engine_path} ${engine_entry} PARENT_SCOPE)
return()
endif()
endif()
endforeach()
message(FATAL_ERROR "Unable to find repo_name: '${engine_name}'")
endfunction()
################################################################################
#! o3de_find_project_folder:
#
# \arg:project_path returns the path of the o3de project folder with name project_name
# \arg:project_name name of the project
################################################################################
function(o3de_find_project_folder project_name project_path)
foreach(project_entry ${o3de_projects})
set(project_json_file ${project_entry}/project.json)
file(READ ${project_json_file} project_json)
string(JSON this_project_name ERROR_VARIABLE json_error GET ${project_json} project_name)
if(json_error)
message(WARNING "Unable to read project_name from '${project_json_file}', error: ${json_error}")
else()
if(this_project_name STREQUAL project_name)
set(${project_path} ${project_entry} PARENT_SCOPE)
return()
endif()
endif()
endforeach()
message(FATAL_ERROR "Unable to find project_name: '${project_name}'")
endfunction()
################################################################################
#! o3de_find_gem_folder:
#
# \arg:gem_path returns the path of the o3de gem folder with name gem_name
# \arg:gem_name name of the gem
################################################################################
function(o3de_find_gem_folder gem_name gem_path)
foreach(gem_entry ${o3de_gems})
set(gem_json_file ${gem_entry}/gem.json)
file(READ ${gem_json_file} gem_json)
string(JSON this_gem_name ERROR_VARIABLE json_error GET ${gem_json} gem_name)
if(json_error)
message(WARNING "Unable to read gem_name from '${gem_json_file}', error: ${json_error}")
else()
if(this_gem_name STREQUAL gem_name)
set(${gem_path} ${gem_entry} PARENT_SCOPE)
return()
endif()
endif()
endforeach()
message(FATAL_ERROR "Unable to find gem_name: '${gem_name}'")
endfunction()
################################################################################
#! o3de_find_template_folder:
#
# \arg:template_path returns the path of the o3de template folder with name template_name
# \arg:template_name name of the template
################################################################################
function(o3de_find_template_folder template_name template_path)
foreach(template_entry ${o3de_templates})
set(template_json_file ${template_entry}/template.json)
file(READ ${template_json_file} template_json)
string(JSON this_template_name ERROR_VARIABLE json_error GET ${template_json} template_name)
if(json_error)
message(WARNING "Unable to read template_name from '${template_json_file}', error: ${json_error}")
else()
if(this_template_name STREQUAL template_name)
set(${template_path} ${template_entry} PARENT_SCOPE)
return()
endif()
endif()
endforeach()
message(FATAL_ERROR "Unable to find template_name: '${template_name}'")
endfunction()
################################################################################
#! o3de_find_repo_folder:
#
# \arg:repo_path returns the path of the o3de repo folder with name repo_name
# \arg:repo_name name of the repo
################################################################################
function(o3de_find_repo_folder repo_name repo_path)
foreach(repo_entry ${o3de_repos})
set(repo_json_file ${repo_entry}/repo.json)
file(READ ${repo_json_file} repo_json)
string(JSON this_repo_name ERROR_VARIABLE json_error GET ${repo_json} repo_name)
if(json_error)
message(WARNING "Unable to read repo_name from '${repo_json_file}', error: ${json_error}")
else()
if(this_repo_name STREQUAL repo_name)
set(${repo_path} ${repo_entry} PARENT_SCOPE)
return()
endif()
endif()
endforeach()
message(FATAL_ERROR "Unable to find repo_name: '${repo_name}'")
endfunction()
################################################################################
#! o3de_find_restricted_folder:
#
# \arg:restricted_path returns the path of the o3de restricted folder with name restricted_name
# \arg:restricted_name name of the restricted
################################################################################
function(o3de_find_restricted_folder restricted_name restricted_path)
foreach(restricted_entry ${o3de_restricted})
set(restricted_json_file ${restricted_entry}/restricted.json)
file(READ ${restricted_json_file} restricted_json)
string(JSON this_restricted_name ERROR_VARIABLE json_error GET ${restricted_json} restricted_name)
if(json_error)
message(WARNING "Unable to read restricted_name from '${restricted_json_file}', error: ${json_error}")
else()
if(this_restricted_name STREQUAL restricted_name)
set(${restricted_path} ${restricted_entry} PARENT_SCOPE)
return()
endif()
endif()
endforeach()
message(FATAL_ERROR "Unable to find restricted_name: '${restricted_name}'")
endfunction()
################################################################################
#! o3de_engine_name:
#
# \arg:engine returns the engine_name element from an engine.json
# \arg:o3de_engine_json_file name of the o3de json file
################################################################################
function(o3de_engine_name o3de_engine_json_file engine)
file(READ ${o3de_engine_json_file} json_data)
string(JSON engine_entry ERROR_VARIABLE json_error GET ${json_data} engine_name)
if(json_error)
message(FATAL_ERROR "Unable to read engine_name from '${o3de_json_file}', error: ${json_error}")
endif()
if(engine_entry)
set(${engine} ${engine_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_project_name:
#
# \arg:project returns the project_name element from an project.json
# \arg:o3de_project_json_file name of the o3de json file
################################################################################
function(o3de_project_name o3de_project_json_file project)
file(READ ${o3de_project_json_file} json_data)
string(JSON project_entry ERROR_VARIABLE json_error GET ${json_data} project_name)
if(json_error)
message(FATAL_ERROR "Unable to read project_name from '${o3de_json_file}', error: ${json_error}")
endif()
if(project_entry)
set(${project} ${project_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_gem_name:
#
# \arg:gem returns the gem_name element from an gem.json
# \arg:o3de_gem_json_file name of the o3de json file
################################################################################
function(o3de_gem_name o3de_gem_json_file gem)
file(READ ${o3de_gem_json_file} json_data)
string(JSON gem_entry ERROR_VARIABLE json_error GET ${json_data} gem_name)
if(json_error)
message(FATAL_ERROR "Unable to read gem_name from '${o3de_json_file}', error: ${json_error}")
endif()
if(gem_entry)
set(${gem} ${gem_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_template_name:
#
# \arg:template returns the template_name element from an template json
# \arg:o3de_template_json_file name of the o3de json file
################################################################################
function(o3de_template_name o3de_template_json_file template)
file(READ ${o3de_template_json_file} json_data)
string(JSON template_entry ERROR_VARIABLE json_error GET ${json_data} template_name)
if(json_error)
message(FATAL_ERROR "Unable to read template_name from '${o3de_json_file}', error: ${json_error}")
endif()
if(template_entry)
set(${template} ${template_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_repo_name:
#
# \arg:repo returns the repo_name element from an repo.json or o3de_manifest.json
# \arg:o3de_repo_json_file name of the o3de json file
################################################################################
function(o3de_repo_name o3de_repo_json_file repo)
file(READ ${o3de_repo_json_file} json_data)
string(JSON repo_entry ERROR_VARIABLE json_error GET ${json_data} repo_name)
if(json_error)
message(FATAL_ERROR "Unable to read repo_name from '${o3de_json_file}', error: ${json_error}")
endif()
if(repo_entry)
set(${repo} ${repo_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_restricted_name:
#
# \arg:restricted returns the restricted association element from an o3de json
# \arg:o3de_json_file name of the o3de json file
################################################################################
function(o3de_restricted_name o3de_json_file restricted)
file(READ ${o3de_json_file} json_data)
string(JSON restricted_entry ERROR_VARIABLE json_error GET ${json_data} restricted_name)
if(json_error)
message(WARNING "FATAL_ERROR to read restricted_name from '${o3de_json_file}', error: ${json_error}")
endif()
if(restricted_entry)
set(${restricted} ${restricted_entry} PARENT_SCOPE)
endif()
endfunction()
################################################################################
#! o3de_engine_path:
#
# \arg:engine_path returns the path of the o3de engine folder with name engine_name
# \arg:engine_name name of the engine
################################################################################
function(o3de_engine_path o3de_json_file engine_path)
o3de_engine_id(${o3de_json_file} engine_name)
if(engine_name)
o3de_find_engine_folder(${engine_name} engine_folder)
if(engine_folder)
set(${engine_path} ${engine_folder} PARENT_SCOPE)
endif()
endif()
endfunction()
################################################################################
#! o3de_project_path:
#
# \arg:project_path returns the path of the o3de project folder with name project_name
# \arg:project_name name of the project
################################################################################
function(o3de_project_path o3de_json_file project_path)
o3de_project_id(${o3de_json_file} project_name)
if(project_name)
o3de_find_project_folder(${project_name} project_folder)
if(project_folder)
set(${project_path} ${project_folder} PARENT_SCOPE)
endif()
endif()
endfunction()
################################################################################
#! o3de_template_path:
#
# \arg:template_path returns the path of the o3de template folder with name template_name
# \arg:template_name name of the template
################################################################################
function(o3de_template_path o3de_json_file template_path)
o3de_template_id(${o3de_json_file} template_name)
if(template_name)
o3de_find_template_folder(${template_name} template_folder)
if(template_folder)
set(${template_path} ${template_folder} PARENT_SCOPE)
endif()
endif()
endfunction()
################################################################################
#! o3de_repo_path:
#
# \arg:repo_path returns the path of the o3de repo folder with name repo_name
# \arg:repo_name name of the repo
################################################################################
function(o3de_repo_path o3de_json_file repo_path)
o3de_repo_id(${o3de_json_file} repo_name)
if(repo_name)
o3de_find_repo_folder(${repo_name} repo_folder)
if(repo_folder)
set(${repo_path} ${repo_folder} PARENT_SCOPE)
endif()
endif()
endfunction()
################################################################################
#! o3de_restricted_path:
#
# \arg:restricted_path returns the path of the o3de restricted folder with name restricted_name
# \arg:restricted_name name of the restricted
################################################################################
function(o3de_restricted_path o3de_json_file restricted_path)
o3de_restricted_id(${o3de_json_file} restricted_name)
if(restricted_name)
o3de_find_restricted_folder(${restricted_name} restricted_folder)
if(restricted_folder)
set(${restricted_path} ${restricted_folder} PARENT_SCOPE)
endif()
endif()
endfunction()

@ -1,5 +1,6 @@
{
"engine_name": "o3de",
"restricted": "o3de",
"FileVersion": 1,
"O3DEVersion": "0.0.0.0",
"O3DECopyrightYear": 2021

@ -35,7 +35,7 @@
"PARAMETERS": {
"CONFIGURATION":"debug",
"OUTPUT_DIRECTORY":"build\\android",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS":"AutomatedTesting",
"CMAKE_TARGET":"all",
"CMAKE_BUILD_ARGS":"-j!NUMBER_OF_PROCESSORS!"
@ -60,7 +60,7 @@
"PARAMETERS": {
"CONFIGURATION":"profile",
"OUTPUT_DIRECTORY":"build\\android",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS":"AutomatedTesting",
"CMAKE_TARGET":"all",
"CMAKE_BUILD_ARGS":"-j!NUMBER_OF_PROCESSORS!"
@ -76,7 +76,7 @@
"PARAMETERS": {
"CONFIGURATION":"profile",
"OUTPUT_DIRECTORY":"build\\android",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_UNITY_BUILD=FALSE",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_UNITY_BUILD=FALSE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS":"AutomatedTesting",
"CMAKE_TARGET":"all",
"CMAKE_BUILD_ARGS":"-j!NUMBER_OF_PROCESSORS!"
@ -93,7 +93,7 @@
"PARAMETERS": {
"CONFIGURATION":"profile",
"OUTPUT_DIRECTORY":"build\\windows_vs2019",
"CMAKE_OPTIONS":"-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS":"-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS":"AutomatedTesting",
"CMAKE_TARGET":"AssetProcessorBatch",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo",
@ -112,7 +112,7 @@
"PARAMETERS": {
"CONFIGURATION":"release",
"OUTPUT_DIRECTORY":"build\\android",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS":"AutomatedTesting",
"CMAKE_TARGET":"all",
"CMAKE_BUILD_ARGS":"-j!NUMBER_OF_PROCESSORS!"
@ -128,7 +128,7 @@
"PARAMETERS": {
"CONFIGURATION":"release",
"OUTPUT_DIRECTORY":"build\\mono_android",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_MONOLITHIC_GAME=TRUE -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS":"-G \"Ninja Multi-Config\" -DCMAKE_TOOLCHAIN_FILE=cmake\\Platform\\Android\\Toolchain_android.cmake -DANDROID_ABI=arm64-v8a -DANDROID_ARM_MODE=arm -DANDROID_ARM_NEON=FALSE -DANDROID_NATIVE_API_LEVEL=21 -DLY_NDK_DIR=\"!LY_3RDPARTY_PATH!\\android-ndk\\r21d\" -DLY_MONOLITHIC_GAME=TRUE -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS":"AutomatedTesting",
"CMAKE_TARGET":"all",
"CMAKE_BUILD_ARGS":"-j!NUMBER_OF_PROCESSORS!"

@ -37,7 +37,7 @@
"PARAMETERS": {
"CONFIGURATION": "debug",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "all"
}
@ -53,7 +53,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "all"
}
@ -66,7 +66,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "all"
}
@ -80,7 +80,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "all",
"CTEST_OPTIONS": "-E (Gem::EMotionFX.Editor.Tests|Gem::AWSClientAuth.Tests|Gem::AWSCore.Editor.Tests) -L FRAMEWORK_googletest"
@ -92,7 +92,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "all",
"CTEST_OPTIONS": "-E (Gem::EMotionFX.Editor.Tests|Gem::AWSClientAuth.Tests|Gem::AWSCore.Editor.Tests) -L FRAMEWORK_googletest"
@ -108,7 +108,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "AssetProcessorBatch",
"ASSET_PROCESSOR_BINARY": "bin/profile/AssetProcessorBatch",
@ -122,7 +122,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "AssetProcessorBatch",
"ASSET_PROCESSOR_BINARY": "bin/profile/AssetProcessorBatch",
@ -140,7 +140,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_periodic",
"CTEST_OPTIONS": "-L \"(SUITE_periodic)\""
@ -156,7 +156,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_benchmark",
"CTEST_OPTIONS": "-L \"(SUITE_benchmark)\""
@ -172,7 +172,7 @@
"PARAMETERS": {
"CONFIGURATION": "release",
"OUTPUT_DIRECTORY": "build/linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "all"
}
@ -187,7 +187,7 @@
"PARAMETERS": {
"CONFIGURATION": "release",
"OUTPUT_DIRECTORY": "build/mono_linux",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_MONOLITHIC_GAME=TRUE -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4",
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_MONOLITHIC_GAME=TRUE -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "all"
}

@ -37,7 +37,7 @@
"PARAMETERS": {
"CONFIGURATION": "debug",
"OUTPUT_DIRECTORY": "build/mac",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD"
}
@ -51,7 +51,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/mac",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD"
}
@ -66,7 +66,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/mac",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=FALSE",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=FALSE -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD"
}
@ -81,7 +81,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/mac",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "AssetProcessorBatch",
"ASSET_PROCESSOR_BINARY": "bin/profile/AssetProcessorBatch",
@ -99,7 +99,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/mac",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_periodic",
"CTEST_OPTIONS": "-L \"(SUITE_periodic)\""
@ -115,7 +115,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/mac",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_benchmark",
"CTEST_OPTIONS": "-L \"(SUITE_benchmark)\""
@ -131,7 +131,7 @@
"PARAMETERS": {
"CONFIGURATION": "release",
"OUTPUT_DIRECTORY": "build/mac",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD"
}
@ -146,7 +146,7 @@
"PARAMETERS": {
"CONFIGURATION": "release",
"OUTPUT_DIRECTORY": "build/mono_mac",
"CMAKE_OPTIONS": "-G Xcode -DLY_MONOLITHIC_GAME=TRUE -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DLY_MONOLITHIC_GAME=TRUE -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD"
}

@ -87,7 +87,7 @@
"PARAMETERS": {
"CONFIGURATION": "debug",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_BUILD_WITH_INCREMENTAL_LINKING_DEBUG=FALSE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_BUILD_WITH_INCREMENTAL_LINKING_DEBUG=FALSE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo"
@ -101,7 +101,7 @@
"PARAMETERS": {
"CONFIGURATION": "debug",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_BUILD_WITH_INCREMENTAL_LINKING_DEBUG=FALSE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_BUILD_WITH_INCREMENTAL_LINKING_DEBUG=FALSE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_smoke TEST_SUITE_main",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo",
@ -118,7 +118,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo"
@ -134,7 +134,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=FALSE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=FALSE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo"
@ -149,7 +149,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_smoke TEST_SUITE_main",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo",
@ -169,7 +169,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_smoke TEST_SUITE_main",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo",
@ -187,7 +187,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "AssetProcessorBatch",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo",
@ -206,7 +206,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_periodic",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo",
@ -227,7 +227,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_sandbox",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo",
@ -245,7 +245,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "TEST_SUITE_benchmark",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo",
@ -263,7 +263,7 @@
"PARAMETERS": {
"CONFIGURATION": "release",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo"
@ -279,7 +279,7 @@
"PARAMETERS": {
"CONFIGURATION": "release",
"OUTPUT_DIRECTORY": "build\\mono_windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_MONOLITHIC_GAME=TRUE -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_MONOLITHIC_GAME=TRUE -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo"
@ -294,7 +294,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build\\windows_vs2019",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_DISABLE_TEST_MODULES=TRUE -DCMAKE_INSTALL_PREFIX=install",
"CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_DISABLE_TEST_MODULES=TRUE -DCMAKE_INSTALL_PREFIX=install -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "",
"CMAKE_TARGET": "INSTALL",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo"

@ -4,7 +4,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "windows_vs2017",
"CMAKE_OPTIONS": "-G \"Visual Studio 15 2017\" -A x64 -T host=x64 -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G \"Visual Studio 15 2017\" -A x64 -T host=x64 -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AtomTest;AtomSampleViewer",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "/m:4 /p:CL_MPCount=!HALF_PROCESSORS! /nologo"
@ -15,7 +15,7 @@
"PARAMETERS": {
"CONFIGURATION":"profile",
"OUTPUT_DIRECTORY":"windows_vs2019",
"CMAKE_OPTIONS":"-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS":"-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS":"AtomTest;AtomSampleViewer",
"CMAKE_TARGET":"ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "/m /nologo"

@ -27,7 +27,7 @@
"PARAMETERS": {
"CONFIGURATION": "debug",
"OUTPUT_DIRECTORY": "build/ios",
"CMAKE_OPTIONS": "-G Xcode -DCMAKE_TOOLCHAIN_FILE=cmake/Platform/iOS/Toolchain_ios.cmake -DLY_MONOLITHIC_GAME=TRUE -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=FALSE -DLY_IOS_CODE_SIGNING_IDENTITY=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=FALSE -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DCMAKE_TOOLCHAIN_FILE=cmake/Platform/iOS/Toolchain_ios.cmake -DLY_MONOLITHIC_GAME=TRUE -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=FALSE -DLY_IOS_CODE_SIGNING_IDENTITY=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=FALSE -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "-destination generic/platform=iOS"
@ -44,7 +44,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/ios",
"CMAKE_OPTIONS": "-G Xcode -DCMAKE_TOOLCHAIN_FILE=cmake/Platform/iOS/Toolchain_ios.cmake -DLY_MONOLITHIC_GAME=TRUE -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=FALSE -DLY_IOS_CODE_SIGNING_IDENTITY=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=FALSE -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DCMAKE_TOOLCHAIN_FILE=cmake/Platform/iOS/Toolchain_ios.cmake -DLY_MONOLITHIC_GAME=TRUE -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=FALSE -DLY_IOS_CODE_SIGNING_IDENTITY=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=FALSE -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "-destination generic/platform=iOS"
@ -60,7 +60,7 @@
"PARAMETERS": {
"CONFIGURATION": "profile",
"OUTPUT_DIRECTORY": "build/ios",
"CMAKE_OPTIONS": "-G Xcode -DCMAKE_TOOLCHAIN_FILE=cmake/Platform/iOS/Toolchain_ios.cmake -DLY_MONOLITHIC_GAME=TRUE -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=FALSE -DLY_IOS_CODE_SIGNING_IDENTITY=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=FALSE -DLY_UNITY_BUILD=FALSE",
"CMAKE_OPTIONS": "-G Xcode -DCMAKE_TOOLCHAIN_FILE=cmake/Platform/iOS/Toolchain_ios.cmake -DLY_MONOLITHIC_GAME=TRUE -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=FALSE -DLY_IOS_CODE_SIGNING_IDENTITY=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=FALSE -DLY_UNITY_BUILD=FALSE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "-destination generic/platform=iOS"
@ -94,7 +94,7 @@
"PARAMETERS": {
"CONFIGURATION": "release",
"OUTPUT_DIRECTORY": "build/ios",
"CMAKE_OPTIONS": "-G Xcode -DCMAKE_TOOLCHAIN_FILE=cmake/Platform/iOS/Toolchain_ios.cmake -DLY_MONOLITHIC_GAME=TRUE -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=FALSE -DLY_IOS_CODE_SIGNING_IDENTITY=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=FALSE -DLY_UNITY_BUILD=TRUE",
"CMAKE_OPTIONS": "-G Xcode -DCMAKE_TOOLCHAIN_FILE=cmake/Platform/iOS/Toolchain_ios.cmake -DLY_MONOLITHIC_GAME=TRUE -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED=FALSE -DLY_IOS_CODE_SIGNING_IDENTITY=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS=\"\" -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=FALSE -DLY_UNITY_BUILD=TRUE -DO3DE_HOME_PATH=\"!WORKSPACE!/home\" -DO3DE_REGISTER_ENGINE_PATH=\"!WORKSPACE!/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
"CMAKE_LY_PROJECTS": "AutomatedTesting",
"CMAKE_TARGET": "ALL_BUILD",
"CMAKE_NATIVE_BUILD_ARGS": "-destination generic/platform=iOS"

@ -33,4 +33,6 @@ popd
EXIT /b 1
:end
popd
EXIT /b %ERRORLEVEL%

@ -19,15 +19,13 @@ if ROOT_DEV_PATH not in sys.path:
sys.path.append(ROOT_DEV_PATH)
from cmake.Tools import engine_template
from cmake.Tools import current_project
from cmake.Tools import add_remove_gem
from cmake.Tools import global_project
from cmake.Tools import registration
def add_args(parser, subparsers) -> None:
current_project.add_args(parser, subparsers)
global_project.add_args(parser, subparsers)
engine_template.add_args(parser, subparsers)
add_remove_gem.add_args(parser, subparsers)
registration.add_args(parser, subparsers)

@ -15,11 +15,9 @@
#Note this does not actually change the working directory
SCRIPT_DIR=$(cd `dirname $0` && pwd)
#The engine root is always the parent of the scripts directory, so $(dirname "$SCRIPT_DIR") should get us engine root
ENGINE_ROOT=$(dirname "$SCRIPT_DIR")
#The engines python is in the engineroot/python
PYTHON_DIRECTORY="$ENGINE_ROOT/python"
#python should be in the base path
BASE_PATH=$(dirname "$SCRIPT_DIR")
PYTHON_DIRECTORY="$BASE_PATH/python"
#If engine python exists use it, if not try the system python
if [ ! -d "$PYTHON_DIRECTORY" ]; then
@ -33,4 +31,5 @@ if [ ! -f "$PYTHON_EXECUTABLE" ]; then
fi
#run the o3de.py pass along the command
$PYTHON_EXECUTABLE "$SCRIPT_DIR/o3de.py" $*
$PYTHON_EXECUTABLE "$SCRIPT_DIR/o3de.py" $*
exit $?

File diff suppressed because it is too large Load Diff

@ -9,54 +9,67 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
import pytest
'''
import os
import sys
import tempfile
import logging
import pathlib
from unittest.mock import MagicMock
logger = logging.getLogger()
# Code lives one folder above
projects_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(projects_path)
project_manager_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(project_manager_path)
from pyside import add_pyside_environment, is_configuration_valid
from ly_test_tools import WINDOWS
project_marker_file = "project.json"
sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
executable_path = ''
from cmake.Tools import registration
from cmake.Tools import engine_template
class ProjectHelper:
def __init__(self):
self._temp_directory = tempfile.TemporaryDirectory()
self.temp_project_root = self._temp_directory.name
self.temp_file_dir = os.path.join(self.temp_project_root, "o3de")
self._temp_directory = pathlib.Path(tempfile.TemporaryDirectory().name).resolve()
self._temp_directory.mkdir(parents=True, exist_ok=True)
self.home_path = self._temp_directory
registration.override_home_folder = self.home_path
self.engine_path = registration.get_this_engine_path()
if registration.register(engine_path=self.engine_path):
assert True, f"Failed to register the engine."
if registration.register_shipped_engine_o3de_objects():
assert True, f"Failed to register shipped engine objects."
self.projects_folder = registration.get_o3de_projects_folder()
if not self.projects_folder.is_dir():
assert True
self.application = None
self.dialog = None
if not os.path.exists(self.temp_file_dir):
os.makedirs(self.temp_file_dir)
def create_empty_projects(self):
self.project_1_dir = os.path.join(self.temp_project_root, "Project1")
if not os.path.exists(self.project_1_dir):
os.makedirs(self.project_1_dir)
with open(os.path.join(self.project_1_dir,project_marker_file), 'w') as marker_file:
marker_file.write("{}")
self.project_2_dir = os.path.join(self.temp_project_root, "Project2")
if not os.path.exists(self.project_2_dir):
os.makedirs(self.project_2_dir)
with open(os.path.join(self.project_2_dir, project_marker_file), 'w') as marker_file:
marker_file.write("{}")
self.project_3_dir = os.path.join(self.temp_project_root, "Project3")
if not os.path.exists(self.project_3_dir):
os.makedirs(self.project_3_dir)
with open(os.path.join(self.project_3_dir, project_marker_file), 'w') as marker_file:
marker_file.write("{}")
self.invalid_project_dir = os.path.join(self.temp_project_root, "InvalidProject")
self.project_1_dir = self.projects_folder / "Project1"
if engine_template.create_project(project_manager_path=self.project_1_dir):
assert True, f"Failed to create Project1."
self.project_2_dir = self.projects_folder / "Project2"
if engine_template.create_project(project_manager_path=self.project_2_dir):
assert True, f"Failed to create Project2."
self.project_3_dir = self.projects_folder / "Project3"
if engine_template.create_project(project_manager_path=self.project_3_dir):
assert True, f"Failed to create Project3."
self.invalid_project_dir = self.projects_folder / "InvalidProject"
self.invalid_project_dir.mkdir(parents=True, exist_ok=True)
def setup_dialog_test(self, workspace):
add_pyside_environment(workspace.paths.build_directory())
@ -66,6 +79,7 @@ class ProjectHelper:
# need to use the profile version of PySide which works with the profile QT libs which aren't in the debug
# folder we've built.
return None
from PySide2.QtWidgets import QApplication, QMessageBox
if QApplication.instance():
@ -74,13 +88,13 @@ class ProjectHelper:
self.application = QApplication(sys.argv)
assert self.application
from projects import ProjectDialog
from projects import ProjectManagerDialog
try:
self.dialog = ProjectDialog(settings_folder=self.temp_file_dir)
self.dialog = ProjectManagerDialog(settings_folder=self.home_path)
return self.dialog
except Exception as e:
logger.error(f'Failed to create ProjectDialog with error {e}')
logger.error(f'Failed to create ProjectManagerDialog with error {e}')
return None
def create_project_from_template(self, project_name) -> bool:
@ -90,21 +104,24 @@ class ProjectHelper:
:return: True for Success, False for failure
"""
from PySide2.QtWidgets import QWidget, QFileDialog
from projects import ProjectDialog
from projects import ProjectManagerDialog
QWidget.exec = MagicMock()
self.dialog.create_project_handler()
QWidget.exec.assert_called_once()
assert len(self.dialog.project_templates), 'Failed to find any project templates'
ProjectDialog.get_selected_project_template = MagicMock(return_value=self.dialog.project_templates[0])
ProjectManagerDialog.get_selected_project_template = MagicMock(return_value=self.dialog.project_templates[0])
QFileDialog.exec = MagicMock()
create_project_dir = os.path.join(self.temp_project_root, project_name)
QFileDialog.selectedFiles = MagicMock(return_value=[create_project_dir])
create_project_path = self.projects_folder / project_name
QFileDialog.selectedFiles = MagicMock(return_value=[create_project_path])
self.dialog.create_project_accepted_handler()
assert os.path.isdir(create_project_dir), f"Expected project folder not found at {create_project_dir}"
assert QWidget.exec.call_count == 2, "Message box confirming project creation failed to show"
if create_project_path.is_dir():
assert True, f"Expected project creation folder not found at {create_project_path}"
if QWidget.exec.call_count == 2:
assert True, "Message box confirming project creation failed to show"
@pytest.fixture
@ -113,7 +130,7 @@ def project_helper():
@pytest.mark.skipif(not WINDOWS, reason="PySide2 only works on windows currently")
@pytest.mark.parametrize('project', ['']) # Workspace wants a project, but this test is not project dependent
@pytest.mark.parametrize('project', ['']) # Workspace wants a project, but this test is not project dependent
def test_logger_handler(workspace, project_helper):
my_dialog = project_helper.setup_dialog_test(workspace)
if not my_dialog:
@ -126,7 +143,7 @@ def test_logger_handler(workspace, project_helper):
@pytest.mark.skipif(not WINDOWS, reason="PySide2 only works on windows currently")
@pytest.mark.parametrize('project', ['']) # Workspace wants a project, but this test is not project dependent
@pytest.mark.parametrize('project', ['']) # Workspace wants a project, but this test is not project dependent
def test_mru_list(workspace, project_helper):
my_dialog = project_helper.setup_dialog_test(workspace)
if not my_dialog:
@ -140,16 +157,16 @@ def test_mru_list(workspace, project_helper):
assert len(mru_list) == 0, f'MRU list unexpectedly had entries: {mru_list}'
QMessageBox.warning = MagicMock()
my_dialog.add_new_project('TestProjectInvalid')
my_dialog.add_project(project_helper.invalid_project_dir)
mru_list = my_dialog.get_mru_list()
assert len(mru_list) == 0, f'MRU list unexpectedly added an invalid project : {mru_list}'
QMessageBox.warning.assert_called_once()
my_dialog.add_new_project(project_helper.project_1_dir)
my_dialog.add_project(project_helper.project_1_dir)
mru_list = my_dialog.get_mru_list()
assert len(mru_list) == 1, f'MRU list failed to add project at {project_helper.project_1_dir}'
my_dialog.add_new_project(project_helper.project_1_dir)
my_dialog.add_project(project_helper.project_1_dir)
mru_list = my_dialog.get_mru_list()
assert len(mru_list) == 1, f'MRU list added project at {project_helper.project_1_dir} a second time : {mru_list}'
@ -157,7 +174,7 @@ def test_mru_list(workspace, project_helper):
mru_list = my_dialog.get_mru_list()
assert len(mru_list) == 1, f'MRU list added project at {project_helper.project_1_dir} a second time : {mru_list}'
my_dialog.add_new_project(project_helper.project_2_dir)
my_dialog.add_project(project_helper.project_2_dir)
mru_list = my_dialog.get_mru_list()
assert len(mru_list) == 2, f'MRU list failed to add project at {project_helper.project_2_dir}'
@ -170,13 +187,13 @@ def test_mru_list(workspace, project_helper):
assert mru_list[0] == project_helper.project_1_dir, f"{project_helper.project_1_dir} wasn't first item"
assert mru_list[1] == project_helper.project_2_dir, f"{project_helper.project_2_dir} wasn't second item"
my_dialog.add_new_project(project_helper.invalid_project_dir)
my_dialog.add_project(project_helper.invalid_project_dir)
mru_list = my_dialog.get_mru_list()
assert len(mru_list) == 2, f'MRU list added invalid item {mru_list}'
assert mru_list[0] == project_helper.project_1_dir, f"{project_helper.project_1_dir} wasn't first item"
assert mru_list[1] == project_helper.project_2_dir, f"{project_helper.project_2_dir} wasn't second item"
my_dialog.add_new_project(project_helper.project_3_dir)
my_dialog.add_project(project_helper.project_3_dir)
mru_list = my_dialog.get_mru_list()
assert len(mru_list) == 3, f'MRU list failed to add {project_helper.project_3_dir} : {mru_list}'
assert mru_list[0] == project_helper.project_3_dir, f"{project_helper.project_3_dir} wasn't first item"
@ -185,7 +202,7 @@ def test_mru_list(workspace, project_helper):
@pytest.mark.skipif(not WINDOWS, reason="PySide2 only works on windows currently")
@pytest.mark.parametrize('project', ['']) # Workspace wants a project, but this test is not project dependent
@pytest.mark.parametrize('project', ['']) # Workspace wants a project, but this test is not project dependent
def test_create_project(workspace, project_helper):
my_dialog = project_helper.setup_dialog_test(workspace)
if not my_dialog:
@ -195,7 +212,7 @@ def test_create_project(workspace, project_helper):
@pytest.mark.skipif(not WINDOWS, reason="PySide2 only works on windows currently")
@pytest.mark.parametrize('project', ['']) # Workspace wants a project, but this test is not project dependent
@pytest.mark.parametrize('project', ['']) # Workspace wants a project, but this test is not project dependent
def test_add_remove_gems(workspace, project_helper):
my_dialog = project_helper.setup_dialog_test(workspace)
if not my_dialog:
@ -203,32 +220,36 @@ def test_add_remove_gems(workspace, project_helper):
my_project_name = "TestAddRemoveGems"
project_helper.create_project_from_template(my_project_name)
my_project_path = os.path.join(project_helper.temp_project_root, my_project_name)
project_helper.create_project_from_template(project_manager_path=my_project_name)
my_project_path = project_helper.projects_folder / my_project_name
from PySide2.QtWidgets import QWidget, QFileDialog
from projects import ProjectDialog
from projects import ProjectManagerDialog
assert my_dialog.path_for_selection() == my_project_path, "Gems project not selected"
assert my_dialog.get_selected_project_path() == my_project_path, "TestAddRemoveGems project not selected"
QWidget.exec = MagicMock()
my_dialog.manage_gems_handler()
assert my_dialog.manage_gems_dialog, "No gem management dialog created"
assert my_dialog.manage_gem_targets_dialog, "No gem management dialog created"
QWidget.exec.assert_called_once()
assert len(my_dialog.gems_list), 'Failed to find any gems'
my_test_gem = my_dialog.gems_list[0]
my_test_gem_name = my_test_gem.get("Name")
my_test_gem_path = my_test_gem.get("Path")
my_test_gem_selection = (my_test_gem_name, my_test_gem_path)
ProjectDialog.get_selected_add_gems = MagicMock(return_value=[my_test_gem_selection])
if not len(my_dialog.all_gems_list):
assert True, 'Failed to find any gems'
my_test_gem_path = my_dialog.all_gems_list[0]
gem_data = registration.get_gem_data(my_test_gem_path)
my_test_gem_selection = (my_test_gem_name, my_test_gem_path)
ProjectManagerDialog.get_selected_add_gems = MagicMock(return_value=[my_test_gem_selection])
assert my_test_gem_name, "No Name set in test gem"
assert my_test_gem_name not in my_dialog.project_gem_list, f'Gem {my_test_gem_name} already in project gem list'
my_dialog.add_gems_handler()
assert my_test_gem_name in my_dialog.project_gem_list, f'Gem {my_test_gem_name} failed to add to gem list'
ProjectDialog.get_selected_project_gems = MagicMock(return_value=[my_test_gem_name])
ProjectManagerDialog.get_selected_project_gems = MagicMock(return_value=[my_test_gem_name])
my_dialog.remove_gems_handler()
assert my_test_gem_name not in my_dialog.project_gem_list, f'Gem {my_test_gem_name} still in project gem list'
'''
def test_project_place_holder():
pass

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>createFromTemplateDialog</class>
<widget class="QDialog" name="createFromTemplateDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>467</width>
<height>288</height>
</rect>
</property>
<property name="windowTitle">
<string>Create From Template</string>
</property>
<widget class="QDialogButtonBox" name="okCancel">
<property name="geometry">
<rect>
<x>50</x>
<y>250</y>
<width>400</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
<widget class="QListView" name="genericTemplates">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>449</width>
<height>221</height>
</rect>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>300</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Available Templates</string>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>okCancel</sender>
<signal>accepted()</signal>
<receiver>createFromTemplateDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>okCancel</sender>
<signal>rejected()</signal>
<receiver>createFromTemplateDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>createGemDialog</class>
<widget class="QDialog" name="createGemDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>467</width>
<height>288</height>
</rect>
</property>
<property name="windowTitle">
<string>Create Gem</string>
</property>
<widget class="QDialogButtonBox" name="okCancel">
<property name="geometry">
<rect>
<x>50</x>
<y>250</y>
<width>400</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
<widget class="QListView" name="gemTemplates">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>449</width>
<height>221</height>
</rect>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>300</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Available Templates</string>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>okCancel</sender>
<signal>accepted()</signal>
<receiver>createGemDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>okCancel</sender>
<signal>rejected()</signal>
<receiver>createGemDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>226</width>
<width>467</width>
<height>288</height>
</rect>
</property>
@ -18,7 +18,7 @@
<rect>
<x>50</x>
<y>250</y>
<width>171</width>
<width>400</width>
<height>32</height>
</rect>
</property>
@ -34,7 +34,7 @@
<rect>
<x>10</x>
<y>20</y>
<width>211</width>
<width>449</width>
<height>221</height>
</rect>
</property>
@ -47,7 +47,7 @@
<rect>
<x>10</x>
<y>0</y>
<width>101</width>
<width>300</width>
<height>16</height>
</rect>
</property>

@ -1,24 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>addGemsDialog</class>
<widget class="QDialog" name="addGemsDialog">
<class>manageGemTargetsDialog</class>
<widget class="QDialog" name="manageGemTargetsDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>635</width>
<height>327</height>
<width>702</width>
<height>297</height>
</rect>
</property>
<property name="windowTitle">
<string>Manage Gems</string>
<string>Manage Gem Targets</string>
</property>
<widget class="QDialogButtonBox" name="close">
<property name="geometry">
<rect>
<x>460</x>
<y>290</y>
<width>171</width>
<x>310</x>
<y>260</y>
<width>71</width>
<height>32</height>
</rect>
</property>
@ -29,10 +29,10 @@
<set>QDialogButtonBox::Close</set>
</property>
</widget>
<widget class="QListView" name="addGemsList">
<widget class="QListView" name="availableGemTargetsList">
<property name="geometry">
<rect>
<x>380</x>
<x>440</x>
<y>50</y>
<width>250</width>
<height>221</height>
@ -48,7 +48,7 @@
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
</widget>
<widget class="QListView" name="projectGems">
<widget class="QListView" name="enabledGemTargetsList">
<property name="geometry">
<rect>
<x>10</x>
@ -64,14 +64,14 @@
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>380</x>
<x>440</x>
<y>30</y>
<width>91</width>
<width>251</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Available Gems</string>
<string>Available Gem Targets</string>
</property>
</widget>
<widget class="QLabel" name="label_4">
@ -79,38 +79,38 @@
<rect>
<x>10</x>
<y>30</y>
<width>71</width>
<width>251</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Enabled Gems</string>
<string>Enabled Gem Targets</string>
</property>
</widget>
<widget class="QPushButton" name="removeGemsButton">
<widget class="QPushButton" name="removeGemTargetsButton">
<property name="geometry">
<rect>
<x>267</x>
<x>264</x>
<y>130</y>
<width>105</width>
<width>171</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Remove Gems &gt;&gt;</string>
<string>Remove Gem Targets &gt;&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="addGemsButton">
<widget class="QPushButton" name="addGemTargetsButton">
<property name="geometry">
<rect>
<x>267</x>
<x>264</x>
<y>100</y>
<width>105</width>
<width>171</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&lt;&lt; Add Gems</string>
<string>&lt;&lt; Add Gem Targets</string>
</property>
</widget>
<widget class="QLabel" name="label">
@ -118,12 +118,12 @@
<rect>
<x>10</x>
<y>5</y>
<width>241</width>
<height>16</height>
<width>400</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Adding new Gems may require rebuilding</string>
<string>Adding new Gem Targets may require rebuilding</string>
</property>
</widget>
</widget>
@ -132,7 +132,7 @@
<connection>
<sender>close</sender>
<signal>accepted()</signal>
<receiver>addGemsDialog</receiver>
<receiver>manageGemTargetsDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
@ -148,7 +148,7 @@
<connection>
<sender>close</sender>
<signal>rejected()</signal>
<receiver>addGemsDialog</receiver>
<receiver>manageGemTargetsDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">

@ -0,0 +1,407 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>712</width>
<height>395</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>O3DE</string>
</property>
<property name="whatsThis">
<string>Select and manage your projects for O3DE</string>
</property>
<widget class="QDialogButtonBox" name="okCancel">
<property name="geometry">
<rect>
<x>540</x>
<y>360</y>
<width>161</width>
<height>31</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
<widget class="QComboBox" name="projectListBox">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>691</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Current project to launch or manage gems for.</string>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>47</width>
<height>13</height>
</rect>
</property>
<property name="text">
<string>Project</string>
</property>
</widget>
<widget class="QLabel" name="logDisplay">
<property name="geometry">
<rect>
<x>270</x>
<y>220</y>
<width>431</width>
<height>141</height>
</rect>
</property>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
<widget class="QGroupBox" name="createGroupBox">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>241</width>
<height>151</height>
</rect>
</property>
<property name="title">
<string>Create</string>
</property>
<widget class="QPushButton" name="createFromTemplateButton">
<property name="geometry">
<rect>
<x>10</x>
<y>110</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Create a new O3DE object from a pre configured template.</string>
</property>
<property name="text">
<string>Create From Template</string>
</property>
</widget>
<widget class="QPushButton" name="createProjectButton">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Create a new O3DE object from a pre configured template.</string>
</property>
<property name="text">
<string>Create Project</string>
</property>
</widget>
<widget class="QPushButton" name="createGemButton">
<property name="geometry">
<rect>
<x>11</x>
<y>50</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Create a new O3DE object from a pre configured template.</string>
</property>
<property name="text">
<string>Create Gem</string>
</property>
</widget>
<widget class="QPushButton" name="createTemplateButton">
<property name="geometry">
<rect>
<x>11</x>
<y>80</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Create a new O3DE object from a pre configured template.</string>
</property>
<property name="text">
<string>Create Template</string>
</property>
</widget>
</widget>
<widget class="QGroupBox" name="addRemoveGroupBox">
<property name="geometry">
<rect>
<x>260</x>
<y>70</y>
<width>451</width>
<height>141</height>
</rect>
</property>
<property name="title">
<string>Registration</string>
</property>
<widget class="QPushButton" name="addTemplateButton">
<property name="geometry">
<rect>
<x>10</x>
<y>80</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Add Template</string>
</property>
</widget>
<widget class="QPushButton" name="addProjectButton">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Add Project</string>
</property>
</widget>
<widget class="QPushButton" name="addGemButton">
<property name="geometry">
<rect>
<x>10</x>
<y>50</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Add Gem</string>
</property>
</widget>
<widget class="QPushButton" name="addRestrictedButton">
<property name="geometry">
<rect>
<x>10</x>
<y>110</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Add Restricted</string>
</property>
</widget>
<widget class="QPushButton" name="removeRestrictedButton">
<property name="geometry">
<rect>
<x>230</x>
<y>110</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Remove Restricted</string>
</property>
</widget>
<widget class="QPushButton" name="removeProjectButton">
<property name="geometry">
<rect>
<x>230</x>
<y>20</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Remove Project</string>
</property>
</widget>
<widget class="QPushButton" name="removeGemButton">
<property name="geometry">
<rect>
<x>230</x>
<y>50</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Remove Gem</string>
</property>
</widget>
<widget class="QPushButton" name="removeTemplateButton">
<property name="geometry">
<rect>
<x>230</x>
<y>80</y>
<width>211</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Remove Template</string>
</property>
</widget>
</widget>
<widget class="QGroupBox" name="manageProjectGroupBox">
<property name="geometry">
<rect>
<x>10</x>
<y>230</y>
<width>241</width>
<height>121</height>
</rect>
</property>
<property name="title">
<string>Manage Project</string>
</property>
<widget class="QPushButton" name="manageServerGemTargetsButton">
<property name="geometry">
<rect>
<x>10</x>
<y>80</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Add or remove gems from your selected project. Gems add and remove additional assets and features to projects.</string>
</property>
<property name="text">
<string>Manage Server Gem Targets</string>
</property>
</widget>
<widget class="QPushButton" name="manageToolGemTargetsButton">
<property name="geometry">
<rect>
<x>10</x>
<y>50</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Add or remove gems from your selected project. Gems add and remove additional assets and features to projects.</string>
</property>
<property name="text">
<string>Manage Tool Gem Targets</string>
</property>
</widget>
<widget class="QPushButton" name="manageRuntimeGemTargetsButton">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Add or remove gems from your selected project. Gems add and remove additional assets and features to projects.</string>
</property>
<property name="text">
<string>Manage Runtime Gem Targets</string>
</property>
</widget>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>okCancel</sender>
<signal>accepted()</signal>
<receiver>Dialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>okCancel</sender>
<signal>rejected()</signal>
<receiver>Dialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

@ -1,167 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>464</width>
<height>136</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>O3DE</string>
</property>
<property name="whatsThis">
<string>Select and manage your projects for O3DE</string>
</property>
<widget class="QDialogButtonBox" name="okCancel">
<property name="geometry">
<rect>
<x>290</x>
<y>100</y>
<width>171</width>
<height>31</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
<widget class="QComboBox" name="projectListBox">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>451</width>
<height>31</height>
</rect>
</property>
<property name="whatsThis">
<string>Current project to launch or manage gems for.</string>
</property>
</widget>
<widget class="QPushButton" name="createProjectButton">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>91</width>
<height>23</height>
</rect>
</property>
<property name="whatsThis">
<string>Create a new O3DE project from a pre configured template.</string>
</property>
<property name="text">
<string>Create New</string>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>47</width>
<height>13</height>
</rect>
</property>
<property name="text">
<string>Project</string>
</property>
</widget>
<widget class="QPushButton" name="browseProjectsButton">
<property name="geometry">
<rect>
<x>110</x>
<y>70</y>
<width>91</width>
<height>23</height>
</rect>
</property>
<property name="whatsThis">
<string>Browse for an existing O3DE project.</string>
</property>
<property name="text">
<string>Browse</string>
</property>
</widget>
<widget class="QPushButton" name="manageGemsButton">
<property name="geometry">
<rect>
<x>350</x>
<y>70</y>
<width>91</width>
<height>23</height>
</rect>
</property>
<property name="whatsThis">
<string>Add or remove gems from your selected project. Gems add and remove additional assets and features to projects.</string>
</property>
<property name="text">
<string>Manage Gems</string>
</property>
</widget>
<widget class="QLabel" name="logDisplay">
<property name="geometry">
<rect>
<x>5</x>
<y>110</y>
<width>275</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string/>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>okCancel</sender>
<signal>accepted()</signal>
<receiver>Dialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>okCancel</sender>
<signal>rejected()</signal>
<receiver>Dialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>
Loading…
Cancel
Save