Search code examples
powershellgitlab-cigitlab-ci.yml

Factor out common command line options in gitlab?


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 ?


Solution

  • 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: