RULE_LAUNCH_LINKでCMakeを極める!リンカ実行時の問題解決と代替方法


"RULE_LAUNCH_LINK" プロパティは、CMake の "Properties of Global Scope" に属する設定項目であり、Makefile ジェネレータや Ninja ジェネレータが生成するリンカコマンドにプレフィックスとして指定するランチャーコマンドを定義します。このランチャーコマンドは、リンカ実行時の問題をより詳細な粒度で捕捉することを目的としています。

用途

"RULE_LAUNCH_LINK" プロパティは、主に以下の用途に役立ちます。

  • 特定の環境変数やディレクトリ設定をリンカ実行時に適用
  • リンカ実行時の問題を特定するためのデバッガの起動
  • リンカ実行時の詳細なログ情報収集

設定方法

"RULE_LAUNCH_LINK" プロパティは、CMakeLists.txt ファイル内の cmake_properties() コマンドを使用して設定できます。以下の例は、グローバルな "RULE_LAUNCH_LINK" プロパティを設定する方法を示しています。

cmake_properties(GLOBAL RULE_LAUNCH_LINK "/bin/sh -c 'set -x; \$0 $@'")

この例では、"/bin/sh -c 'set -x; \$0 $@'" というランチャーコマンドがすべてのリンカコマンドにプレフィックスとして付与されます。このランチャーコマンドは、以下の処理を実行します。

  1. set -x コマンドを実行し、シェルスクリプトの実行内容を詳細にログ出力します。
  2. 実際のリンカコマンド ($0) を引数として実行します。
  • "RULE_LAUNCH_LINK" プロパティは、内部使用を目的としたプロパティであり、変更すると予期せぬ動作を引き起こす可能性があります。
  • プロジェクトや開発者は、<LANG>_LINKER_LAUNCHER ターゲットプロパティまたは CMAKE_<LANG>_LINKER_LAUNCHER 変数を使用するべきです。これらの設定は、より詳細な制御と柔軟性を提供します。


cmake_properties(GLOBAL RULE_LAUNCH_LINK "/bin/sh -c 'set -x; \$0 $@'")

このコードを実行すると、リンカコマンドは以下のようになります。

/bin/sh -c 'set -x; <actual_linker_command> <arguments>'

リンカ実行時の問題を特定するためのデバッガの起動

以下の例では、リンカ実行時に GDB デバッガを起動する方法を示します。

cmake_properties(GLOBAL RULE_LAUNCH_LINK "gdb --args \$0")
gdb --args <actual_linker_command> <arguments>

特定の環境変数やディレクトリ設定をリンカ実行時に適用

以下の例では、リンカ実行時に LD_LIBRARY_PATH 環境変数を設定する方法を示します。

cmake_properties(GLOBAL RULE_LAUNCH_LINK "env LD_LIBRARY_PATH=/my/lib/path \$0 $@")
env LD_LIBRARY_PATH=/my/lib/path <actual_linker_command> <arguments>
  • "RULE_LAUNCH_LINK" プロパティは、内部使用を目的としたプロパティであるため、変更すると予期せぬ動作を引き起こす可能性があります。
  • 複雑なランチャーコマンドを使用する場合は、シェルスクリプトファイルを作成して実行することを推奨します。
  • 上記の例はあくまで一例であり、実際の用途に合わせて調整する必要があります。


しかし、"RULE_LAUNCH_LINK" プロパティは内部使用を目的としたプロパティであり、変更すると予期せぬ動作を引き起こす可能性があります。そのため、状況によっては "RULE_LAUNCH_LINK" プロパティの代替方法を検討する必要があります。

代替方法

"RULE_LAUNCH_LINK" プロパティの代替方法としては、以下の方法が考えられます。

<LANG>_LINKER_LAUNCHER ターゲットプロパティと CMAKE_<LANG>_LINKER_LAUNCHER 変数

<LANG>_LINKER_LAUNCHER ターゲットプロパティと CMAKE_<LANG>_LINKER_LAUNCHER 変数は、"RULE_LAUNCH_LINK" プロパティよりも詳細な制御と柔軟性を提供します。これらの設定は、ターゲットごとに異なるランチャーコマンドを設定したり、条件に応じてランチャーコマンドを切り替えたりすることができます。


set(CMAKE_C_LINKER_LAUNCHER "gdb --args \$0")
set(CMAKE_CXX_LINKER_LAUNCHER "env LD_LIBRARY_PATH=/my/lib/path \$0 $@")

カスタムターゲット


add_custom_target(pre_link COMMAND /bin/sh -c "set -x; echo 'Pre-link commands'")

set_property(TARGET pre_link PRE_LINK_COMMANDS ${pre_link})

CMake 外部ツール

CMake 外部のツールを使用して、リンカ実行時の制御を行うこともできます。例えば、Make の prelink ルールや Ninja の prebuild ルールを利用することができます。

手動スクリプト

プロジェクトのビルドプロセスを自動化していない場合は、手動スクリプトを使用してリンカ実行前に必要な処理を実行することができます。

選択基準

どの代替方法を選択するかは、以下の要素を考慮する必要があります。

  • 開発者のスキルと経験
  • 必要とされる制御レベル
  • プロジェクトの複雑性