我遇到了需要将柯南安装文件夹与导入根文件夹分离的情况。主要目标是在我希望能够测试运行 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