Я хочу связать их цели/компоненты для различных других проектов, в зависимости от потребностей. Они оба имеют разные заголовки и ссылки. Дело в том, что я не могу заставить 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
)
// ...
Код: Выделить всё
# 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()
Код: Выделить всё
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)
Я попытался добавить информацию о компоненте в раздел 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"]
Есть идеи, как я могу добиться такого разделения распространяемых ссылок , когда все цели/компоненты определены в одном проекте CMake и одном файле Conan? Возможно ли это вообще без разделения целей на отдельные проекты с помощью собственных файлов CMakeLists и Conan?
Подробнее здесь: https://stackoverflow.com/questions/792 ... pendencies
Мобильная версия