3.16 regression in FindBinUtils.cmake when used with cross compile toolchain
There is a regression introduced in 3.16 with the way FindBinUtils.cmake detects utilities when used with cross compile toolchain. The utilities, not overridden in the toolchain file, will be detected from the PATH instead of the toolchain provided ones.
The regression seems to be introduced with !3854 (merged).
Here is a quick reproduction with Android NDK r20 toolchain and this sample CMakeLists.txt:
project(foo)
message(STATUS "CMake version: ${CMAKE_VERSION}")
message(STATUS "_CMAKE_TOOLCHAIN_PREFIX: ${_CMAKE_TOOLCHAIN_PREFIX}")
message(STATUS "_CMAKE_TOOLCHAIN_SUFFIX: ${_CMAKE_TOOLCHAIN_SUFFIX}")
message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}")
message(STATUS "CMAKE_AR: ${CMAKE_AR}")
message(STATUS "CMAKE_LINKER: ${CMAKE_LINKER}")
message(STATUS "CMAKE_RANLIB: ${CMAKE_RANLIB}")
message(STATUS "CMAKE_STRIP: ${CMAKE_STRIP}")
message(STATUS "CMAKE_NM: ${CMAKE_NM}")
message(STATUS "CMAKE_OBJCOPY: ${CMAKE_OBJCOPY}")
message(STATUS "CMAKE_OBJDUMP: ${CMAKE_OBJDUMP}")
message(STATUS "CMAKE_READELF: ${CMAKE_READELF}")
message(STATUS "CMAKE_DLLTOOL: ${CMAKE_DLLTOOL}")
message(STATUS "CMAKE_ADDR2LINE: ${CMAKE_ADDR2LINE}")
With CMake 3.15.5 we get the following output:
# cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk/android-ndk-r20/build/cmake/android.toolchain.cmake ../
-- ANDROID_PLATFORM not set. Defaulting to minimum supported version
16.
-- Check for working C compiler: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- Check for working C compiler: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
-- Check for working CXX compiler: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- CMake version: 3.15.5
-- _CMAKE_TOOLCHAIN_PREFIX: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
-- _CMAKE_TOOLCHAIN_SUFFIX:
-- CMAKE_C_COMPILER: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- CMAKE_CXX_COMPILER: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
-- CMAKE_AR: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
-- CMAKE_LINKER: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld
-- CMAKE_RANLIB: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlib
-- CMAKE_STRIP: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip
-- CMAKE_NM: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm
-- CMAKE_OBJCOPY: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-objcopy
-- CMAKE_OBJDUMP: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-objdump
-- CMAKE_READELF:
-- CMAKE_DLLTOOL:
-- CMAKE_ADDR2LINE:
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/cmake_findbinutils_regression/build
With CMake 3.16.0rc3:
# cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk/android-ndk-r20/build/cmake/android.toolchain.cmake ../
-- ANDROID_PLATFORM not set. Defaulting to minimum supported version
16.
-- Check for working C compiler: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- Check for working C compiler: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
-- Check for working CXX compiler: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- CMake version: 3.16.0-rc3
-- _CMAKE_TOOLCHAIN_PREFIX: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
-- _CMAKE_TOOLCHAIN_SUFFIX:
-- CMAKE_C_COMPILER: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
-- CMAKE_CXX_COMPILER: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
-- CMAKE_AR: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
-- CMAKE_LINKER: /usr/bin/ld
-- CMAKE_RANLIB: /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlib
-- CMAKE_STRIP: /usr/bin/strip
-- CMAKE_NM: /usr/bin/nm
-- CMAKE_OBJCOPY: /usr/bin/objcopy
-- CMAKE_OBJDUMP: /usr/bin/objdump
-- CMAKE_READELF: /usr/bin/readelf
-- CMAKE_DLLTOOL: CMAKE_DLLTOOL-NOTFOUND
-- CMAKE_ADDR2LINE: /usr/bin/addr2line
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/cmake_findbinutils_regression/build
The problem comes from query for program path, in CMakeFindBinUtils.cmake, which doesn't give priority to program names with toolchain prefix anymore. The way program path is queried at the moment, we get for example:
# /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -print-prog-name=objcopy
/usr/bin/objcopy
But when we use toolchain prefix, we get the correct path, e.g.:
# /opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -print-prog-name=arm-linux-androideabi-objcopy
/opt/android/ndk/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-objcopy