The easiest way to get dependency path is:
from conans import ConanFile # for type hinting
# conan create
boost: ConanFile = self.dependencies.build["boost"]
boost.package_folder
but it will not work always:
# conan build (hacky)
self.deps_cpp_info["boost"].build_paths[0]
- it might not be available in all steps (I did not check in detail)
The most reliable way to get this information is actually to read if from conanbuildinfo.txt - this file is created during install step, you can use different generators, like -g json to use it in different formats.
You can read this file using conan api:
from conans.client.generators import TXTGenerator
with open("conanbuildinfo.txt", "r") as handle:
contents = handle.read()
deps_cpp_info, deps_user_info, deps_env_info, user_info_build = TXTGenerator.loads(contents)
And the last way that I found in my code (this can be simplified, but that is what I can provide for now):
import sys
import conans.errorsc
import conans.cli.exit_codes
from conans import ConanFile
from conans.client.cache.cache import ClientCache
from conans.client.conan_api import Conan
from conans.model.ref import PackageReference
from conans.paths.package_layouts.package_editable_layout import PackageEditableLayout
try:
conan_api, _, _ = Conan.factory()
except conans.errors.ConanMigrationError:
sys.exit(conans.cli.exit_codes.ERROR_MIGRATION)
except conans.errors.ConanException as error:
sys.exit(conans.cli.exit_codes.ERROR_GENERAL)
def _discover_package_path(dependency_name: str) -> str:
"""Returns a package folder in local conan cache for specified dependency.
Function is similar to:
> conan info conanfile.py --paths --only package_folder
This implementation is based on _grab_info_data (Conan version 1.55.0-dev):
>>> from conans.client.conan_command_output import CommandOutputer
>>> CommandOutputer._grab_info_data
"""
data, _ = conan_api.info(reference_or_path="conanfile.py")
node = next(node for node in data.nodes if node.name == dependency_name)
cache = ClientCache(conan_api.cache_folder, conan_api.out)
layout = cache.package_layout(node.ref, node.conanfile.short_paths)
if isinstance(layout, PackageEditableLayout):
return node.conanfile.package_folder
else:
return layout.package(PackageReference(node.ref, node.package_id))
# _discover_package_path("cmake")
class MyDummy(ConanFile):
name = "MyDummy"
version = "0.0.1"
requires = "boost/1.71.0"
def build(self):
print(80 * "#")
print(_discover_package_path("boost"))
print(80 * "#")
-DWITH_BOOST=boost_dependency_pathmagically to the cmake configuration of a sourced project it does know anything about?