Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • CMake CMake
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 4,106
    • Issues 4,106
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 16
    • Merge requests 16
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Releases
  • Packages and registries
    • Packages and registries
    • Container Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • External wiki
    • External wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • CMakeCMake
  • CMakeCMake
  • Issues
  • #19934
Closed
Open
Issue created Nov 07, 2019 by Vedran Vujinovic@vedranvContributor

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
Edited Nov 07, 2019 by Brad King
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
Time tracking