makefile - CMake:使用来自 3rdparty 库的现有 Makefile 的变量
问题描述
我面临以下情况:
- 现有项目使用
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 列表/文件。
解决方案
由于您无法确定您的目标系统是否会安装 Make,因此唯一的选择是从 .mk 文件中解析字符串,如果将变量直接设置为文件名列表,这可能会很容易,或者如果它们被设置为其他变量、条件等的扩展,真的很难。用FILE(STRINGS)
cmake doc做到这一点。
你的计划只有在 Makefile 很简单并且不设置重要的编译器标志、定义预处理器变量、修改包含目录等的情况下才有效。如果它们真的很简单,跳过解析,只是做一些类似aux_source_directory(<dir> <variable>)
收集所有来自库目录的来源。
您还可以考虑为此第三方库构建和维护 CMakeLists.txt。进行一次转换,并将其存储为版本控制系统中“供应商”主分支的一个分支。每当您更新时,从上游更新供应商分支,并合并或重新调整您的修改。或者只是将其存储在您现有的项目中,参考 3rd-party 东西的源目录。
推荐阅读
- java - Android 在屏幕上动态更改距离 - 现在仅在方向更改时更改
- ansible - 使用 when 模块执行 ansible playbook
- webots - 在 Webots 中的实体节点上应用用户定义的力
- laravel - Laravel,为什么找不到我的定义路由错误 404?
- applescript - Applescript - 无法访问对象内的变量,具体取决于应用程序
- java - PrintClassHistogramAfterFullGC/PrintClassHistogramBeforeFullGC后如何分离GC日志和Histo?
- c++ - C++ 中的有理零定理
- arduino - 以编程方式与 IVR 交互
- c++ - 为什么使用 read 函数从文件中读取字符串既可以使用 & 也可以不使用它?
- javascript - 将键值和增量值添加到对象数组