question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

[question] CMakeDeps and layout() creates but wrong test-package

See original GitHub issue

This is a followup to #9937:

I have the following conanfile.py

import os
import sys
from conans import ConanFile, tools
from conan.tools.cmake import CMakeDeps, CMakeToolchain, CMake
from conans.tools import Version
from conan.tools.layout import cmake_layout

import cg_conan as cg  # noqa: E402

class BaseLibrary(ConanFile):
  name = "base"

  description = """This is a test project with a library base::io
    and base::math and an executable cli."""

  license = "MIT"
  url = "..."
  homepage = "..."
  default_options = {"fmt:shared": True}
  build_policy = "missing"  # if this package is build by default if missing.
  settings = "os", "compiler", "build_type", "arch"

  scm = {
      "type":
          "git",
      "subfolder":
          "repo",
      "url":
          "https://bitbucket.dentsplysirona.com/scm/devops/cmake-general.git",
      "revision":
          "auto",
      "shallow":
          True
  }

  apply_env = True

  def set_version(self):
    self.version = cg.version.get_version_from_git_tag(self)

  def requirements(self):
    if Version(self.version) >= "0.0.0":
      self.requires("fmt/8.0.1")

  def build_requirements(self):
    if Version(self.version) >= "0.0.0":
      self.build_requires("catch2/2.13.7")
      self.build_requires("gtest/1.11.0")

  def configure(self):
    cg.assert_compiler_and_stdlib_match(self)

  def layout(self):
    # https://docs.conan.io/en/latest/reference/conanfile/methods.html#layout
    cmake_layout(self)
    self.folders.source = "repo/tests/project"

  def generate(self):
    tc = CMakeToolchain(self)
    tc.variables["GENERAL_BUILD_LIBS"] = True
    tc.variables["GENERAL_BUILD_TOOLS"] = True
    tc.variables["GENERAL_BUILD_TESTS"] = False
   tc.generate()

    deps = CMakeDeps(self)
    # When you have a build-require, by default,
    # the config files (xxx-config.cmake) files are not generated.
    # https://docs.conan.io/en/latest/reference/conanfile/tools/cmake/cmakedeps.html#build-context-activated
    deps.build_context_activated = ["catch2", "gtest"]
    deps.generate()

  def build(self):
    cmake = CMake(self)
    cmake.configure()
    cmake.build()
    cmake.install()

  def package(self):
    cmake = CMake(self)
    cmake.install()
    tools.rmdir(os.path.join(self.package_folder, "lib", "pkgconfig"))
    tools.rmdir(os.path.join(self.package_folder, "share", "base", "cmake"))

  def package_info(self):
    self.cpp_info.name = self.name

    debugSuffix = ""
    if self.settings.build_type == "Debug":
      debugSuffix = "-dbg"

    # libs = tools.collect_libs(self)
    # print(libs)

    compMath = "math"
    dllMath = f"{self.name}-{compMath}{debugSuffix}"
    self.cpp_info.components[compMath].libs = [dllMath]
    self.cpp_info.components[compMath].requires = ["fmt::fmt"]

    compIo = f"io"
    dllIO = f"{self.name}-{compIo}{debugSuffix}"
    self.cpp_info.components[compIo].libs = [dllIO]
    self.cpp_info.components[compIo].requires = ["fmt::fmt", compMath]

When I create the package for this by

 conan create \
    -pr:b "clang-default" \
    -pr:h "clang-default" \
    -s build_type=Debug \
    --test-folder tests/package \
    --build=missing \
    . demo/testing

It successfully creates the package and testing it with test/package also works. The tests/package/build folder contains a base-debug-x86_64-data.cmake with e.g. an “io” component:

########### COMPONENT math VARIABLES #############################################
set(base_math_INCLUDE_DIRS_DEBUG "${base_PACKAGE_FOLDER_DEBUG}/include")
set(base_math_LIB_DIRS_DEBUG "${base_PACKAGE_FOLDER_DEBUG}/lib")
set(base_math_RES_DIRS_DEBUG "${base_PACKAGE_FOLDER_DEBUG}/res")
set(base_math_DEFINITIONS_DEBUG )
set(base_math_OBJECTS_DEBUG )
set(base_math_COMPILE_DEFINITIONS_DEBUG )
set(base_math_COMPILE_OPTIONS_C_DEBUG "")
set(base_math_COMPILE_OPTIONS_CXX_DEBUG "")
set(base_math_LIBS_DEBUG base-math-dbg)
set(base_math_SYSTEM_LIBS_DEBUG )
set(base_math_FRAMEWORK_DIRS_DEBUG "${base_PACKAGE_FOLDER_DEBUG}/Frameworks")
set(base_math_FRAMEWORKS_DEBUG )
set(base_math_DEPENDENCIES_DEBUG fmt::fmt)
set(base_math_LINKER_FLAGS_DEBUG
        $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:>
        $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,MODULE_LIBRARY>:>
        $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:>
)

Which is correct!

However as I introduce the layout() override to specify where my conan files should go (e.g. build/conan instead of .) :

  • uncomment the layout() function and set sources_folder="."

Then testing the created package fails becaue the base-debug-x86_64-data.cmake contains now:

