From 85abc8321ce34a5f0bf130e83ad299a4e7690276 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 3 Dec 2025 09:49:28 -0500 Subject: [PATCH 1/2] refactor(CMake): Use cmake_host_system_information with VIEW 32_64 for registry queries --- Generals/CMakeLists.txt | 45 ++++++++++++++++++++++++++++----------- GeneralsMD/CMakeLists.txt | 44 +++++++++++++++++++++++++++----------- 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/Generals/CMakeLists.txt b/Generals/CMakeLists.txt index 837065acba..f5d2e3f536 100644 --- a/Generals/CMakeLists.txt +++ b/Generals/CMakeLists.txt @@ -15,28 +15,47 @@ add_subdirectory(Code) # If we are building on windows for windows, try and get the game install path from the registry. if("${CMAKE_HOST_SYSTEM}" MATCHES "Windows" AND "${CMAKE_SYSTEM}" MATCHES "Windows") - # Check the CD registry path + # Check the EA App/CD registry path (checks both 32-bit and 64-bit registry views) if(NOT RTS_INSTALL_PREFIX_GENERALS) - get_filename_component(RTS_INSTALL_PREFIX_GENERALS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Electronic Arts\\EA Games\\Generals;InstallPath]" ABSOLUTE CACHE) - endif() - - # Check the WOW6432Node registry path (for EA App on 64-bit Windows) - if(NOT RTS_INSTALL_PREFIX_GENERALS OR "${RTS_INSTALL_PREFIX_GENERALS}" STREQUAL "/registry") - get_filename_component(RTS_INSTALL_PREFIX_GENERALS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Electronic Arts\\EA Games\\Generals;InstallPath]" ABSOLUTE CACHE) + cmake_host_system_information(RESULT _generals_path + QUERY WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Generals" + VALUE InstallPath + VIEW 32_64 + ERROR_VARIABLE _reg_error) + if(NOT _reg_error AND _generals_path) + set(RTS_INSTALL_PREFIX_GENERALS "${_generals_path}" CACHE PATH "Generals install path from registry") + endif() endif() # Check the "First Decade" registry path - if(NOT RTS_INSTALL_PREFIX_GENERALS OR "${RTS_INSTALL_PREFIX_GENERALS}" STREQUAL "/registry") - get_filename_component(RTS_INSTALL_PREFIX_GENERALS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Electronic Arts\\EA Games\\Command and Conquer The First Decade;gr_folder]" ABSOLUTE CACHE) + if(NOT RTS_INSTALL_PREFIX_GENERALS) + cmake_host_system_information(RESULT _generals_path + QUERY WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer The First Decade" + VALUE gr_folder + VIEW 32_64 + ERROR_VARIABLE _reg_error) + if(NOT _reg_error AND _generals_path) + set(RTS_INSTALL_PREFIX_GENERALS "${_generals_path}" CACHE PATH "Generals install path from registry") + endif() endif() - # Check the Steam registry path - if(NOT RTS_INSTALL_PREFIX_GENERALS OR "${RTS_INSTALL_PREFIX_GENERALS}" STREQUAL "/registry") - get_filename_component(RTS_INSTALL_PREFIX_GENERALS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Electronic Arts\\EA Games\\Generals;installPath]" ABSOLUTE CACHE) + # Check alternate capitalization (installPath vs InstallPath) + if(NOT RTS_INSTALL_PREFIX_GENERALS) + cmake_host_system_information(RESULT _generals_path + QUERY WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Generals" + VALUE installPath + VIEW 32_64 + ERROR_VARIABLE _reg_error) + if(NOT _reg_error AND _generals_path) + set(RTS_INSTALL_PREFIX_GENERALS "${_generals_path}" CACHE PATH "Generals install path from registry") + endif() endif() endif() -if(RTS_INSTALL_PREFIX_GENERALS AND NOT "${RTS_INSTALL_PREFIX_GENERALS}" STREQUAL "/registry") +if(RTS_INSTALL_PREFIX_GENERALS) install(TARGETS g_generals RUNTIME DESTINATION "${RTS_INSTALL_PREFIX_GENERALS}") install(FILES $ DESTINATION "${RTS_INSTALL_PREFIX_GENERALS}" OPTIONAL) diff --git a/GeneralsMD/CMakeLists.txt b/GeneralsMD/CMakeLists.txt index 830d0df785..22251447a1 100644 --- a/GeneralsMD/CMakeLists.txt +++ b/GeneralsMD/CMakeLists.txt @@ -15,27 +15,47 @@ add_subdirectory(Code) # If we are building on windows for windows, try and get the game install path from the registry. if("${CMAKE_HOST_SYSTEM}" MATCHES "Windows" AND "${CMAKE_SYSTEM}" MATCHES "Windows") + # Check the EA App/CD registry path (checks both 32-bit and 64-bit registry views) if(NOT RTS_INSTALL_PREFIX_ZEROHOUR) - get_filename_component(RTS_INSTALL_PREFIX_ZEROHOUR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Electronic Arts\\EA Games\\Command and Conquer Generals Zero Hour;InstallPath]" ABSOLUTE CACHE) - endif() - - # Check the WOW6432Node registry path (for EA App on 64-bit Windows) - if(NOT RTS_INSTALL_PREFIX_ZEROHOUR OR "${RTS_INSTALL_PREFIX_ZEROHOUR}" STREQUAL "/registry") - get_filename_component(RTS_INSTALL_PREFIX_ZEROHOUR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Electronic Arts\\EA Games\\Command and Conquer Generals Zero Hour;InstallPath]" ABSOLUTE CACHE) + cmake_host_system_information(RESULT _zerohour_path + QUERY WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer Generals Zero Hour" + VALUE InstallPath + VIEW 32_64 + ERROR_VARIABLE _reg_error) + if(NOT _reg_error AND _zerohour_path) + set(RTS_INSTALL_PREFIX_ZEROHOUR "${_zerohour_path}" CACHE PATH "Zero Hour install path from registry") + endif() endif() # Check the "First Decade" registry path - if(NOT RTS_INSTALL_PREFIX_ZEROHOUR OR "${RTS_INSTALL_PREFIX_ZEROHOUR}" STREQUAL "/registry") - get_filename_component(RTS_INSTALL_PREFIX_ZEROHOUR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Electronic Arts\\EA Games\\Command and Conquer The First Decade;zh_folder]" ABSOLUTE CACHE) + if(NOT RTS_INSTALL_PREFIX_ZEROHOUR) + cmake_host_system_information(RESULT _zerohour_path + QUERY WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer The First Decade" + VALUE zh_folder + VIEW 32_64 + ERROR_VARIABLE _reg_error) + if(NOT _reg_error AND _zerohour_path) + set(RTS_INSTALL_PREFIX_ZEROHOUR "${_zerohour_path}" CACHE PATH "Zero Hour install path from registry") + endif() endif() - # Check the Steam registry path - if(NOT RTS_INSTALL_PREFIX_ZEROHOUR OR "${RTS_INSTALL_PREFIX_ZEROHOUR}" STREQUAL "/registry") - get_filename_component(RTS_INSTALL_PREFIX_ZEROHOUR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Electronic Arts\\EA Games\\ZeroHour;installPath]" ABSOLUTE CACHE) + # Check alternate registry location (ZeroHour vs full name) + if(NOT RTS_INSTALL_PREFIX_ZEROHOUR) + cmake_host_system_information(RESULT _zerohour_path + QUERY WINDOWS_REGISTRY + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/ZeroHour" + VALUE installPath + VIEW 32_64 + ERROR_VARIABLE _reg_error) + if(NOT _reg_error AND _zerohour_path) + set(RTS_INSTALL_PREFIX_ZEROHOUR "${_zerohour_path}" CACHE PATH "Zero Hour install path from registry") + endif() endif() endif() -if(RTS_INSTALL_PREFIX_ZEROHOUR AND NOT "${RTS_INSTALL_PREFIX_ZEROHOUR}" STREQUAL "/registry") +if(RTS_INSTALL_PREFIX_ZEROHOUR) install(TARGETS z_generals RUNTIME DESTINATION "${RTS_INSTALL_PREFIX_ZEROHOUR}") install(FILES $ DESTINATION "${RTS_INSTALL_PREFIX_ZEROHOUR}" OPTIONAL) From ce1f957dd62b369f6542cdb046a00a407d0ccd0d Mon Sep 17 00:00:00 2001 From: bobtista Date: Fri, 5 Dec 2025 20:37:25 -0500 Subject: [PATCH 2/2] refactor(CMake): Simplify registry queries with reusable macro --- Generals/CMakeLists.txt | 54 +++++++++++++------------------------ GeneralsMD/CMakeLists.txt | 56 ++++++++++++++------------------------- cmake/registry.cmake | 15 +++++++++++ 3 files changed, 54 insertions(+), 71 deletions(-) create mode 100644 cmake/registry.cmake diff --git a/Generals/CMakeLists.txt b/Generals/CMakeLists.txt index f5d2e3f536..78f920244e 100644 --- a/Generals/CMakeLists.txt +++ b/Generals/CMakeLists.txt @@ -15,44 +15,28 @@ add_subdirectory(Code) # If we are building on windows for windows, try and get the game install path from the registry. if("${CMAKE_HOST_SYSTEM}" MATCHES "Windows" AND "${CMAKE_SYSTEM}" MATCHES "Windows") - # Check the EA App/CD registry path (checks both 32-bit and 64-bit registry views) - if(NOT RTS_INSTALL_PREFIX_GENERALS) - cmake_host_system_information(RESULT _generals_path - QUERY WINDOWS_REGISTRY - "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Generals" - VALUE InstallPath - VIEW 32_64 - ERROR_VARIABLE _reg_error) - if(NOT _reg_error AND _generals_path) - set(RTS_INSTALL_PREFIX_GENERALS "${_generals_path}" CACHE PATH "Generals install path from registry") - endif() - endif() + include(${CMAKE_SOURCE_DIR}/cmake/registry.cmake) + + # Check the EA App/CD registry path + fetch_registry_value( + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Generals" + "InstallPath" + RTS_INSTALL_PREFIX_GENERALS + "Generals install path from registry") # Check the "First Decade" registry path - if(NOT RTS_INSTALL_PREFIX_GENERALS) - cmake_host_system_information(RESULT _generals_path - QUERY WINDOWS_REGISTRY - "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer The First Decade" - VALUE gr_folder - VIEW 32_64 - ERROR_VARIABLE _reg_error) - if(NOT _reg_error AND _generals_path) - set(RTS_INSTALL_PREFIX_GENERALS "${_generals_path}" CACHE PATH "Generals install path from registry") - endif() - endif() + fetch_registry_value( + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer The First Decade" + "gr_folder" + RTS_INSTALL_PREFIX_GENERALS + "Generals install path from registry") - # Check alternate capitalization (installPath vs InstallPath) - if(NOT RTS_INSTALL_PREFIX_GENERALS) - cmake_host_system_information(RESULT _generals_path - QUERY WINDOWS_REGISTRY - "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Generals" - VALUE installPath - VIEW 32_64 - ERROR_VARIABLE _reg_error) - if(NOT _reg_error AND _generals_path) - set(RTS_INSTALL_PREFIX_GENERALS "${_generals_path}" CACHE PATH "Generals install path from registry") - endif() - endif() + # Check the Steam registry path + fetch_registry_value( + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Generals" + "installPath" + RTS_INSTALL_PREFIX_GENERALS + "Generals install path from registry") endif() if(RTS_INSTALL_PREFIX_GENERALS) diff --git a/GeneralsMD/CMakeLists.txt b/GeneralsMD/CMakeLists.txt index 22251447a1..2a9a65fb78 100644 --- a/GeneralsMD/CMakeLists.txt +++ b/GeneralsMD/CMakeLists.txt @@ -15,44 +15,28 @@ add_subdirectory(Code) # If we are building on windows for windows, try and get the game install path from the registry. if("${CMAKE_HOST_SYSTEM}" MATCHES "Windows" AND "${CMAKE_SYSTEM}" MATCHES "Windows") - # Check the EA App/CD registry path (checks both 32-bit and 64-bit registry views) - if(NOT RTS_INSTALL_PREFIX_ZEROHOUR) - cmake_host_system_information(RESULT _zerohour_path - QUERY WINDOWS_REGISTRY - "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer Generals Zero Hour" - VALUE InstallPath - VIEW 32_64 - ERROR_VARIABLE _reg_error) - if(NOT _reg_error AND _zerohour_path) - set(RTS_INSTALL_PREFIX_ZEROHOUR "${_zerohour_path}" CACHE PATH "Zero Hour install path from registry") - endif() - endif() + include(${CMAKE_SOURCE_DIR}/cmake/registry.cmake) - # Check the "First Decade" registry path - if(NOT RTS_INSTALL_PREFIX_ZEROHOUR) - cmake_host_system_information(RESULT _zerohour_path - QUERY WINDOWS_REGISTRY - "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer The First Decade" - VALUE zh_folder - VIEW 32_64 - ERROR_VARIABLE _reg_error) - if(NOT _reg_error AND _zerohour_path) - set(RTS_INSTALL_PREFIX_ZEROHOUR "${_zerohour_path}" CACHE PATH "Zero Hour install path from registry") - endif() - endif() + # Check the EA App/CD registry path + fetch_registry_value( + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer Generals Zero Hour" + "InstallPath" + RTS_INSTALL_PREFIX_ZEROHOUR + "Zero Hour install path from registry") - # Check alternate registry location (ZeroHour vs full name) - if(NOT RTS_INSTALL_PREFIX_ZEROHOUR) - cmake_host_system_information(RESULT _zerohour_path - QUERY WINDOWS_REGISTRY - "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/ZeroHour" - VALUE installPath - VIEW 32_64 - ERROR_VARIABLE _reg_error) - if(NOT _reg_error AND _zerohour_path) - set(RTS_INSTALL_PREFIX_ZEROHOUR "${_zerohour_path}" CACHE PATH "Zero Hour install path from registry") - endif() - endif() + # Check the "First Decade" registry path + fetch_registry_value( + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/Command and Conquer The First Decade" + "zh_folder" + RTS_INSTALL_PREFIX_ZEROHOUR + "Zero Hour install path from registry") + + # Check the Steam registry path + fetch_registry_value( + "HKEY_LOCAL_MACHINE/SOFTWARE/Electronic Arts/EA Games/ZeroHour" + "installPath" + RTS_INSTALL_PREFIX_ZEROHOUR + "Zero Hour install path from registry") endif() if(RTS_INSTALL_PREFIX_ZEROHOUR) diff --git a/cmake/registry.cmake b/cmake/registry.cmake new file mode 100644 index 0000000000..6f8caae688 --- /dev/null +++ b/cmake/registry.cmake @@ -0,0 +1,15 @@ +# Helper macro for querying Windows registry values +# Queries both 32-bit and 64-bit registry views automatically +macro(fetch_registry_value registry_key registry_value output_var description) + if(NOT ${output_var}) + cmake_host_system_information(RESULT _variable + QUERY WINDOWS_REGISTRY + "${registry_key}" + VALUE "${registry_value}" + VIEW 32_64) + if(_variable) + set(${output_var} "${_variable}" CACHE PATH "${description}") + endif() + endif() +endmacro() +