【问题标题】:A NuGet-aware find_package for CMake用于 CMake 的 NuGet 感知 find_package
【发布时间】:2015-11-08 08:10:33
【问题描述】:

我正在使用 CMake 构建一个跨平台库,该库具有一些(非常常见的)依赖项(例如 PCRE)。这些依赖项可通过通常的包管理器(Ubuntu/Debian 上的 APT,OSX 上的 Homebrew)以及 Windows 上的 NuGet 获得。在我的CMakeLists.txt 中,我使用find_package 的“模块”版本来定位这些依赖项并设置正确的包含/库标志。

This question 提供了一种集成 CMake + NuGet 的方法,但也暗示 CMake 和 NuGet 不太可能一起玩得很好,我似乎找不到方法让find_package 找到已安装的依赖项。有什么方法可以让 CMake 读取 NuGet 配置文件(就像 pkg_check_modules 在具有 pkg-config 的系统上工作的方式一样)并从那里填充适当的 CMake 变量?还是我必须在FindPCRE.cmake 中手动推出自己的解决方案?

【问题讨论】:

  • 您是否尝试将 NuGet 安装路径添加到 CMAKE_PREFIX_PATH?
  • 我不确定 CMAKE_PREFIX_PATH 是否足够,因为看起来目录层次结构有点……疯狂。
  • 是的,毛茸茸的。我尝试了它,但找不到魔法咒语。
  • 问题是没有统一的约定如何用NuGet打包原生库。因此,每个包都有一个独特的布局,您必须手动考虑这一点。我有一个脚本,它根据各个包设置 CMAKE_LIBRARY_PATH 和 CMAKE_PREFIX_PATH... :-( 我正在研究具有统一布局约定的 vcpkg。

标签: windows cmake nuget


【解决方案1】:

作为一种(有点肮脏的)解决方法,我依赖nuget cli 工具的存在和使用

find_program(NUGET nuget)
if(NOT NUGET)
  message(FATAL "Cannot find nuget command line tool.\nInstall it with e.g. choco install nuget.commandline")
else()
  execute_process(COMMAND ${NUGET} install foolib)
endif()

【讨论】:

    【解决方案2】:

    从 CMake 3.15 开始,CMake 现在支持使用 VS_PACKAGE_REFERENCES 引用 Nuget 包,无需 Nuget CLI 或硬编码引用路径。要将 Nuget 包引用添加到 CMake 目标,我们可以使用语法 <package-name>_<package-version>。下面是 Nuget 日志记录包Serilog 2.9.0 版的一个简单示例:

    set_property(TARGET MyLibrary
        PROPERTY VS_PACKAGE_REFERENCES "Serilog_2.9.0"
    )
    

    链接的文档显示了如何通过分号分隔 ; 包参数来添加 多个 Nuget 包。

    【讨论】:

    • 这是否仅在您使用 VS 生成器时才有效?说它不适用于忍者?
    • @Dr.PolarHumenn 考虑到文档说包引用将被添加到生成的 Visual Studio 项目中,我认为它不适用于 Ninja。但是,我还没有测试过,所以我不能肯定地说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2016-02-02
    相关资源
    最近更新 更多