Configurar as construções com o CMake
O Azure Sphere utiliza o CMake para configurar compilações para aplicações com o Visual Studio, o Visual Studio Code e as linhas de comandos do Windows e Linux. O CMake é um sistema open source multiplataformas. Para obter informações gerais sobre cMake, veja o Wiki CMake.
As seguintes origens fornecem informações sobre a utilização do CMake com o Visual Studio ou o Visual Studio Code:
As construções CMake utilizam os seguintes ficheiros:
Ficheiro | Objetivo |
---|---|
CMakeLists.txt | Ficheiro de configuração CMake geral. Necessário para todas as construções. |
CMakePresets.json | Ficheiro predefinido de configuração para Visual Studio e Visual Studio Code. Este ficheiro ou CMakeSettings.json é necessário para criar com o Visual Studio. |
CMakeSettings.json | Ficheiro de configuração do Visual Studio. Este ficheiro ou CMakePresets.json é necessário para criar com o Visual Studio. |
CMakeWorkspaceSettings.json | Ficheiro de configuração do Visual Studio para projetos com múltiplas raízes, como no exemplo IntercoreComms. |
.vscode/settings.json | Ficheiro de configuração do Visual Studio Code. Necessário para criar com o Visual Studio Code. |
Os parâmetros CMake são separados por espaços. O caráter de continuação de linha "^" para a linha de comandos do Windows, " \ " para a linha de comandos do Linux ou """ para o Powershell pode ser utilizado para legibilidade, mas não é necessário. O caráter específico é determinado pela configuração do terminal do Windows ou linux.
Funções CMake para o Azure Sphere
O ficheiro CMakeLists.txt fornece as definições de configuração gerais que o CMake utiliza para criar uma aplicação. O Azure Sphere suporta a utilização das seguintes funções no CMakeLists.txt:
Nome | Objetivo |
---|---|
azsphere_target_hardware_definition | Especifique o hardware de destino. |
azsphere_target_add_image_package | Criar um pacote de imagem. |
Se tiver uma aplicação existente criada com um SDK anterior à 20.04, veja Converter uma aplicação existente para utilizar as funções CMake.
O ficheiro CMakeLists.txt tem de chamar o comando do projeto antes de qualquer uma das funções azsphere_ .
Definição de hardware de destino
Pode especificar o hardware que está a filtrar ao chamar a função azsphere_target_hardware_definition para armazenar o valor no CMakeLists.txt. Esta função utiliza dois parâmetros: uma lista de diretórios para procurar e um nome de ficheiro a procurar. Por exemplo:
azsphere_target_hardware_definition(${PROJECT_NAME} TARGET_DIRECTORY "<path>/my_app/contoso_hardware_definitions" "<path>/my_app/test_hardware" TARGET_DEFINITION "contoso_board.json")
É necessário o parâmetro TARGET_DEFINITION. Especifica o nome do ficheiro de definição de hardware necessário para a sua aplicação. O parâmetro TARGET_DIRECTORY lista os diretórios nos quais pretende procurar este ficheiro. Este parâmetro é opcional; Se omitir, o CMake procura apenas na pasta HardwareDefinitions na instalação do SDK. Para especificar várias pastas, coloque cada nome de pasta entre aspas duplas e utilize um espaço para separar nomes de pastas, como no exemplo. No exemplo, <> path representa o caminho para a pasta my_app no seu computador de desenvolvimento.
Criação de pacotes de imagens
Especifique o ficheiro do pacote de imagem e quaisquer ficheiros de recursos a incluir ao criar ao chamar a função azsphere_target_add_image_package para armazenar o valor no CMakeLists.txt. A função azsphere_target_add_image_package e o projeto a compilar são necessários; os ficheiros de recursos são opcionais.
A chamada de função seguinte cria um pacote de imagem que contém apenas a aplicação do Azure Sphere:
azsphere_target_add_image_package(${PROJECT_NAME})
O exemplo seguinte cria um pacote de imagem que contém um certificado para além de uma aplicação:
azsphere_target_add_image_package(${PROJECT_NAME} RESOURCE_FILES "certs/bundle.pem")
O destino CMake transmitido para azsphere_target_add_image_package tem de ter o nome ${PROJECT_NAME}, e a função azsphere_target_add_image_package só pode ser chamada uma vez a partir do ficheiro CMakeLists.txt.
Funções CMake preteridas
Antes da versão 24.03 do SDK, as funções CMake azsphere_configure_tools e azsphere_configure_api foram utilizadas para especificar a versão das ferramentas do SDK de destino e a API de destino definidas no ficheiro de CMakeLists.txt. Estas funções foram preteridas e o conjunto de API de destino deve ser especificado no ficheiro de configuração adequado. Veja a página Versão do runtime da aplicação, sysroots e APIs Beta para obter detalhes.
Se estiver a utilizar uma versão mais antiga do SDK e vir um erro de configuração do CMake sobre uma revisão de ferramentas não suportadas, pode resolvê-la ao voltar a adicionar essas funções ao CMakeLists.txt. Como exemplo:
azsphere_configure_tools(TOOLS_REVISION 23.05)
azsphere_configure_api(TARGET_API_SET 16)
Como eliminar a cache CMake ao alterar os ficheiros de configuração
Se alterar um dos ficheiros de configuração, deve eliminar a cache CMake para garantir que as compilações subsequentes não falham. Siga este procedimento antes de tentar outra criação:
- Para criar o Visual Studio Code, execute o comando CMake:Delete Cache e Reconfigure a partir da Paleta de Comandos.
- Para compilações da linha de comandos (CLI), elimine o diretório de compilação que criou num passo anterior.
O Visual Studio deteta alterações ao ficheiro de configuração CMake e elimina automaticamente a cache.
Converter uma aplicação existente para utilizar as funções CMake
Se já tiver uma aplicação do Azure Sphere criada com cMake antes do SDK 20.04, deve convertê-la para utilizar estas novas funções. Ainda pode criar essas aplicações inalteradas por enquanto, mas o suporte para as mesmas é limitado e pode ser removido numa versão futura.
Para obter um exemplo das alterações que deve efetuar, veja como os ficheiros de configuração CMakeLists.txt e *.json foram alterados para a aplicação de alto nível da Atualização mcU externa para a versão 20.04.
Nota
Além das atualizações para utilizar as funções, estes ficheiros foram atualizados nos exemplos do Azure Sphere para utilizar nomes de funções em minúsculas, alinhando-se assim com as convenções CMake.
CMakeLists.txt alterações de configuração
Os exemplos seguintes mostram as alterações necessárias para atualizar o ficheiro de CMakeLists.txt a partir da versão 20.01 ou anterior para utilizar as novas funções.
Exemplo 20.01 SDK CMakeLists.txt ficheiro
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}")
Ficheiro de CMakeLists.txt atualizado
O ficheiro de CMakeLists.txt atualizado chama as funções azsphere_target_hardware_definition para definir o hardware de destino. Também chama azsphere_target_add_image_package para criar o pacote de imagem e, opcionalmente, especifica os ficheiros a incluir no mesmo.
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")
Nota
Os caminhos absolutos não são suportados para RESOURCE_FILES.
Configuração do Visual Studio CMakePresets.json
O ficheiro CMakePresets.json permite-lhe especificar opções comuns de configuração, compilação e teste e, em seguida, partilhá-las com programadores através de outros ambientes de desenvolvimento. Por exemplo, pode utilizar o mesmo ficheiro de configuração predefinido para invocar o CMake no Visual Studio, o Visual Studio Code, um pipeline de Integração Contínua ou a partir da CLI no Windows, Linux ou macOS.
A partir da versão 22.07, os projetos atuais utilizam predefinições definidas no CMakePresets.json, enquanto os projetos existentes podem continuar a utilizar definições no CMakeSettings.json. Os exemplos são enviados com apenas um ficheiro de configuração, CMakePresets.json ou CMakeSettings.json. O ambiente de desenvolvimento utilizará o ficheiro que está presente. Veja cada projeto de exemplo para ver que ficheiro é utilizado. Para projetos que utilizam CMakeSettings.json, veja Visual Studio CMakeSettings.json alterações de configuração.
Os ficheiros CMakePresets.json para uma aplicação de alto nível e para uma aplicação em tempo real são muito semelhantes; as únicas diferenças estão nas CMAKE_TOOLCHAIN_FILE
variáveis e ARM_GNU_PATH
.
Numa aplicação de alto nível, ARM_GNU_PATH
não está definida e CMAKE_TOOLCHAIN_FILE
é definida da seguinte forma:
"CMAKE_TOOLCHAIN_FILE": "$env{AzureSphereDefaultSDKDir}/CMakeFiles/AzureSphereToolchain.cmake",
Numa aplicação em tempo real, CMAKE_TOOLCHAIN_FILE
e ARM_GNU_PATH
são definidos da seguinte forma:
"CMAKE_TOOLCHAIN_FILE": "$env{AzureSphereDefaultSDKDir}/CMakeFiles/AzureSphereRTCoreToolchain.cmake",
"ARM_GNU_PATH": "$env{ArmGnuPath}"
Configuração do Visual Studio CMakeSettings.json
Os exemplos são enviados com um ficheiro de configuração CMakePresets.json ou CMakeSettings.json. Veja cada projeto para ver que ficheiro é utilizado. Esta secção descreve a configuração CMakeSettings.json. Para projetos que utilizam CMakePresets.json, veja Visual Studio CMakePresets.json alterações de configuração.
Os exemplos seguintes mostram as alterações necessárias para atualizar o ficheiro de CMakeSettings.json no Visual Studio a partir da versão 20.01 ou anterior para utilizar as novas funções.
Exemplo 20.01 SDK CMakeSettings.json ficheiro
{
"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}"
}
]
}
]
}
Ficheiro de CMakeSettings.json do SDK atualizado
O ficheiro de CMakeSettings.json atualizado inclui as seguintes alterações:
- No campo "ambientes", só é necessário "Azure Sphere".
- No campo "configurações" para as compilações Depuração e Versão:
- Os valores "buildRoot" e "installRoot" já não requerem a definição AzureSphereTargetApiSet.
- A cadeia de ferramentas CMake está agora definida em "cmakeToolChain", em vez de em "variables".
- O campo "variables" especifica agora apenas o conjunto de API de destino e utiliza o novo valor "latest-lts" para indicar que o projeto deve ser criado com a sysroot de longo prazo (LTS) mais recente. As definições AZURE_SPHERE_TARGET_HARDWARE_DEFINITION_DIRECTORY e AZURE_SPHERE_TARGET_HARDWARE_DEFINITION já não são necessárias, uma vez que estes valores estão agora definidos no ficheiro deCMakeLists.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"
}
]
}
]
}
Configuração do Visual Studio Code .vscode/settings.json
Os exemplos seguintes mostram as alterações necessárias para atualizar o ficheiro .vscode/settings.json para o Visual Studio Code a partir da versão 20.01 ou anterior para utilizar as novas funções.
Exemplo 20.01 SDK .vscode/settings.json ficheiro
{
"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"
}
Ficheiro .vscode/settings.json atualizado
O ficheiro .vscode/settings.json contém definições de área de trabalho para o Visual Studio Code.
O ficheiro settings.json atualizado inclui as seguintes alterações ao campo "cmake.configureSettings":
- As
AZURE_SPHERE_TARGET_HARDWARE_DEFINITION_DIRECTORY
definições eAZURE_SPHERE_TARGET_HARDWARE_DEFINITION
já não são necessárias, porque estes valores estão agora definidos no ficheiro CMakeLists.txt . - As
CMAKE_TOOLCHAIN_FILE
definições eAZURE_SPHERE_TARGET_API_SET
já não são necessárias, porque estes valores estão agora definidos no ficheiro CMakePresets.json . OAZURE_SPHERE_TARGET_API_SET
valor é agora"latest-lts"
, o que indica que o projeto deve ser compilar com o sysroot mais recente de longa duração estável (LTS).
Tenha em atenção que o "cmake.configureArgs"
campo também foi eliminado por razões não relacionadas com cMake. (O campo já não é necessário porque o --no-warn-unused-cli
parâmetro não é necessário para esta compilação.)
Os seguintes campos aplicam-se a extensões:
"cmake.configureOnOpen": true
notifica a extensão cmake-tools para começar a configurar quando a área de trabalho é aberta."C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
especifica o fornecedor do IntelliSense a utilizar para a extensão cpp-tools ; neste caso, a extensão 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"
}
Criar um ficheiro de CMakeWorkspaceSettings.json
Se estiver a utilizar o Visual Studio 2022, versão 17.1 ou posterior, e tiver um projeto com múltiplas raízes, como o exemplo IntercoreComms, terá de adicionar um ficheiro CMakeWorkspaceSettings.json à pasta de nível superior do projeto. O ficheiro tem duas entradas, uma para especificar que a criação CMake está ativada e outra que contém os caminhos para as múltiplas raízes. Por exemplo, para o exemplo IntercoreComms, o CMakeWorkspaceSettings.json tem o seguinte conteúdo:
{
"enableCMake": true,
"sourceDirectory": [ "IntercoreComms_HighLevelApp", "IntercoreComms_RTApp_MT3620_BareMetal" ]
}
Os caminhos são especificados em relação à pasta que contém o ficheiro CMakeWorkspaceSettings.json.