2016-08-16 5 views
1

私はcmake(3.1)を使用していますが、find_package()関数に渡されたバージョン文字列を別のfind_package()関数が使用する特別なフォーマットのバージョン文字列に変換しようとしています。特に、私はあなたがまだ推測していない場合、これはBoost_VERSIONを必要とするFindBoost.cmakeためである(cmake formatted string出力

"105700" 

のように見えるものに

"1.57.0" 

のように見える何かを変換しようとしています「105700」の形式)。

私はちょうど私がcmakeの中でこれを行う方法は考えていることを実現しています。固定フィールド幅と先行ゼロでフォーマットされた出力を行うコマンド/マクロ展開/関数はないようですね。 printfの%d%03d%02dのようになります。それとも?

更新:私はバージョン番号をバングしました。これを反映するように更新されました。

アップデート2:それはFindBoost.cmake内のロジックは、私がここに述べられてきたものよりも、より微妙な理由で私のために失敗しているバージョンのように見えます。

@Torbjörnと@Antonioが指摘しているように、Boost_VERSIONは、入力として機能する自動的に構築された変数ではなく、FindBoost.cmakeのOUTPUT変数です。むしろ、find_package(Boost 1.57.0)は自動的Boost_FIND_VERSIONと呼ばれる変数、Boost_FIND_VERSION_MAJORBoost_FIND_VERSION_MINORBoost_FIND_VERSION_PATCH、およびBoost_FIND_VERSION_TWEAKを作成します。 FindBoost.cmakeはそれからBoost_VERSIONを構成し、ブーストソースのversion.hppに表示されるものと同様の形式105700のバージョン番号と比較します。ここでの私の混乱の原因は、find_package(Boost 1.57.0)を呼び出すとFindBoost.cmakeがBoost_VERSIONの構築に問題があり、そのバージョンチェックが失敗したようです。その後、私がfind_package(Boost 105700)を試しても、もうチェックが失敗しないようです。おそらく、version.hpp形式のバージョンを検出するロジックがあります(つまり、Boost_FIND_VERSION_MAJORの全体バージョンですか?)おそらくfind_package(Boost 105700)が何かを壊しました。

とにかく、cmakeにはまだフォーマットされた文字列出力がないことが分かります。

+3

カウンターは質問:なぜ、あなたは手動で 'Boost_VERSION'を設定する必要がありますか? 'find_package(Boost 1.57.0)'を実行しているときに 'FindBoost'が定義する変数の一つです。 –

+1

あなたが言うことは[documentation](https://cmake.org/cmake/help/v3.5/module/FindBoost.html)には対応していません。 Boost_VERSION *は 'find_package(Boost)'や 'find_package(Boost 1.57.0)'で設定されます。完全なストーリーを知らないと、ここで意味をなさないように見える唯一の変換は、* Boost_MAJOR_VERSION、Boost_MINOR_VERSIONなどの代わりに* 015700 *から* 1.57.0(これはおそらくそれほど難しくありません) – Antonio

答えて

1

悲観的な答え
いいえ、CMakeのでフォーマットされた出力を生成するためのそのような機能はありません。

Optimisitic Answer
あなた自身をロールバックします。

バージョン文字列に先頭と末尾のドットを埋め込むための正確なロジックはわかりませんが、string commandには、おそらく必要なすべてのサブコマンドと1つまたはもう1つのブロックifブロックが用意されています。 例えば、ドットを取り除くためにREPLACEを使用します。

string(REPLACE "." "" "${version}" version_wo_dots) 
+1

もっと簡単なアプローチは文字列(REPLACE "。" ";"%{version} version_list)です。しかし、私は本当にcmakeが文字列出力をフォーマットしているかどうかを知りたいと思っていました。私はこれを答えとしてマークします –

関連する問題