もう悩まない!CMakeのXcode_Scheme_Main_Thread_Checker_Stopを使いこなす


"XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" は、CMake の "Properties: Targets" におけるターゲットプロパティであり、Xcode プロジェクトで生成されるスキームファイルにおいて、メインスレッドチェッカーオプションの動作を制御します。このオプションは、メインスレッド上で実行されているコードにおける潜在的な問題を検出するために使用されます。

詳細

"XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティは、以下の2つの値を設定できます。

  • FALSE: メインスレッドチェッカーが問題を発見しても、実行を継続します。
  • TRUE: メインスレッドチェッカーが問題を発見した際に、実行を停止します。

設定方法

"XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティは、ターゲットに対して以下のいずれかの方法で設定できます。

  • CMakeLists.txt ファイル内で直接設定する
  • target_properties() コマンドを使用する

以下の例は、target_properties() コマンドを使用して "MyTarget" ターゲットの "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティを TRUE に設定する方法を示しています。

target_properties(MyTarget PROPERTIES XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP TRUE)

以下の例は、CMakeLists.txt ファイル内で "MyTarget" ターゲットの "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティを直接設定する方法を示しています。

set_property(TARGET MyTarget PROPERTY XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP TRUE)

注意事項

  • このプロパティは、デバッグビルドでのみ有効です。リリースビルドでは無効になります。
  • "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティは、Xcode 9 以降でのみ使用できます。

"XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティは、主にデバッグ目的で使用されます。メインスレッド上で実行されているコードにおける潜在的な問題を特定し、修正することができます。ただし、このプロパティを有効にすると、パフォーマンスが低下する可能性があることに注意する必要があります。

  • XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP: 未定義動作検知ツールを無効にする
  • XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER: メインスレッドチェッカーを完全に無効にする


ターゲットプロパティを使用して "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティを設定する

cmake_minimum_required(VERSION 3.10)

project(MyProject)

set(CMAKE_TARGET_PROPERTIES MyTarget PROPERTIES XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP TRUE)

add_executable(MyTarget main.cpp)
  • "main.cpp" ファイルから "MyTarget" 実行可能ファイルを作成します。
  • "MyTarget" ターゲットの "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティを TRUE に設定します。
  • "MyTarget" という名前のターゲットを作成します。
  • "MyProject" という名前のプロジェクトを作成します。
  • CMake の最小バージョンを 3.10 に設定します。

CMakeLists.txt ファイル内で "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティを直接設定する

cmake_minimum_required(VERSION 3.10)

project(MyProject)

set(SOURCE_FILES main.cpp)

add_executable(MyTarget ${SOURCE_FILES})

set_property(TARGET MyTarget PROPERTY XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP TRUE)

このコードは、1つ目の例とほぼ同じことを行いますが、"set_property" コマンドを使用して "XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティを直接設定しています。

cmake_minimum_required(VERSION 3.10)

project(MyProject)

set(SOURCE_FILES main.cpp)

add_executable(MyTarget ${SOURCE_FILES})

set_property(TARGET MyTarget PROPERTIES XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP TRUE XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER FALSE)


代替方法

"XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティの代替方法はいくつかあります。

Xcode の設定を使用する

Xcode でプロジェクトを開き、以下の手順でメインスレッドチェッカーの設定を変更できます。

  1. ターゲットを選択します。
  2. "ビルド設定" タブを選択します。
  3. "Apple LLVM Compiler - AS" カテゴリを選択します。
  4. "メインスレッドチェッカー" オプションを見つけます。
  5. オプションを "停止" または "警告" に設定します。

コードを変更する

dispatch_get_main_queue() 関数を使用してメインスレッドを取得し、その上で実行されるコードを直接チェックすることもできます。これは、より詳細な制御が必要な場合に役立ちます。

#include <dispatch/dispatch.h>

void checkMainThread() {
  dispatch_queue_t mainQueue = dispatch_get_main_queue();
  if (dispatch_get_current_queue() == mainQueue) {
    // メインスレッド上で実行されているコードを処理する
  }
}

サードパーティのツールを使用する

"Xcode_Scheme_Main_Thread_Checker_Stop" プロパティの機能を拡張するサードパーティのツールもいくつかあります。これらのツールは、より多くの機能やオプションを提供する場合があります。

  • サードパーティのツールを使用する場合は、そのツールのドキュメントをよく読んでください。
  • 上記の代替方法は、"XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP" プロパティよりも複雑な場合があります。