問題タブ [meson-build]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
4728 参照

build - 「ただの」サブディレクトリのための「cmake rebuild_cache」?

CMake の makefile ステージの生成が遅いという問題があります。これは、この未回答の質問に似ています。

CMake での makefile の生成が遅い

私のプロジェクトは、個々のライブラリおよび実行可能コンポーネントのさまざまなサブプロジェクトを追加するためにCMakeLists.txt使用する最上位ファイルで構成されています。add_subdirectory()

特定のコンポーネントの場合、CMakeLists.txtファイルには次のようなものが含まれます。

次を使用して、そのディレクトリの内容だけを構築できます。

サブディレクトリ内のファイルを変更するとCMakeLists.txt(純粋な Makefile から CMake への移行の一環として多くのことを行ってきました)、makeそれを正しく実行すると、CMake が再実行され、実行したかのように構成が更新されますmake rebuild_cache

ただし、実際にはプロジェクト全体を再構成していることに気付きました。CMake が、現在のディレクトリとサブディレクトリで Makefile を再生成するだけでよいことを理解できるほど賢くなることを本当に望んでいます。

これを達成するために CMake プロジェクトを構築するより良い方法はありますか? 各サブプロジェクトの CMakeLists.txt ごとにproject()を 使用する人もいます。一般的に、これは良い考えですか?

あるいは/さらに、CMakeの生成ステップを高速化する方法はありますか? (現在60代以上)

CMake 自体が並列実行できる必要がある、またはできない理由について議論したい場合のボーナス ポイント (a を想像してくださいcmake -j)。


私は meson-build タグをささやかな報奨金として追加しましたが、それだけではまだ答えを保証するほどの注目を集めていません. この種の問題が原因で、システムのビルドを meson-build に切り替えたり (同様の問題がないと仮定して)、または同様のものに切り替えたりする可能性があります。

ソースをCMakeに変更しないとできない、というのが正解かもしれません。賞金を獲得するには、CMake がどのように機能するか、および/またはどこに欠陥があるかについての説明が必要です。


明確化:私の場合、遅いのは生成ステップです。構成自体は十分に高速ですが、CMake は"-- Configuring done""-- Generating done"を出力する間にかなりの時間ハングします。

完全なキャッシュを再構築するには、次を実行します。

ボンネットの下でこれが実行されます:

-Bの同義語だと思い--buildます。どちらのオプションもドキュメントで正しく説明されていません。-Hはソース ディレクトリのルートです (--helpドキュメントで信じられているものとは異なります)。

"Configuring done"の出力に到達するのは高速ですが、そこからは低速です。

例えば、

サブディレクトリ内の 1 つの CMakeLists.txt ファイルを編集してから を実行するとmake -n、次のように実行されます。

--check-build-system は、文書化されていない別のオプションです。

効果は同じです。現在のサブツリーだけでなく、ビルド システム全体を再生成します。ソース内ビルドとソース外ビルドの動作に違いはありません。

トレースを実行すると、たとえば次のようになります。

費やされる時間の大部分は、open、access、unlink の呼び出し (またはその間) に費やされているようです。

各タスクの長さはかなり変動しますが、膨大な数のタスクが蓄積されます。Labels.json および Labels.txt ファイルが何であるかはわかりません (CMake の内部的なもの)。

1 回の実行:

同じコマンドをもう一度実行します。

Ninja ジェネレーターははるかに高速であることに注意してください (それでも素晴らしいとは言えません)。例えば、

次のようなエラーがあるため、プロジェクトはまだ忍者の準備が整っていないことに注意してください。

解決する必要があります。この質問は、Makefileジェネレーターが遅い理由に関するものです。忍者が示す問題がここで役立つヒントなのか、それとも赤いニシンなのか、私にはわかりません。


より多くの最適化を行って CMake をビルドしても役に立ちません。

私のトレース出力と時間の出力に基づいて、そうなる可能性は低いです。ユーザー時間、つまり CMake コード自体に費やされる時間は非常に少ないです。(例えば、time(1) の出力で「real」、「user」、および「sys」は何を意味しますか? を参照してください)。

完全を期すために私が試したのは次のとおりです。

実際には、より最適化された CMake を使用すると構成部分が高速になりますが、私の場合、遅いのは生成部分ですタイミングから、このステップは何らかの形で I/O バウンドのように見えます。


私は、一時ファイルにファイルストリームのメモリストリームを使用すると違いが生じる可能性があるという Florian の考えを調査することにしました。

簡単な方法を試すことにし、代わりに CMake をハッキングして .tmp ファイルを RAM ディスクに書き込みました。

次に、独り占めして、RAM ディスク上にビルド システムを生成しようとしました。

これが壁時計の時間とまったく変わらないことに非常に驚きました。

同様に ramfs の場合:

ここで何が起こっているのでしょうか?私はサブプロセスを推測していましたが、どのサブプロセスが壁時計の時間を消費しているかを判断できません。彼らは非常に短命に見えます。


完全を期すために、perf からの出力を次に示します (CMake でビルド-fno-omit-frame-pointer):

そしてperf report -g graph -no-children :

0 投票する
2 に答える
434 参照

meson-build - Meson で忍者バージョンを指定しますか?

Ubuntu 14.04LTS に基づく Elementary OS を実行しています。Ninja はバージョン 1.3.4 です。Meson を実行すると、次のエラーが表示されます。

http://www.mariocampos.io/blog/meson,-first-impressions/によると、新しいバージョンの Ninja を入手することでこれを修正できます。大丈夫、できるよ。ただし、パッケージリポジトリのソフトウェアを維持することを好むので、私の質問は次のとおりです。

そのような高いバージョンを必要としない Ninja ビルド ファイルを生成するように Meson に指示できますか? それとも Meson は 1.5.1 でのみ利用可能な Ninja 機能を使用しますか?

0 投票する
1 に答える
840 参照

meson-build - Meson Build の特定のテストの実行

meson ビルドでは、ここmeson.buildに示すように に複数のテストが定義されている場合、特定の単一のテストをビルドして実行することは可能ですか? 特定のモジュールに取り組んでいて、コマンド プロンプトを使用してそのモジュールのテストだけを実行したいとしましょう。

0 投票する
1 に答える
557 参照

c++ - Mac で Qt を meson とともに使用する際の問題

私はビルド システム meson ( http://mesonbuild.com/ ) に出くわし、そのシンプルさと Qt のネイティブ サポートに惹かれました。

ただし、チュートリアルに従うと、エラーメッセージが表示されました

Qt Creator を使用すると、Qt プロジェクトを簡単に作成、コンパイル、および実行できるため、これは奇妙です。MacOS シエラを使用しています。qmakeがどこにあるのか、どうにかしてメソンに伝えることはできますか?

0 投票する
2 に答える
3532 参照

qt-creator - Qt Creator で meson をセットアップする方法

私は通常、cmake で Qt クリエーターを使用して C++ プロジェクトをプログラミングします。最近、私は meson についてかなりの量を読みました。それはシンプルで、テストするのが好きです。この例では、中間子のセットアップ方法について説明します。

ctrl + Bmeson を使用するときは、ビルド ( ) または実行 ( )に Qt 作成者のショートカットを引き続き使用するのが好きctrl + Rです。「一般的なプロジェクト」を使用している場合、Qt Creator を構成して meson プロジェクトをビルドするにはどうすればよいですか?