【问题标题】:How do I add objects with a custom extension to a cmake library?如何将具有自定义扩展名的对象添加到 cmake 库?
【发布时间】:2014-09-19 14:03:09
【问题描述】:

我想将一些目标文件添加到 CMake 静态库中,但它们具有自定义扩展名。

这是我尝试过的:

set(SRCS testfile.cxx jsobj.js)
add_library(testlib STATIC ${SRCS})

创建后,CMake 调用ar testfile.cxx.o(即完全忽略其他文件)。如何将其包含在存档中?以下是我尝试过的其他一些技巧:

list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS js)
list(APPEND CMAKE_C_SOURCE_FILE_EXTENSIONS js) # no luck

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/jsobj.js.o
                   COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/jsobj.js
                                                    ${CMAKE_CURRENT_BINARY_DIR}/jsobj.js.o
                   DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/jsobj.js.o) # still no luck

(如果您有兴趣,我正在使用 emscripten 编译器,它可以接受 C/C++ 文件作为源输入,而 JavaScript 文件本质上是“预编译对象”。我想找到一种方法让 CMake将它们添加到ar 命令行,仅此而已!)

【问题讨论】:

  • 你解决了这个问题吗?我正在寻找我真正感兴趣的解决方案
  • @DarioOO 我已经汇总了我在下面所做的事情的指示;希望这会有所帮助。

标签: build cmake emscripten unix-ar


【解决方案1】:

为了记录,这就是我以一种老套的方式解决我的问题的方法:“适当的”解决方案会很高兴地被接受。

我为我的特殊预编译对象创建了一个新的文件扩展名“jso”,然后将其添加到 CMake 理解的输入文件列表中:

list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS jso)

然后,我将扩展名为“.jso”的目标文件添加到 CMake 源中,以包含在静态库目标中。

最后,我通过设置CC=mycc 破解了编译器,其中mycc 是一个Python 脚本,它检查输入是否具有扩展名“.jso”:如果没有,它只是重新调用标准编译器;否则它将输入复制到输出而不做任何更改,因此mycc -c input.jso -o output.jso.o 只是一个文件副本。

这并不漂亮,但它为增量构建完美地拾取了所有依赖项。我不能假装它很漂亮,但是按照 CMake 喜欢的方式做事似乎很有效。在这里,我们只是假设所有输入都是源文件,即使它们实际上已经编译。

【讨论】:

  • uao 不错!真的很有趣的黑客!感谢您。我需要它来做 emscripten
  • 我已经为 emscripten 提出了一个拉取请求,以使其自动发生 - 但拉取请求正在等待我添加一些测试才能被接受。如果您想参与并提供帮助,那可能对您更有用!或者至少你应该合并到我的分支中。 github.com/kripken/emscripten/pull/2809
  • 我想知道为什么不简单地设置CMAKE_<LANG>_SOURCE_FILE_EXTENSIONS 工作?看起来它只是被忽略了。
猜你喜欢
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2016-06-26
  • 1970-01-01
相关资源
最近更新 更多