cmake-gui: Refactor installation into CMake.app/Contents on macOS

Instead of mutating `CMAKE_INSTALL_PREFIX`, add a `CMake.app/Contents/`
prefix to install destinations besides the `cmake-gui` target itself.
This commit is contained in:
Brad King
2025-10-25 13:51:57 -04:00
parent a65d986850
commit 7ebad5d201
28 changed files with 59 additions and 59 deletions

View File

@@ -1,16 +1,16 @@
# Install Vim files to a typical system integration directory.
# Packagers can set CMake_INSTALL_VIMFILES_DIR to control this.
if(NOT CMake_INSTALL_VIMFILES_DIR)
set(CMake_INSTALL_VIMFILES_DIR ${CMAKE_XDGDATA_DIR}/vim/vimfiles)
set(CMake_INSTALL_VIMFILES_DIR ${CMake_INSTALL_XDGDATA_DIR}/vim/vimfiles)
endif()
install(DIRECTORY vim/indent vim/syntax DESTINATION ${CMake_INSTALL_VIMFILES_DIR})
# Install Emacs files to a typical system integration directory.
# Packagers can set CMake_INSTALL_EMACS_DIR to control this.
if(NOT CMake_INSTALL_EMACS_DIR)
set(CMake_INSTALL_EMACS_DIR ${CMAKE_XDGDATA_DIR}/emacs/site-lisp)
set(CMake_INSTALL_EMACS_DIR ${CMake_INSTALL_XDGDATA_DIR}/emacs/site-lisp)
endif()
install(FILES cmake-mode.el DESTINATION ${CMake_INSTALL_EMACS_DIR})
install(FILES cmake.m4 DESTINATION ${CMAKE_XDGDATA_DIR}/aclocal)
install(FILES cmake.m4 DESTINATION ${CMake_INSTALL_XDGDATA_DIR}/aclocal)
add_subdirectory (bash-completion)

View File

@@ -15,7 +15,7 @@ if(NOT CMake_INSTALL_BASH_COMP_DIR)
set(CMake_INSTALL_BASH_COMP_DIR "${CMAKE_BASH_COMP_DIR}")
else()
# Default.
set(CMake_INSTALL_BASH_COMP_DIR ${CMAKE_XDGDATA_DIR}/bash-completion/completions)
set(CMake_INSTALL_BASH_COMP_DIR ${CMake_INSTALL_XDGDATA_DIR}/bash-completion/completions)
endif()
endif()
install(FILES cmake cpack ctest DESTINATION ${CMake_INSTALL_BASH_COMP_DIR})

View File

@@ -177,7 +177,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
endif()
endif()
install(FILES "${CMake_SOURCE_DIR}/Source/QtIFW/cmake.org.html"
DESTINATION "${CMAKE_DOC_DIR}"
DESTINATION "${CMake_INSTALL_DOC_DIR}"
)
endif()
@@ -220,7 +220,7 @@ endif()
set(CPACK_PACKAGE_CONTACT "cmake+development@discourse.cmake.org")
if(UNIX)
set(CPACK_STRIP_FILES "${CMAKE_BIN_DIR}/ccmake;${CMAKE_BIN_DIR}/cmake;${CMAKE_BIN_DIR}/cpack;${CMAKE_BIN_DIR}/ctest")
set(CPACK_STRIP_FILES "${CMake_INSTALL_BIN_DIR}/ccmake;${CMake_INSTALL_BIN_DIR}/cmake;${CMake_INSTALL_BIN_DIR}/cpack;${CMake_INSTALL_BIN_DIR}/ctest")
set(CPACK_SOURCE_STRIP_FILES "")
set(CPACK_PACKAGE_EXECUTABLES "ccmake" "CMake")
endif()

View File

