mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-01 19:30:13 -06:00
If a project or toolchain file hard-codes a tool location such as `CMAKE_LINKER` with a plain `set()` then the value will be stored in compiler information files but not cached. If the value is not cached then we should not mark it as advanced because doing so will initialize an empty cache entry. Fixes: #18315
98 lines
3.9 KiB
CMake
98 lines
3.9 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
|
|
# search for additional tools required for C/C++ (and other languages ?)
|
|
#
|
|
# If the internal cmake variable _CMAKE_TOOLCHAIN_PREFIX is set, this is used
|
|
# as prefix for the tools (e.g. arm-elf-gcc etc.)
|
|
# If the cmake variable _CMAKE_TOOLCHAIN_LOCATION is set, the compiler is
|
|
# searched only there. The other tools are at first searched there, then
|
|
# also in the default locations.
|
|
#
|
|
# Sets the following variables:
|
|
# CMAKE_AR
|
|
# CMAKE_RANLIB
|
|
# CMAKE_LINKER
|
|
# CMAKE_STRIP
|
|
# CMAKE_INSTALL_NAME_TOOL
|
|
|
|
# on UNIX, cygwin and mingw
|
|
|
|
if(CMAKE_LINKER)
|
|
# we only get here if CMAKE_LINKER was specified using -D or a pre-made CMakeCache.txt
|
|
# (e.g. via ctest) or set in CMAKE_TOOLCHAIN_FILE
|
|
# find the linker in the PATH if necessary
|
|
get_filename_component(_CMAKE_USER_LINKER_PATH "${CMAKE_LINKER}" PATH)
|
|
if(NOT _CMAKE_USER_LINKER_PATH)
|
|
find_program(CMAKE_LINKER_WITH_PATH NAMES ${CMAKE_LINKER} HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
if(CMAKE_LINKER_WITH_PATH)
|
|
set(CMAKE_LINKER ${CMAKE_LINKER_WITH_PATH})
|
|
get_property(_CMAKE_LINKER_CACHED CACHE CMAKE_LINKER PROPERTY TYPE)
|
|
if(_CMAKE_LINKER_CACHED)
|
|
set(CMAKE_LINKER "${CMAKE_LINKER}" CACHE STRING "Default Linker" FORCE)
|
|
endif()
|
|
unset(_CMAKE_LINKER_CACHED)
|
|
endif()
|
|
unset(CMAKE_LINKER_WITH_PATH CACHE)
|
|
endif()
|
|
endif()
|
|
|
|
set(_CMAKE_TOOL_VARS "")
|
|
|
|
# if it's the MS C/CXX compiler, search for link
|
|
if("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_SIMULATE_ID}" STREQUAL "xMSVC"
|
|
OR "x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" STREQUAL "xMSVC"
|
|
OR (CMAKE_HOST_WIN32 AND "x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" STREQUAL "xPGI")
|
|
OR (CMAKE_GENERATOR MATCHES "Visual Studio"
|
|
AND NOT CMAKE_VS_PLATFORM_NAME STREQUAL "Tegra-Android"))
|
|
|
|
find_program(CMAKE_LINKER NAMES link HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
|
|
list(APPEND _CMAKE_TOOL_VARS CMAKE_LINKER)
|
|
|
|
# in all other cases search for ar, ranlib, etc.
|
|
else()
|
|
if(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN)
|
|
set(_CMAKE_TOOLCHAIN_LOCATION ${_CMAKE_TOOLCHAIN_LOCATION} ${CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN}/bin)
|
|
endif()
|
|
if(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN)
|
|
set(_CMAKE_TOOLCHAIN_LOCATION ${_CMAKE_TOOLCHAIN_LOCATION} ${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}/bin)
|
|
endif()
|
|
find_program(CMAKE_AR NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ar${_CMAKE_TOOLCHAIN_SUFFIX} HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
|
|
find_program(CMAKE_RANLIB NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ranlib HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
if(NOT CMAKE_RANLIB)
|
|
set(CMAKE_RANLIB : CACHE INTERNAL "noop for ranlib")
|
|
endif()
|
|
|
|
find_program(CMAKE_STRIP NAMES ${_CMAKE_TOOLCHAIN_PREFIX}strip${_CMAKE_TOOLCHAIN_SUFFIX} HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
find_program(CMAKE_LINKER NAMES ${_CMAKE_TOOLCHAIN_PREFIX}ld HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
find_program(CMAKE_NM NAMES ${_CMAKE_TOOLCHAIN_PREFIX}nm HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
find_program(CMAKE_OBJDUMP NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objdump HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
find_program(CMAKE_OBJCOPY NAMES ${_CMAKE_TOOLCHAIN_PREFIX}objcopy HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
|
|
list(APPEND _CMAKE_TOOL_VARS CMAKE_AR CMAKE_RANLIB CMAKE_STRIP CMAKE_LINKER CMAKE_NM CMAKE_OBJDUMP CMAKE_OBJCOPY)
|
|
|
|
endif()
|
|
|
|
if(CMAKE_PLATFORM_HAS_INSTALLNAME)
|
|
find_program(CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool HINTS ${_CMAKE_TOOLCHAIN_LOCATION})
|
|
|
|
if(NOT CMAKE_INSTALL_NAME_TOOL)
|
|
message(FATAL_ERROR "Could not find install_name_tool, please check your installation.")
|
|
endif()
|
|
|
|
list(APPEND _CMAKE_TOOL_VARS CMAKE_INSTALL_NAME_TOOL)
|
|
endif()
|
|
|
|
# Mark any tool cache entries as advanced.
|
|
foreach(var IN LISTS _CMAKE_TOOL_VARS)
|
|
get_property(_CMAKE_TOOL_CACHED CACHE ${var} PROPERTY TYPE)
|
|
if(_CMAKE_TOOL_CACHED)
|
|
mark_as_advanced(${var})
|
|
endif()
|
|
endforeach()
|
|
unset(_CMAKE_TOOL_VARS)
|
|
unset(_CMAKE_TOOL_CACHED)
|