Как ограничить распространяемые зависимости компонентов CMakePython

Программы на Python
Ответить
Anonymous
 Как ограничить распространяемые зависимости компонентов CMake

Сообщение Anonymous »

Я хотел бы оптимизировать свой проект CMake, который использует Conan в качестве инструмента управления зависимостями. Это исполняемый файл, который зависит от нескольких библиотек Конана. Однако возникла необходимость в совместном использовании некоторых заголовков и некоторых зависимостей, поэтому я разделил проект, в результате чего появились две новые цели в дополнение к уже существующей цели исполняемого файла.
Я хочу связать их цели/компоненты для различных других проектов, в зависимости от потребностей. Они оба имеют разные заголовки и ссылки. Дело в том, что я не могу заставить CMake или Conan соблюдать это различие, и я начал сомневаться, возможно ли это вообще.
Если быть точнее: я имею в виду это, связывая myproject::myLib в другом проекте, я не хочу включать другие библиотеки, например Boost, OpenSSL и MyOtherLib, которые связаны с myproject::iface с INTERFACE и косвенно в myExecutable (благодаря связыванию компонента iface). Возможно ли это?
Я использую GCC 14.2, CMake 3.26 и Conan 1.65.0.
CMakeLists.txt:

Код: Выделить всё

project(myProject)

// ...

// looking for dependencies installed by Conan
find_package(Boost CONFIG REQUIRED)
find_package(OpenSSL CONFIG REQUIRED)
find_package(MyOtherLib CONFIG REQUIRED)

// main executable target
add_executable(myExecutable
one.cpp
two.cpp
)

// new static library target
add_library(myLib STATIC)
target_sources(myLib
PRIVATE
lib/myLib/threeLib.cpp
PUBLIC
FILE_SET libHeaders
TYPE HEADERS
BASE_DIRS lib/myLib/include
FILES
lib/myLib/threeLib.h
target_link_libraries(myLib PRIVATE boost::boost)

// new header only component target
add_library(iface INTERFACE)
target_sources(iface
INTERFACE
FILE_SET ifaceHeaders
TYPE HEADERS
BASE_DIRS include
FILES
include/fourHeader.h
include/fiveHeader.h
target_link_libraries(iface
INTERFACE
boost::boost
openssl::openssl
myotherlib::myotherlib

// executable is using both of these libs/components
target_link_libraries(myExecutable
PRIVATE
iface
myLib
)
// ...
conanfile.py

Код: Выделить всё

# some imports
class myProject(ConanFile):
# some attributes and settings
# version numbers might be randomized
generators = "CMakeDeps", "CMakeToolchain"
requires = "boost/1.80.0", "openssl/3.3.5", "myotherlib/1.0@myremote/testing"

def layout(self):
cmake_layout(self)

def generate(self):
toolchain = CMakeToolchain(self)
toolchain.generate()
deps = CMakeDeps(self)
deps.generate()

def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
Я пробовал много вещей. Вначале у меня были проблемы с включением заголовков обоих компонентов, но мне удалось это исправить с помощью установки CMake:

Код: Выделить всё

install(
TARGETS iface
EXPORT ifaceTargets
FILE_SET ifaceHeaders
DESTINATION include)

install(
EXPORT ifaceTargets
FILE ifaceTargets.cmake
NAMESPACE myproject::
DESTINATION lib/cmake/iface)

install(
TARGETS myLib
EXPORT myLibTargets
FILE_SET myLibHeaders
DESTINATION myLib_include
ARCHIVE_DESTINATION lib)

install(
EXPORT myLibTargets
FILE myLibTargets.cmake
NAMESPACE myproject::
lib/cmake/mylib)
Однако проблема по-прежнему заключалась в том, что связывание myproject::myLib влияет на связывание всех других библиотек.
Я попытался добавить информацию о компоненте в раздел cpp_info файла Conan, надеясь, что, установив поле require, я смогу «переопределить» некоторые зависимости, сгенерированные по умолчанию:

Код: Выделить всё

def package(self):
cmake = CMake(self)
cmake.install()

def package_info(self):
self.cpp_info.components["myLib"].libs = ["myLib"]
self.cpp_info.components["myLib"].set_property("cmake_target_name", "myproject::myLib")
self.cpp_info.components["myLib"].includedirs = ["myLib_include"]
self.cpp_info.components["myLib"].requires = []

self.cpp_info.components["iface"].set_property("cmake_target_name", "myproject::iface")
self.cpp_info.components["iface"].includedirs = ["include"]
self.cpp_info.components["iface"].requires = ["boost::boost", "openssl::openssl", "myotherlib::myotherlib"]
Однако никакого эффекта. Связывание myproject::myLib по-прежнему связывает Boost и другие библиотеки, чего мне хотелось бы избежать без атомизации проекта.
Есть идеи, как я могу добиться такого разделения распространяемых ссылок , когда все цели/компоненты определены в одном проекте CMake и одном файле Conan? Возможно ли это вообще без разделения целей на отдельные проекты с помощью собственных файлов CMakeLists и Conan?

Подробнее здесь: https://stackoverflow.com/questions/792 ... pendencies
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»