conan: [package] boost/*: CMakeDeps generator broken for Conan 1.51.0

Package and Environment Details

  • Package Name/Version: conan/1.79.0
  • Operating System+version: Fedora Linux 36
  • Compiler+version: GCC 12
  • Conan version: conan 1.51.0
  • Python version: Python 3.10.5

Conan profile

conan profile show linux/gcc/debug Configuration for profile linux/gcc/debug:

[settings] os=Linux arch=x86_64 compiler=gcc compiler.version=12 compiler.libcxx=libstdc++11 compiler.cppstd=17 build_type=Debug [options] [conf] [build_requires] [env]

Steps to reproduce

  1. Use CMakeDeps generator with the Boost package from Conan Center as a requires.
  2. Run conan install.
  3. Run conan build, where the configure stage of CMake will fail.

Logs

Click to expand log
CMake Error at build/Boost-Target-debug.cmake:1274 (target_link_libraries):
  Cannot specify link libraries for target "boost::boost" which is not built
  by this project.
Call Stack (most recent call first):
  build/BoostTargets.cmake:26 (include)
  build/BoostConfig.cmake:10 (include)
  CMakeLists.txt:1 (find_package)


-- Configuring incomplete, errors occurred!

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Comments: 20 (15 by maintainers)

Most upvoted comments

I re-created a minimal example project demonstrating the problem. Due to the fact the release notes mentioned GLOBAL target behavior, I deduced the problem only occurred when using multiple CMakeLists.txt files through add_subdirectory.

CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(hello CXX)

set(CMAKE_FIND_PACKAGE_PREFER_CONFIG yes CACHE BOOL "")
find_package(Boost REQUIRED COMPONENTS exception headers)

add_subdirectory(src)

src/CMakeLists.txt:

find_package(Boost REQUIRED COMPONENTS exception headers)

add_library(hello hello.cpp)
target_include_directories(hello PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include)

target_link_libraries(hello PUBLIC Boost::exception Boost::headers)

set_target_properties(hello PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/../include/hello.h")
install(TARGETS hello)

I finally manage to reproduce it. Now I can hunt the bug, million thanks for your help.

Thanks MiSo1289, I have an idea now about what is happening.

Could you attach the generated build/Boost-Target-debug.cmake file? I’m not able to reproduce the issue so far. @jwillikers

I attach the -Target-debug.cmake file for eigen where I encountered the same issue. I tried to do a minimal reproduction but failed; of note maybe is that eigen is required in the project only transitively through opencv.

########### VARIABLES #######################################################################
#############################################################################################

set(eigen_COMPILE_OPTIONS_DEBUG
    "$<$<COMPILE_LANGUAGE:CXX>:${eigen_COMPILE_OPTIONS_CXX_DEBUG}>"
    "$<$<COMPILE_LANGUAGE:C>:${eigen_COMPILE_OPTIONS_C_DEBUG}>")

set(eigen_LINKER_FLAGS_DEBUG
    "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:${eigen_SHARED_LINK_FLAGS_DEBUG}>"
    "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,MODULE_LIBRARY>:${eigen_SHARED_LINK_FLAGS_DEBUG}>"
    "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:${eigen_EXE_LINK_FLAGS_DEBUG}>")

set(eigen_FRAMEWORKS_FOUND_DEBUG "") # Will be filled later
conan_find_apple_frameworks(eigen_FRAMEWORKS_FOUND_DEBUG "${eigen_FRAMEWORKS_DEBUG}" "${eigen_FRAMEWORK_DIRS_DEBUG}")

# Gather all the libraries that should be linked to the targets (do not touch existing variables)
# FIXME: Why is needed to pass all the dependencies to link with the micro-targets?
set(_eigen_DEPENDENCIES_DEBUG "")

set(eigen_LIBRARIES_TARGETS_DEBUG "") # Will be filled later
conan_package_library_targets("${eigen_LIBS_DEBUG}"    # libraries
                              "${eigen_LIB_DIRS_DEBUG}" # package_libdir
                              "${_eigen_DEPENDENCIES_DEBUG}" # deps
                              eigen_LIBRARIES_TARGETS  # out_libraries_targets
                              "DEBUG" # DEBUG, RELEASE ...
                              "eigen")    # package_name

# The XXXX_LIBRARIES_RELEASE/DEBUG is used for the module (FindXXX.cmake)
foreach(_FRAMEWORK ${eigen_FRAMEWORKS_FOUND_DEBUG})
    list(APPEND eigen_LIBRARIES_DEBUG ${_FRAMEWORK})
endforeach()

foreach(_SYSTEM_LIB ${eigen_SYSTEM_LIBS_DEBUG})
    list(APPEND eigen_LIBRARIES_DEBUG ${_SYSTEM_LIB})
endforeach()

# We need to add our requirements too
set(eigen_LIBRARIES_DEBUG "")
list(APPEND eigen_LIBRARIES_DEBUG )

# FIXME: What is the result of this for multi-config? All configs adding themselves to path?
set(CMAKE_MODULE_PATH ${eigen_BUILD_DIRS_DEBUG} ${CMAKE_MODULE_PATH})
set(CMAKE_PREFIX_PATH ${eigen_BUILD_DIRS_DEBUG} ${CMAKE_PREFIX_PATH})


########## COMPONENTS TARGET PROPERTIES Debug ########################################
########## COMPONENT Eigen3::Eigen FIND LIBRARIES & FRAMEWORKS / DYNAMIC VARS #############

set(eigen_Eigen3_Eigen_FRAMEWORKS_FOUND_DEBUG "")
conan_find_apple_frameworks(eigen_Eigen3_Eigen_FRAMEWORKS_FOUND_DEBUG "${eigen_Eigen3_Eigen_FRAMEWORKS_DEBUG}" "${eigen_Eigen3_Eigen_FRAMEWORK_DIRS_DEBUG}")

set(eigen_Eigen3_Eigen_LIBRARIES_TARGETS "")

conan_package_library_targets("${eigen_Eigen3_Eigen_LIBS_DEBUG}"
                              "${eigen_Eigen3_Eigen_LIB_DIRS_DEBUG}"
                              "${eigen_Eigen3_Eigen_DEPENDENCIES_DEBUG}"
                              eigen_Eigen3_Eigen_LIBRARIES_TARGETS
                              "DEBUG" # DEBUG, RELEASE...
                              "eigen_Eigen3_Eigen")

########## COMPONENT Eigen3::Eigen TARGET PROPERTIES #####################################
set_property(TARGET Eigen3::Eigen
             PROPERTY INTERFACE_LINK_LIBRARIES
             $<$<CONFIG:Debug>:${eigen_Eigen3_Eigen_OBJECTS_DEBUG}>
             ${eigen_Eigen3_Eigen_LIBRARIES_TARGETS}
             $<$<CONFIG:Debug>:${eigen_Eigen3_Eigen_DEPENDENCIES_DEBUG}>
             $<$<CONFIG:Debug>:${eigen_Eigen3_Eigen_FRAMEWORKS_FOUND_DEBUG}>
             $<$<CONFIG:Debug>:${eigen_Eigen3_Eigen_SYSTEM_LIBS_DEBUG}>
             APPEND)

set_property(TARGET Eigen3::Eigen PROPERTY INTERFACE_LINK_OPTIONS
             $<$<CONFIG:Debug>:${eigen_Eigen3_Eigen_LINKER_FLAGS_DEBUG}> APPEND)
set_property(TARGET Eigen3::Eigen PROPERTY INTERFACE_INCLUDE_DIRECTORIES
             $<$<CONFIG:Debug>:${eigen_Eigen3_Eigen_INCLUDE_DIRS_DEBUG}> APPEND)
set_property(TARGET Eigen3::Eigen PROPERTY INTERFACE_COMPILE_DEFINITIONS
             $<$<CONFIG:Debug>:${eigen_Eigen3_Eigen_COMPILE_DEFINITIONS_DEBUG}> APPEND)
set_property(TARGET Eigen3::Eigen PROPERTY INTERFACE_COMPILE_OPTIONS
             $<$<CONFIG:Debug>:
             ${eigen_Eigen3_Eigen_COMPILE_OPTIONS_C_DEBUG}
             ${eigen_Eigen3_Eigen_COMPILE_OPTIONS_CXX_DEBUG}> APPEND)
set(eigen_Eigen3_Eigen_TARGET_PROPERTIES TRUE)

########## AGGREGATED GLOBAL TARGET WITH THE COMPONENTS #####################
target_link_libraries(Eigen3::Eigen INTERFACE Eigen3::Eigen)

Error log:

CMake Error at build3/Eigen3-Target-debug.cmake:84 (target_link_libraries):
  Cannot specify link libraries for target "Eigen3::Eigen" which is not built
  by this project.
Call Stack (most recent call first):
  build3/Eigen3Targets.cmake:26 (include)
  build3/Eigen3Config.cmake:10 (include)
  examples/CMakeLists.txt:3 (find_package)