2016-11-25 24 views
1

外部Cライブラリ用にFindXXX.cmakeスクリプトを書いています。スクリプトにライブラリのバージョンに関する情報を提供したいと思います。ただし、ライブラリはバージョン番号を文字列として返す関数の形式でしかこの情報を提供しません。CMakeでバイナリからライブラリのバージョンを抽出する

私はその場で次のCプログラムをコンパイルFindXXX.cmake持つことで、バージョン番号を抽出できると思っていた:

#include <stdio.h> 
#include "library.h" 

int main() { 
    char version[256]; 
    get_version(version); 
    puts(version); 
    return 0; 
} 

これが機能するためには、CMakeのは、設定時に上記のプログラムをコンパイルして実行する必要があり、バージョン識別子として印刷する情報を使用します。私は後者(execute_process)を行う方法を知っており、私はほとんどを行う方法を知っています:CheckCSourceRunsが気になりますが、私は生成された実行可能ファイルの標準出力をキャプチャする方法を知らない。

TL:DR:プログラムをコンパイルして実行し、生成時にCMakeからstdoutをキャプチャする方法はありますか?

答えて

2

あなたは(あなたのソースファイルがfoo_get_version.cとして指名されているものとする)その目的のためにtry_runを使用することがあります。

try_run(foo_run_result foo_compile_result 
     foo_try_run ${CMAKE_CURRENT_LIST_DIR}/foo_get_version.c 
     RUN_OUTPUT_VARIABLE foo_run_output) 

if(NOT foo_compile_result) 
    # ... Failed to compile 
endif() 
if(NOT foo_run_result EQUAL "0") 
    # ... Failed to run 
endif() 

# Now 'foo_run_output' variable contains output of your program. 

注意を、try_runが実行されていないことをクロスコンパイルするとき。代わりに、CMakeはユーザーがキャッシュ変数foo_run_resultfoo_run_result__TRYRUN_OUTPUTを設定することを期待しています。

+0

ありがとうございます!私はクロスコンパイルの最後のビットを得ていませんでした。詳しく教える? –

+1

クロスコンパイルすると*ライブラリーとリンクすることができますが、ライブラリーをロードすることはできません(*プログラムを実行する*)。これは*ホスト*プラットフォーム( 'cmake'を実行する場所)が*ターゲット*プラットフォーム(ライブラリがロードされることを意図しているプラ​​ットフォーム)と異なるためです。その場合は、ライブラリのバージョンを取得するための他の方法が必要です。たとえば、* target *マシンでプログラムを実行し、その実行に応じて特定のCMakeキャッシュ変数を設定するようにユーザーに依頼することができます。 – Tsyvarev

関連する問題