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 バージョンで使用することができます。