2014-09-19 47 views
2

我想添加一些目标文件到CMake静态库,但他们有一个自定义扩展。如何将具有自定义扩展名的对象添加到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命令行中,就这些了!)

+0

你解决了这个问题吗?我正在寻找一个解决方案,我真的很感兴趣 – GameDeveloper 2014-12-28 00:59:14

+1

@DarioOO我已经汇总了一下我在下面做了什么;希望这应该有所帮助。 – 2015-01-07 07:51:28

回答

1

为了记录,这就是我如何以一种冒险的方式解决我的问题:”正确的“解决方案很乐意接受。

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

list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS jso) 

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

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

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

+0

uao不错!真正有趣的黑客!谢谢。我需要它为emscripten – GameDeveloper 2015-01-07 15:09:42

+1

我已经提出了一个emscripten的拉请求,使这种情况自动发生 - 但拉请求正在等待我添加一些测试它才可以被接受。如果你想融入并帮助你,那可能对你更有用!或者至少你应该在我的分支中合并。 https://github.com/kripken/emscripten/pull/2809 – 2015-01-07 15:38:36

相关问题