CMakeでmacOSアプリバンドルを見つける3つの方法:`CMAKE_FIND_APPBUNDLE`、`find_file`、`CFBundleInfo.plist`ファイル


CMAKE_FIND_APPBUNDLE は、CMake の find_* コマンドが macOS アプリケーションバンドルと Unix スタイルのパッケージコンポーネントのどちらを見つけるかを制御する変数です。これは、Darwin または macOS アプリケーションバンドルをサポートするシステムでのみ使用できます。

設定値

CMAKE_FIND_APPBUNDLE は、空文字列または以下のいずれかの値に設定できます。

  • NEVER
    アプリケーションバンドルを検索しません。
  • ONLY
    アプリケーションバンドルのみを検索します。
  • LAST
    標準プログラムを検索してからアプリケーションバンドルを検索します。
  • FIRST (デフォルト)
    アプリケーションバンドルを標準プログラムよりも優先的に検索します。

動作

find_* コマンドは、CMAKE_FIND_APPBUNDLE の値に基づいて以下のようになります。

  • NEVER
    コマンドは常に標準プログラムを検索します。アプリケーションバンドルは検索しません。
  • LAST
    コマンドはまず標準プログラムを検索します。見つかった場合は、それを使用します。見つからない場合は、アプリケーションバンドルを検索します。
  • FIRST または ONLY
    コマンドはまずアプリケーションバンドルを検索します。見つかった場合は、それを使用します。見つからない場合は、標準プログラムを検索します。

以下の例は、CMAKE_FIND_APPBUNDLE を使用して myapp コマンドを見つける方法を示しています。

set(CMAKE_FIND_APPBUNDLE FIRST)
find_program(MYAPP myapp)

この例では、find_program コマンドはまず myapp アプリケーションバンドルを検索します。見つかった場合は、そのバンドル内の実行ファイルが MYAPP 変数に設定されます。見つからない場合は、myapp コマンドが標準プログラムとして検索されます。

  • Unix スタイルのパッケージコンポーネントは、通常 bin ディレクトリまたは lib ディレクトリにあります。
  • macOS アプリケーションバンドルは、通常 .app 拡張子のファイルです。
  • CMAKE_FIND_APPBUNDLE は、find_program コマンドと find_package コマンドの両方に影響します。
  • この説明が分かりやすく、プログラミングに役立つ情報であれば幸いです。


macOS アプリケーションバンドルを見つける

set(CMAKE_FIND_APPBUNDLE FIRST)

find_program(MYAPP myapp)

if (MYAPP)
  message(STATUS "Found macOS application bundle: ${MYAPP}")
else()
  message(STATUS "macOS application bundle not found.")
endif()

このコードは、以下のことを行います。

  1. CMAKE_FIND_APPBUNDLEFIRST に設定します。これにより、find_program コマンドはまず macOS アプリケーションバンドルを検索します。
  2. find_program コマンドを使用して myapp コマンドを見つけます。
  3. MYAPP 変数が設定されている場合、見つかった macOS アプリケーションバンドルのパスが MYAPP 変数に格納されます。
  4. MYAPP 変数が設定されていない場合、macOS アプリケーションバンドルが見つかりませんでした。
find_package(PkgName REQUIRED)

if (PkgName_FOUND)
  message(STATUS "Found Unix package: ${PkgName}")
else()
  message(STATUS "Unix package not found.")
endif()
  1. PkgName という名前のパッケージを検索します。
  2. PkgName_FOUND 変数が設定されている場合、Unix スタイルのパッケージが見つかりました。
  3. PkgName_FOUND 変数が設定されていない場合、Unix スタイルのパッケージが見つかりませんでした。
  • find_program コマンドと find_package コマンドには、他にも多くのオプションがあります。詳細は、CMake のドキュメントを参照してください。
  • MYAPPPkgName は、実際のプログラム名やパッケージ名に置き換える必要があります。
  • 上記のコードは、CMakeLists.txt ファイルの一部として使用できます。
  • CMake の変数 CMAKE_FIND_APPBUNDLE は、Darwin または macOS アプリケーションバンドルをサポートするシステムでのみ使用できます。
  • 上記のコードは、あくまでも例です。実際の状況に合わせて変更する必要があります。

改善点

  • コードをより汎用的にするために、MYAPPPkgName などの変数を置き換えられるようにしました。
  • コードをより簡潔にするために、不要な変数を削除しました。
  • コードをより分かりやすくするために、コメントを追加しました。


find_file コマンドを使用する

find_file コマンドを使用して、アプリケーションバンドルのメイン実行ファイルを見つけることができます。

find_file(MYAPP_EXECUTABLE "${CMAKE_APPLICATION_SUBLIB_DIR}/${MYAPP}.app/Contents/MacOS/${MYAPP}")

if (MYAPP_EXECUTABLE)
  message(STATUS "Found macOS application bundle: ${MYAPP_EXECUTABLE}")
else()
  message(STATUS "macOS application bundle not found.")
endif()
  1. MYAPP_EXECUTABLE 変数に、アプリケーションバンドルのメイン実行ファイルへのパスを格納します。
  2. MYAPP_EXECUTABLE 変数が設定されている場合、macOS アプリケーションバンドルが見つかりました。
  3. MYAPP_EXECUTABLE 変数が設定されていない場合、macOS アプリケーションバンドルが見つかりませんでした。

CFBundleInfo.plist ファイルを使用する

find_file(MYAPP_CFBUNDLEINFO_PLIST "${CMAKE_APPLICATION_SUBLIB_DIR}/${MYAPP}.app/Contents/Info.plist")

if (MYAPP_CFBUNDLEINFO_PLIST)
  message(STATUS "Found macOS application bundle: ${MYAPP_CFBUNDLEINFO_PLIST}")
  
  # CFBundleInfo.plist ファイルから情報を取得する
  
else()
  message(STATUS "macOS application bundle not found.")
endif()
  1. MYAPP_CFBUNDLEINFO_PLIST 変数に、CFBundleInfo.plist ファイルへのパスを格納します。
  2. MYAPP_CFBUNDLEINFO_PLIST 変数が設定されている場合、macOS アプリケーションバンドルが見つかりました。
  3. CFBundleInfo.plist ファイルから情報を取得します。
  4. MYAPP_CFBUNDLEINFO_PLIST 変数が設定されていない場合、macOS アプリケーションバンドルが見つかりませんでした。

CocoaAppKit などのフレームワークを使用して、macOS アプリケーションバンドルを見つけることもできます。

find_package(Cocoa REQUIRED)

if (Cocoa_FOUND)
  # Cocoa フレームワークを使用してアプリケーションバンドルを見つける
else()
  message(FATAL_ERROR "Cocoa framework not found.")
endif()
  1. Cocoa フレームワークを検索します。
  2. Cocoa_FOUND 変数が設定されている場合、Cocoa フレームワークが見つかりました。
  3. Cocoa フレームワークを使用して、アプリケーションバンドルを見つけることができます。
  4. Cocoa_FOUND 変数が設定されていない場合、Cocoa フレームワークが見つかりませんでした。
  • CMake で macOS アプリケーションバンドルを見つけるには、さまざまな方法があります。最適な方法は、状況によって異なります。
  • 上記の方法は、あくまでも例です。実際の状況に合わせて変更する必要があります。
  • この情報が、CMake で macOS アプリケーションバンドルを見つけるのに役立つことを願っています。