2

我遇到了需要将柯南安装文件夹与导入根文件夹分离的情况。主要目标是在我希望能够测试运行 conan test tests Mylibrary/0.1@user/testing 的二进制文件时,拥有一个有效的 Visual Studio 打开文件夹解决方案

我的示例包由四个文件夹组成,src 包含源代码,生成可执行文件的示例 test_package 测试包是否正确链接,以及包含包的一些 gtest 的测试。

root
  |_ src
  |_ examples
  |_ test_package
  |_ tests
       |_ conanfile.py
       |_ CMakeLists.txt

当我想开发包时,我在根文件夹中使用 Visual Studio 的打开文件夹功能。因为我想在 Visual Studio 中运行示例和测试时获得最新的更改,所以我在 CMakeSettings.json 中将 CMAKE_RUNTIME_OUTPUT_DIRECTORY 设置为指向 ${CMAKE_BINARY_DIR}/bin (我也可以在主 CMakeLists.txt 中设置它) )。现在在测试文件夹中驻留我的 conanfile.py,它将 gtest.dll 复制到根 bin 文件夹。

测试/conanfile.py

def imports(self):
        self.copy("*.dll", dst="../bin", src="bin")

为了防止 conan_cmake_run 更改输出目录,我在 tests/CMakeLists.txt 中使用 NO_OUTPUT_DIRS 标志。

conan_cmake_run(CONANFILE conanfile.py
                BASIC_SETUP CMAKE_TARGETS NO_OUTPUT_DIRS)

但是,当我调用 conan test tests 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)${CMAKE_CURRENT_BINARY_DIR} 中不存在 conanbuildinfo。有什么优雅的解决方案吗?我错过了什么吗?

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)

在这两种情况下,预期的行为都是将我的 dll 放在 ${CMAKE_BINARY/DIR}/bin 文件夹中。

我认为可接受的解决方案如下:导入将仅包含一行

测试/conanfile.py

def imports(self):
        self.copy("*.dll", dst="bin", src="bin")

那么我应该能够使用 IMPORT_FOLDER 参数调用 conan_cmake_run 。例如

测试/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

4

0 回答 0