Я сталкиваюсь с ситуацией, когда мне нужно отделить папку установки conan от корневой папки импорта. Основная цель - создать работающее решение для работы с открытыми папками в Visual Studio, когда я хочу иметь возможность тестировать мои двоичные файлы, выполняя тесты conan test Mylibrary/0.1@user/testing
Мой пример пакета состоит из четырех папок: src, который содержит исходники, примеры, которые создают исполняемый файл test_package, который проверяет, правильно ли пакет связывается, и тесты, которые содержат некоторые тесты для пакета.
root
|_ src
|_ examples
|_ test_package
|_ tests
|_ conanfile.py
|_ CMakeLists.txt
Когда я хочу разработать пакет, я использую функциональность открытой папки Visual Studio в корневой папке. Поскольку я хочу получить последние изменения при запуске моих примеров и тестов в Visual Studio, я установил для CMAKE_RUNTIME_OUTPUT_DIRECTORY значение $ {CMAKE_BINARY_DIR} / bin в моем CMakeSettings.json (ну, я также могу установить это в основном CMakeLists.txt). ). Теперь внутри папки test находится мой файл conanfile.py, который копирует gtest.dll в корневую папку bin.
Тесты / conanfile.py
def imports(self):
self.copy("*.dll", dst="../bin", src="bin")
Чтобы conan_cmake_run не менял выходные каталоги, я использую флаг NO_OUTPUT_DIRS внутри tests / CMakeLists.txt.
conan_cmake_run(CONANFILE conanfile.py
BASIC_SETUP CMAKE_TARGETS NO_OUTPUT_DIRS)
Однако, используя эту настройку, когда я вызываю тесты conan MyLibrary/0.1@user/testing, двоичные файлы gtest копируются за пределы папки сборки ...
Что я сделал, так это скопировал dll в текущей папке.
Тесты / conanfile.py
def imports(self):
self.copy("*.dll", dst="../bin", src="bin")
self.copy("*.dll", dst="", src="bin")
Это уродливое решение этой проблемы, потому что копии dll дважды. Также я попытался установить для INSTALL_FOLDER значение $ {CMAKE_BINARY_DIR}, но затем conan.cmake жалуется (ln 388), что conanbuildinfo не существует в $ {CMAKE_CURRENT_BINARY_DIR}. Есть какое-нибудь элегантное решение для этого? Я что-то упустил?
CMakeLists.txt
# Main ExternalDevicesLibrary Library
cmake_minimum_required(VERSION 3.12)
project(ExternalDevicesLibrary LANGUAGES CXX)
# add project code
add_subdirectory(src)
# add example code
add_subdirectory(examples)
# add unit tests
enable_testing()
add_subdirectory(tests)
Тесты / CMakeLists.txt
# ExternalDevices Tests
cmake_minimum_required(VERSION 3.12)
project(ExternalDevicesTests LANGUAGES CXX)
include(${CMAKE_CURRENT_SOURCE_DIR}/../conan.cmake)
# Make sure to use conanfile.py to define dependencies, to stay consistent
conan_cmake_run(CONANFILE conanfile.py
BASIC_SETUP CMAKE_TARGETS NO_OUTPUT_DIRS)
# dependencies
enable_testing()
find_package(GTest MODULE REQUIRED)
if(NOT TARGET LLTB::ExternalDevices) # if not part of the project find the installed library
find_package(ExternalDevices CONFIG REQUIRED)
endif()
# target definitions
add_executable(ExternalDevicesTests ExternalDevices_tests.cpp)
target_link_libraries(ExternalDevicesTests
PRIVATE
LLTB::ExternalDevices
GTest::Main
)
add_test(NAME ExternalDevices.UnitTests
COMMAND ExternalDevicesTests
)
Тесты / conanfile.py
import os
from conans import ConanFile, CMake
class ExternaldevicesTests(ConanFile):
settings = "os", "compiler", "build_type", "arch"
generators = "cmake"
requires = (
"gtest/1.8.1@bincrafters/stable"
)
default_options = (
"*:shared=True",
"gtest:build_gmock=False"
)
def build(self):
cmake = CMake(self, generator='Ninja')
# Current dir is "tests/build/<build_id>" and CMakeLists.txt is
# in "tests"
cmake.configure()
cmake.build()
def imports(self):
self.copy("*.dll", dst="../bin", src="bin")
self.copy("*.dll", dst="", src="bin")
def test(self):
cmake = CMake(self)
self.run("ctest -VV -C %s" % cmake.build_type)
Ожидается, что в обоих случаях мои библиотеки будут находиться в папке $ {CMAKE_BINARY / DIR} / bin.
В качестве приемлемого решения я вижу следующее: импорт будет содержать только одну строку
Тесты / conanfile.py
def imports(self):
self.copy("*.dll", dst="bin", src="bin")
тогда я смогу вызвать conan_cmake_run с аргументом IMPORT_FOLDER. например, * 1 037 *
Тесты / CMakeLists.txt
conan_cmake_run(CONANFILE conanfile.py
BASIC_SETUP NO_OUTPUT_DIRS
IMPORT_FOLDER ${CMAKE_BINARY_DIR})
Однако функциональность папки импорта отсутствует, и мне нужно найти способ смоделировать это поведение с помощью cmake.
PS # 1. Я знаю, что могу использовать gtest в качестве статической библиотеки, но не хочу. Это пример подтверждения концепции, что я могу интегрировать cmake conan и открытую папку VS без проблем со стандартным рабочим процессом conan.
PS # 2. Полный код можно скачать через: git clone https://jason5480@bitbucket.org/jason5480/externaldevices.git