CMake を使用してビルドを構成する
重要
これは Azure Sphere (レガシ) のドキュメントです。 Azure Sphere (レガシ) は 2027 年 9 月 27 日に 再提供されておりユーザーは現時点で Azure Sphere (統合) に移行する必要があります。 TOC の上にある Version セレクターを使用して、Azure Sphere (統合) のドキュメントを表示します。
Azure Sphere は、Visual Studio、Visual Studio Code、および Windows と Linux のコマンド ラインを使用してアプリケーションのビルドを構成するために、CMake を使用します。 CMake は、オープンソースのクロスプラットフォーム make システムです。 CMake の全般的な情報については、CMake Wiki を参照してください。
次のソースでは、Visual Studio または Visual Studio Code での CMake の使用に関する情報を提供します。
CMake のビルドでは、次のファイルを使用します。
ファイル | 目的 |
---|---|
CMakeLists.txt | 一般的な CMake 構成ファイル。 すべてのビルドに必須です。 |
CMakePresets.json | Visual Studio と Visual Studio Code の構成プリセット ファイル。 Visual Studio を使用してビルドするには、このファイルまたはCMakeSettings.jsonが必要です。 |
CMakeSettings.json | Visual Studio の構成ファイル。 Visual Studio を使用してビルドするには、このファイルまたはCMakePresets.jsonが必要です。 |
CMakeWorkspaceSettings.json | IntercoreComms サンプルのように、複数のルートを持つプロジェクトの Visual Studio 構成ファイル。 |
.vscode/settings.json | Visual Studio Code の構成ファイル。 Visual Studio Code でのビルドに必須です。 |
CMake パラメーターはスペースで区切られます。 Windows コマンド ラインの行継続文字 "^" 、Linux コマンド ラインの場合は " \ " 、Powershell の場合は "'" を読みやすくするために使用できますが、必須ではありません。 具体的な文字は、Windows または Linux のターミナル構成によって決まります。
Azure Sphere 用の CMake 関数
CMakeLists.txt ファイルには、アプリケーションをビルドするために CMake で使用する一般的な構成設定が用意されています。 Azure Sphere では、CMakeLists.txt での次の関数の使用がサポートされています。
Name | 目的 |
---|---|
azsphere_target_hardware_definition | ターゲット ハードウェアを指定します。 |
azsphere_target_add_image_package | イメージ パッケージを作成します。 |
20.04 より前の SDK を使用して作成された既存のアプリケーションがある場合は、「CMake 関数を使用するよう既存のアプリを変換する」を参照してください。
CMakeLists.txt ファイルでは、どの azsphere_ 関数よりも前に、project コマンドを呼び出す必要があります。
ターゲット ハードウェアの定義
azsphere_target_hardware_definition 関数を呼び出してターゲットとするハードウェアを指定し、その値を CMakeLists.txt に格納することができます。 この関数は、検索するディレクトリのリストと検索するファイル名の 2 つのパラメーターを受け取ります。 次に例を示します。
azsphere_target_hardware_definition(${PROJECT_NAME} TARGET_DIRECTORY "<path>/my_app/contoso_hardware_definitions" "<path>/my_app/test_hardware" TARGET_DEFINITION "contoso_board.json")
TARGET_DEFINITION パラメーターは必須です。 これは、アプリケーションで必要なハードウェア定義ファイルの名前を指定します。 TARGET_DIRECTORY パラメーターには、このファイルを検索するディレクトリがリストされます。 このパラメーターは省略可能です。省略した場合、CMake では、SDK インストールの HardwareDefinitions フォルダーのみが検索されます。 複数のフォルダーを指定するには、各フォルダー名を二重引用符で囲み、次の例のようにスペースを使用してフォルダー名を区切ります。 この例では、 <path> は開発用コンピューター上の my_app フォルダーへのパスを表します。
イメージ パッケージの作成
azsphere_target_add_image_package 関数を呼び出すことでビルド時に含めるイメージ パッケージ ファイルと任意のリソース ファイルを指定し、その値を CMakeLists.txt に格納します。 azsphere_target_add_image_package 関数と、ビルドするプロジェクトは必須です。リソース ファイルは省略可能です。
次の関数呼び出しにより、Azure Sphere アプリケーションのみを含むイメージ パッケージが作成されます。
azsphere_target_add_image_package(${PROJECT_NAME})
次の例では、アプリケーションに加えて証明書を含むイメージ パッケージが作成されます。
azsphere_target_add_image_package(${PROJECT_NAME} RESOURCE_FILES "certs/bundle.pem")
azsphere_target_add_image_package に渡される CMake ターゲットは、${PROJECT_NAME} という名前にする必要があります。また、azsphere_target_add_image_package 関数は、CMakeLists.txt ファイルから一度だけ呼び出すことができます。
非推奨の CMake 関数
SDK バージョン 24.03 より前では、CMake 関数の azsphere_configure_tools と azsphere_configure_api を使用して、CMakeLists.txt ファイル内のターゲット SDK ツールのバージョンとターゲット API セットを指定していました。 これらの関数は非推奨になりました。代わりに、ターゲット API セットを適切な構成ファイルで指定する必要があります。 詳細については、 Application ランタイム バージョン、sysroots、および Beta API ページを参照してください。
古いバージョンの SDK を使用していて、サポートされていないツールリビジョンに関する CMake 構成エラーが表示される場合は、それらの関数をCMakeLists.txtに再追加することで回避できます。 例
azsphere_configure_tools(TOOLS_REVISION 23.05)
azsphere_configure_api(TARGET_API_SET 16)
構成ファイルの変更時に CMake キャッシュを削除する方法
構成ファイルの 1 つを変更する場合は、後続のビルドが失敗しないように CMake キャッシュを削除する必要があります。 別のビルドを試行する前に、次の手順に従います。
- Visual Studio Code ビルドの場合は、コマンド パレットから CMake:Delete Cache と Reconfigure コマンドを実行します。
- コマンドライン (CLI) のビルドでは、前の手順で作成したビルド ディレクトリを削除します。
Visual Studio では、CMake 構成ファイルへの変更が検出され、キャッシュが自動的に削除されます。
CMake 関数を使用するよう既存のアプリを変換する
20.04 SDK より前の CMake を使用してビルドされた Azure Sphere アプリケーションが既にある場合は、これらの新しい関数を使用するよう変換する必要があります。 現時点では、このようなアプリケーションは変更せずにビルドできますが、サポートは制限されており、今後のリリースで削除される可能性があります。
行う必要がある変更の例については、20.04 リリース向けの外部更新プログラムという高度なアプリのために CMakeLists.txt および *.json 構成ファイルがどのように変更されたかを確認してください。
Note
この関数を使用するための更新に加えて、これらのファイルは Azure Sphere のサンプルで小文字の関数名を使用するように更新されているため、CMake の規則に沿っています。
CMakeLists.txt の構成の変更
次の例では、新しい関数を使用するよう CMakeLists.txt ファイルを 20.01 またはそれ以前のバージョンから更新するために必要な変更を示しています。
20.01 SDK CMakeLists.txt ファイルの例
CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
PROJECT(ExternalMcuUpdateNrf52 C)
ADD_EXECUTABLE(${PROJECT_NAME} main.c file_view.c mem_buf.c epoll_timerfd_utilities.c nordic/slip.c nordic/crc.c nordic/dfu_uart_protocol.c)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} applibs pthread gcc_s c)
SET(ADDITIONAL_APPROOT_INCLUDES "ExternalNRF52Firmware/blinkyV1.bin;ExternalNRF52Firmware/blinkyV1.dat;ExternalNRF52Firmware/s132_nrf52_6.1.0_softdevice.bin;ExternalNRF52Firmware/s132_nrf52_6.1.0_softdevice.dat")
INCLUDE("${AZURE_SPHERE_MAKE_IMAGE_FILE}")
更新された CMakeLists.txt ファイル
更新されたCMakeLists.txt ファイルは、 azsphere_target_hardware_definition 関数を呼び出してターゲット ハードウェアを設定します。 また、azsphere_target_add_image_package を呼び出してイメージ パッケージをビルドし、必要に応じて、それに含めるファイルを指定します。
cmake_minimum_required(VERSION 3.20)
project(ExternalMcuUpdateNrf52 C)
add_executable(${PROJECT_NAME} main.c file_view.c mem_buf.c epoll_timerfd_utilities.c nordic/slip.c nordic/crc.c nordic/dfu_uart_protocol.c)
target_link_libraries(${PROJECT_NAME} applibs pthread gcc_s c)
azsphere_target_hardware_definition(${PROJECT_NAME} TARGET_DIRECTORY "../../../HardwareDefinitions/mt3620_rdb" TARGET_DEFINITION "sample_hardware.json")
azsphere_target_add_image_package(
${PROJECT_NAME}
RESOURCE_FILES
"ExternalNRF52Firmware/blinkyV1.bin"
"ExternalNRF52Firmware/blinkyV1.dat"
"ExternalNRF52Firmware/s132_nrf52_6.1.0_softdevice.bin"
"ExternalNRF52Firmware/s132_nrf52_6.1.0_softdevice.dat")
Note
絶対パスは、RESOURCE_FILESではサポートされていません。
Visual Studio CMakePresets.json構成
CMakePresets.json ファイルを使用すると、一般的な構成、ビルド、テストのオプションを指定し、他の開発環境を使用して開発者と共有することができます。 たとえば、同じプリセット構成ファイルを使用して、Visual Studio、Visual Studio Code、継続的インテグレーション パイプライン、または Windows、Linux、または macOS 上の CLI から CMake を呼び出すことができます。
リリース 22.07 の時点で、現在のプロジェクトでは CMakePresets.json で定義されているプリセットが使用されますが、既存のプロジェクトでは引き続きCMakeSettings.jsonの設定を使用できます。 サンプルには、CMakePresets.jsonまたはCMakeSettings.jsonの構成ファイルが 1 つだけ付属しています。 開発環境では、存在するファイルが使用されます。 使用されているファイルについては、各サンプル プロジェクトを参照してください。 CMakeSettings.jsonを使用するプロジェクトについては、「 Visual Studio CMakeSettings.json構成の変更」を参照してください。
高度なアプリケーションとリアルタイムアプリケーション用のCMakePresets.jsonファイルは非常によく似ています。唯一の違いは、 CMAKE_TOOLCHAIN_FILE
変数と ARM_GNU_PATH
変数にあります。
高度なアプリケーションでは、 ARM_GNU_PATH
は設定されず、 CMAKE_TOOLCHAIN_FILE
は次のように設定されます。
"CMAKE_TOOLCHAIN_FILE": "$env{AzureSphereDefaultSDKDir}/CMakeFiles/AzureSphereToolchain.cmake",
リアルタイム アプリケーションでは、 CMAKE_TOOLCHAIN_FILE
と ARM_GNU_PATH
は次のように設定されます。
"CMAKE_TOOLCHAIN_FILE": "$env{AzureSphereDefaultSDKDir}/CMakeFiles/AzureSphereRTCoreToolchain.cmake",
"ARM_GNU_PATH": "$env{ArmGnuPath}"
Visual Studio CMakeSettings.json構成
サンプルには、CMakePresets.jsonまたはCMakeSettings.json構成ファイルが付属しています。 使用されているファイルを確認するには、各プロジェクトを参照してください。 このセクションでは、CMakeSettings.json構成について説明します。 CMakePresets.jsonを使用するプロジェクトについては、「 Visual Studio CMakePresets.json構成の変更」を参照してください。
次の例では、新しい関数を使用するよう Visual Studio の CMakeSettings.json ファイルを 20.01 またはそれ以前のバージョンから更新するために必要な変更を示しています。
サンプルの 20.01 SDK CMakeSettings.json ファイル
{
"environments": [
{
"environment": "AzureSphere",
"AzureSphereTargetApiSet": "4",
"AzureSphereTargetHardwareDefinitionDirectory": "${projectDir}\\..\\..\\..\\Hardware\\mt3620_rdb",
"AzureSphereTargetHardwareDefinition": "sample_hardware.json"
}
],
"configurations": [
{
"name": "ARM-Debug",
"generator": "Ninja",
"configurationType": "Debug",
"inheritEnvironments": [
"AzureSphere"
],
"buildRoot": "${projectDir}\\out\\${name}-${env.AzureSphereTargetApiSet}",
"installRoot": "${projectDir}\\install\\${name}-${env.AzureSphereTargetApiSet}",
"cmakeCommandArgs": "--no-warn-unused-cli",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"variables": [
{
"name": "CMAKE_TOOLCHAIN_FILE",
"value": "${env.AzureSphereDefaultSDKDir}CMakeFiles\\AzureSphereToolchain.cmake"
},
{
"name": "AZURE_SPHERE_TARGET_API_SET",
"value": "${env.AzureSphereTargetApiSet}"
},
{
"name": "AZURE_SPHERE_TARGET_HARDWARE_DEFINITION_DIRECTORY",
"value": "${env.AzureSphereTargetHardwareDefinitionDirectory}"
},
{
"name": "AZURE_SPHERE_TARGET_HARDWARE_DEFINITION",
"value": "${env.AzureSphereTargetHardwareDefinition}"
}
]
},
{
"name": "ARM-Release",
"generator": "Ninja",
"configurationType": "Release",
"inheritEnvironments": [
"AzureSphere"
],
"buildRoot": "${projectDir}\\out\\${name}-${env.AzureSphereTargetApiSet}",
"installRoot": "${projectDir}\\install\\${name}-${env.AzureSphereTargetApiSet}",
"cmakeCommandArgs": "--no-warn-unused-cli",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"variables": [
{
"name": "CMAKE_TOOLCHAIN_FILE",
"value": "${env.AzureSphereDefaultSDKDir}CMakeFiles\\AzureSphereToolchain.cmake"
},
{
"name": "AZURE_SPHERE_TARGET_API_SET",
"value": "${env.AzureSphereTargetApiSet}"
},
{
"name": "AZURE_SPHERE_TARGET_HARDWARE_DEFINITION_DIRECTORY",
"value": "${env.AzureSphereTargetHardwareDefinitionDirectory}"
},
{
"name": "AZURE_SPHERE_TARGET_HARDWARE_DEFINITION",
"value": "${env.AzureSphereTargetHardwareDefinition}"
}
]
}
]
}
更新された SDK CMakeSettings.json ファイル
更新された CMakeSettings.json ファイルには、次の変更が含まれています。
- "environments" フィールドには、"Azure Sphere" のみが必要です。
- デバッグ ビルドとリリース ビルドの両方の [構成] フィールドで、次の手順を実行します。
- "buildRoot" と "installRoot" の値には、AzureSphereTargetApiSet の設定が不要になりました。
- CMake ツールチェーンは、"variables" ではなく "cmakeToolChain" で定義されるようになりました。
- "variables" フィールドでは、ターゲット API セットのみを指定し、新しい "latest-lts" 値を使用して、プロジェクトを最新の LTS (Long-Term-Stable) sysroot でビルドする必要があることを指定するようになりました。 AZURE_SPHERE_TARGET_HARDWARE_DEFINITION_DIRECTORY および AZURE_SPHERE_TARGET_HARDWARE_DEFINITION の設定は必須ではなくなりました。これらの値は現在、CMakeLists.txt ファイルで設定されるためです。
{
"environments": [
{
"environment": "AzureSphere"
}
],
"configurations": [
{
"name": "ARM-Debug",
"generator": "Ninja",
"configurationType": "Debug",
"inheritEnvironments": [
"AzureSphere"
],
"buildRoot": "${projectDir}\\out\\${name}",
"installRoot": "${projectDir}\\install\\${name}",
"cmakeToolchain": "${env.AzureSphereDefaultSDKDir}CMakeFiles\\AzureSphereToolchain.cmake",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"variables": [
{
"name": "AZURE_SPHERE_TARGET_API_SET",
"value": "latest-lts"
}
]
},
{
"name": "ARM-Release",
"generator": "Ninja",
"configurationType": "Release",
"inheritEnvironments": [
"AzureSphere"
],
"buildRoot": "${projectDir}\\out\\${name}",
"installRoot": "${projectDir}\\install\\${name}",
"cmakeToolchain": "${env.AzureSphereDefaultSDKDir}CMakeFiles\\AzureSphereToolchain.cmake",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"variables": [
{
"name": "AZURE_SPHERE_TARGET_API_SET",
"value": "latest-lts"
}
]
}
]
}
Visual Studio Code .vscode/settings.json 構成
次の例は、Visual Studio Code の .vscode/settings.json ファイルを 20.01 以前から更新して新しい関数を使用するために必要な変更を示しています。
例 20.01 SDK .vscode/settings.json ファイル
{
"cmake.generator": "Ninja",
"cmake.buildDirectory": "${workspaceRoot}/out/${buildType}-${command:azuresphere.AzureSphereTargetApiSet}",
"cmake.buildToolArgs": [ "-v" ],
"cmake.configureArgs": [ "--no-warn-unused-cli" ],
"cmake.configureSettings": {
"CMAKE_TOOLCHAIN_FILE": "${command:azuresphere.AzureSphereSdkDir}/CMakeFiles/AzureSphereToolchain.cmake",
"AZURE_SPHERE_TARGET_HARDWARE_DEFINITION_DIRECTORY": "${workspaceRoot}/../../../HardwareDefinitions/mt3620_rdb",
"AZURE_SPHERE_TARGET_HARDWARE_DEFINITION": "sample_hardware.json",
"AZURE_SPHERE_TARGET_API_SET": "4"
},
"cmake.configureOnOpen": true,
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools"
}
.vscode/settings.json ファイルを更新しました
.vscode/settings.json ファイルには、Visual Studio Code のワークスペース設定が含まれています。
更新されたsettings.json ファイルには、"cmake.configureSettings" フィールドに対する次の変更が含まれています。
- これらの値は CMakeLists.txt ファイルに設定されているため、
AZURE_SPHERE_TARGET_HARDWARE_DEFINITION_DIRECTORY
とAZURE_SPHERE_TARGET_HARDWARE_DEFINITION
の設定は不要になりました。 - これらの値は CMakePresets.json ファイルで設定されているため、
CMAKE_TOOLCHAIN_FILE
とAZURE_SPHERE_TARGET_API_SET
の設定は不要になりました。AZURE_SPHERE_TARGET_API_SET
値が"latest-lts"
になりました。これは、プロジェクトが最新の長期安定 (LTS) sysroot を使用してビルドする必要があることを示します。
"cmake.configureArgs"
フィールドも、CMake とは無関係の理由で削除されていることに注意してください。 (このビルドでは --no-warn-unused-cli
パラメーターが必要ないため、フィールドは不要になりました)。
拡張機能には、次のフィールドが適用されます。
"cmake.configureOnOpen": true
は、ワークスペースが開いたときに構成を開始するように cmake-tools 拡張機能に通知します。"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
は、 cpp-tools 拡張機能に使用する IntelliSense プロバイダーを指定します。この場合は、 cmake-tools 拡張機能です。
{
"cmake.generator": "Ninja",
"cmake.buildDirectory": "${workspaceRoot}/out/${buildType}-${command:azuresphere.AzureSphereTargetApiSet}",
"cmake.buildToolArgs": [ "-v" ]
},
"cmake.configureOnOpen": true,
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
}
CMakeWorkspaceSettings.json ファイルの作成
Visual Studio 2022 バージョン 17.1 以降を使用していて、 IntercoreComms サンプルなど、複数のルートを持つプロジェクトがある場合プロジェクトの最上位フォルダーにCMakeWorkspaceSettings.json ファイルを追加する必要があります。 ファイルには 2 つのエントリがあります。1 つは CMake ビルドが有効であることを指定し、1 つは複数のルートへのパスを含みます。 たとえば、IntercoreComms サンプルの場合、CMakeWorkspaceSettings.jsonには次の内容があります。
{
"enableCMake": true,
"sourceDirectory": [ "IntercoreComms_HighLevelApp", "IntercoreComms_RTApp_MT3620_BareMetal" ]
}
パスは、CMakeWorkspaceSettings.json ファイルを含むフォルダーに対して相対的に指定されます。