From 117df75343e4a9c1b6968dc6d3f34472eb837d85 Mon Sep 17 00:00:00 2001 From: Christophe Deschamps Date: Wed, 6 Nov 2024 07:40:09 +0100 Subject: [PATCH] Fix Windows CI build on vs2022 --- .gitlab-ci-files/job-windows-desktop.yml | 182 +++++++++++++---------- CMakeLists.txt | 16 ++ 2 files changed, 118 insertions(+), 80 deletions(-) diff --git a/.gitlab-ci-files/job-windows-desktop.yml b/.gitlab-ci-files/job-windows-desktop.yml index 1f313dc8a..add265c31 100644 --- a/.gitlab-ci-files/job-windows-desktop.yml +++ b/.gitlab-ci-files/job-windows-desktop.yml @@ -2,39 +2,32 @@ # BUILD ################################################# -.windows-vs2019: - extends: .job-prepare +.windows-vs: + extends: .prepare stage: build - tags: [ "windows-powershell" ] rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $DOCKER_UPDATE == null && $SKIP_WINDOWS == null - if: $CI_PIPELINE_SOURCE == "schedule" && $DOCKER_UPDATE == null && $SKIP_WINDOWS == null variables: - CMAKE_OPTIONS: -DLINPHONE_WINDOWS_SIGN_TOOL=$WINDOWS_SIGN_TOOL -DLINPHONE_WINDOWS_SIGN_TIMESTAMP_URL=$WINDOWS_SIGN_TIMESTAMP_URL -DLINPHONE_WINDOWS_SIGN_HASH=$WINDOWS_SIGN_HASH -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON + CMAKE_OPTIONS: -DENABLE_UNIT_TESTS=ON -DLINPHONE_WINDOWS_SIGN_TOOL=$WINDOWS_SIGN_TOOL -DLINPHONE_WINDOWS_SIGN_TIMESTAMP_URL=$WINDOWS_SIGN_TIMESTAMP_URL -DLINPHONE_WINDOWS_SIGN_HASH=$WINDOWS_SIGN_HASH -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON -DCMAKE_PREFIX_PATH="C:/Qt/$QT5_WIN_VER_VS2022/msvc2019_64" LINPHONESDK_PLATFORM: Desktop OUTPUT_ZIP_FOLDER: win64 MINGW_TYPE: mingw64 - CMAKE_GENERATOR: "Visual Studio 16 2019" - CMAKE_ARCHITECTURE : -A x64 + BUILD_TARGET: install + CMAKE_C_COMPILER : cl.exe + CMAKE_CXX_COMPILER : cl.exe + CMAKE_RC_COMPILER : rc.exe + script: - - Set-Variable -Name "PATH_TEMP" -Value ($(Get-ChildItem -Path Env:\PATH).value) - - echo $env:Path - #Remove MinGW of MSYS from PATH and add MINGW_TYPE for MSYS2 - # We double the "\" to escape paths as -replace uses regular expressions - - $PATH_TEMP = $PATH_TEMP -replace "C:\\MinGW\\bin;" -replace "C:\\Strawberry\\c\\bin;" -replace "C:\\Program Files\\NASM" - - echo $PATH_TEMP - - $env:Path = ($PATH_TEMP + ";C:\msys64\" + $MINGW_TYPE + "\bin;" + $env:SIGNTOOL_ROOT + "\x64;C:\msys64;C:\msys64\usr\bin;") - - If ($MINGW_TYPE -eq "mingw64") {Import-BatchEnvironment "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"} Else {Import-BatchEnvironment "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat"} - - If ($MINGW_TYPE -eq "mingw64") {$env:Path = ($env:Path + ";C:\Qt\" + $env:QT5_WIN_VER + "\msvc2019_64\bin")} Else {$env:Path = ($env:Path + ";C:\Qt\" + $env:QT5_WIN_VER + "\msvc2019\bin")} - if ($MAKE_RELEASE_FILE_URL) { } else { $RELEASE_FILE = "" } + - $env:Path = ($env:Path + ";C:\Qt\" + $env:QT5_WIN_VER_VS2022 + "\msvc2019_64\bin") - echo $env:Path - If ( Test-Path -Path "build-desktop" ) {Remove-Item -recurse -force -path "build-desktop" } - mkdir build-desktop - cd build-desktop - #we launch the msvc-cl wrapper located in python scripts folder - #this wrapper relays only needed calls to the real compiler - #cache stats display - - C:\PROGRA~1\Python37\Scripts\cl -s + - sccache --show-stats + - sccache --zero-stats + - Write-Output $QT_WIN_VER - Write-Output $CMAKE_ARCHITECTURE - Write-Output $SCHEDULE_CMAKE_OPTIONS - Write-Output $MAKEFILE_JOBS @@ -76,17 +69,14 @@ # /!\ By design, we must keep $NINJA_OPTIMIZATION as the last option of the line, because it contains an output redirect - echo $LastExitCode - Invoke-Expression "cmake --build . --target $BUILD_TARGET --config $CI_BUILD_TYPE $PARALLEL_OPTIONS $NINJA_OPTIMIZATION" - - if ($EXITS_ON_ERROR_MSVC) { Invoke-Expression "$EXITS_ON_ERROR_MSVC" } else { Write-Output "EXITS_ON_ERROR_MSVC is null" } + - if ($EXITS_ON_ERROR_MSBUILD) { Invoke-Expression "$EXITS_ON_ERROR_MSBUILD" } else { Write-Output "EXITS_ON_ERROR_MSBUILD is null" } - if ($DISPLAY_NINJA_LOG) { Invoke-Expression "$DISPLAY_NINJA_LOG" } else { Write-Output "DISPLAY_NINJA_LOG is null" } - if ($SEARCH_NINJA_ERROR) { Invoke-Expression "$SEARCH_NINJA_ERROR" } else { Write-Output "SEARCH_NINJA_ERROR is null" } - if ($DISPLAY_SEARCH_STATUS) { Invoke-Expression "$DISPLAY_SEARCH_STATUS" } else { Write-Output "DISPLAY_SEARCH_STATUS is null" } - if ($SET_EXIT_CODE_BASED_ON_SEARCH_STATUS) { Invoke-Expression "$SET_EXIT_CODE_BASED_ON_SEARCH_STATUS" } else { Write-Output "SET_EXIT_CODE_BASED_ON_SEARCH_STATUS is null" } - if ($SHOW_SEARCH_STATUS_SCRIPT) { Invoke-Expression "$SHOW_SEARCH_STATUS_SCRIPT" } else { Write-Output "SHOW_SEARCH_STATUS_SCRIPT is null" } - if ($LAUNCH_SEARCH_STATUS_SCRIPT) { Invoke-Expression "$LAUNCH_SEARCH_STATUS_SCRIPT" -ErrorAction stop } else { Write-Output "LAUNCH_SEARCH_STATUS_SCRIPT is null" } - - C:\PROGRA~1\Python37\Scripts\cl -s - - cd linphone-sdk - - mkdir $OUTPUT_ZIP_FOLDER - - Copy-Item -Path "*.zip" -Destination "$CI_PROJECT_DIR/build-desktop/linphone-sdk/$OUTPUT_ZIP_FOLDER" -Recurse + - sccache --show-stats ################ artifacts: @@ -95,22 +85,38 @@ - build-desktop\ninja_buildlog.txt - build-desktop\invertSearch.ps1 - build-desktop\OUTPUT\* - - build-desktop\linphone-sdk\openh264-prefix\src\openh264-stamp\* + - build-desktop\external\linphone-sdk\openh264-prefix\src\openh264-stamp\* when: always expire_in: 1 week - -.windows-vs2019-msvc: - extends: .windows-vs2019 - variables: - CMAKE_OPTIONS: -DENABLE_UNIT_TESTS=ON -DLINPHONE_WINDOWS_SIGN_TOOL=$WINDOWS_SIGN_TOOL -DLINPHONE_WINDOWS_SIGN_TIMESTAMP_URL=$WINDOWS_SIGN_TIMESTAMP_URL -DLINPHONE_WINDOWS_SIGN_HASH=$WINDOWS_SIGN_HASH -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON - LINPHONESDK_PLATFORM: Desktop - CMAKE_GENERATOR: "Visual Studio 16 2019" - BUILD_TARGET: install - PARALLEL_OPTIONS: "-- /maxcpucount /nodeReuse:true /p:TrackFileAccess=false" - EXITS_ON_ERROR_MSVC: 'if (-not ($$LastExitCode -eq 0)) {throw "Error: Build failed"}' -.windows-vs2019-scheduled: - extends: .windows-vs2019-msvc + +.windows-vs2022: + extends: .windows-vs + tags: [ "windows-powershell-vs-17-2022" ] + +.windows-msbuild-variables: + variables: + PARALLEL_OPTIONS: "-- /maxcpucount /nodeReuse:true /p:TrackFileAccess=false" + EXITS_ON_ERROR_MSBUILD: 'if (-not ($$LastExitCode -eq 0)) {throw "Error: Build failed"}' + CMAKE_ARCHITECTURE : -A x64 + +.windows-ninja-variables: + variables: + CLI_OUTPUT_INFO_NINJA: Write-Output -NoEnumerate "Building with Ninja. See ninja_buildlog.txt to get details before completing the build." + NINJA_BUILD_PARALLEL_LEVEL: -DCMAKE_BUILD_PARALLEL_LEVEL=$WINDOWS_PARALLEL_JOBS + PARALLEL_OPTIONS: "--parallel $WINDOWS_PARALLEL_JOBS" + NINJA_OPTIMIZATION: "| find /V \"inclusion du fichier\" > ninja_buildlog.txt; cmd /c \"exit /b 0\"" + NINJA_EXPLICIT_COMPILER_SET: -DCMAKE_C_COMPILER="$CMAKE_C_COMPILER" -DCMAKE_CXX_COMPILER="$CMAKE_CXX_COMPILER" -DCMAKE_RC_COMPILER="$CMAKE_RC_COMPILER" + DISPLAY_NINJA_LOG: Get-Content ninja_buildlog.txt + SEARCH_NINJA_ERROR: 'Write-Output "`$$isFound = (Select-String -Pattern `"build stopped: subcommand failed`" -SimpleMatch -Quiet -Path ninja_buildlog.txt)" > invertSearch.ps1' + DISPLAY_SEARCH_STATUS: Write-Output 'echo $$isFound' >> invertSearch.ps1 + SET_EXIT_CODE_BASED_ON_SEARCH_STATUS: Write-Output -NoEnumerate "If (`$(echo `$$isFound) -eq `"True`") {throw `"There was an error in the build`"} else {exit 0}" >> invertSearch.ps1 + SHOW_SEARCH_STATUS_SCRIPT: Get-Content invertSearch.ps1 + LAUNCH_SEARCH_STATUS_SCRIPT: .\invertSearch.ps1 + CMAKE_GENERATOR: "Ninja" + +.windows-msbuild-scheduled: + extends: .windows-msbuild-variables rules: - if: $NIGHTLY_MASTER - if: $NIGHTLY_RELEASE @@ -120,15 +126,26 @@ - Set-Variable -Name "CLCACHE_DISABLE" -Value 1 ###################################################### -# JOBS +# On each push ###################################################### -vs2019-msvc-win64-windows: - extends: .windows-vs2019-msvc - variables: - CMAKE_C_COMPILER : cl.exe - CMAKE_CXX_COMPILER : cl.exe - CMAKE_RC_COMPILER : rc.exe +.win64-mr-rules: + rules: + - if: ($CI_PIPELINE_SOURCE == "merge_request_event") && $DOCKER_UPDATE == null && $SKIP_WINDOWS == null + +win64-msbuild-vs2022-windows: + rules: + - !reference [.rules-merge-request-manual, rules] + extends: + - .windows-vs2022 + - .windows-msbuild-variables + - .win64-mr-rules + +win64-ninja-vs2022-windows: + extends: + - .windows-vs2022 + - .windows-ninja-variables + - .win64-mr-rules ###################################################### # NIGHTLY @@ -136,21 +153,26 @@ vs2019-msvc-win64-windows: ## ON SCHEDULE ## -vs2019-win64-scheduled-windows: - extends: .windows-vs2019-scheduled +.vs-scheduled-windows: rules: + - !reference [.rules-merge-request-manual, rules] - if: $NIGHTLY_MASTER - - if: $NIGHTLY_RELEASE + - if: $DEPLOY_PLUGINS - if: $DEPLOY_RUN_WINDOWS +win64-ninja-vs2022-scheduled-windows: + extends: + - win64-ninja-vs2022-windows + - .vs-scheduled-windows + ################################################# # PACKAGE ################################################# #Remove . when packaging process is ready to use -vs2019-win64-package: + +.vs-win64-package: stage: package - extends: .windows-vs2019-msvc dependencies: [] rules: - !reference [.rules-merge-request-manual, rules] @@ -161,48 +183,48 @@ vs2019-win64-package: variables: CMAKE_OPTIONS: -DENABLE_APP_PACKAGING=YES -DLINPHONE_WINDOWS_SIGN_TOOL=$WINDOWS_SIGN_TOOL -DLINPHONE_WINDOWS_SIGN_TIMESTAMP_URL=$WINDOWS_SIGN_TIMESTAMP_URL -DLINPHONE_WINDOWS_SIGN_HASH=$WINDOWS_SIGN_HASH -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON RELEASE_FILE: -DLINPHONE_SDK_MAKE_RELEASE_FILE_URL=$MAKE_RELEASE_FILE_URL/$WINDOWS_PLATFORM/$APP_FOLDER - + +win64-ninja-vs2022-package-windows: + variables: + CMAKE_GENERATOR: "Ninja" + CMAKE_ARCHITECTURE: "" + PARALLEL_OPTIONS: "" + extends: + - .windows-vs2022 + - .windows-ninja-variables + - .vs-win64-package + ################################################# # DEPLOY ################################################# -vs2019-win64-upload: +.win64-upload: stage: deploy - tags: [ "deploy"] + tags: [ "windows-powershell" ] rules: - - !reference [.rules-merge-request-manual, rules] - if: $NIGHTLY_MASTER - if: $DEPLOY_WINDOWS - needs: - - vs2019-win64-package - script: -# Going to folder in order to avoid having path in checksum - - |- - cd build-desktop/OUTPUT/Packages/ - for file in $(find . -type f -name '*.exe' -exec basename {} \;) - do - rsync -rlv --ignore-existing $file $DEPLOY_SERVER:$UPLOAD_ROOT_PATH/$WINDOWS_PLATFORM/$APP_FOLDER - sha512sum $file > $file.sha512 - rsync -rlv --ignore-existing $file.sha512 $DEPLOY_SERVER:$UPLOAD_ROOT_PATH/$WINDOWS_PLATFORM/$APP_FOLDER - done - cd ../../.. - - |- - if [[ $MAKE_RELEASE_FILE_URL != "" ]]; then - rsync -rlv build-desktop/OUTPUT/RELEASE $DEPLOY_SERVER:$UPLOAD_ROOT_PATH/$WINDOWS_PLATFORM - rsync -rlv build-desktop/OUTPUT/RELEASE $MAIN_DEPLOY_SERVER:$UPLOAD_ROOT_PATH/$WINDOWS_PLATFORM - fi -vs2019-win64-plugins-upload: + script: + - scp -pr build-desktop/OUTPUT/Packages/*.exe ${DEPLOY_SERVER}:${UPLOAD_ROOT_PATH}/${WINDOWS_PLATFORM}/${APP_FOLDER} + - if ($MAKE_RELEASE_FILE_URL) { scp -pr build-desktop/OUTPUT/RELEASE ${DEPLOY_SERVER}:${UPLOAD_ROOT_PATH}/${WINDOWS_PLATFORM}/ } + - if ($MAKE_RELEASE_FILE_URL) { scp -pr build-desktop/OUTPUT/RELEASE ${MAIN_DEPLOY_SERVER}:${UPLOAD_ROOT_PATH}/${WINDOWS_PLATFORM}/ } + +win64-ninja-vs2022-upload: + extends: + - .win64-upload + needs: + - win64-ninja-vs2022-package-windows + +.win64-plugins-upload: stage: deploy - tags: [ "windows"] + tags: [ "windows" ] rules: - if: $DEPLOY_PLUGINS - needs: - - vs2019-win64-scheduled-windows script: - - scp "build-desktop/OUTPUT/plugins/app/*.dll" "%DEPLOY_SERVER%:%WINDOWS_UPLOAD_DIRECTORY%/plugins" + - scp "build-desktop/OUTPUT/plugins/app/*.dll" "%MAIN_DEPLOY_SERVER%:%WINDOWS_UPLOAD_DIRECTORY%/plugins" - - - - +win64-ninja-vs2022-plugins-upload: + extends: .win64-plugins-upload + needs: + - win64-ninja-vs2022-scheduled-windows diff --git a/CMakeLists.txt b/CMakeLists.txt index 56376ad2b..7eeebe714 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,22 @@ if(ENABLE_BUILD_VERBOSE) message("User Args : ${USER_ARGS}") endif() +if(POLICY CMP0149) + # VS generator looks for most recent Windows SDK, ignoring + # CMAKE_SYSTEM_VERSION and allowing override by WindowsSDKVersion + # environment variable. New in 3.27. This is to allow override + # in the Windows CI builds. + # This MUST be set before any project() or or enable_language() command. + cmake_policy(SET CMP0149 NEW) +endif() + +if(POLICY CMP0141) + # Changes the way debug info on Windows are stored (forces /Z7) + # This is a requirement to use build cache on Windows, since /Zi is another Microsoft cache, incompatible with any third party cache known to date + set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded) + cmake_policy(SET CMP0141 NEW) +endif() + project(linphoneqt) include(GNUInstallDirs)