3

いくつかのオブジェクト ファイルを 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

(興味がある場合は、ソース入力として C/C++ ファイルを受け入れることができる emscripten コンパイラを使用しています。JavaScript ファイルは本質的に「プリコンパイル済みオブジェクト」です。CMake にそれらを追加する方法を見つけたいです。arコマンドライン、それだけです! )

4

1 に答える 1

2

記録のために、これは私がハックな方法で問題を解決した方法です。「適切な」解決策は喜んで受け入れられます。

事前にコンパイルされた特別なオブジェクト「jso」の新しいファイル拡張子を作成し、それを CMake が理解する入力ファイルのリストに追加しました。

list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS jso)

次に、拡張子が「.jso」のオブジェクト ファイルを CMake ソースに追加して、静的ライブラリ ターゲットに含めます。

最後に、 を設定してコンパイラをハッキングしましたCC=myccmyccは、入力に拡張子「.jso」があるかどうかをチェックする Python スクリプトです。そうでない場合は、標準コンパイラを再呼び出しします。それ以外の場合は、入力をまったく変更せずに出力にコピーするため、これmycc -c input.jso -o output.jso.oは単なるファイルのコピーです。

これはきれいではありませんが、インクリメンタル ビルドのすべての依存関係を完全に取得します。きれいなふりをすることはできませんが、CMake が好きなように動作するようです。ここでは、実際には既にコンパイル済みであっても、すべての入力がソース ファイルであるかのように見せかけています。

于 2014-12-30T15:36:18.203 に答える