diff --git a/cmake/Packaging.cmake b/cmake/Packaging.cmake
index fbeffa94eb..84bad13687 100644
--- a/cmake/Packaging.cmake
+++ b/cmake/Packaging.cmake
@@ -17,6 +17,8 @@ endif()
set(LY_INSTALLER_DOWNLOAD_URL "" CACHE STRING "URL embedded into the installer to download additional artifacts")
set(LY_INSTALLER_LICENSE_URL "" CACHE STRING "Optionally embed a link to the license instead of raw text")
+set(CPACK_DESIRED_CMAKE_VERSION 3.20.2)
+
# set all common cpack variable overrides first so they can be accessible via configure_file
# when the platform specific settings are applied below. additionally, any variable with
# the "CPACK_" prefix will automatically be cached for use in any phase of cpack namely
@@ -38,6 +40,7 @@ set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_VER
# neither of the SOURCE_DIR variables equate to anything during execution of pre/post build scripts
set(CPACK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+set(CPACK_BINARY_DIR ${CMAKE_BINARY_DIR}/_CPack) # to match other CPack out dirs
# attempt to apply platform specific settings
ly_get_absolute_pal_filename(pal_dir ${CPACK_SOURCE_DIR}/Platform/${PAL_HOST_PLATFORM_NAME})
@@ -48,6 +51,53 @@ if(NOT CPACK_GENERATOR)
return()
endif()
+# pull down the desired copy of CMake so it can be included in the package
+if(NOT (CPACK_CMAKE_PACKAGE_FILE AND CPACK_CMAKE_PACKAGE_HASH))
+ message(FATAL_ERROR
+ "Packaging is missing one or more following properties required to include CMake: "
+ " CPACK_CMAKE_PACKAGE_FILE, CPACK_CMAKE_PACKAGE_HASH")
+endif()
+
+set(_cmake_package_dest ${CPACK_BINARY_DIR}/${CPACK_CMAKE_PACKAGE_FILE})
+
+string(REPLACE "." ";" _version_componets "${CPACK_DESIRED_CMAKE_VERSION}")
+list(GET _version_componets 0 _major_version)
+list(GET _version_componets 1 _minor_version)
+
+set(_url_version_tag "v${_major_version}.${_minor_version}")
+set(_package_url "https://cmake.org/files/${_url_version_tag}/${CPACK_CMAKE_PACKAGE_FILE}")
+
+message(STATUS "Ensuring CMake ${CPACK_DESIRED_CMAKE_VERSION} is available for packaging...")
+download_file(
+ URL ${_package_url}
+ TARGET_FILE ${_cmake_package_dest}
+ EXPECTED_HASH ${CPACK_CMAKE_PACKAGE_HASH}
+ RESULTS _results
+)
+list(GET _results 0 _status_code)
+
+if (${_status_code} EQUAL 0 AND EXISTS ${_cmake_package_dest})
+ message(STATUS "-> Package found and verified!")
+else()
+ file(REMOVE ${_cmake_package_dest})
+ list(REMOVE_AT _results 0)
+
+ set(_error_message "An error occurred, code ${_status_code}. URL ${_package_url} - ${_results}")
+
+ if(${_status_code} EQUAL 1)
+ string(APPEND _error_message
+ " Please double check the CPACK_CMAKE_PACKAGE_FILE and "
+ "CPACK_CMAKE_PACKAGE_HASH properties before trying again.")
+ endif()
+
+ message(FATAL_ERROR ${_error_message})
+endif()
+
+install(FILES ${_cmake_package_dest}
+ DESTINATION ./Tools/Redistributables/CMake
+ COMPONENT ${LY_DEFAULT_INSTALL_COMPONENT}
+)
+
# IMPORTANT: required to be included AFTER setting all property overrides
include(CPack REQUIRED)
diff --git a/cmake/Platform/Windows/Packaging/PostInstallSetup.wxs b/cmake/Platform/Windows/Packaging/PostInstallSetup.wxs
new file mode 100644
index 0000000000..d4f6c181dd
--- /dev/null
+++ b/cmake/Platform/Windows/Packaging/PostInstallSetup.wxs
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cmake/Platform/Windows/Packaging/Template.wxs.in b/cmake/Platform/Windows/Packaging/Template.wxs.in
index 2900b96f41..e14e064fbc 100644
--- a/cmake/Platform/Windows/Packaging/Template.wxs.in
+++ b/cmake/Platform/Windows/Packaging/Template.wxs.in
@@ -17,8 +17,7 @@
-
@@ -41,8 +40,24 @@
+
+
+
+
+
+
+ NOT Installed Or REINSTALL
+
+
+ NOT Installed Or REINSTALL
+
+
+ NOT Installed Or REINSTALL
+
+
+
diff --git a/cmake/Platform/Windows/Packaging_windows.cmake b/cmake/Platform/Windows/Packaging_windows.cmake
index ce73e9a07b..db9c7fc906 100644
--- a/cmake/Platform/Windows/Packaging_windows.cmake
+++ b/cmake/Platform/Windows/Packaging_windows.cmake
@@ -28,6 +28,10 @@ endif()
set(CPACK_GENERATOR "WIX")
+set(_cmake_package_name "cmake-${CPACK_DESIRED_CMAKE_VERSION}-windows-x86_64")
+set(CPACK_CMAKE_PACKAGE_FILE "${_cmake_package_name}.zip")
+set(CPACK_CMAKE_PACKAGE_HASH "15a49e2ab81c1822d75b1b1a92f7863f58e31f6d6aac1c4103eef2b071be3112")
+
# CPack will generate the WiX product/upgrade GUIDs further down the chain if they weren't supplied
# however, they are unique for each run. instead, let's do the auto generation here and add it to
# the cache for run persistence and have the ability to detect if they are still being used.
@@ -83,9 +87,14 @@ set(CPACK_WIX_PRODUCT_ICON ${CPACK_SOURCE_DIR}/Platform/Windows/Packaging/produc
set(CPACK_WIX_TEMPLATE "${CPACK_SOURCE_DIR}/Platform/Windows/Packaging/Template.wxs.in")
set(CPACK_WIX_EXTRA_SOURCES
+ "${CPACK_SOURCE_DIR}/Platform/Windows/Packaging/PostInstallSetup.wxs"
"${CPACK_SOURCE_DIR}/Platform/Windows/Packaging/Shortcuts.wxs"
)
+set(CPACK_WIX_EXTENSIONS
+ WixUtilExtension
+)
+
set(_embed_artifacts "yes")
if(LY_INSTALLER_DOWNLOAD_URL)
@@ -101,4 +110,5 @@ endif()
set(CPACK_WIX_CANDLE_EXTRA_FLAGS
-dCPACK_EMBED_ARTIFACTS=${_embed_artifacts}
+ -dCPACK_CMAKE_PACKAGE_NAME=${_cmake_package_name}
)