我遇到一种情况,需要将柯南安装文件夹与导入根文件夹解耦。主要目标是拥有一个有效的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