diff --git a/cmake-modules/TSPCompile.cmake b/cmake-modules/TSPCompile.cmake index 10f9217b6..23a4e64c3 100644 --- a/cmake-modules/TSPCompile.cmake +++ b/cmake-modules/TSPCompile.cmake @@ -3,8 +3,17 @@ find_package(Git) +macro(GenerateCodeFromTypeSpec TSP_SHA TSP_REPO_PATH TSP_DESTINATION CODEGEN_SHA CODEGEN_DESTINATION ) + + message("Generating code using the following params TSP_SHA=${TSP_SHA} TSP_REPO_PATH=${TSP_REPO_PATH} TSP_DESTINATION=${TSP_DESTINATION} CODEGEN_SHA=${CODEGEN_SHA} CODEGEN_DESTINATION=${CODEGEN_DESTINATION}") + set(CODEGEN_PATH packages/typespec-cpp) + DownloadTSPFiles(${TSP_SHA} ${TSP_REPO_PATH} ${TSP_DESTINATION}) + DownloadCodeGenerator(${CODEGEN_SHA} ${CODEGEN_DESTINATION}) + GenerateCodeFromTSP(${TSP_DESTINATION} ${TSP_REPO_PATH} ${CODEGEN_DESTINATION} ${CODEGEN_PATH}) +endmacro() + macro(DownloadTSPFiles TSP_SHA TSP_REPO_PATH TSP_DESTINATION) - message ("Downloading TSP files using the following params TSP_REPO=${TSP_REPO} TSP_SHA=${TSP_SHA} TSP_REPO_PATH=${TSP_REPO_PATH} TSP_DESTINATION=${TSP_DESTINATION}") + message ("Downloading TSP files using the following params TSP_REPO=${TSP_REPO} TSP_SHA=${TSP_SHA} TSP_REPO_PATH=${TSP_REPO_PATH} TSP_DESTINATION=${TSP_DESTINATION}") if(Git_FOUND) message("Git found: ${GIT_EXECUTABLE}") @@ -49,7 +58,7 @@ macro(DownloadTSPFiles TSP_SHA TSP_REPO_PATH TSP_DESTINATION) endmacro() macro (DownloadCodeGenerator CODEGEN_SHA CODEGEN_DESTINATION) - message("Downloading CODEGEN files using the following params CODEGEN_REPO=${CODEGEN_REPO} CODEGEN_SHA=${CODEGEN_SHA} CODEGEN_DESTINATION=${CODEGEN_DESTINATION}") + message("Downloading CODEGEN files using the following params CODEGEN_REPO=${CODEGEN_REPO} CODEGEN_SHA=${CODEGEN_SHA} CODEGEN_DESTINATION=${CODEGEN_DESTINATION}") if(Git_FOUND) message("Git found: ${GIT_EXECUTABLE}") @@ -85,24 +94,38 @@ macro(GenerateCodeFromTSP TSP_DESTINATION TSP_REPO_PATH CODEGEN_DESTINATION CODE message("Generating code using the following params TSP_DESTINATION=${TSP_DESTINATION} TSP_REPO_PATH=${TSP_REPO_PATH} CODEGEN_DESTINATION=${CODEGEN_DESTINATION}") message("Remember to Download the typspec-cpp emitter from npmjs.org") #TODO : https://github.com/Azure/azure-sdk-for-cpp/issues/6071 - set(DOWNLOAD_CODEGEN_FOLDER ${CMAKE_SOURCE_DIR}/build/${CODEGEN_DESTINATION}/${CODEGEN_PATH}) + set(DOWNLOAD_CODEGEN_FOLDER ${CMAKE_SOURCE_DIR}/build/${CODEGEN_DESTINATION}/${CODEGEN_PATH}/specs/) set(DOWNLOAD_TSP_FOLDER ${CMAKE_SOURCE_DIR}/build/${TSP_DESTINATION}/${TSP_REPO_PATH}) - set(CODEGEN_CPP_FOLDER ${DOWNLOAD_CODEGEN_FOLDER}/../../../codegen.cpp) - set(CODEGEN_CPP_FOLDER ${DOWNLOAD_CODEGEN_FOLDER}/../../../codegen.cpp) + set(SCRIPTS_FOLDER ${CMAKE_SOURCE_DIR}/eng/scripts/typespec/) message("Will copy tsp files from ${DOWNLOAD_TSP_FOLDER} to ${DOWNLOAD_CODEGEN_FOLDER}") #copy tsp files to the codegen folder file(COPY ${DOWNLOAD_TSP_FOLDER} DESTINATION ${DOWNLOAD_CODEGEN_FOLDER}) - - execute_process(COMMAND npm install -g @azure-tools/typespec-client-generator-cli - WORKING_DIRECTORY ${DOWNLOAD_CODEGEN_FOLDER}) + message("Will copy tsp generation scripts from ${SCRIPTS_FOLDER} to ${DOWNLOAD_CODEGEN_FOLDER}") + file(COPY ${SCRIPTS_FOLDER} + DESTINATION ${DOWNLOAD_CODEGEN_FOLDER}) - execute_process(COMMAND npm install -g @azure-tools/typespec-azure-rulesets - WORKING_DIRECTORY ${DOWNLOAD_CODEGEN_FOLDER}) - #generate code + #build codegen + message("Building codegen in folder ${DOWNLOAD_CODEGEN_FOLDER}") execute_process(COMMAND pwsh Build-Codegen.ps1 WORKING_DIRECTORY ${DOWNLOAD_CODEGEN_FOLDER}) + #generate code + message("Use codegen in folder ${DOWNLOAD_CODEGEN_FOLDER}") execute_process(COMMAND pwsh Generate-Code.ps1 WORKING_DIRECTORY ${DOWNLOAD_CODEGEN_FOLDER}) endmacro() + +macro(UpdateCodeFilesFromGenerated CODEGEN_DESTINATION INCLUDE_DESTINATION SOURCE_DESTINATION) + message("Updating code files using the following params CODEGEN_DESTINATION=${CODEGEN_DESTINATION} INCLUDE_DESTINATION=${INCLUDE_DESTINATION} SOURCE_DESTINATION=${SOURCE_DESTINATION}") + set(CODEGEN_PATH packages/typespec-cpp/specs) + set(INCLUDE_SRC ${CMAKE_SOURCE_DIR}/build/${CODEGEN_DESTINATION}/${CODEGEN_PATH}/generated/inc/) + set(SOURCE_SRC ${CMAKE_SOURCE_DIR}/build/${CODEGEN_DESTINATION}/${CODEGEN_PATH}/generated/src/) + + message("Copying files from ${INCLUDE_SRC} to ${INCLUDE_DESTINATION}") + file(COPY ${INCLUDE_SRC} DESTINATION ${INCLUDE_DESTINATION}) + + message("Copying files from ${SOURCE_SRC} to ${SOURCE_DESTINATION}") + file(COPY ${SOURCE_SRC} DESTINATION ${SOURCE_DESTINATION}) + +endmacro() diff --git a/eng/scripts/typespec/Build-Codegen.ps1 b/eng/scripts/typespec/Build-Codegen.ps1 new file mode 100644 index 000000000..0aa05226f --- /dev/null +++ b/eng/scripts/typespec/Build-Codegen.ps1 @@ -0,0 +1,39 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# SPDX-License-Identifier: MIT + +[CmdletBinding()] +param( + [switch] $ForceInstall = $false, + [switch] $Reinstall = $false +) + +pushd +cd ..\..\ +cd codegen.cpp + +if ($Reinstall) { + rm -Recurse -Force .\node_modules\ && rm .\package-lock.json +} + +if ($ForceInstall) { + npm install --force +} else { + npm install +} + +npm run build + +cd ..\typespec-cpp + +if ($Reinstall) { + rm -Recurse -Force .\node_modules\ && rm .\package-lock.json +} + +if ($ForceInstall) { + npm install --force +} else { + npm install +} + +npm run build +popd diff --git a/eng/scripts/typespec/Cleanup-Directory.ps1 b/eng/scripts/typespec/Cleanup-Directory.ps1 new file mode 100644 index 000000000..60f6d50f2 --- /dev/null +++ b/eng/scripts/typespec/Cleanup-Directory.ps1 @@ -0,0 +1,7 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# SPDX-License-Identifier: MIT + +[CmdletBinding()] +param() + +Get-ChildItem -Exclude *.cpp,*.tsp,*.ps1,*.yaml,.clang-format,generated | Remove-Item -Recurse -Force diff --git a/eng/scripts/typespec/Generate-Code.ps1 b/eng/scripts/typespec/Generate-Code.ps1 new file mode 100644 index 000000000..4b6a5fc67 --- /dev/null +++ b/eng/scripts/typespec/Generate-Code.ps1 @@ -0,0 +1,44 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# SPDX-License-Identifier: MIT + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string] $ClangFormatPath = "clang-format" +) + +$ErrorActionPreference = "Stop" +$PSNativeCommandUseErrorActionPreference = $true + +pushd +cd $PSScriptRoot +cd ../ +$typespecCppDir = Get-Location +popd + +pushd +Write-Host "Invoking: tsp compile ." +tsp compile --emit $typespecCppDir . + +if (-not (Test-Path ".clang-format")) { + $oldProgressPreference = $ProgressPreference + $ProgressPreference = "SilentlyContinue" + Invoke-WebRequest -Uri "https://raw.githubusercontent.com/Azure/azure-sdk-for-cpp/azure-core_1.13.0/.clang-format" -OutFile ".clang-format" + $ProgressPreference = $oldProgressPreference +} + +try { + & "$ClangFormatPath" -version +} catch { + Write-Error "Clang-Format not found at: $ClangFormatPath" + popd + exit 1 +} + +Write-Host "Formatting generated code with clang-format" +Get-ChildItem generated -Include *.cpp, *.hpp -Recurse | ForEach-Object -Process{ + " Processing: $_" + & "$ClangFormatPath" -i $_ +} + +popd diff --git a/sdk/keyvault/azure-security-keyvault-secrets/CMakeLists.txt b/sdk/keyvault/azure-security-keyvault-secrets/CMakeLists.txt index 647285994..37b0aa740 100644 --- a/sdk/keyvault/azure-security-keyvault-secrets/CMakeLists.txt +++ b/sdk/keyvault/azure-security-keyvault-secrets/CMakeLists.txt @@ -31,35 +31,30 @@ include(AzureConfigRTTI) include(AzureBuildTargetForCI) # Add create_map_file function include(CreateMapFile) -option(TSP_GEN "Generate from TypeSpec" OFF) -if(TSP_GEN) - include(TSPCompile) +option(AZURE_TSP_KV_SECRETS_GEN "Generate KeyVault Secrets from TypeSpec" OFF) +message("KeyVault Secrets TSP Generation ${AZURE_TSP_KV_SECRETS_GEN}") - set(TSP_DESTINATION "keyvault_secrets") - set(TSP_REPO "https://github.com/Azure/azure-rest-api-specs.git") - set(TSP_SHA "1da5a85c4dc4f4f1caa47fff691e85960ef4bf20") - set(TSP_REPO_PATH "specification/keyvault/data-plane/Security.KeyVault.Secrets/") - - DownloadTSPFiles(${TSP_REPO} ${TSP_SHA} ${TSP_REPO_PATH} ${TSP_DESTINATION}) -endif() - -option(AZURE_TSP_KV_SECRETS_GEN "Generate from TypeSpec" OFF) -message("KeyVault Secrets TSP Generation ${az_TSP_KV_SECRETS_GEN}") if(AZURE_TSP_KV_SECRETS_GEN) include(TSPCompile) - + #typespec related repo information set(TSP_REPO_PATH "specification/keyvault/data-plane/Security.KeyVault.Secrets/") - set(TSP_SHA "1124d1074d262dc20a010c2a9d366f8e7a452927") + set(TSP_SHA "1da5a85c4dc4f4f1caa47fff691e85960ef4bf20") set(TSP_DESTINATION "keyvault_secrets") - - set(CODEGEN_SHA "b4107ff1b9ce83aedf1d299a63575b6c27434de0") + + #codegen related repo information + set(CODEGEN_SHA "1a9e3b7a337d5553603b8326dd3be5024d53b28a") set(CODEGEN_DESTINATION "typespec-cpp") - set(CODEGEN_PATH "packages/typespec-cpp/samples/keyvault/secrets") + + #destination folders + set(INCLUDE_DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/inc/azure/keyvault/secrets") + set(SOURCE_DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/src") - DownloadTSPFiles(${TSP_SHA} ${TSP_REPO_PATH} ${TSP_DESTINATION}) - DownloadCodeGenerator(${CODEGEN_SHA} ${CODEGEN_DESTINATION}) - GenerateCodeFromTSP(${TSP_DESTINATION} ${TSP_REPO_PATH} ${CODEGEN_DESTINATION} ${CODEGEN_PATH}) + #generate code from typespec + GenerateCodeFromTypeSpec(${TSP_SHA} ${TSP_REPO_PATH} ${TSP_DESTINATION} ${CODEGEN_SHA} ${CODEGEN_DESTINATION}) + #update code files left this as a separate step as generating and moving result around + #conceptually are two different steps + UpdateCodeFilesFromGenerated(${CODEGEN_DESTINATION} ${INCLUDE_DESTINATION} ${SOURCE_DESTINATION}) endif() if(FETCH_SOURCE_DEPS)