通过conan_cmake_run调用时,更改工作目录以导入柯南导入命令

时间:2019-03-30 22:21:14

标签: c++ cmake binary conan visual-studio-2017-build-tools

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

的情况下测试我的二进制文件

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

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

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

tests / 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)

但是,当我调用柯南测试测试MyLibrary/0.1@user/testing gtest二进制文件时,使用此设置复制到build文件夹之外... 我所做的是将dll复制到当前文件夹中。

tests / 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抱怨(第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)

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
)

tests / 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文件夹中。

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

tests / conanfile.py

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

然后,我应该能够使用IMPORT_FOLDER参数调用conan_cmake_run。例如

tests / 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 open文件夹集成在一起,而不会给标准的conan工作流程造成问题。

PS#2。完整的代码可以通过以下方式下载:git clone https://jason5480@bitbucket.org/jason5480/externaldevices.git

0 个答案:

没有答案