使用 CMake 配置生成
Azure Sphere 使用 CMake 为具有 Visual Studio、Visual Studio Code以及 Windows 和 Linux 命令行的应用程序配置生成。 CMake 是一个开源的跨平台生成系统。 有关 CMake 的一般信息,请参阅 CMake Wiki。
以下源提供有关将 CMake 与 Visual Studio 配合使用或Visual Studio Code的信息:
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 | 具有多个根的项目的 Visual Studio 配置文件,如 IntercoreComms 示例中所示。 |
.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 中使用以下函数:
名字 | 目的 |
---|---|
azsphere_target_hardware_definition | 指定目标硬件。 |
azsphere_target_add_image_package | 创建映像包。 |
如果现有应用程序是使用 20.04 之前的 SDK 创建的,请参阅 转换现有应用以使用 CMake 函数。
CMakeLists.txt 文件必须在任何azsphere_函数之前调用项目命令。
目标硬件定义
可以通过调用 azsphere_target_hardware_definition 函数将值存储在 CMakeLists.txt 中来指定目标硬件。 此函数采用两个参数:要搜索的目录列表和要搜索的文件名。 例如:
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},并且只能从 CMakeLists.txt 文件中调用 一次 azsphere_target_add_image_package 函数。
已弃用的 CMake 函数
在 SDK 版本 24.03 之前,CMake 函数 azsphere_configure_tools 和 azsphere_configure_api 用于指定 CMakeLists.txt 文件中设置的目标 SDK 工具版本和目标 API。 现在已弃用这些函数,应改为在相应的配置文件中指定目标 API 集。 有关详细信息 ,请参阅应用程序运行时版本、sysroots 和 Beta API 页。
如果使用旧版 SDK,并且看到有关不受支持的工具修订版的 CMake 配置错误,可以通过将这些函数重新添加到 CMakeLists.txt 来解决此问题。 例如:
azsphere_configure_tools(TOOLS_REVISION 23.05)
azsphere_configure_api(TARGET_API_SET 16)
更改配置文件时如何删除 CMake 缓存
如果更改其中一个配置文件,则应删除 CMake 缓存,以确保后续生成不会失败。 在尝试另一个生成之前,请遵循以下过程:
- 对于Visual Studio Code生成,请从命令面板运行 CMake:Delete Cache and Reconfigure 命令。
- 对于命令行 (CLI) 生成,请删除在前面步骤中创建的生成目录。
Visual Studio 检测对 CMake 配置文件的更改并自动删除缓存。
转换现有应用以使用 CMake 函数
如果已有在 20.04 SDK 之前使用 CMake 生成的 Azure Sphere 应用程序,则应将其转换为使用这些新函数。 目前仍可生成此类应用程序,但对它们的支持有限,可能会在将来的版本中删除。
有关应进行的更改示例,请查看如何为 20.04 版本的 外部 MCU 更新高级应用 更改 CMakeLists.txt 和 *.json 配置文件。
注意
除了使用函数的更新之外,Azure Sphere 示例中还更新了这些文件,以使用小写函数名称,从而符合 CMake 约定。
CMakeLists.txt 配置更改
以下示例演示从 20.01 或更早版本更新 CMakeLists.txt 文件以使用新函数所需的更改。
示例 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")
注意
RESOURCE_FILES不支持绝对路径。
Visual Studio CMakePresets.json配置
使用 CMakePresets.json 文件可以指定常见的配置、生成和测试选项,然后使用其他开发环境与开发人员共享这些选项。 例如,可以使用相同的预设配置文件在 Visual Studio、Visual Studio Code、持续集成管道中调用 CMake,或者从 Windows、Linux 或 macOS 上的 CLI 调用 CMake。
从版本 22.07 开始,当前项目使用 CMakePresets.json 中定义的预设,而现有项目则可以继续使用 CMakeSettings.json 中的设置。 示例仅附带一个配置文件,CMakePresets.json或CMakeSettings.json。 开发环境将使用存在的 文件。 请参阅每个示例项目,了解使用了哪个文件。 对于使用 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配置更改。
以下示例演示从 20.01 或更早版本更新 Visual Studio 中的 CMakeSettings.json 文件以使用新函数所需的更改。
示例 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 文件包括以下更改:
- 在“环境”字段中,只需要“Azure Sphere”。
- 在“调试”和“发布”版本的“配置”字段中:
- “buildRoot”和“installRoot”值不再需要 AzureSphereTargetApiSet 设置。
- CMake 工具链现在在“cmakeToolChain”中定义,而不是在“variables”中定义。
- “variables”字段现在仅指定目标 API 集,并使用新的“latest-lts”值来指示项目应使用最新的长期稳定 (LTS) 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 配置
以下示例演示从 20.01 或更早版本更新 Visual Studio Code 的 .vscode/settings.json 文件以使用新函数所需的更改。
示例 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”字段的以下更改:
-
AZURE_SPHERE_TARGET_HARDWARE_DEFINITION_DIRECTORY
和AZURE_SPHERE_TARGET_HARDWARE_DEFINITION
设置不再需要,因为这些值现在在 CMakeLists.txt 文件中设置。 -
CMAKE_TOOLCHAIN_FILE
和AZURE_SPHERE_TARGET_API_SET
设置不再需要,因为这些值现在在 CMakePresets.json 文件中设置。 现在AZURE_SPHERE_TARGET_API_SET
"latest-lts"
值为 ,指示项目应使用最新的长期稳定 (LTS) sysroot 生成。
请注意, "cmake.configureArgs"
由于与 CMake 无关的原因,字段也已被删除。 (字段不再需要, --no-warn-unused-cli
因为此 build 不需要参数。)
以下字段适用于扩展:
"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文件添加到项目的顶级文件夹中。 该文件有两个条目,一个用于指定启用 CMake 生成,一个条目包含指向多个根的路径。 例如,对于 IntercoreComms 示例,CMakeWorkspaceSettings.json包含以下内容:
{
"enableCMake": true,
"sourceDirectory": [ "IntercoreComms_HighLevelApp", "IntercoreComms_RTApp_MT3620_BareMetal" ]
}
路径相对于包含 CMakeWorkspaceSettings.json 文件的文件夹指定。