首页 > 解决方案 > CMake:使用来自 3rdparty 库的现有 Makefile 的变量

问题描述

我面临以下情况:

与现有问题相比,我的情况的不同之处在于我不需要 cmake 来通过 Makefile 构建 3rdparty 库。相反,3rdparty 库提供了一个library.mkMakefile,其中包含编译库所需的所有源文件和头文件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 列表/文件。

标签: makefilecmake

解决方案


由于您无法确定您的目标系统是否会安装 Make,因此唯一的选择是从 .mk 文件中解析字符串,如果将变量直接设置为文件名列表,这可能会很容易,或者如果它们被设置为其他变量、条件等的扩展,真的很难。用FILE(STRINGS) cmake doc做到这一点。

你的计划只有在 Makefile 很简单并且不设置重要的编译器标志、定义预处理器变量、修改包含目录等的情况下才有效。如果它们真的很简单,跳过解析,只是做一些类似aux_source_directory(<dir> <variable>)收集所有来自库目录的来源。

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


推荐阅读