2014-09-19 67 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

相關問題