2017-11-10 18 views
2

複数の.aファイルを1つのファイルにマージするためのcmakeカスタムターゲットを作成しようとしています。私が多くのサードパーティのライブラリを持っているので(私は複雑な環境、コナン、cmakeなど...)、私はOBJECTS libモードを使うことができないことに注意してください。CMake COMMANDシェルパラメータの置換に失敗する

だから私は

add_custom_target(combineall 
    COMMAND echo "extract all .o files from all lib*.a file in the static folder" 
    COMMAND for f in *.a ; do ar -x $f ; done 
    COMMAND echo "merge all .o files in the static folder" 
    COMMAND for f in *.o ; do ar -rs ${CMAKE_BINARY_DIR}/libmerged.a $f ; done 
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/static 
    DEPENDS MyLib 
    ) 

次に書いたが、cmakeのはcombineallカスタムターゲットを実行すると、私は次のようなエラーメッセージが出ます:私はそれが$fから来ているとし

extract all .o files from all lib*.a file in the static folder /bin/sh: -c: line 1: syntax error: unexpected end of file

を。私はcmake for_each構文を使用して、完全に異なるcmakeスクリプトを.aファイルに繰り返し書き込むことができることを知っていますが、ここでの目標はありません!

よろしく、 アレックス

+0

それはそうのように、文字列の中にあなたのシェル変数を展開する方が良いでしょう: '*の.AでFのために。 ar -x "$ f"を実行します。完了しました。それが 'cmake'の文脈で何か変わるかどうかは分かりませんが、試してみることができます。 – Nepho

+0

こんにちは@Nepho私はすでに試してみますが、同じ方法で失敗します。 – alexbuisson

答えて

2

あなたはバックスラッシュエスケープするためにあなたのセミコロンを持っている、と$あなたの$を-escape。 CMakeはそれらをコマンドから削除しているので、bashはfor f in *.a do ar -x doneと表示されています。これはあなたが見ているエラーで失敗します。

だからあなたの目標は次のようになります。

add_custom_target(combineall 
    COMMAND echo "extract all .o files from all lib*.a file in the static folder" 
    COMMAND for f in *.a \; do ar -x $$f \; done 
    COMMAND echo "merge all .o files in the static folder" 
    COMMAND for f in *.o \; do ar -rs ${CMAKE_BINARY_DIR}/libmerged.a $$f \; done 
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/static 
    DEPENDS MyLib 
    ) 
+0

別のオプションは、スクリプトをファイルに入れて、CMakeからスクリプトファイルを呼び出すことです。 – legalize

関連する問題