CMake: Swift モジュールのバージョン管理と名前空間の衝突を解決する「Swift_MODULE_NAME」プロパティ


"Swift_MODULE_NAME" プロパティは、CMake の "Properties: Targets" カテゴリに属するものであり、Swift モジュールの名前を指定するために使用されます。このプロパティは、CMake 3.15 以降で導入されました。

デフォルト値

"Swift_MODULE_NAME" プロパティのデフォルト値は、ターゲットの名前と同じになります。

設定方法

"Swift_MODULE_NAME" プロパティを設定するには、以下の構文を使用します。

set_target_properties(target_name PROPERTIES SWIFT_MODULE_NAME module_name)

ここで、

  • module_name は、Swift モジュールの名前です。
  • target_name は、プロパティを設定するターゲットの名前です。

以下の例では、"MyTarget" という名前のターゲットの "Swift_MODULE_NAME" プロパティを "MySwiftModule" に設定しています。

add_executable(MyTarget MyTarget.swift)
set_target_properties(MyTarget PROPERTIES SWIFT_MODULE_NAME MySwiftModule)

用途

"Swift_MODULE_NAME" プロパティは、以下の目的で使用されます。

  • モジュール名を変更することで、モジュールの名前空間の衝突を回避することができます。
  • モジュール名を変更することで、モジュールのバージョン管理を容易にすることができます。
  • Swift モジュールの名前を明確に指定することで、モジュール間の依存関係を明確にすることができます。

注意事項

  • "Swift_MODULE_NAME" プロパティは、すべての CMake ジェネレータでサポートされているわけではありません。
  • "Swift_MODULE_NAME" プロパティは、CMake 3.15 以降でしか使用できません。
  • "Swift_MODULE_NAME" プロパティは、ターゲットが Swift ソースファイルをコンパイルする場合にのみ有効です。

"Swift_MODULE_NAME" プロパティは、Swift モジュールの名前を指定するために使用される CMake プロパティです。このプロパティは、モジュール間の依存関係を明確にし、モジュールのバージョン管理を容易にし、モジュールの名前空間の衝突を回避するために使用することができます。



サンプル 1: モジュールの名前を明確に指定する

add_executable(MyTarget MyTarget.swift)
set_target_properties(MyTarget PROPERTIES SWIFT_MODULE_NAME MySwiftModule)

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

MyTarget.app/Contents/MacOS/MyTarget

上記のように、モジュールの名前は "MySwiftModule" となり、ターゲットの名前とは異なる名前になります。

サンプル 2: モジュールのバージョン管理を容易にする

このサンプルでは、"MyTarget" という名前のターゲットの "Swift_MODULE_NAME" プロパティを "MySwiftModule-1.0" に設定することで、モジュールのバージョン管理を容易にしています。

add_executable(MyTarget MyTarget.swift)
set_target_properties(MyTarget PROPERTIES SWIFT_MODULE_NAME MySwiftModule-1.0)
MyTarget.app/Contents/MacOS/MyTarget

上記のように、モジュールの名前は "MySwiftModule-1.0" となり、モジュールのバージョン情報が含まれています。

このサンプルでは、"MyTarget" という名前のターゲットと "MyOtherTarget" という名前のターゲットの "Swift_MODULE_NAME" プロパティをそれぞれ "MySwiftModule" と "MyOtherSwiftModule" に設定することで、モジュールの名前空間の衝突を回避しています。

add_executable(MyTarget MyTarget.swift)
set_target_properties(MyTarget PROPERTIES SWIFT_MODULE_NAME MySwiftModule)

add_executable(MyOtherTarget MyOtherTarget.swift)
set_target_properties(MyOtherTarget PROPERTIES SWIFT_MODULE_NAME MyOtherSwiftModule)
MyTarget.app/Contents/MacOS/MyTarget
MyOtherTarget.app/Contents/MacOS/MyOtherTarget


PUBLIC_HEADER_DIR プロパティ

"PUBLIC_HEADER_DIR" プロパティを使用して、モジュールのヘッダーファイルを指定することができます。このプロパティは、モジュールの名前を暗黙的に推測するために使用されます。

add_executable(MyTarget MyTarget.swift)
set_target_properties(MyTarget PROPERTIES PUBLIC_HEADER_DIR MyTarget-Headers)

このコードを実行すると、モジュールの名前は "MyTarget" となります。

CMAKE_MODULE_PATH 変数

"CMAKE_MODULE_PATH" 変数を使用して、モジュールのヘッダーファイルの検索パスを指定することができます。この変数は、モジュールの名前を暗黙的に推測するために使用されます。

set(CMAKE_MODULE_PATH MyTarget-Headers ${CMAKE_MODULE_PATH})
add_executable(MyTarget MyTarget.swift)

手動でモジュールファイルを名前付けする

モジュールファイルを手動で名前付けることで、モジュールの名前を明示的に指定することができます。

add_executable(MyTarget MyTarget.swift)
target_sources(MyTarget PRIVATE MyTarget-Module.module)

このコードを実行すると、モジュールの名前は "MyTarget-Module" となります。

注意事項

  • 上記の代替方法は、すべての CMake ジェネレータでサポートされているわけではありません。
  • 上記の代替方法は、"Swift_MODULE_NAME" プロパティほど柔軟ではありません。

"Swift_MODULE_NAME" プロパティは、CMake 3.15 以降で導入された比較的新しいプロパティです。それ以前の CMake バージョンでは、上記のような代替方法を使用してモジュールの名前を指定していました。

これらの代替方法は、"Swift_MODULE_NAME" プロパティほど柔軟ではありませんが、古い CMake バージョンで使用することができます。