conan create не может найти зависимости - PullRequest
0 голосов
/ 10 июля 2019

У меня есть проект, который использует conanfile.py для управления своими зависимостями и предоставления рецепта для собственного пакета:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Conan file for KVTest, a library used to support the development of tests.

To install dependencies view https://docs.conan.io/en/latest/howtos/vs2017_cmake.html
"""

from conans import ConanFile, CMake


class KVTestConan(ConanFile):
    name = "kvtest"
    version = "0.1.0.0"
    description = "Kiwi Test Support library"
    topics = ("kv", "kvtest", "C++")
    settings = "os", "arch", "compiler", "build_type"
    options = {"shared": [True, False]}
    default_options = {"shared": False}
    generators = "cmake_find_package"
    exports_sources = ["src/*", "include/*", "cmake/*", "CMakeLists.txt", "Config.hpp.in"]

    def requirements(self):
        self.requires("gtest/1.8.1@bincrafters/stable")
        self.requires("boost/1.70.0@conan/stable")

    def build(self):
        cmake = CMake(self)
        # Let's skip tests since the final package doesn't need them
        cmake.configure(build_folder="build/")
        cmake.build()

    def package(self):
        self.copy("*.h", dst="include", src="src")
        self.copy("*.lib", dst="lib", keep_path=False)
        self.copy("*.dll", dst="bin", keep_path=False)

    def package_info(self):
        self.cpp_info.libs = ["kvtest"]

В процессе разработки я перехожу в каталог проекта и выполняю conan install . kvtest/0.1.0.0@kiwi/testing -if="<path to Visual studio build folder>, все зависимости установлены и проект успешно компилируется в Visual Studio.

Моя проблема в том, что когда я пытаюсь создать пакет для этого проекта, он не может найти его зависимости. Мой CMakeLists.txt имеет все необходимые find_package() звонки:

list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR})
find_package(gtest REQUIRED)
find_package(boost REQUIRED)

Но когда я пытаюсь создать пакет, он не может найти никаких зависимостей:

kvtest/0.1.0.0@kiwi/testing: Calling build()
-- The CXX compiler identification is MSVC 19.16.27032.1
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- clang-format found: C:/Program Files/LLVM/bin/clang-format.exe
-- Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
-- Boost version: 1.70.0
-- Configuring done
CMake Error at src/CMakeLists.txt:50 (add_library):
  Target "kvtest" links to target "gtest::gtest" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?


CMake Error at src/CMakeLists.txt:50 (add_library):
  Target "kvtest" links to target "boost::boost" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?

Я использую это в других пакетах, поэтому затрудняюсь понять, что вызывает это сейчас.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Так что это вызвано тем, что я использую сборки из исходного кода на CMake.

Все мои корневые CMakeLists.txt (у меня есть несколько проектов) имеют следующие строки:

if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
  message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt.")
endif (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})

, что означает, что в каталоге сборки мне нужно: 1) создать папку сборки, а затем 2) скопировать в нее все файлы Find * .cmake:

path = os.path.normpath(self.source_folder)
build = os.path.join(path, "build/")
os.mkdir(build)
with os.scandir(path) as entries:
    for entry in entries:
        if entry.is_file() and fnmatch.fnmatch(entry.name, "Find*.cmake"):
            shutil.copy2(entry.path, build)

После этого сборка завершится правильно.

0 голосов
/ 10 июля 2019

Генератор cmake_find_package не является заменой оригинальной FindGTest.cmake, предоставленной автором. Прочитайте ссылки ниже.

Вы пытаетесь использовать определенные переменные, предоставленные автором, например GTEST_MAIN_LIBRARY, которые недоступны в генераторе cmake_find_package, они не будут работать.

Наилучшие генераторы, которые вы можете использовать для своего дела, это cmake_find_package для Boost и cmake_paths для GTest. Пакет GTest Conan содержит оригинальные файлы FindGTest и FindGMock, которые позволяют вам найти то, что вы хотите. Конечно, вам нужно изменить имя модуля с find_package(gtest) на find_package(GTest) в вашем файле cmake.

Ошибка CMake в файле src / CMakeLists.txt: 50 (add_library): Целевой "kvtest" ссылки на целевой "boost :: boost", но цель не была найденный. Возможно, отсутствует вызов find_package () для цели IMPORTED, или отсутствует цель ALIAS?

Похоже, что ваш CMAKE_MODULE_PATH не в порядке, иначе Boost будет найден без проблем.

Если вы хотите узнать больше о генераторах CMake, вы можете прочитать в блоге сообщение о прозрачной интеграции cmake .

Подробнее о cmake_find_package можно прочитать .

...