根据生成构建文件时不可用的源文件在 CMake 中创建库

2023-12-02

我有一个构建两个库的 CMake 配置文件:

  1. 第三方库(此处称为 ThirdPartyLib),包含来自供应商的实时操作系统/主板支持包。它是使用 autotools 工具链在 CMake 外部构建的。
  2. 前一个库的扩展版本(此处称为 ExtendedThirdPartyLib)

不幸的是,我需要的一些源代码(各种工具)不是在(1)的普通构建脚本中构建的。因为我不想弄乱供应商构建脚本,所以我想添加另一个库 (2),构建丢失的文件,从而从供应商扩展库。

我希望能够做这样的事情CMakeFiles.txt:

cmake_minimum_required(VERSION 3.2)
project(bsp)
include(ExternalProject)

ExternalProject_Add(
  ThirdPartyLib
  URL <http://some.url/bsp.tar.bz2
  BUILD_COMMAND make -C ../external/ThirdPartyLib/src
)
set_target_properties(ThirdPartyLib PROPERTIES EXCLUDE_FROM_ALL TRUE)

add_library(ExtendedThirdPartyLib
  ${CMAKE_CURRENT_BINARY_DIR}/some/path/missing_file1.c
  ${CMAKE_CURRENT_BINARY_DIR}/some/path/missing_file2.c
)
add_dependencies(ExtendedThirdPartyLib ThirdPartyLib)
target_include_directories(ExtendedThirdPartyLib PUBLIC
  ${CMAKE_CURRENT_BINARY_DIR}/some/path/include
)
target_link_libraries(ExtendedThirdPartyLib ThirdPartyLib)

这里的问题是路径missing_file1.c and missing_file2.c当 CMake 生成构建文件时无效(它们是从供应商的 tarball 中提取的)。 CMake 退出并显示错误输出:“找不到源文件”。

有没有一种巧妙的方法来完成这项工作?IE。是否可以让 CMake 相信在开始构建库时某些不存在的输入文件将存在?或者有其他推荐的方法来解决这个问题吗?

(我已经临时制作了需要从供应商 tarball 构建的文件的本地副本,但这当然不是一个好的解决方案。如果这些文件在供应商包的未来版本中发生更改并且我忘记覆盖我的本地副本可能会是一个可怕的混乱......

另一个“解决方案”是在 CMake 之外创建一个小的 makefile 并使用另一个ExternalProject_Add以某种方式在 CMakeFiles.txt 中。但这也不是一个好的解决方案,例如如果编译和链接器标志被修改,我也需要记住更改 makefile。)


就我个人而言,我不喜欢ExternalProject_Add命令,因为它做了太多不合我口味的事情,但我已经离题了。

如果你做这样的事情怎么办?bar正在模拟你的ExtendedThirdPartyLib目标,因为它取决于生成的文件

cmake_minimum_required(VERSION 3.11)

project(lol C)

set(SOURCES lol.c) # only this file exists

add_library(lol ${SOURCES})

set(FOO_FILES "foo1.c" "foo2.c")

add_custom_command(OUTPUT ${FOO_FILES}
  COMMAND ${CMAKE_COMMAND} -E touch ${FOO_FILES}
  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
  COMMENT "Creating ${FOO_FILES}"
  VERBATIM)

add_custom_target(foo DEPENDS ${FOO_FILES})

add_library(bar ${FOO_FILES})

add_dependencies(bar foo)

target_link_libraries(lol bar)

整个方法取决于这样一个事实:获取生成/生成的文件的方法是通过自定义命令和关联的自定义目标显式定义的。

您应该修改自定义命令以从 tarball 中提取所需的文件(例如甚至可以调用一些外部脚本)(这可能需要使用curl或类似的东西下载)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据生成构建文件时不可用的源文件在 CMake 中创建库 的相关文章

随机推荐