CMakeFindBinUtils.cmake not work well if CMAKE_LINKER is set with an absolute path
Checklist:
- cmake version 3.12.1
- Windows 10: 17134.rs4_release.180410-1804
- Existing issues: checked.
- Master branch for modification: checked
Symptoms:
Setting CMAKE_LINKER
(example: set(CMAKE_LINKER "C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Tools/MSVC/14.14.26428/bin/Hostx64/x64/link.exe")
) with an absolute path will result with CMAKE_LINKER:FILEPATH=
(<-- empty).
I made some patch for myself, I would like to share it:
File: C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeFindBinUtils.cmake
The original:
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()
My patch:
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}" DIRECTORY)
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})
endif()
unset(CMAKE_LINKER_WITH_PATH CACHE)
endif()
unset(_CMAKE_USER_LINKER_PATH)
get_property(_CMAKE_LINKER_CACHED CACHE CMAKE_LINKER PROPERTY TYPE)
if(NOT _CMAKE_LINKER_CACHED)
set(CMAKE_LINKER "${CMAKE_LINKER}" CACHE STRING "Default Linker" FORCE)
endif()
unset(_CMAKE_LINKER_CACHED)
endif()
Edited by Máté Pék