@@ -13,7 +13,7 @@ if(CPACK_GENERATOR MATCHES "NSIS")
set(CPACK_PACKAGE_ICON "@CMake_SOURCE_DIR@/Utilities/Release\\CMakeInstall.bmp")
# tell cpack to create links to the doc files
set(CPACK_NSIS_MENU_LINKS
"@CMAKE_DOC_DIR@/html/index.html" "CMake Documentation"
"@CMake_INSTALL_DOC_DIR@/html/index.html" "CMake Documentation"
"https://cmake.org" "CMake Web Site"
)
# Use the icon from cmake-gui for add-remove programs
@@ -241,7 +241,7 @@ if("${CPACK_GENERATOR}" STREQUAL "WIX")
"@CMake_SOURCE_DIR@/Utilities/Release/CMakeLogo.ico"
)
set_property(INSTALL "@CMAKE_DOC_DIR@/html/index.html" PROPERTY
set_property(INSTALL "@CMake_INSTALL_DOC_DIR@/html/index.html" PROPERTY
CPACK_START_MENU_SHORTCUTS "CMake Documentation"
)

View File

@@ -450,17 +450,6 @@ if(NOT CMake_TEST_EXTERNAL_CMAKE)
# build the utilities
include(CMakeBuildUtilities)
if(BUILD_QtDialog)
if(APPLE)
set(CMAKE_BUNDLE_LOCATION "${CMAKE_INSTALL_PREFIX}")
# make sure CMAKE_INSTALL_PREFIX ends in /
if(NOT CMAKE_INSTALL_PREFIX MATCHES "/$")
string(APPEND CMAKE_INSTALL_PREFIX "/")
endif()
string(APPEND CMAKE_INSTALL_PREFIX "CMake.app/Contents")
endif()
endif()
if(UNIX)
# Install executables with the RPATH set for libraries outside the build tree.
# This is also suitable for binaries in the build tree. Avoid re-link on install.
@@ -546,12 +535,12 @@ if(NOT CMake_TEST_EXTERNAL_CMAKE)
install(FILES
"${CMake_LICENSE_FILE}"
"${CMake_SOURCE_DIR}/CONTRIBUTORS.rst"
DESTINATION ${CMAKE_DOC_DIR})
DESTINATION ${CMake_INSTALL_DOC_DIR})
# Install script directories.
install(
DIRECTORY Help Modules Templates
DESTINATION ${CMAKE_DATA_DIR}
DESTINATION ${CMake_INSTALL_DATA_DIR}
FILE_PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
DIRECTORY_PERMISSIONS OWNER_READ OWNER_EXECUTE OWNER_WRITE
GROUP_READ GROUP_EXECUTE

View File

@@ -16,7 +16,7 @@ function Component()
Component.prototype.reactOnTargetDirChange = function(key, value)
{
if (key == "TargetDir") {
var path = value + "/%CMAKE_BIN_DIR%";
var path = value + "/%CMake_INSTALL_BIN_DIR%";
installer.setValue("CMAKE%CMake_VERSION_MAJOR%%CMake_VERSION_MINOR%_BIN_DIR", path.replace(/\\/g, "/"));
}
}

View File

@@ -35,6 +35,14 @@ set_property(CACHE CMake_INSTALL_INFIX PROPERTY HELPSTRING
)
mark_as_advanced(CMake_INSTALL_INFIX)
if(APPLE AND BUILD_QtDialog)
set(CMake_INSTALL_APP_DIR "CMake.app/Contents")
set(CMake_INSTALL_APP_DIR_SLASH "${CMake_INSTALL_APP_DIR}/")
else()
set(CMake_INSTALL_APP_DIR ".")
set(CMake_INSTALL_APP_DIR_SLASH "")
endif()
foreach(v
BIN
DATA
@@ -56,4 +64,7 @@ foreach(v
endif()
# Remove leading slash to treat as relative to install prefix.
string(REGEX REPLACE "^/" "" CMAKE_${v}_DIR "${CMAKE_${v}_DIR}")
# Install under a base path within the prefix.
set(CMake_INSTALL_${v}_DIR "${CMake_INSTALL_APP_DIR_SLASH}${CMAKE_${v}_DIR}")
endforeach()

View File

@@ -1415,7 +1415,7 @@ endif()
foreach(_tool IN LISTS _tools)
CMake_OPTIONAL_COMPONENT(${_tool})
install(TARGETS ${_tool} DESTINATION ${CMAKE_BIN_DIR} ${COMPONENT})
install(TARGETS ${_tool} DESTINATION ${CMake_INSTALL_BIN_DIR} ${COMPONENT})
endforeach()
# Unset temporary variables

View File

@@ -60,4 +60,4 @@ if(CMake_JOB_POOL_LINK_BIN)
endif()
CMake_OPTIONAL_COMPONENT(ccmake)
install(TARGETS ccmake DESTINATION ${CMAKE_BIN_DIR} ${COMPONENT})
install(TARGETS ccmake DESTINATION ${CMake_INSTALL_BIN_DIR} ${COMPONENT})

View File

@@ -22,7 +22,7 @@ set(KWSYS_USE_MD5 1)
set(KWSYS_USE_Process 1)
set(KWSYS_USE_CommandLineArguments 1)
set(KWSYS_HEADER_ROOT ${CMake_BINARY_DIR}/Source)
set(KWSYS_INSTALL_DOC_DIR "${CMAKE_DOC_DIR}")
set(KWSYS_INSTALL_DOC_DIR "${CMake_INSTALL_DOC_DIR}")
if(CMake_NO_CXX_STANDARD)
set(KWSYS_CXX_STANDARD "")
endif()

View File

@@ -97,7 +97,7 @@ if(CMake_INSTALL_DEPENDENCIES AND (APPLE OR WIN32))
elseif(WIN32)
set(_qt_plugin_dir "plugins")
endif()
set(_qt_plugin_dest "${_qt_plugin_dir}/${_qt_plugin_type}")
set(_qt_plugin_dest "${CMake_INSTALL_APP_DIR_SLASH}${_qt_plugin_dir}/${_qt_plugin_type}")
install(FILES "${_qt_plugin_path}"
DESTINATION "${_qt_plugin_dest}"
${COMPONENT})
@@ -135,7 +135,7 @@ if(CMake_INSTALL_DEPENDENCIES AND (APPLE OR WIN32))
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
"[Paths]\nPlugins = ${_qt_plugin_dir}\n")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
DESTINATION "${CMAKE_INSTALL_PREFIX}/Resources"
DESTINATION "${CMake_INSTALL_APP_DIR_SLASH}Resources"
${COMPONENT})
elseif(WIN32 AND NOT CMake_QT_STATIC_QWindowsIntegrationPlugin_LIBRARIES)
if(CMake_QT_MAJOR_VERSION VERSION_EQUAL 5)
@@ -250,7 +250,7 @@ endif()
if(USE_LGPL)
install(FILES ${CMake_SOURCE_DIR}/Licenses/LGPLv${USE_LGPL}.txt
DESTINATION ${CMAKE_DATA_DIR}/Licenses
DESTINATION ${CMake_INSTALL_DATA_DIR}/Licenses
${COMPONENT})
set_property(SOURCE CMakeSetupDialog.cxx
PROPERTY COMPILE_DEFINITIONS USE_LGPL="${USE_LGPL}")
@@ -326,14 +326,14 @@ if(APPLE)
endif()
install(TARGETS cmake-gui
RUNTIME DESTINATION bin ${COMPONENT}
BUNDLE DESTINATION "${CMAKE_BUNDLE_LOCATION}" ${COMPONENT})
RUNTIME DESTINATION ${CMake_INSTALL_BIN_DIR} ${COMPONENT}
BUNDLE DESTINATION . ${COMPONENT})
if(UNIX AND NOT APPLE)
foreach(size IN ITEMS 32 128)
install(
FILES "${CMAKE_CURRENT_SOURCE_DIR}/CMakeSetup${size}.png"
DESTINATION "${CMAKE_XDGDATA_DIR}/icons/hicolor/${size}x${size}/apps"
DESTINATION "${CMake_INSTALL_XDGDATA_DIR}/icons/hicolor/${size}x${size}/apps"
${COMPONENT}
RENAME "CMakeSetup.png")
endforeach()
@@ -341,26 +341,26 @@ if(UNIX AND NOT APPLE)
# install a desktop file so CMake appears in the application start menu
# with an icon
install(FILES cmake-gui.desktop
DESTINATION "${CMAKE_XDGDATA_DIR}/applications"
DESTINATION "${CMake_INSTALL_XDGDATA_DIR}/applications"
${COMPONENT})
install(FILES cmakecache.xml
DESTINATION "${CMAKE_XDGDATA_DIR}/mime/packages"
DESTINATION "${CMake_INSTALL_XDGDATA_DIR}/mime/packages"
${COMPONENT})
endif()
if(APPLE)
install(CODE "
execute_process(COMMAND ln -s \"../MacOS/CMake\" cmake-gui
WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)
WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMake_INSTALL_BIN_DIR})
" ${COMPONENT})
endif()
if(CMake_INSTALL_DEPENDENCIES AND (APPLE OR WIN32))
# install rules for including 3rd party libs such as Qt
# if a system Qt is used (e.g. installed in /usr/lib/), it will not be included in the installation
set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/cmake-gui${CMAKE_EXECUTABLE_SUFFIX}")
set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMake_INSTALL_BIN_DIR}/cmake-gui${CMAKE_EXECUTABLE_SUFFIX}")
if(APPLE)
set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/MacOS/CMake")
set(fixup_exe "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMake_INSTALL_APP_DIR_SLASH}MacOS/CMake")
endif()
install(CODE "
include(BundleUtilities)

View File

@@ -11,7 +11,7 @@ Component.prototype.createOperations = function()
if (installer.value("os") === "win") {
component.addOperation("CreateShortcut",
"@TargetDir@/%CMAKE_DOC_DIR%/developer-reference/html/index.html",
"@TargetDir@/%CMake_INSTALL_DOC_DIR%/developer-reference/html/index.html",
"@StartMenuDir@/CMake Developer Reference.lnk");
}

View File

@@ -11,7 +11,7 @@ Component.prototype.createOperations = function()
if (installer.value("os") === "win") {
component.addOperation("CreateShortcut",
"@TargetDir@/%CMAKE_BIN_DIR%/cmake-gui.exe",
"@TargetDir@/%CMake_INSTALL_BIN_DIR%/cmake-gui.exe",
"@StartMenuDir@/CMake (cmake-gui).lnk");
}

View File

@@ -11,7 +11,7 @@ Component.prototype.createOperations = function()
if (installer.value("os") === "win") {
component.addOperation("CreateShortcut",
"@TargetDir@/%CMAKE_DOC_DIR%/html/index.html",
"@TargetDir@/%CMake_INSTALL_DOC_DIR%/html/index.html",
"@StartMenuDir@/CMake Documentation.lnk");
}

View File

@@ -11,7 +11,7 @@ Component.prototype.createOperations = function()
if (installer.value("os") === "win") {
component.addOperation("CreateShortcut",
"@TargetDir@/%CMAKE_DOC_DIR%/cmake.org.html",
"@TargetDir@/%CMake_INSTALL_DOC_DIR%/cmake.org.html",
"@StartMenuDir@/CMake Web Site.lnk");
component.addOperation("CreateShortcut",

View File

@@ -14,7 +14,7 @@ Component.prototype.createOperations = function()
%_CPACK_IFW_SHORTCUT_OPTIONAL%
component.addOperation("CreateShortcut",
"@TargetDir@/%CMAKE_DOC_DIR%/cmake.org.html",
"@TargetDir@/%CMake_INSTALL_DOC_DIR%/cmake.org.html",
"@StartMenuDir@/CMake Web Site.lnk");
component.addOperation("CreateShortcut",

View File

@@ -7,7 +7,7 @@ if (CMake_DOC_ARTIFACT_PREFIX)
# Undocumented option for CI usage to reuse already
# built documentation.
install(DIRECTORY ${CMake_DOC_ARTIFACT_PREFIX}/
DESTINATION . USE_SOURCE_PERMISSIONS)
DESTINATION ${CMake_INSTALL_APP_DIR} USE_SOURCE_PERMISSIONS)
else()
# Normal documentation build.
add_subdirectory(Sphinx)

View File

@@ -82,14 +82,14 @@ if (CMake_BUILD_DEVELOPER_REFERENCE OR CMakeDeveloperReference_STANDALONE)
if(CMake_BUILD_DEVELOPER_REFERENCE_HTML)
CMake_OPTIONAL_COMPONENT(cmake-developer-reference-html)
install(DIRECTORY "${CMakeDeveloperReference_BINARY_DIR}/developer-reference/html"
DESTINATION ${CMAKE_DOC_DIR}/developer-reference
DESTINATION ${CMake_INSTALL_DOC_DIR}/developer-reference
${COMPONENT})
endif()
if(CMake_BUILD_DEVELOPER_REFERENCE_QTHELP)
CMake_OPTIONAL_COMPONENT(cmake-developer-reference-qthelp)
install(FILES "${CMakeDeveloperReference_BINARY_DIR}/developer-reference/CMakeDeveloperReference-${CMake_VERSION_MAJOR}${CMake_VERSION_MINOR}${CMake_VERSION_PATCH}.qch"
DESTINATION ${CMAKE_DOC_DIR}/developer-reference
DESTINATION ${CMake_INSTALL_DOC_DIR}/developer-reference
${COMPONENT})
endif()

View File

@@ -283,7 +283,7 @@ endif()
if(SPHINX_INFO)
CMake_OPTIONAL_COMPONENT(sphinx-info)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/texinfo/cmake.info
DESTINATION ${CMAKE_INFO_DIR}
DESTINATION ${CMake_INSTALL_INFO_DIR}
${COMPONENT}
)
endif()
@@ -306,7 +306,7 @@ if(SPHINX_MAN)
if(NOT skip)
CMake_OPTIONAL_COMPONENT(sphinx-man)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/man/${name}.${sec}
DESTINATION ${CMAKE_MAN_DIR}/man${sec}
DESTINATION ${CMake_INSTALL_MAN_DIR}/man${sec}
${COMPONENT})
endif()
unset(skip)
@@ -317,7 +317,7 @@ endif()
if(SPHINX_HTML)
CMake_OPTIONAL_COMPONENT(sphinx-html)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html
DESTINATION ${CMAKE_DOC_DIR}
DESTINATION ${CMake_INSTALL_DOC_DIR}
${COMPONENT}
PATTERN .buildinfo EXCLUDE
)
@@ -326,7 +326,7 @@ endif()
if(SPHINX_SINGLEHTML)
CMake_OPTIONAL_COMPONENT(sphinx-singlehtml)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/singlehtml
DESTINATION ${CMAKE_DOC_DIR}
DESTINATION ${CMake_INSTALL_DOC_DIR}
${COMPONENT}
PATTERN .buildinfo EXCLUDE
)
@@ -335,13 +335,13 @@ endif()
if(SPHINX_QTHELP)
CMake_OPTIONAL_COMPONENT(sphinx-qthelp)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qthelp/CMake.qch
DESTINATION ${CMAKE_DOC_DIR} ${COMPONENT}
DESTINATION ${CMake_INSTALL_DOC_DIR} ${COMPONENT}
)
endif()
if(SPHINX_LATEXPDF)
CMake_OPTIONAL_COMPONENT(sphinx-latexpdf)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/latexpdf/latex/CMake.pdf
DESTINATION ${CMAKE_DOC_DIR} ${COMPONENT}
DESTINATION ${CMake_INSTALL_DOC_DIR} ${COMPONENT}
)
endif()

