MesonでRustを使用

extern crateの使用を回避

Mesonは、Rustソースコードのextern crateステートメントの結果としてrustcによってリンクされたクレートの依存関係情報を追跡できません。使用しているクレートの依存関係がMesonで正しく表現されている場合、Rust 2018エディション以降を使用している限り、Rustコードでextern crateステートメントは不要です。これは、project(default_options)引数にrust_std=2018(以降も可)を追加することを意味します。

extern crateの問題の例として、Mesonビルドファイルからクレートを削除した場合、そのクレートにextern crateを使用して依存している他のクレートはビルドに失敗するのではなく、削除されたクレートの残りのrlibを使用して引き続きリンクされる可能性があることが挙げられます。ビルドディレクトリがクリーンアップされるまで。

この制限は、将来的にrustcの改善によって解決される可能性があります。たとえば、-Z binary-dep-depinfo機能が安定化された場合などです。

Rustソースと非Rustソースの混在

Mesonは現在、Rustソースと非Rustソースを混ぜた単一のターゲットを作成することをサポートしていないため、複数のライブラリをコンパイルしてリンクする必要があります。

rust_lib = static_library(
    'rust_lib',
    sources : 'lib.rs',
    ...
)

c_lib = static_library(
    'c_lib',
    sources : 'lib.c',
    link_with : rust_lib,
)

これはMesonの実装の詳細であり、今後変更される可能性があります。

生成されたソースと静的ソースの混在

注意 この機能は0.62で追加されました

structured_srcを使用できます。構造化ソースは、ディレクトリの文字列をソースまたはソースのリストにマップする辞書です。構造化ソースを使用する場合、Mesonがソースをソースツリーからビルドツリーにコピーする場合があるため、すべての入力をリストする必要があります

生成されたソースを使用していない場合、通常は構造化された入力を必要としません。

実装の詳細として、Mesonは構成時にファイルをコピーする必要があるかどうかを確認し、コピーする必要がない場合はコピーをスキップします。コピーは(必要に応じて)ビルド時に実行され、ソースが変更されたときに再構成しないようにします。

executable(
    'rust_exe',
    structured_sources(
        'main.rs',
        {
            'foo' : ['bar.rs', 'foo/lib.rs', generated_rs],
            'foo/bar' : [...],
            'other' : [...],
        }
    )
)

rust-analyzerで使用する

0.64.0以降。

プロジェクトにrustターゲットがある場合、Mesonはビルドディレクトリのルートにrust-project.jsonファイルを生成します。ソースルートにないため、ほとんどのIDEはファイルを使用するように構成する必要があります(Mesonはソースディレクトリにファイルを書き込みません)。 アップストリームのドキュメントで、構成方法について詳しく説明されています。

標準ライブラリとのリンク

Mesonは、ターゲットがprocマクロまたはdylibの場合、またはdylibに依存している場合を除き、Rust標準ライブラリ(例:libstd)をスタティックにリンクします。その場合、-C prefer-dynamicがRustコンパイラに渡され、標準ライブラリが動的にリンクされます。

検索結果は