########### COMPONENT math VARIABLES #############################################
set(base_math_INCLUDE_DIRS_DEBUG )
set(base_math_LIB_DIRS_DEBUG )
set(base_math_RES_DIRS_DEBUG )
set(base_math_DEFINITIONS_DEBUG )
set(base_math_OBJECTS_DEBUG )
set(base_math_COMPILE_DEFINITIONS_DEBUG )
set(base_math_COMPILE_OPTIONS_C_DEBUG "")
set(base_math_COMPILE_OPTIONS_CXX_DEBUG "")
set(base_math_LIBS_DEBUG base-math-dbg)
set(base_math_SYSTEM_LIBS_DEBUG )
set(base_math_FRAMEWORK_DIRS_DEBUG )
set(base_math_FRAMEWORKS_DEBUG )
set(base_math_DEPENDENCIES_DEBUG fmt::fmt)
set(base_math_LINKER_FLAGS_DEBUG
        $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:>
        $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,MODULE_LIBRARY>:>
        $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:>
)

which is somewhat wrong which reports as :

base/v1.1.1-9-g237fdd66df-dirty@demo/testing: Already installed!
base/v1.1.1-9-g237fdd66df-dirty@demo/testing (test package): Generator txt created conanbuildinfo.txt
base/v1.1.1-9-g237fdd66df-dirty@demo/testing (test package): Generator 'CMakeDeps' calling 'generate()'
base/v1.1.1-9-g237fdd66df-dirty@demo/testing (test package): Generator 'CMakeToolchain' calling 'generate()'
base/v1.1.1-9-g237fdd66df-dirty@demo/testing (test package): Aggregating env generators
base/v1.1.1-9-g237fdd66df-dirty@demo/testing (test package): Generated conaninfo.txt
base/v1.1.1-9-g237fdd66df-dirty@demo/testing (test package): Generated graphinfo
Using lockfile: '/workspaces/cmake-general/tests/project/tests/package/build/8a0f14e3d7eea6ad8888100be528c014879dab53/conan.lock'
Using cached profile from lockfile
base/v1.1.1-9-g237fdd66df-dirty@demo/testing (test package): Calling build()
-- Cmake-General: /workspaces/cmake-general
-- The C compiler identification is Clang 12.0.1
-- The CXX compiler identification is Clang 12.0.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Cmake-General: Compiler cache '/usr/bin/ccache' found and enabled.
-- Cmake-General: Downloading 'conan.cmake' from 'https://raw.githubusercontent.com/gabyx/cmake-conan/patch-1/conan.cmake'.
-- Conan: Component target declared 'base::math'
-- Conan: Component target declared 'base::io'
-- Conan: Target declared 'base::base'
CMake Error at build/8a0f14e3d7eea6ad8888100be528c014879dab53/cmakedeps_macros.cmake:4 (message):
  Library 'base-io-dbg' not found in package.  If 'base-io-dbg' is a system
  library, declare it with 'cpp_info.system_libs' property
Call Stack (most recent call first):
  build/8a0f14e3d7eea6ad8888100be528c014879dab53/cmakedeps_macros.cmake:48 (conan_message)
  build/8a0f14e3d7eea6ad8888100be528c014879dab53/base-Target-debug.cmake:21 (conan_package_library_targets)
  build/8a0f14e3d7eea6ad8888100be528c014879dab53/baseTargets.cmake:26 (include)
  build/8a0f14e3d7eea6ad8888100be528c014879dab53/base-config.cmake:11 (include)
  CMakeLists.txt:25 (find_package)

*Also the generated files in the tests/package test-folder are not inside test/8a0f14e3d7eea6ad8888100be528c014879dab53/conan (I guess thats how testing a package works, why is it so different?`:

image

Issue Analytics

  • State:closed
  • Created 2 years ago
  • Comments:16 (8 by maintainers)

github_iconTop GitHub Comments

2reactions
memshardedcommented, Nov 5, 2021

Also,

  • you are doing tc.variables["GENERAL_BUILD_LIBS"] = True after the generation. It should be defined before tc.generate()
  • self.build_requires("catch2/2.13.7") => self.build_requires("catch2/2.13.7", force_host_context=True). This is important if you are going to use the 2 profiles (which is recommended)
0reactions
gabyxcommented, Nov 8, 2021

Ah, thanks. Good explanation.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Conan Documentation - Conan Docs
Using packages in an application. 1. Write a conanfile.txt. This captures the project configuration: 2.2. Community-Created Format.
Read more >
Conan unable to execute UnitTest as a part of build process
I have included my conanfile.py and CMakeLists.txt in the question itself. from conans import ConanFile, CMake, tools from conan.tools.cmake ...
Read more >
conan Changelog - pyup.io
Fix: CMakeDeps now generates CMake variables as `XXX_INCLUDE_DIR` in the ... Fix: When using the new layout() feature of Conan 2.0, change the...
Read more >
81b90e0c62cda8b01c411c8687...
For subdirectory project() command Xcode projects we use the source directory containing ... but this is not reliable because the format can vary...
Read more >
Software Architecture with C++
Chapter 4, Architectural and System Design, is all about creating ... you're having a microservice architecture, a common mistake is to have ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found