I have a simple c++ application that I'd like to build on both Linux and Windows. It seems to be working nicely using cmake.
Now I'd like to cleanup my gitlab-ci.yml file and factor out the common cmake command line options.
I tried a naive:
variables:
COMMON_CMAKE_FLAGS: >-
-DBUILD_SHARED_LIBS=OFF
-DCMAKE_CXX_EXTENSIONS=OFF -DCMAKE_CXX_STANDARD=17
-DBUILD_APPS=OFF
-DBUILD_TESTING=ON
-DCMAKE_INSTALL_MESSAGE=LAZY
This seems to be working just fine using the default runner (bash?) with something like:
script:
- cmake -S . -B build -GNinja -DCMAKE_BUILD_TYPE=Release $COMMON_CMAKE_FLAGS
However the following fails miserably with my default windows runner (powershell based).
- cmake -S . -B obj -GNinja -DCMAKE_BUILD_TYPE=Release
"-DVCPKG_TARGET_TRIPLET=${env:VCPKG_DEFAULT_TRIPLET}"
"-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake"
$env:COMMON_CMAKE_FLAGS
Indeed using something like echoargs
gives:
$ echoargs -S . -B obj -GNinja -DCMAKE_BUILD_TYPE=Release "-DVCPKG_TARGET_TRIPLET=${env:VCPKG_DEFAULT_TRIPLET}" $env:COMMON_CMAKE_FLAGS
Arg 0 is <-S>
Arg 1 is <.>
Arg 2 is <-B>
Arg 3 is <obj>
Arg 4 is <-GNinja>
Arg 5 is <-DCMAKE_BUILD_TYPE=Release>
Arg 6 is <-DVCPKG_TARGET_TRIPLET=x64-windows-static>
Arg 7 is <-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake>
Arg 9 is <-DBUILD_SHARED_LIBS=OFF -DCMAKE_CXX_EXTENSIONS=OFF -DCMAKE_CXX_STANDARD=17 -DBUILD_APPS=OFF -DBUILD_TESTING=ON -DCMAKE_INSTALL_MESSAGE=LAZY>
Is there a (simple!) way to share common command line option in a gitlab ci script in between a bash based runner and a powershell runner ?
One possible solution is to use splatting. Working solution:
- cmake -S . -B obj -GNinja -DCMAKE_BUILD_TYPE=Release
"-DVCPKG_TARGET_TRIPLET=${env:VCPKG_DEFAULT_TRIPLET}"
"-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake"
(-split $COMMON_CMAKE_FLAGS)
Reference: