diff --git a/CMakeLists.txt b/CMakeLists.txt
index 43b0dd240e..e659270f84 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -29,11 +29,11 @@ include(cmake/PAL.cmake)
include(cmake/PALTools.cmake)
include(cmake/RuntimeDependencies.cmake)
include(cmake/Configurations.cmake) # Requires to be after PAL so we get platform variable definitions
-include(cmake/Install.cmake)
include(cmake/Dependencies.cmake)
include(cmake/Deployment.cmake)
include(cmake/3rdParty.cmake)
include(cmake/LYPython.cmake)
+include(cmake/Install.cmake)
include(cmake/LYWrappers.cmake)
include(cmake/Gems.cmake)
include(cmake/UnitTest.cmake)
diff --git a/Code/Editor/Platform/Mac/EditorEntitlements.plist b/Code/Editor/Platform/Mac/EditorEntitlements.plist
new file mode 100644
index 0000000000..cefa2bf93b
--- /dev/null
+++ b/Code/Editor/Platform/Mac/EditorEntitlements.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.cs.allow-dyld-environment-variables
+
+ com.apple.security.cs.disable-library-validation
+
+
+
diff --git a/Code/Editor/Platform/Mac/editor_mac.cmake b/Code/Editor/Platform/Mac/editor_mac.cmake
index fdccfafb46..eed955f2e4 100644
--- a/Code/Editor/Platform/Mac/editor_mac.cmake
+++ b/Code/Editor/Platform/Mac/editor_mac.cmake
@@ -12,28 +12,5 @@ set_target_properties(Editor PROPERTIES
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_LIST_DIR}/gui_info.plist
RESOURCE ${CMAKE_CURRENT_LIST_DIR}/Images.xcassets
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME EditorAppIcon
+ ENTITLEMENT_FILE_PATH ${CMAKE_CURRENT_LIST_DIR}/EditorEntitlements.plist
)
-
-# We cannot use ly_add_target here because we're already including this file from inside ly_add_target
-# So we need to setup target, dependencies and install logic manually.
-add_executable(EditorDummy Platform/Mac/main_dummy.cpp)
-add_executable(AZ::EditorDummy ALIAS EditorDummy)
-
-ly_target_link_libraries(EditorDummy
- PRIVATE
- AZ::AzCore
- AZ::AzFramework)
-
-ly_add_dependencies(Editor EditorDummy)
-
-# Store the aliased target into a DIRECTORY property
-set_property(DIRECTORY APPEND PROPERTY LY_DIRECTORY_TARGETS AZ::EditorDummy)
-
-# Store the directory path in a GLOBAL property so that it can be accessed
-# in the layout install logic. Skip if the directory has already been added
-get_property(ly_all_target_directories GLOBAL PROPERTY LY_ALL_TARGET_DIRECTORIES)
-if(NOT CMAKE_CURRENT_SOURCE_DIR IN_LIST ly_all_target_directories)
- set_property(GLOBAL APPEND PROPERTY LY_ALL_TARGET_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})
-endif()
-
-ly_install_add_install_path_setreg(Editor)
\ No newline at end of file
diff --git a/Code/Editor/Platform/Mac/gui_info.plist b/Code/Editor/Platform/Mac/gui_info.plist
index cc87cbbb47..5b5f94e977 100644
--- a/Code/Editor/Platform/Mac/gui_info.plist
+++ b/Code/Editor/Platform/Mac/gui_info.plist
@@ -3,7 +3,7 @@
CFBundleExecutable
- EditorDummy
+ Editor
CFBundleIdentifier
org.O3DE.Editor
CFBundlePackageType
diff --git a/Code/Editor/Platform/Mac/main_dummy.cpp b/Code/Editor/Platform/Mac/main_dummy.cpp
deleted file mode 100644
index 348a32ab47..0000000000
--- a/Code/Editor/Platform/Mac/main_dummy.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-int main(int argc, char* argv[])
-{
- // Create a ComponentApplication to initialize the AZ::SystemAllocator and initialize the SettingsRegistry
- AZ::ComponentApplication::Descriptor desc;
- AZ::ComponentApplication application;
- application.Create(desc);
-
- AZStd::vector envVars;
-
- const char* homePath = std::getenv("HOME");
- envVars.push_back(AZStd::string::format("HOME=%s", homePath));
-
- if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
- {
- const char* dyldLibPathOrig = std::getenv("DYLD_LIBRARY_PATH");
- AZStd::string dyldSearchPath = AZStd::string::format("DYLD_LIBRARY_PATH=%s", dyldLibPathOrig);
- if (AZ::IO::FixedMaxPath projectModulePath;
- settingsRegistry->Get(projectModulePath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_ProjectConfigurationBinPath))
- {
- dyldSearchPath.append(":");
- dyldSearchPath.append(projectModulePath.c_str());
- }
-
- if (AZ::IO::FixedMaxPath installedBinariesFolder;
- settingsRegistry->Get(installedBinariesFolder.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_InstalledBinaryFolder))
- {
- if (AZ::IO::FixedMaxPath engineRootFolder;
- settingsRegistry->Get(engineRootFolder.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_EngineRootFolder))
- {
- installedBinariesFolder = engineRootFolder / installedBinariesFolder;
- dyldSearchPath.append(":");
- dyldSearchPath.append(installedBinariesFolder.c_str());
- }
- }
- envVars.push_back(dyldSearchPath);
- }
-
- AZStd::string commandArgs;
- for (int i = 1; i < argc; i++)
- {
- commandArgs.append(argv[i]);
- commandArgs.append(" ");
- }
-
- AzFramework::ProcessLauncher::ProcessLaunchInfo processLaunchInfo;
- AZ::IO::Path processPath{ AZ::IO::PathView(AZ::Utils::GetExecutableDirectory()) };
- processPath /= "Editor";
- processLaunchInfo.m_processExecutableString = AZStd::move(processPath.Native());
- processLaunchInfo.m_commandlineParameters = commandArgs;
- processLaunchInfo.m_environmentVariables = &envVars;
- processLaunchInfo.m_showWindow = true;
-
- AzFramework::ProcessLauncher::LaunchUnwatchedProcess(processLaunchInfo);
-
- application.Destroy();
-
- return 0;
-}
-
diff --git a/Code/Editor/Plugins/EditorCommon/CMakeLists.txt b/Code/Editor/Plugins/EditorCommon/CMakeLists.txt
index 2aff57cfb1..cd9f2e79c7 100644
--- a/Code/Editor/Plugins/EditorCommon/CMakeLists.txt
+++ b/Code/Editor/Plugins/EditorCommon/CMakeLists.txt
@@ -51,4 +51,5 @@ ly_add_target(
AZ::AzCore
AZ::AzToolsFramework
AZ::AzQtComponents
+ Legacy::EditorCore
)
diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Module/DynamicModuleHandle_UnixLike.cpp b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Module/DynamicModuleHandle_UnixLike.cpp
index 5cf854d49f..1ca6a7c4c7 100644
--- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Module/DynamicModuleHandle_UnixLike.cpp
+++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Module/DynamicModuleHandle_UnixLike.cpp
@@ -72,6 +72,7 @@ namespace AZ
{
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
{
+ bool fileFound = false;
if (AZ::IO::FixedMaxPath projectModulePath;
settingsRegistry->Get(projectModulePath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_ProjectConfigurationBinPath))
{
@@ -79,6 +80,23 @@ namespace AZ
if (AZ::IO::SystemFile::Exists(projectModulePath.c_str()))
{
m_fileName.assign(projectModulePath.c_str(), projectModulePath.Native().size());
+ fileFound = true;
+ }
+ }
+ if (!fileFound)
+ {
+ if (AZ::IO::FixedMaxPath installedBinariesPath;
+ settingsRegistry->Get(installedBinariesPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_InstalledBinaryFolder))
+ {
+ if (AZ::IO::FixedMaxPath engineRootFolder;
+ settingsRegistry->Get(engineRootFolder.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_EngineRootFolder))
+ {
+ installedBinariesPath = engineRootFolder / installedBinariesPath / fullFilePath;
+ if (AZ::IO::SystemFile::Exists(installedBinariesPath.c_str()))
+ {
+ m_fileName.assign(installedBinariesPath.c_str(), installedBinariesPath.Native().size());
+ }
+ }
}
}
}
diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp
index 9aff67a00f..2e31936057 100644
--- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp
+++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp
@@ -9,6 +9,7 @@
#include
#include
+#include
namespace AZ
{
@@ -39,6 +40,14 @@ namespace AZ
AZ::IO::FixedMaxPath path{homePath};
return path.Native();
}
+
+ struct passwd* pass = getpwuid(getuid());
+ if (pass)
+ {
+ AZ::IO::FixedMaxPath path{pass->pw_dir};
+ return path.Native();
+ }
+
return {};
}
diff --git a/Code/Tools/AssetProcessor/Platform/Mac/AssetProcessorEntitlements.plist b/Code/Tools/AssetProcessor/Platform/Mac/AssetProcessorEntitlements.plist
new file mode 100644
index 0000000000..cefa2bf93b
--- /dev/null
+++ b/Code/Tools/AssetProcessor/Platform/Mac/AssetProcessorEntitlements.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.cs.allow-dyld-environment-variables
+
+ com.apple.security.cs.disable-library-validation
+
+
+
diff --git a/Code/Tools/AssetProcessor/Platform/Mac/assetprocessor_mac.cmake b/Code/Tools/AssetProcessor/Platform/Mac/assetprocessor_mac.cmake
index e34ce9d341..c5147d4024 100644
--- a/Code/Tools/AssetProcessor/Platform/Mac/assetprocessor_mac.cmake
+++ b/Code/Tools/AssetProcessor/Platform/Mac/assetprocessor_mac.cmake
@@ -12,28 +12,5 @@ set_target_properties(AssetProcessor PROPERTIES
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Platform/Mac/gui_info.plist
RESOURCE ${CMAKE_CURRENT_SOURCE_DIR}/Platform/Mac/Images.xcassets
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AssetProcessorAppIcon
+ ENTITLEMENT_FILE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Platform/Mac/AssetProcessorEntitlements.plist
)
-
-# We cannot use ly_add_target here because we're already including this file from inside ly_add_target
-# So we need to setup target, dependencies and install logic manually.
-add_executable(AssetProcessorDummy Platform/Mac/main_dummy.cpp)
-add_executable(AZ::AssetProcessorDummy ALIAS AssetProcessorDummy)
-
-ly_target_link_libraries(AssetProcessorDummy
- PRIVATE
- AZ::AzCore
- AZ::AzFramework)
-
-ly_add_dependencies(AssetProcessor AssetProcessorDummy)
-
-# Store the aliased target into a DIRECTORY property
-set_property(DIRECTORY APPEND PROPERTY LY_DIRECTORY_TARGETS AZ::AssetProcessorDummy)
-
-# Store the directory path in a GLOBAL property so that it can be accessed
-# in the layout install logic. Skip if the directory has already been added
-get_property(ly_all_target_directories GLOBAL PROPERTY LY_ALL_TARGET_DIRECTORIES)
-if(NOT CMAKE_CURRENT_SOURCE_DIR IN_LIST ly_all_target_directories)
- set_property(GLOBAL APPEND PROPERTY LY_ALL_TARGET_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})
-endif()
-
-ly_install_add_install_path_setreg(AssetProcessor)
\ No newline at end of file
diff --git a/Code/Tools/AssetProcessor/Platform/Mac/gui_info.plist b/Code/Tools/AssetProcessor/Platform/Mac/gui_info.plist
index 301f0c5cee..665abea1d3 100644
--- a/Code/Tools/AssetProcessor/Platform/Mac/gui_info.plist
+++ b/Code/Tools/AssetProcessor/Platform/Mac/gui_info.plist
@@ -11,7 +11,7 @@
CFBundleSignature
ASPR
CFBundleExecutable
- AssetProcessorDummy
+ AssetProcessor
CFBundleIdentifier
com.Amazon.AssetProcessor
diff --git a/Code/Tools/AssetProcessor/Platform/Mac/main_dummy.cpp b/Code/Tools/AssetProcessor/Platform/Mac/main_dummy.cpp
deleted file mode 100644
index 3eed37e555..0000000000
--- a/Code/Tools/AssetProcessor/Platform/Mac/main_dummy.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-int main(int argc, char* argv[])
-{
- // Create a ComponentApplication to initialize the AZ::SystemAllocator and initialize the SettingsRegistry
- AZ::ComponentApplication::Descriptor desc;
- AZ::ComponentApplication application;
- application.Create(desc);
-
- AZStd::vector envVars;
-
- const char* homePath = std::getenv("HOME");
- envVars.push_back(AZStd::string::format("HOME=%s", homePath));
-
- if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
- {
- const char* dyldLibPathOrig = std::getenv("DYLD_LIBRARY_PATH");
- AZStd::string dyldSearchPath = AZStd::string::format("DYLD_LIBRARY_PATH=%s", dyldLibPathOrig);
- if (AZ::IO::FixedMaxPath projectModulePath;
- settingsRegistry->Get(projectModulePath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_ProjectConfigurationBinPath))
- {
- dyldSearchPath.append(":");
- dyldSearchPath.append(projectModulePath.c_str());
- }
-
- if (AZ::IO::FixedMaxPath installedBinariesFolder;
- settingsRegistry->Get(installedBinariesFolder.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_InstalledBinaryFolder))
- {
- if (AZ::IO::FixedMaxPath engineRootFolder;
- settingsRegistry->Get(engineRootFolder.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_EngineRootFolder))
- {
- installedBinariesFolder = engineRootFolder / installedBinariesFolder;
- dyldSearchPath.append(":");
- dyldSearchPath.append(installedBinariesFolder.c_str());
- }
- }
- envVars.push_back(dyldSearchPath);
- }
-
- AZStd::string commandArgs;
- for (int i = 1; i < argc; i++)
- {
- commandArgs.append(argv[i]);
- commandArgs.append(" ");
- }
-
- AzFramework::ProcessLauncher::ProcessLaunchInfo processLaunchInfo;
- AZ::IO::Path processPath{ AZ::IO::PathView(AZ::Utils::GetExecutableDirectory()) };
- processPath /= "AssetProcessor";
- processLaunchInfo.m_processExecutableString = AZStd::move(processPath.Native());
- processLaunchInfo.m_commandlineParameters = commandArgs;
- processLaunchInfo.m_environmentVariables = &envVars;
- processLaunchInfo.m_showWindow = true;
-
- AzFramework::ProcessLauncher::LaunchUnwatchedProcess(processLaunchInfo);
-
- application.Destroy();
-
- return 0;
-}
-
diff --git a/Code/Tools/BundleLauncher/CMakeLists.txt b/Code/Tools/BundleLauncher/CMakeLists.txt
new file mode 100644
index 0000000000..812cb21099
--- /dev/null
+++ b/Code/Tools/BundleLauncher/CMakeLists.txt
@@ -0,0 +1,24 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+# This is the launcher that will be used by the O3DE_SDK.app bundle
+# generated by the cmake install process for Mac.
+if(NOT ${PAL_PLATFORM_NAME} STREQUAL Mac)
+ return()
+endif()
+
+ly_add_target(
+ NAME O3DE_SDK EXECUTABLE
+ NAMESPACE AZ
+ FILES_CMAKE
+ O3DE_SDK_files.cmake
+ BUILD_DEPENDENCIES
+ PRIVATE
+ AZ::AzCore
+ AZ::AzFramework
+)
diff --git a/Code/Tools/BundleLauncher/O3DE_SDK_Launcher.cpp b/Code/Tools/BundleLauncher/O3DE_SDK_Launcher.cpp
new file mode 100644
index 0000000000..0c362ac829
--- /dev/null
+++ b/Code/Tools/BundleLauncher/O3DE_SDK_Launcher.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+int main(int argc, char* argv[])
+{
+ // We need to pass in the engine path since we won't be able to find it by searching upwards.
+ // We can't use any containers that use our custom allocator till after the call to ComponentApplication::Create()
+ AZ::IO::FixedMaxPath processPath = AZ::Utils::GetExecutableDirectory();
+ AZ::IO::FixedMaxPath enginePath = (processPath / "../Engine").LexicallyNormal();
+ auto enginePathParam = AZ::SettingsRegistryInterface::FixedValueString::format(R"(--engine-path="%s")", enginePath.c_str());
+ // Uses the fixed_vector deduction guide to determine the type is AZStd::fixed_vector
+ AZStd::fixed_vector commandLineParams{ processPath.Native().data(), enginePathParam.data() };
+
+
+ // Create a ComponentApplication to initialize the AZ::SystemAllocator and initialize the SettingsRegistry
+ AZ::ComponentApplication application(static_cast(commandLineParams.size()), commandLineParams.data());
+ application.Create(AZ::ComponentApplication::Descriptor());
+
+ AZ::IO::FixedMaxPath installedBinariesFolder;
+ if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
+ {
+ if (settingsRegistry->Get(installedBinariesFolder.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_InstalledBinaryFolder))
+ {
+ installedBinariesFolder = enginePath / installedBinariesFolder;
+ }
+ }
+
+ AZ::IO::FixedMaxPath shellPath = "/bin/sh";
+ AZStd::string parameters = AZStd::string::format("-c \"export LY_CMAKE_PATH=/usr/local/bin && \"%s/python/get_python.sh\"\"", enginePath.c_str());
+ AzFramework::ProcessLauncher::ProcessLaunchInfo shellProcessLaunch;
+ shellProcessLaunch.m_processExecutableString = AZStd::move(shellPath.Native());
+ shellProcessLaunch.m_commandlineParameters = parameters;
+ shellProcessLaunch.m_showWindow = true;
+ shellProcessLaunch.m_workingDirectory = enginePath.String();
+ AZStd::unique_ptr shellProcess(AzFramework::ProcessWatcher::LaunchProcess(shellProcessLaunch, AzFramework::ProcessCommunicationType::COMMUNICATOR_TYPE_NONE));
+ shellProcess->WaitForProcessToExit(120);
+ shellProcess.reset();
+
+ AZ::IO::FixedMaxPath projectManagerPath = installedBinariesFolder/"o3de.app"/"Contents"/"MacOS"/"o3de";
+ AzFramework::ProcessLauncher::ProcessLaunchInfo processLaunchInfo;
+ processLaunchInfo.m_processExecutableString = AZStd::move(projectManagerPath.Native());
+ processLaunchInfo.m_showWindow = true;
+ AzFramework::ProcessLauncher::LaunchUnwatchedProcess(processLaunchInfo);
+
+ application.Destroy();
+
+ return 0;
+}
+
diff --git a/Code/Tools/BundleLauncher/O3DE_SDK_files.cmake b/Code/Tools/BundleLauncher/O3DE_SDK_files.cmake
new file mode 100644
index 0000000000..04989c9df2
--- /dev/null
+++ b/Code/Tools/BundleLauncher/O3DE_SDK_files.cmake
@@ -0,0 +1,11 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+set(FILES
+ O3DE_SDK_Launcher.cpp
+)
diff --git a/Code/Tools/BundleLauncher/info.plist b/Code/Tools/BundleLauncher/info.plist
new file mode 100644
index 0000000000..5b3dd43b37
--- /dev/null
+++ b/Code/Tools/BundleLauncher/info.plist
@@ -0,0 +1,18 @@
+
+
+
+
+ CFBundleExecutable
+ O3DE_SDK
+ CFBundleIdentifier
+ org.O3DE.O3DE_SDK
+ CFBundlePackageType
+ APPL
+ CFBundleSignature
+ ????
+ NSHumanReadableCopyright
+ Copyright (c) Contributors to the Open 3D Engine Project.
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/Code/Tools/CMakeLists.txt b/Code/Tools/CMakeLists.txt
index 66c43e53e5..8107089433 100644
--- a/Code/Tools/CMakeLists.txt
+++ b/Code/Tools/CMakeLists.txt
@@ -20,3 +20,4 @@ add_subdirectory(GridHub)
add_subdirectory(Standalone)
add_subdirectory(TestImpactFramework)
add_subdirectory(ProjectManager)
+add_subdirectory(BundleLauncher)
diff --git a/Code/Tools/ProjectManager/Platform/Mac/PAL_mac.cmake b/Code/Tools/ProjectManager/Platform/Mac/PAL_mac.cmake
index 7a325ca97e..5cd1fb5a22 100644
--- a/Code/Tools/ProjectManager/Platform/Mac/PAL_mac.cmake
+++ b/Code/Tools/ProjectManager/Platform/Mac/PAL_mac.cmake
@@ -5,3 +5,4 @@
# SPDX-License-Identifier: Apache-2.0 OR MIT
#
#
+
diff --git a/Gems/Atom/Feature/Common/Code/CMakeLists.txt b/Gems/Atom/Feature/Common/Code/CMakeLists.txt
index b8c414dcc6..9c4ffe5b5e 100644
--- a/Gems/Atom/Feature/Common/Code/CMakeLists.txt
+++ b/Gems/Atom/Feature/Common/Code/CMakeLists.txt
@@ -40,6 +40,8 @@ ly_add_target(
Gem::Atom_Feature_Common.Public
Gem::ImGui.imguilib
#3rdParty::lux_core # AZ_TRAIT_LUXCORE_SUPPORTED is disabled in every platform, Issue #3915 will remove
+ RUNTIME_DEPENDENCIES
+ Gem::ImGui.imguilib
)
ly_add_target(
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt b/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt
index bf28ed3f14..e68681315e 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt
@@ -109,6 +109,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS)
RUNTIME_DEPENDENCIES
Gem::Atom_RPI.Editor
Gem::Atom_Feature_Common.Editor
+ Legacy::EditorCommon
)
# The AtomLyIntegration_CommonFeatures.Editor module is used for Builders and Tools
diff --git a/Gems/Camera/Code/CMakeLists.txt b/Gems/Camera/Code/CMakeLists.txt
index 3fbeec0908..138f0fda85 100644
--- a/Gems/Camera/Code/CMakeLists.txt
+++ b/Gems/Camera/Code/CMakeLists.txt
@@ -61,6 +61,8 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
Legacy::EditorCommon
AZ::AzToolsFramework
Gem::Camera.Static
+ RUNTIME_DEPENDENCIES
+ Legacy::EditorCommon
)
# tools and builders use the above module.
diff --git a/cmake/Install.cmake b/cmake/Install.cmake
index 6f50c78fd7..adcd28fa37 100644
--- a/cmake/Install.cmake
+++ b/cmake/Install.cmake
@@ -152,3 +152,20 @@ function(ly_install_run_code CODE)
)
endfunction()
+
+#! ly_install_run_script: specifies path to script to be added to the install process (will run at install time)
+#
+# \notes:
+# - refer to cmake's install(SCRIPT documentation for more information
+#
+function(ly_install_run_script SCRIPT)
+
+ if(NOT LY_INSTALL_ENABLED)
+ return()
+ endif()
+
+ install(SCRIPT ${SCRIPT}
+ COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} # use the default for the time being
+ )
+
+endfunction()
\ No newline at end of file
diff --git a/cmake/LYPython.cmake b/cmake/LYPython.cmake
index eeb9f97a55..a8095fbc95 100644
--- a/cmake/LYPython.cmake
+++ b/cmake/LYPython.cmake
@@ -21,14 +21,17 @@ include(cmake/LySet.cmake)
# CMAKE_HOST_SYSTEM_NAME is "Windows", "Darwin", or "Linux" in our cases..
if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux" )
ly_set(LY_PYTHON_VERSION 3.7.10)
+ ly_set(LY_PYTHON_VERSION_MAJOR_MINOR 3.7)
ly_set(LY_PYTHON_PACKAGE_NAME python-3.7.10-rev2-linux)
ly_set(LY_PYTHON_PACKAGE_HASH 6b9cf455e6190ec38836194f4454bb9db6bfc6890b4baff185cc5520aa822f05)
elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Darwin" )
ly_set(LY_PYTHON_VERSION 3.7.10)
+ ly_set(LY_PYTHON_VERSION_MAJOR_MINOR 3.7)
ly_set(LY_PYTHON_PACKAGE_NAME python-3.7.10-rev1-darwin)
ly_set(LY_PYTHON_PACKAGE_HASH 3f65801894e4e44b5faa84dd85ef80ecd772dcf728cdd2d668a6e75978a32695)
elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows" )
ly_set(LY_PYTHON_VERSION 3.7.10)
+ ly_set(LY_PYTHON_VERSION_MAJOR_MINOR 3.7)
ly_set(LY_PYTHON_PACKAGE_NAME python-3.7.10-rev2-windows)
ly_set(LY_PYTHON_PACKAGE_HASH 06d97488a2dbabe832ecfa832a42d3e8a7163ba95e975f032727331b0f49d280)
endif()
diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake
index fdd3256d78..8fb2effe29 100644
--- a/cmake/Platform/Common/Install_common.cmake
+++ b/cmake/Platform/Common/Install_common.cmake
@@ -21,15 +21,21 @@ define_property(TARGET PROPERTY LY_INSTALL_GENERATE_RUN_TARGET
ly_set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME Core)
-cmake_path(RELATIVE_PATH CMAKE_RUNTIME_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE runtime_output_directory)
-cmake_path(RELATIVE_PATH CMAKE_LIBRARY_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE library_output_directory)
-
if(LY_MONOLITHIC_GAME)
set(LY_BUILD_PERMUTATION Monolithic)
else()
set(LY_BUILD_PERMUTATION Default)
endif()
+cmake_path(RELATIVE_PATH CMAKE_RUNTIME_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE runtime_output_directory)
+cmake_path(RELATIVE_PATH CMAKE_LIBRARY_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE library_output_directory)
+# Get the output folders, archive is always the same, but runtime/library can be in subfolders defined per target
+cmake_path(RELATIVE_PATH CMAKE_ARCHIVE_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE archive_output_directory)
+
+cmake_path(APPEND archive_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}")
+cmake_path(APPEND library_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}")
+cmake_path(APPEND runtime_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}")
+
#! ly_setup_target: Setup the data needed to re-create the cmake target commands for a single target
function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_target_source_dir)
# De-alias target name
@@ -78,9 +84,6 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar
endforeach()
endif()
- # Get the output folders, archive is always the same, but runtime/library can be in subfolders defined per target
- cmake_path(RELATIVE_PATH CMAKE_ARCHIVE_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE archive_output_directory)
-
get_target_property(target_runtime_output_directory ${TARGET_NAME} RUNTIME_OUTPUT_DIRECTORY)
if(target_runtime_output_directory)
cmake_path(RELATIVE_PATH target_runtime_output_directory BASE_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} OUTPUT_VARIABLE target_runtime_output_subdirectory)
@@ -91,10 +94,6 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar
cmake_path(RELATIVE_PATH target_library_output_directory BASE_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} OUTPUT_VARIABLE target_library_output_subdirectory)
endif()
- cmake_path(APPEND archive_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}")
- cmake_path(APPEND library_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}")
- cmake_path(APPEND runtime_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}")
-
if(COMMAND ly_install_target_override)
# Mac needs special handling because of a cmake issue
ly_install_target_override(TARGET ${TARGET_NAME}
@@ -372,6 +371,10 @@ function(ly_setup_o3de_install)
COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME}
)
+ if(COMMAND ly_post_install_steps)
+ ly_post_install_steps()
+ endif()
+
endfunction()
#! ly_setup_cmake_install: install the "cmake" folder
@@ -528,7 +531,7 @@ endfunction()"
# of baking the path. This is needed so `cmake --install --prefix ` works regardless of the CMAKE_INSTALL_PREFIX
# used to generate the solution.
# CMAKE_INSTALL_PREFIX is still used when building the INSTALL target
- set(install_output_folder "\${CMAKE_INSTALL_PREFIX}/${runtime_output_directory}/${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}")
+ set(install_output_folder "\${CMAKE_INSTALL_PREFIX}/${runtime_output_directory}")
set(target_file_dir "${install_output_folder}/${target_runtime_output_subdirectory}")
ly_get_runtime_dependencies(runtime_dependencies ${target})
foreach(runtime_dependency ${runtime_dependencies})
diff --git a/cmake/Platform/Mac/Configurations_mac.cmake b/cmake/Platform/Mac/Configurations_mac.cmake
index 33a58dbbda..b1c50b751d 100644
--- a/cmake/Platform/Mac/Configurations_mac.cmake
+++ b/cmake/Platform/Mac/Configurations_mac.cmake
@@ -29,9 +29,7 @@ else()
endif()
# Signing
-# The "-o linker-signed" flag is required as a work-around for the following CMake issue:
-# https://gitlab.kitware.com/cmake/cmake/-/issues/21854
-ly_set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep -o linker-signed")
+ly_set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep")
# Generate scheme files for Xcode
ly_set(CMAKE_XCODE_GENERATE_SCHEME TRUE)
diff --git a/cmake/Platform/Mac/InstallUtils_mac.cmake.in b/cmake/Platform/Mac/InstallUtils_mac.cmake.in
new file mode 100644
index 0000000000..de6d9ddf65
--- /dev/null
+++ b/cmake/Platform/Mac/InstallUtils_mac.cmake.in
@@ -0,0 +1,168 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+function(fixup_qt_framework lib_name framework_path)
+
+ file(REMOVE_RECURSE
+ ${framework_path}/Headers
+ ${framework_path}/Resources
+ ${framework_path}/${lib_name}
+ ${framework_path}/Versions/Current
+ ${framework_path}/Versions/5/Headers
+ )
+
+ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink 5 Current
+ WORKING_DIRECTORY ${framework_path}/Versions
+ )
+ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink Versions/Current/${lib_name} ${lib_name}
+ WORKING_DIRECTORY ${framework_path}
+ )
+ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink Versions/Current/Resources Resources
+ WORKING_DIRECTORY ${framework_path}
+ )
+
+endfunction()
+
+function(fixup_python_framework framework_path)
+
+ file(REMOVE_RECURSE
+ ${framework_path}/Versions/Current
+ ${framework_path}/Versions/@LY_PYTHON_VERSION_MAJOR_MINOR@/Headers
+ ${framework_path}/Versions/@LY_PYTHON_VERSION_MAJOR_MINOR@/lib/Python
+ ${framework_path}/Versions/@LY_PYTHON_VERSION_MAJOR_MINOR@/lib/python@LY_PYTHON_VERSION_MAJOR_MINOR@/test
+ ${framework_path}/Versions/@LY_PYTHON_VERSION_MAJOR_MINOR@/lib/python@LY_PYTHON_VERSION_MAJOR_MINOR@/site-packages/scipy/io/tests
+ ${framework_path}/Python
+ ${framework_path}/Resources
+ ${framework_path}/Headers
+ )
+
+ file(GLOB_RECURSE exe_file_list "${framework_path}/**/*.exe")
+ if(exe_file_list)
+ file(REMOVE_RECURSE ${exe_file_list})
+ endif()
+ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink include/python@LY_PYTHON_VERSION_MAJOR_MINOR@m Headers
+ WORKING_DIRECTORY ${framework_path}/Versions/@LY_PYTHON_VERSION_MAJOR_MINOR@
+ )
+ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink @LY_PYTHON_VERSION_MAJOR_MINOR@ Current
+ WORKING_DIRECTORY ${framework_path}/Versions/
+ )
+ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink Versions/Current/Python Python
+ WORKING_DIRECTORY ${framework_path}
+ )
+ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink Versions/Current/Headers Headers
+ WORKING_DIRECTORY ${framework_path}
+ )
+ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink Versions/Current/Resources Resources
+ WORKING_DIRECTORY ${framework_path}
+ )
+ file(CHMOD ${framework_path}/Versions/Current/Python
+ PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+ )
+
+endfunction()
+
+function(codesign_file file entitlement_file)
+
+ if (NOT @LY_ENABLE_HARDENED_RUNTIME@)
+ return()
+ endif()
+
+ if(EXISTS ${entitlement_file})
+
+ execute_process(COMMAND "/usr/bin/codesign" "--force" "--sign" "@LY_CODE_SIGN_IDENTITY@" "--deep" "-o" "runtime" "--timestamp" "--entitlements" "${entitlement_file}" "${file}"
+ TIMEOUT 300
+ OUTPUT_VARIABLE codesign_out
+ RESULT_VARIABLE codesign_ret
+ )
+ else()
+ execute_process(COMMAND "/usr/bin/codesign" "--force" "--sign" "@LY_CODE_SIGN_IDENTITY@" "--deep" "-o" "runtime" "--timestamp" "${file}"
+ TIMEOUT 300
+ OUTPUT_VARIABLE codesign_out
+ RESULT_VARIABLE codesign_ret
+ )
+ endif()
+
+ if(NOT ${codesign_ret} EQUAL "0")
+ message(FATAL_ERROR "Codesign operation for ${file_path} returned ${codesign_ret} with message ${codesign_out}")
+ endif()
+
+endfunction()
+
+function(codesign_python_framework_binaries framework_path)
+
+ if (NOT @LY_ENABLE_HARDENED_RUNTIME@)
+ return()
+ endif()
+
+ # The codesign "--deep" flag will only codesign binaries in folders with specific names.
+ # We need to codesign all the binaries that the "--deep" flag will miss.
+ file(GLOB_RECURSE files
+ LIST_DIRECTORIES false
+ "${framework_path}/Versions/@LY_PYTHON_VERSION_MAJOR_MINOR@/bin/**"
+ "${framework_path}/Versions/@LY_PYTHON_VERSION_MAJOR_MINOR@/lib/**"
+ "${framework_path}/Versions/@LY_PYTHON_VERSION_MAJOR_MINOR@/Resources/**")
+
+ foreach(file ${files})
+ if(NOT EXISTS ${file})
+ file(REMOVE ${file})
+ continue()
+ endif()
+ cmake_path(SET path_var "${file}")
+ cmake_path(GET path_var EXTENSION LAST_ONLY extension)
+ set(should_codesign FALSE)
+ set(extension_skip_list ".dylib" ".so" ".7m")
+ if (NOT extension)
+ set(should_codesign TRUE)
+ elseif(extension IN_LIST extension_skip_list)
+ set(should_codesign TRUE)
+ endif()
+ if(${should_codesign})
+ codesign_file("${file}" "@LY_ROOT_FOLDER@/python/Platform/Mac/PythonEntitlements.plist")
+ endif()
+ endforeach()
+
+endfunction()
+
+function(ly_copy source_file target_directory)
+
+ if("${source_file}" MATCHES "\\.[Ff]ramework[^\\.]")
+
+ # fixup origin to copy the whole Framework folder
+ string(REGEX REPLACE "(.*\\.[Ff]ramework).*" "\\1" source_file "${source_file}")
+
+ endif()
+ get_filename_component(target_filename "${source_file}" NAME)
+ file(COPY "${source_file}" DESTINATION "${target_directory}" FILE_PERMISSIONS @LY_COPY_PERMISSIONS@ FOLLOW_SYMLINK_CHAIN)
+
+ # Our Qt and Python frameworks aren't in the correct bundle format to be codesigned.
+ if("${target_filename}" MATCHES "(Qt[^.]+)\\.[Ff]ramework")
+ fixup_qt_framework(${CMAKE_MATCH_1} "${target_directory}/${target_filename}")
+ # For some Qt frameworks(QtCore), signing the bundle doesn't work because of bundle
+ # format issues(despite the fixes above). But once we've patched the framework above, there's
+ # only one executable that we need to sign so we can do it directly.
+ set(target_filename "${target_filename}/Versions/5/${CMAKE_MATCH_1}")
+ elseif("${target_filename}" MATCHES "Python.framework")
+ fixup_python_framework("${target_directory}/${target_filename}")
+ codesign_python_framework_binaries("${target_directory}/${target_filename}")
+ endif()
+ codesign_file("${target_directory}/${target_filename}" "none")
+
+endfunction()
+
+function(ly_download_and_codesign_sdk_python)
+ execute_process(COMMAND ${CMAKE_COMMAND} -DPAL_PLATFORM_NAME=Mac -DLY_3RDPARTY_PATH=${CMAKE_INSTALL_PREFIX}/python -P ${CMAKE_INSTALL_PREFIX}/python/get_python.cmake)
+ fixup_python_framework(${CMAKE_INSTALL_PREFIX}/python/runtime/@LY_PYTHON_PACKAGE_NAME@/Python.framework)
+ codesign_python_framework_binaries(${CMAKE_INSTALL_PREFIX}/python/runtime/@LY_PYTHON_PACKAGE_NAME@/Python.framework)
+ codesign_file(${CMAKE_INSTALL_PREFIX}/python/runtime/@LY_PYTHON_PACKAGE_NAME@/Python.framework @LY_ROOT_FOLDER@/python/Platform/Mac/PythonEntitlements.plist)
+endfunction()
+
+function(ly_codesign_sdk)
+ codesign_file(${LY_INSTALL_PATH_ORIGINAL}/O3DE_SDK.app "none")
+endfunction()
+
+
diff --git a/cmake/Platform/Mac/Install_mac.cmake b/cmake/Platform/Mac/Install_mac.cmake
index 8f07b1bfde..bdc2300131 100644
--- a/cmake/Platform/Mac/Install_mac.cmake
+++ b/cmake/Platform/Mac/Install_mac.cmake
@@ -6,6 +6,8 @@
#
#
+include(cmake/Platform/Common/Install_common.cmake)
+
# This is used to generate a setreg file which will be placed inside the bundle
# for targets that request it(eg. AssetProcessor/Editor). This is the relative path
# to the bundle from the installed engine's root. This will be used to compute the
@@ -16,7 +18,7 @@ set(installed_binaries_path_template [[
"AzCore": {
"Runtime": {
"FilePaths": {
- "InstalledBinariesFolder": "bin/Mac/$"
+ "InstalledBinariesFolder": "@runtime_output_directory@"
}
}
}
@@ -24,15 +26,20 @@ set(installed_binaries_path_template [[
}]]
)
-unset(target_conf_dir)
-foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES)
- string(TOUPPER ${conf} UCONF)
- string(APPEND target_conf_dir $<$:${CMAKE_RUNTIME_OUTPUT_DIRECTORY_${UCONF}}>)
-endforeach()
-
-set(installed_binaries_setreg_path ${target_conf_dir}/Registry/installed_binaries_path.setreg)
+# This setreg file will be used by all of our installed app bundles to locate installed
+# runtime dependencies. It contains the path to binary install directory relative to
+# the installed engine root.
+string(CONFIGURE "${installed_binaries_path_template}" configured_setreg_file)
+file(GENERATE
+ OUTPUT ${CMAKE_BINARY_DIR}/runtime_install/$/BinariesInstallPath.setreg
+ CONTENT "${configured_setreg_file}"
+)
-file(GENERATE OUTPUT ${installed_binaries_setreg_path} CONTENT ${installed_binaries_path_template})
+# ly_install_run_script isn't defined yet so we use install(SCRIPT) directly.
+# This needs to be done here because it needs to update the install prefix
+# before cmake does anything else in the install process.
+configure_file(${LY_ROOT_FOLDER}/cmake/Platform/Mac/PreInstallSteps_mac.cmake.in ${CMAKE_BINARY_DIR}/runtime_install/PreInstallSteps_mac.cmake @ONLY)
+install(SCRIPT ${CMAKE_BINARY_DIR}/runtime_install/PreInstallSteps_mac.cmake COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME})
#! ly_install_target_override: Mac specific target installation
function(ly_install_target_override)
@@ -70,33 +77,62 @@ function(ly_install_target_override)
COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME}
)
+ set(install_relative_binaries_path "${ly_platform_install_target_RUNTIME_DIR}/${ly_platform_install_target_RUNTIME_SUBDIR}")
+
if (${is_bundle})
set_property(TARGET ${ly_platform_install_target_TARGET} PROPERTY RESOURCE ${cached_resources_dir})
+ set(runtime_output_filename "$.app")
+ else()
+ set(runtime_output_filename "$")
+ endif()
+
+ get_target_property(target_type ${ly_platform_install_target_TARGET} TYPE)
+ if(target_type IN_LIST LY_TARGET_TYPES_WITH_RUNTIME_OUTPUTS)
+ get_target_property(entitlement_file ${ly_platform_install_target_TARGET} ENTITLEMENT_FILE_PATH)
+ if (NOT entitlement_file)
+ set(entitlement_file "none")
+ endif()
+
+ ly_file_read(${LY_ROOT_FOLDER}/cmake/Platform/Mac/runtime_install_mac.cmake.in template_file)
+ string(CONFIGURE "${template_file}" configured_template_file @ONLY)
+ file(GENERATE
+ OUTPUT ${CMAKE_BINARY_DIR}/runtime_install/$/${ly_platform_install_target_TARGET}.cmake
+ CONTENT "${configured_template_file}"
+ )
endif()
-endfunction()
-
-#! ly_install_add_install_path_setreg: Adds the install path setreg file as a dependency
-function(ly_install_add_install_path_setreg NAME)
- set_property(TARGET ${NAME} APPEND PROPERTY INTERFACE_LY_TARGET_FILES "${installed_binaries_setreg_path}\nRegistry")
endfunction()
#! ly_install_code_function_override: Mac specific copy function to handle frameworks
function(ly_install_code_function_override)
- install(CODE
-"function(ly_copy source_file target_directory)
- if(\"\${source_file}\" MATCHES \"\\\\.[Ff]ramework[^\\\\.]\")
+ configure_file(${LY_ROOT_FOLDER}/cmake/Platform/Mac/InstallUtils_mac.cmake.in ${CMAKE_BINARY_DIR}/runtime_install/InstallUtils_mac.cmake @ONLY)
+ ly_install_run_script(${CMAKE_BINARY_DIR}/runtime_install/InstallUtils_mac.cmake)
- # fixup origin to copy the whole Framework folder
- string(REGEX REPLACE \"(.*\\\\.[Ff]ramework).*\" \"\\\\1\" source_file \"\${source_file}\")
- get_filename_component(target_filename \"\${source_file}\" NAME)
+endfunction()
- endif()
- file(COPY \"\${source_file}\" DESTINATION \"\${target_directory}\" FILE_PERMISSIONS ${LY_COPY_PERMISSIONS})
-endfunction()"
- COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME}
- )
+#! ly_post_install_steps: Any additional platform specific post install steps
+function(ly_post_install_steps)
+
+ # On Mac, after CMake is done installing, the code signatures on all our built binaries will be invalid.
+ # We need to now codesign each dynamic library, executable, and app bundle. It's specific to each target
+ # because there could potentially be different entitlements for different targets.
+ get_property(all_targets GLOBAL PROPERTY LY_ALL_TARGETS)
+ foreach(alias_target IN LISTS all_targets)
+ ly_de_alias_target(${alias_target} target)
+ # Exclude targets that dont produce runtime outputs
+ get_target_property(target_type ${target} TYPE)
+ if(NOT target_type IN_LIST LY_TARGET_TYPES_WITH_RUNTIME_OUTPUTS)
+ continue()
+ endif()
+
+ ly_install_run_script(${CMAKE_BINARY_DIR}/runtime_install/$/${target}.cmake)
+ endforeach()
+
+ ly_install_run_code("
+ ly_download_and_codesign_sdk_python()
+ ly_codesign_sdk()
+ set(CMAKE_INSTALL_PREFIX ${LY_INSTALL_PATH_ORIGINAL})
+ ")
endfunction()
-include(cmake/Platform/Common/Install_common.cmake)
diff --git a/cmake/Platform/Mac/LYWrappers_mac.cmake b/cmake/Platform/Mac/LYWrappers_mac.cmake
index 578f6fe041..245d3bb7c1 100644
--- a/cmake/Platform/Mac/LYWrappers_mac.cmake
+++ b/cmake/Platform/Mac/LYWrappers_mac.cmake
@@ -6,6 +6,16 @@
#
#
+set(LY_ENABLE_HARDENED_RUNTIME OFF CACHE BOOL "Enable hardened runtime capability for Mac builds. This should be ON when building the engine for notarization/distribution.")
+
+define_property(TARGET PROPERTY ENTITLEMENT_FILE_PATH
+ BRIEF_DOCS "Path to the entitlement file"
+ FULL_DOCS [[
+ On MacOS, entitlements are used to grant certain privileges
+ to applications at runtime. Use this propery to specify the
+ path to a .plist file containing entitlements.
+ ]]
+)
function(ly_apply_platform_properties target)
@@ -14,6 +24,18 @@ function(ly_apply_platform_properties target)
INSTALL_RPATH "@executable_path/;@executable_path/../Frameworks"
)
+ get_property(is_imported TARGET ${target} PROPERTY IMPORTED)
+ if((NOT is_imported) AND (LY_ENABLE_HARDENED_RUNTIME))
+ get_property(target_type TARGET ${target} PROPERTY TYPE)
+ set(runtime_types_list "MODULE_LIBRARY" "SHARED_LIBRARY" "EXECUTABLE")
+ if (target_type IN_LIST runtime_types_list)
+ set_target_properties(${target} PROPERTIES
+ XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME YES
+ XCODE_ATTRIBUTE_CODE_SIGN_INJECT_BASE_ENTITLEMENTS NO
+ )
+ endif()
+ endif()
+
endfunction()
diff --git a/cmake/Platform/Mac/PAL_mac.cmake b/cmake/Platform/Mac/PAL_mac.cmake
index b415daf44a..065b35d69c 100644
--- a/cmake/Platform/Mac/PAL_mac.cmake
+++ b/cmake/Platform/Mac/PAL_mac.cmake
@@ -39,3 +39,6 @@ set(LY_ASSET_DEPLOY_ASSET_TYPE "mac" CACHE STRING "Set the asset type for deploy
# Set the python cmd tool
ly_set(LY_PYTHON_CMD ${CMAKE_CURRENT_SOURCE_DIR}/python/python.sh)
+
+# Only x86_64 is currently supported on Mac
+ly_set(CMAKE_OSX_ARCHITECTURES "x86_64")
diff --git a/cmake/Platform/Mac/PreInstallSteps_mac.cmake.in b/cmake/Platform/Mac/PreInstallSteps_mac.cmake.in
new file mode 100644
index 0000000000..5033aadd6e
--- /dev/null
+++ b/cmake/Platform/Mac/PreInstallSteps_mac.cmake.in
@@ -0,0 +1,39 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+cmake_minimum_required(VERSION 3.20)
+
+# The O3DE SDK will be shipped as an app bundle. So we create an O3DE_SDK.app directory
+# and install SDK into the app's Contents/Engine directory.
+set(LY_INSTALL_PATH_ORIGINAL ${CMAKE_INSTALL_PREFIX})
+
+file(INSTALL @LY_ROOT_FOLDER@/Code/Tools/BundleLauncher/info.plist
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/O3DE_SDK.app/Contents
+)
+
+# This SDK launcher will install python site-packages and then launch the ProjectManager
+# when a user double clicks on the SDK from Finder. We're only going to need one version
+# of the SDK launcher regardless of what configs of the engine are installed.
+if (EXISTS @CMAKE_BINARY_DIR@/bin/profile/O3DE_SDK)
+ set(sdk_launcher_config profile)
+elseif (EXISTS @CMAKE_BINARY_DIR@/bin/debug/O3DE_SDK)
+ set(sdk_launcher_config debug)
+elseif (EXISTS @CMAKE_BINARY_DIR@/bin/release/O3DE_SDK)
+ set(sdk_launcher_config release)
+endif()
+file(INSTALL @CMAKE_BINARY_DIR@/bin/${sdk_launcher_config}/O3DE_SDK
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/O3DE_SDK.app/Contents/MacOS
+ USE_SOURCE_PERMISSIONS
+)
+file(INSTALL @CMAKE_BINARY_DIR@/runtime_install/${sdk_launcher_config}/BinariesInstallPath.setreg
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/O3DE_SDK.app/Contents/MacOS/Registry
+)
+
+# We need to update the CMAKE_INSTALL_PREFIX so that the engine is installed inside the app bundle.
+file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/O3DE_SDK.app/Contents/Engine)
+set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/O3DE_SDK.app/Contents/Engine)
\ No newline at end of file
diff --git a/cmake/Platform/Mac/runtime_dependencies_mac.cmake.in b/cmake/Platform/Mac/runtime_dependencies_mac.cmake.in
index d65578f82a..11551f608f 100644
--- a/cmake/Platform/Mac/runtime_dependencies_mac.cmake.in
+++ b/cmake/Platform/Mac/runtime_dependencies_mac.cmake.in
@@ -73,8 +73,8 @@ function(ly_copy source_file target_directory)
return()
endif()
- # fixup the destination so it ends up in Contents/Plugins
- string(REGEX REPLACE "(.*\\.app/Contents)/MacOS" "\\1/plugins" target_directory "${target_directory}")
+ # fixup the destination so it ends up in Contents/PlugIns
+ string(REGEX REPLACE "(.*\\.app/Contents)/MacOS" "\\1/PlugIns" target_directory "${target_directory}")
set(local_plugin_dirs ${plugin_dirs})
list(APPEND local_plugin_dirs "${target_directory}")
@@ -212,7 +212,6 @@ if(@target_file_dir@ MATCHES ".app/Contents/MacOS")
file(REMOVE_RECURSE ${remove_file_list})
endif()
-
endif()
else() # Non-bundle case
diff --git a/cmake/Platform/Mac/runtime_install_mac.cmake.in b/cmake/Platform/Mac/runtime_install_mac.cmake.in
new file mode 100644
index 0000000000..65b1ede77b
--- /dev/null
+++ b/cmake/Platform/Mac/runtime_install_mac.cmake.in
@@ -0,0 +1,34 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+cmake_path(SET file_path "${CMAKE_INSTALL_PREFIX}/@install_relative_binaries_path@/@runtime_output_filename@")
+cmake_path(GET file_path EXTENSION LAST_ONLY file_ext)
+
+if(file_ext STREQUAL .app)
+
+ file(INSTALL @CMAKE_BINARY_DIR@/runtime_install/$/BinariesInstallPath.setreg
+ DESTINATION ${file_path}/Contents/MacOS/Registry
+ )
+
+ if(EXISTS "${file_path}/Contents/Frameworks/Python.framework")
+ codesign_python_framework_binaries("${file_path}/Contents/Frameworks/Python.framework")
+ endif()
+
+else()
+
+ find_program(LY_INSTALL_NAME_TOOL install_name_tool)
+ if (NOT LY_INSTALL_NAME_TOOL)
+ message(FATAL_ERROR "Unable to locate 'install_name_tool'")
+ endif()
+
+ execute_process(COMMAND
+ ${LY_INSTALL_NAME_TOOL} -add_rpath @loader_path ${file_path})
+
+endif()
+
+codesign_file("${file_path}" "@entitlement_file@")
diff --git a/python/Platform/Mac/PythonEntitlements.plist b/python/Platform/Mac/PythonEntitlements.plist
new file mode 100644
index 0000000000..ed4892befa
--- /dev/null
+++ b/python/Platform/Mac/PythonEntitlements.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.cs.disable-library-validation
+
+ com.apple.security.cs.allow-unsigned-executable-memory
+
+
+
diff --git a/python/get_python.sh b/python/get_python.sh
index 248a0790fc..e8d35a311e 100755
--- a/python/get_python.sh
+++ b/python/get_python.sh
@@ -30,7 +30,8 @@ cd $DIR
python_exitcode=$?
if [ $python_exitcode == 0 ]; then
echo get_python.sh: Python is already downloaded: $(./python.sh --version)
- $DIR/pip.sh install -r $DIR/requirements.txt --quiet --disable-pip-version-check
+ $DIR/pip.sh install -r $DIR/requirements.txt --disable-pip-version-check --no-warn-script-location
+ $DIR/pip.sh install -e $DIR/../scripts/o3de --no-deps --disable-pip-version-check --no-warn-script-location
exit 0
fi
if [[ "$OSTYPE" = *"darwin"* ]];
@@ -73,5 +74,6 @@ if [ $retVal -ne 0 ]; then
fi
echo installing via pip...
-$DIR/pip.sh install -r $DIR/requirements.txt --disable-pip-version-check
+$DIR/pip.sh install -r $DIR/requirements.txt --disable-pip-version-check --no-warn-script-location
+$DIR/pip.sh install -e $DIR/../scripts/o3de --no-deps --disable-pip-version-check --no-warn-script-location
exit $?