build - 如何将具有自定义扩展名的对象添加到 cmake 库?

标签 build cmake emscripten unix-ar

我想将一些目标文件添加到 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 命令行,仅此而已!)

最佳答案

郑重声明,这就是我以一种怪异的方式解决我的问题的方式:“适当的”解决方案将很乐意被接受。

我为我的特殊预编译对象创建了一个新的文件扩展名“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 喜欢的方式做事似乎可行。在这里,我们只是假装所有输入都是源文件,即使它们实际上已经编译过了。

关于build - 如何将具有自定义扩展名的对象添加到 cmake 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25935811/

相关文章:

javascript - WebAssembly <-> JavaScript 内存交互如何与多个类型化数组一起工作?

git - TFS Git 项目中的依赖项目 VNEXT 构建

javascript - WebAssembly/脚本 : write files to disk from within browser

java - 如果激活多个配置文件,如何解决冲突的属性

cmake - CMakeLists.txt中应该在哪里调用find_package?

cmake - CPack:如何使用导出来创建库包?缺少 *Targets-noconfig.cmake 文件

python - 融合 API 和 CMake 构建

python - 将 C 代码转换为 Web Assembly 时出错

c++ - CMake:从 ExternalProject 链接共享 C++ 对象生成具有相对路径而非绝对路径的二进制文件

使用 cmd 和 pkg 布局去构建项目 - 构建错误