Skip to content

CMake: Misleading error message in C only projects trying to find Boost #76

@LeSpocky

Description

@LeSpocky

I have multiple CMake library projects here, one of them using Boost threads. One library project ("A") exports its own config together with a find_dependency(Boost COMPONENTS thread) call.

Another library project ("B") uses find_package(A) and this way the find_dependency is executed which calls find_package(Boost COMPONENTS thread) internally. That is then used by a third library ("C"), so you a have a chain of dependencies here.

Problem: library C currently has its LANGUAGES set to C in the project() call. Linking libB in libC is possible, but since the switch from CMake FindBoost module to cmake package config coming with Boost I get a build error, which I could track down to Boost.

Minimal example requires a short CMakeLists.txt only:

cmake_minimum_required(VERSION 3.5)
project(bt
    VERSION 0.1
    LANGUAGES C
)

find_package(Boost REQUIRED CONFIG
    COMPONENTS
        thread
)

The error message is like this:

CMake Error at /usr/lib/x86_64-linux-gnu/cmake/BoostDetectToolset-1.74.0.cmake:5 (string):
  string sub-command REGEX, mode MATCHALL needs at least 5 arguments total to
  command.
Call Stack (most recent call first):
  /usr/lib/x86_64-linux-gnu/cmake/boost_thread-1.74.0/boost_thread-config.cmake:27 (include)
  /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake:141 (find_package)
  /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake:258 (boost_find_component)
  CMakeLists.txt:7 (find_package)


Boost toolset is unknown (compiler  )
CMake Error at /usr/lib/x86_64-linux-gnu/cmake/BoostDetectToolset-1.74.0.cmake:5 (string):
  string sub-command REGEX, mode MATCHALL needs at least 5 arguments total to
  command.
Call Stack (most recent call first):
  /usr/lib/x86_64-linux-gnu/cmake/boost_atomic-1.74.0/boost_atomic-config.cmake:27 (include)
  /usr/lib/x86_64-linux-gnu/cmake/boost_thread-1.74.0/boost_thread-config.cmake:100 (find_package)
  /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake:141 (find_package)
  /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake:258 (boost_find_component)
  CMakeLists.txt:7 (find_package)


Boost toolset is unknown (compiler  )
Performing Test CMAKE_HAVE_LIBC_PTHREAD
Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
Found Threads: TRUE  
Configuring incomplete, errors occurred!
See also "/home/adahl/build/tmp/bt/CMakeFiles/CMakeOutput.log".

Note: this still happens with most recent Boost, it was just easier to reproduce on my host machine like this.

Note: this only happens if COMPONENTS are involved.

Analysis: the problem is in tools/boost_install/BoostDetectToolset.cmake right in the first line:

string(REGEX MATCHALL "[0-9]+" _BOOST_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})

In my case ${CMAKE_CXX_COMPILER_VERSION} is empty here (C only project), leading to that error message. I would propose to check for that variable before using it and bailout with a meaningful error message if it is found to be empty.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions