我想针对一个C和C++项目的三个编译器版本进行构建: gcc、gcc-8和clang (用于C编译器),它应该分别使用g++、g++-8和clang++作为C++编译器。
总共有3种配置。我不想用所有C和C++编译器版本的产品来构建,即。没有gcc/g++-8等。
如何使用这三种配置指定一个矩阵,每个配置设置两个变量?
目前我正在使用这个(请注意,指定了2个OSes,因此总共有6个信任):
strategy:
matrix:
os: [ubuntu-16.04, ubuntu-latest]
cpp_compiler: [g++, g++-8, clang++]
include:
- c_compiler: gcc
- cpp_ompiler: g++-8
c_compiler: gcc-8
- cpp_compiler: clang++
c_compiler: clang本质上,C++编译器(cpp_compiler)被用作主版本,然后include以黑客的方式根据cpp_compiler版本设置c_compiler,但是必须有更好的.
发布于 2021-08-26 14:04:52
除了将@jidicula的答复存储为array的matrix之外,您还可以将其存储为map,这将使工作流更具可读性。
因此,下面的工作流应该工作得更漂亮一些:
# simplified
strategy:
matrix:
os: [ubuntu-16.04, ubuntu-latest]
compiler: [ {cpp: g++, c: gcc}, {cpp: g++-8, c: gcc-8}, {cpp: clang++, c: clang} ]
steps:
- name: Compile with C++ compiler
run: ${{ matrix.compiler.cpp }} source.cpp
- name: Compile with C compiler
run: ${{ matrix.compiler.c }} source.c当触发此工作流时,它将与不同的matrix并行执行6次。
1: matrix.os == ubuntu-16.04, matrix.compiler.cpp == g++, matrix.compiler.c == gcc
2: matrix.os == ubuntu-16.04, matrix.compiler.cpp == g++-8, matrix.compiler.c == gcc-8
3: matrix.os == ubuntu-16.04, matrix.compiler.cpp == clang++, matrix.compiler.c == clang
4: matrix.os == ubuntu-latest, matrix.compiler.cpp == g++, matrix.compiler.c == gcc
5: matrix.os == ubuntu-latest, matrix.compiler.cpp == g++-8, matrix.compiler.c == gcc-8
6: matrix.os == ubuntu-latest, matrix.compiler.cpp == clang++, matrix.compiler.c == clang但是,无论是array还是map,语法目前都是无文档化的,尽管语法检查器已不再将其标记为错误。因此,所有这些都可能在未来发生改变。
发布于 2021-02-09 02:50:13
我只是尝试了一下,结果发现你可以在一个构建矩阵中嵌套数组,但是它是没有文档的。因此,您可以在job.matrix中创建一个编译器数组数组。让我们称之为compiler-version:compiler-version: [[g++, gcc], [g++-8, gcc-8], [clang++, clang]]。然后,您可以使用零索引访问compiler-version数组的每个元素中的每个值:matrix.compiler-version[0]用于C++编译器,matrix.compiler-version[1]用于其C对应项。
您的工作流程将变成:
strategy:
matrix:
os: [ubuntu-16.04, ubuntu-latest]
compiler-version: [[g++, gcc], [g++-8, gcc-8], [clang++, clang]]
steps:
# .... checkout steps
- name: Compile file with C++ compiler
env:
COMPILER: ${{ matrix.compiler-version[0] }}
run: |
$COMPILER file.c
./a.out
- name: Compile file with C compiler
env:
COMPILER: ${{ matrix.compiler-version[1] }}
run: |
$COMPILER file.c
./a.out我用两个Python版本和两个Ubuntu版本组成了一个最小的例子,其中3.7与Ubuntu-18.04配对,3.8与Ubuntu-20.04配对。您可以看到工作流文件这里及其相应的运行这里。
该解决方案克服了在工作流文件中的两个位置定义C++选项的尴尬之处。尽管没有文档化,但我认为它是稳定的,因为GitHub操作上下文对象是(或者至少像对待) JavaScript对象,所以我们实际上只是将数组文本定义为矩阵对象属性并访问它们的值。
https://stackoverflow.com/questions/66025220
复制相似问题