【问题标题】:CMake: Use variables from existing Makefile of 3rdparty libraryCMake:使用来自 3rdparty 库的现有 Makefile 的变量
【发布时间】:2021-08-06 13:06:34
【问题描述】:

我面临以下情况:

  • 使用cmake的现有项目
  • 仅随 Makefile 提供的外部 3rdparty 库

与现有问题相比,我的情况的不同之处在于我不需要 cmake 来通过 Makefile 构建 3rdparty 库。相反,3rdparty 库提供了一个 library.mk Makefile,其中包含 LIB_SRCS 和 LIB_INCS 等变量,其中包含编译库所需的所有源文件和头文件。

我的想法是将library.mk 包含在项目的CMakeLists.txt 中,然后将$(LIB_SRCS) 和$(LIB_INCS) 添加到target_sources()。

我的问题:如何将library.mk 包含到现有的CMakeLists.txt 中以访问$(LIB_SRCS) 和$(LIB_INCS) 以将它们添加到target_sources()?我正在寻找这样的东西:

include("/path/to/library.mk")   # Somehow include the library's `library.mk` to expose variables to cmake.

add_executable(my_app)

target_sources(
    my_app
    PRIVATE
        main.c
        $(LIB_SRCS)    # Add 3rd-party library source files
        $(LIB_INCS)    # Add 3rd-party library header files
)

使用 include() 不起作用,因为 library.mk 不是 CMake 列表/文件。

【问题讨论】:

  • "我的情况与现有问题的不同之处在于,我不需要 cmake 来通过 Makefile 构建 3rdparty 库。" -- 为什么不呢?这将导致您的程序使用库 as 库,这通常是库项目所期望的模式。干净多了。

标签: makefile cmake


【解决方案1】:

由于您无法确定您的目标系统是否会安装 Make,因此唯一的选择是从 .mk 文件中解析字符串,如果将变量直接设置为文件名,或者如果它们设置为其他变量、条件等的扩展,则非常困难。使用FILE(STRINGS) cmake doc 执行此操作。

你的计划只有在 Makefile 很简单的情况下才有效,并且不设置重要的编译器标志、定义预处理器变量、修改包含目录等。如果它们真的很简单,跳过解析,只做类似 @ 987654323@从库目录中收集所有源代码。

您还可以考虑为此第三方库构建和维护 CMakeLists.txt。进行一次转换,并将其存储为版本控制系统中“供应商”主分支的一个分支。每当您更新时,从上游更新供应商分支,并合并或重新调整您的修改。或者只是将其存储在您现有的项目中,参考 3rd-party 东西的源目录。

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多