View File

@@ -41,4 +41,4 @@ if(CMake_BUILD_PCH)
target_precompile_headers(cmcppdap PRIVATE "include/dap/protocol.h")
endif()
install(FILES NOTICE DESTINATION ${CMAKE_DOC_DIR}/cmcppdap)
install(FILES NOTICE DESTINATION ${CMake_INSTALL_DOC_DIR}/cmcppdap)

View File

@@ -2240,7 +2240,7 @@ if(BUILD_TESTING AND CMAKE_CURL_TEST_URL)
add_test(curl curltest ${CMAKE_CURL_TEST_URL})
endif()
install(FILES COPYING DESTINATION ${CMAKE_DOC_DIR}/cmcurl)
install(FILES COPYING DESTINATION ${CMake_INSTALL_DOC_DIR}/cmcurl)
return() # The rest of this file is not needed for building within CMake.
# XXX(cmake): end cmake-specific curl code

View File

@@ -2218,4 +2218,4 @@ add_subdirectory(cpio)
add_subdirectory(unzip)
ENDIF()
install(FILES COPYING DESTINATION ${CMAKE_DOC_DIR}/cmlibarchive)
install(FILES COPYING DESTINATION ${CMake_INSTALL_DOC_DIR}/cmlibarchive)

View File

@@ -195,4 +195,4 @@ if(WIN32 AND CMake_BUILD_PCH)
target_precompile_headers(cmliblzma PRIVATE "common/mythread.h")
endif()
INSTALL(FILES COPYING DESTINATION ${CMAKE_DOC_DIR}/cmliblzma)
INSTALL(FILES COPYING DESTINATION ${CMake_INSTALL_DOC_DIR}/cmliblzma)

