Изменить рабочий каталог для команды импорта conan при вызове через conan_cmake_run - PullRequest
0 голосов
/ 31 марта 2019

Я сталкиваюсь с ситуацией, когда мне нужно отделить папку установки 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...