View File

@@ -39,4 +39,4 @@ include_directories(
add_library(cmlibrhash ${librhash_sources})
target_compile_definitions(cmlibrhash PRIVATE NO_IMPORT_EXPORT)
install(FILES COPYING DESTINATION ${CMAKE_DOC_DIR}/cmlibrhash)
install(FILES COPYING DESTINATION ${CMake_INSTALL_DOC_DIR}/cmlibrhash)

View File

@@ -341,4 +341,4 @@ if(WIN32 AND CMake_BUILD_PCH)
target_precompile_headers(cmlibuv PRIVATE "include/uv.h" "src/win/internal.h")
endif()
install(FILES LICENSE DESTINATION ${CMAKE_DOC_DIR}/cmlibuv)
install(FILES LICENSE DESTINATION ${CMake_INSTALL_DOC_DIR}/cmlibuv)

View File

@@ -50,4 +50,4 @@ target_include_directories(cmnghttp2 PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/lib/includes
)
install(FILES COPYING DESTINATION ${CMAKE_DOC_DIR}/cmnghttp2)
install(FILES COPYING DESTINATION ${CMake_INSTALL_DOC_DIR}/cmnghttp2)

View File

@@ -25,4 +25,4 @@ add_library(cmzlib
zutil.c
)
install(FILES Copyright.txt DESTINATION ${CMAKE_DOC_DIR}/cmzlib)
install(FILES Copyright.txt DESTINATION ${CMake_INSTALL_DOC_DIR}/cmzlib)

View File

@@ -52,4 +52,4 @@ target_compile_definitions(cmzstd PRIVATE
ZSTD_DISABLE_ASM=1
)
install(FILES LICENSE DESTINATION ${CMAKE_DOC_DIR}/cmzstd)
install(FILES LICENSE DESTINATION ${CMake_INSTALL_DOC_DIR}/cmzstd)