Note
Please see Tutorials Setup before you proceed with this section
Using Compiler Schema¶
The compiler schema is used for compilation of programs, currently we support
single source file compilation. In order to use the compiler schema you must set type: compiler
in your
test. For more details see compiler schema docs
We assume the reader has basic understanding of Global Schema validation. Shown below is the schema header definition for compiler.schema.json:
{
"$id": "compiler.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "compiler schema",
"description": "The compiler schema is of ``type: compiler`` in sub-schema which is used for compiling and running programs",
"type": "object",
"required": [
"type",
"source",
"compilers",
"executor"
],
The required fields for compiler schema are type, compilers, source and executor.
Compilation of Hello World¶
We will start out with compilation a Hello World program in Fortran using the GNU compiler.
In this example we have a test called hello_f
. The type: compiler
is set to signify this
test will be validated with compiler.schema.json.
The source
property is used to specify the source code to compile, this can be a
relative path to buildspec file or an absolute path.
In this example the source file src/hello.f90
is relative path to where buildspec file is located.
The compilers
section declares compiler configuration, the name
property is required that is used to search compiler names from our buildtest configuration via regular
expression. In this example we use the builtin_gcc compiler as regular expression which is the system
gcc compiler provided by buildtest. The default
section specifies default compiler
configuration applicable to a specific compiler group like gcc. Within each compiler group we can specify
options like cflags
, fflags
, cxxflags
, ldflags
to customize compilation line.
buildspecs:
hello_f:
type: compiler
description: "Hello World Fortran Compilation"
executor: generic.local.bash
tags: [tutorials, compile]
source: "src/hello.f90"
compilers:
name: ["^(gcc_7.5.0)$"]
default:
gcc:
fflags: -Wall
Shown below is an example build for this test.
$ buildtest build -b /home/spack/buildtest/examples/compilers/gnu_hello_fortran.yml
╭─────────────────────────────────────────────────────── buildtest summary ───────────────────────────────────────────────────────╮
│ │
│ User: spack │
│ Hostname: f170978d3d4a │
│ Platform: Linux │
│ Current Time: 2022/03/18 20:27:47 │
│ buildtest path: /home/spack/buildtest/bin/buildtest │
│ buildtest version: 0.13.0 │
│ python path: /home/spack/pyenv/buildtest/bin/python3 │
│ python version: 3.8.6 │
│ Configuration File: /home/spack/buildtest/buildtest/settings/spack_container.yml │
│ Test Directory: /home/spack/runs │
│ Report File: /home/spack/buildtest/var/report.json │
│ Command: /home/spack/buildtest/bin/buildtest build -b /home/spack/buildtest/examples/compilers/gnu_hello_fortran.yml │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────────────────────────── Discovering Buildspecs ──────────────────────────────────────────────────────────────────────────────────
Discovered Buildspecs: 1
Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
Discovered buildspecs
╔════════════════════════════════════════════════════════════════╗
║ Buildspecs ║
╟────────────────────────────────────────────────────────────────╢
║ /home/spack/buildtest/examples/compilers/gnu_hello_fortran.yml ║
╚════════════════════════════════════════════════════════════════╝
──────────────────────────────────────────────────────────────────────────────────── Parsing Buildspecs ─────────────────────────────────────────────────────────────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/spack/buildtest/examples/compilers/gnu_hello_fortran.yml: VALID
Total builder objects created: 1
Total compiler builder: 1
Total script builder: 0
Total spack builder: 0
Compiler Builder Details
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Builder ┃ Executor ┃ Compiler ┃ description ┃ buildspecs ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ hello_f/339023ee │ generic.local.bash │ gcc_7.5.0 │ Hello World Fortran Compilation │ /home/spack/buildtest/examples/compilers/gnu_hello_fortran.yml │
└──────────────────┴────────────────────┴───────────┴─────────────────────────────────┴────────────────────────────────────────────────────────────────┘
─────────────────────────────────────────────────────────────────────────────────────── Building Test ───────────────────────────────────────────────────────────────────────────────────────
hello_f/339023ee: Creating test directory: /home/spack/runs/generic.local.bash/gnu_hello_fortran/hello_f/339023ee
hello_f/339023ee: Creating the stage directory: /home/spack/runs/generic.local.bash/gnu_hello_fortran/hello_f/339023ee/stage
hello_f/339023ee: Writing build script: /home/spack/runs/generic.local.bash/gnu_hello_fortran/hello_f/339023ee/hello_f_build.sh
─────────────────────────────────────────────────────────────────────────────────────── Running Tests ───────────────────────────────────────────────────────────────────────────────────────
Spawning 4 processes for processing builders
──────────────────────────────────────────────────────────────────────────────────────── Iteration 1 ────────────────────────────────────────────────────────────────────────────────────────
hello_f/339023ee does not have any dependencies adding test to queue
hello_f/339023ee: Running Test via command: bash --norc --noprofile -eo pipefail
hello_f_build.sh
hello_f/339023ee: Test completed in 0.153233 seconds
hello_f/339023ee: Test completed with returncode: 0
hello_f/339023ee: Writing output file - /home/spack/runs/generic.local.bash/gnu
_hello_fortran/hello_f/339023ee/hello_f.out
hello_f/339023ee: Writing error file - /home/spack/runs/generic.local.bash/gnu_h
ello_fortran/hello_f/339023ee/hello_f.err
In this iteration we are going to run the following tests: [hello_f/339023ee]
Test Summary
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Builder ┃ executor ┃ status ┃ Checks (ReturnCode, Regex, Runtime) ┃ ReturnCode ┃ Runtime ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ hello_f/339023ee │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.153233 │
└──────────────────┴────────────────────┴────────┴─────────────────────────────────────┴────────────┴──────────┘
Passed Tests: 1/1 Percentage: 100.000%
Failed Tests: 0/1 Percentage: 0.000%
Adding 1 test results to /home/spack/buildtest/var/report.json
Writing Logfile to: /home/spack/buildtest/var/logs/buildtest_xcxzeu97.log
The generated test for test name hello_f is the following:
$ buildtest inspect query -t hello_f
─────────────────────────────────────────────────────────────────────── hello_f/339023ee-002f-480e-bf47-9ade7a287eac ────────────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: Hello World Fortran Compilation
State: PASS
Returncode: 0
Runtime: 0.153233 sec
Starttime: 2022/03/18 20:27:47
Endtime: 2022/03/18 20:27:47
Command: bash --norc --noprofile -eo pipefail hello_f_build.sh
Test Script: /home/spack/runs/generic.local.bash/gnu_hello_fortran/hello_f/339023ee/hello_f.sh
Build Script: /home/spack/runs/generic.local.bash/gnu_hello_fortran/hello_f/339023ee/hello_f_build.sh
Output File: /home/spack/runs/generic.local.bash/gnu_hello_fortran/hello_f/339023ee/hello_f.out
Error File: /home/spack/runs/generic.local.bash/gnu_hello_fortran/hello_f/339023ee/hello_f.err
Log File: /home/spack/buildtest/var/logs/buildtest_xcxzeu97.log
─────────────────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/gnu_hello_fortran/hello_f/339023ee/hello_f.sh ────────────────────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=hello.f90.exe
6 # Compilation Line
7 /usr/bin/gfortran -Wall -o $_EXEC /home/spack/buildtest/examples/compilers/src/hello.f90
8
9
10 # Run executable
11 ./$_EXEC
12
13
How does buildtest detect programming language?¶
buildtest will detect the file extension of source file based specified by source
property
to detect programming language and generate the appropriate C, C++, or Fortran compilation line based
on language detected.
Shown below is the file extension table buildtest uses for determining the programming language.
Language |
File Extension |
---|---|
C |
.c |
C++ |
.cc .cxx .cpp .c++ |
Fortran |
.f90 .F90 .f95 .f .F .FOR .for .FTN .ftn |
How does buildtest search for compiler¶
Compilers are defined in your configuration file that is used by buildtest to search compilers.
In configuring compilers you will learn how one can define compiler, each compiler
instance will have a unique name and be under one of the compiler groups like gcc
, intel
, cray
, etc…
You can see the compiler declaration from our configuration file by running buildtest config compilers -y
which will display compiler settings in YAML format. Note that for each compiler instance one can define name of compiler
and path to cc
, fc
, cxx
wrapper. In addition one can specify module
property to map compiler instance
to modulefile. If module property is defined you can specify list of modules to load via load
property and buildtest will
automatically load these modules when using the compiler.
$ buildtest config compilers -y
gcc:
clang_6.0.0:
cc: /usr/bin/clang
cxx: /usr/bin/clang++
fc: None
gcc_6.5.0:
cc: gcc
cxx: g++
fc: gfortran
module:
load:
- gcc/6.5.0-gcc-7.5.0
gcc_7.5.0:
cc: /usr/bin/gcc
cxx: /usr/bin/g++
fc: /usr/bin/gfortran
gcc_8.3.0:
cc: gcc
cxx: g++
fc: gfortran
module:
load:
- gcc/8.3.0-gcc-7.5.0
buildtest selects compiler based on name
property which is a list of regular expression
applied for available compilers defined in buildtest configuration. In this next example, we will
compile an OpenACC code that will compute vector addition. We specify all gcc compilers
are used for building this test. The -fopenacc
compiler flag enables GNU compilers to compile OpenACC code,
we can set this via fflags
property. We can specify linker flags via ldflags
during compilation,
this code requires we specify -lm
flag to link with math library.
buildspecs:
vecadd_gnu:
type: compiler
description: Vector Addition example with GNU compiler
tags: [tutorials, compile]
executor: generic.local.bash
source: src/vecAdd.c
compilers:
name: ["^(gcc)"]
default:
gcc:
cflags: -fopenacc
ldflags: -lm
We expect buildtest to generate one test per gcc compiler as you can see below.
$ buildtest build -b /home/spack/buildtest/examples/compilers/vecadd.yml
╭───────────────────────────────────────────────── buildtest summary ──────────────────────────────────────────────────╮
│ │
│ User: spack │
│ Hostname: f170978d3d4a │
│ Platform: Linux │
│ Current Time: 2022/03/18 20:27:49 │
│ buildtest path: /home/spack/buildtest/bin/buildtest │
│ buildtest version: 0.13.0 │
│ python path: /home/spack/pyenv/buildtest/bin/python3 │
│ python version: 3.8.6 │
│ Configuration File: /home/spack/buildtest/buildtest/settings/spack_container.yml │
│ Test Directory: /home/spack/runs │
│ Report File: /home/spack/buildtest/var/report.json │
│ Command: /home/spack/buildtest/bin/buildtest build -b /home/spack/buildtest/examples/compilers/vecadd.yml │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────────────────────────── Discovering Buildspecs ──────────────────────────────────────────────────────────────────────────────────
Discovered Buildspecs: 1
Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
Discovered buildspecs
╔═════════════════════════════════════════════════════╗
║ Buildspecs ║
╟─────────────────────────────────────────────────────╢
║ /home/spack/buildtest/examples/compilers/vecadd.yml ║
╚═════════════════════════════════════════════════════╝
──────────────────────────────────────────────────────────────────────────────────── Parsing Buildspecs ─────────────────────────────────────────────────────────────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/spack/buildtest/examples/compilers/vecadd.yml: VALID
Total builder objects created: 3
Total compiler builder: 3
Total script builder: 0
Total spack builder: 0
Compiler Builder Details
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Builder ┃ Executor ┃ Compiler ┃ description ┃ buildspecs ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ vecadd_gnu/97cec93c │ generic.local.bash │ gcc_7.5.0 │ Vector Addition example with GNU compiler │ /home/spack/buildtest/examples/compilers/vecadd.yml │
├─────────────────────┼────────────────────┼───────────┼───────────────────────────────────────────┼─────────────────────────────────────────────────────┤
│ vecadd_gnu/f3882c07 │ generic.local.bash │ gcc_6.5.0 │ Vector Addition example with GNU compiler │ /home/spack/buildtest/examples/compilers/vecadd.yml │
├─────────────────────┼────────────────────┼───────────┼───────────────────────────────────────────┼─────────────────────────────────────────────────────┤
│ vecadd_gnu/2a0b411f │ generic.local.bash │ gcc_8.3.0 │ Vector Addition example with GNU compiler │ /home/spack/buildtest/examples/compilers/vecadd.yml │
└─────────────────────┴────────────────────┴───────────┴───────────────────────────────────────────┴─────────────────────────────────────────────────────┘
─────────────────────────────────────────────────────────────────────────────────────── Building Test ───────────────────────────────────────────────────────────────────────────────────────
vecadd_gnu/97cec93c: Creating test directory: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/97cec93c
vecadd_gnu/97cec93c: Creating the stage directory: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/97cec93c/stage
vecadd_gnu/97cec93c: Writing build script: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/97cec93c/vecadd_gnu_build.sh
vecadd_gnu/f3882c07: Creating test directory: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/f3882c07
vecadd_gnu/f3882c07: Creating the stage directory: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/f3882c07/stage
vecadd_gnu/f3882c07: Writing build script: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/f3882c07/vecadd_gnu_build.sh
vecadd_gnu/2a0b411f: Creating test directory: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/2a0b411f
vecadd_gnu/2a0b411f: Creating the stage directory: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/2a0b411f/stage
vecadd_gnu/2a0b411f: Writing build script: /home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/2a0b411f/vecadd_gnu_build.sh
─────────────────────────────────────────────────────────────────────────────────────── Running Tests ───────────────────────────────────────────────────────────────────────────────────────
Spawning 4 processes for processing builders
──────────────────────────────────────────────────────────────────────────────────────── Iteration 1 ────────────────────────────────────────────────────────────────────────────────────────
vecadd_gnu/2a0b411f does not have any dependencies adding test to queue
vecadd_gnu/f3882c07 does not have any dependencies adding test to queue
vecadd_gnu/97cec93c does not have any dependencies adding test to queue
vecadd_gnu/2a0b411f: Running Test via command: bash --norc --noprofile -eo
pipefail vecadd_gnu_build.sh
vecadd_gnu/f3882c07: Running Test via command: bash --norc --noprofile -eo
pipefail vecadd_gnu_build.sh
vecadd_gnu/97cec93c: Running Test via command: bash --norc --noprofile -eo
pipefail vecadd_gnu_build.sh
vecadd_gnu/f3882c07: Test completed in 0.207227 seconds
vecadd_gnu/f3882c07: Test completed with returncode: 0
vecadd_gnu/97cec93c: Test completed in 0.200343 seconds
vecadd_gnu/f3882c07: Writing output file -
/home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/f3882c07/vecadd_gnu.out
vecadd_gnu/f3882c07: Writing error file -
/home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/f3882c07/vecadd_gnu.err
vecadd_gnu/97cec93c: Test completed with returncode: 0
vecadd_gnu/97cec93c: Writing output file -
/home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/97cec93c/vecadd_gnu.out
vecadd_gnu/97cec93c: Writing error file -
/home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/97cec93c/vecadd_gnu.err
vecadd_gnu/2a0b411f: Test completed in 0.228976 seconds
vecadd_gnu/2a0b411f: Test completed with returncode: 0
vecadd_gnu/2a0b411f: Writing output file -
/home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/2a0b411f/vecadd_gnu.out
vecadd_gnu/2a0b411f: Writing error file -
/home/spack/runs/generic.local.bash/vecadd/vecadd_gnu/2a0b411f/vecadd_gnu.err
In this iteration we are going to run the following tests: [vecadd_gnu/2a0b411f, vecadd_gnu/f3882c07, vecadd_gnu/97cec93c]
Test Summary
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Builder ┃ executor ┃ status ┃ Checks (ReturnCode, Regex, Runtime) ┃ ReturnCode ┃ Runtime ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ vecadd_gnu/f3882c07 │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.207227 │
├─────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ vecadd_gnu/97cec93c │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.200343 │
├─────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ vecadd_gnu/2a0b411f │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.228976 │
└─────────────────────┴────────────────────┴────────┴─────────────────────────────────────┴────────────┴──────────┘
Passed Tests: 3/3 Percentage: 100.000%
Failed Tests: 0/3 Percentage: 0.000%
Adding 3 test results to /home/spack/buildtest/var/report.json
Writing Logfile to: /home/spack/buildtest/var/logs/buildtest_1u6aas1s.log
Customize Compiler Option¶
We can specify custom compiler options per compiler instance using the config
property.
In this next example, we have a Hello World C example that will specify different cflags
based on compiler name. We can specify default compiler setting via default
property. In this
example the default is -O1
. The config
section can be used to specify custom compiler
options for each compiler name.
buildspecs:
hello_c:
type: compiler
description: "Hello World C Compilation"
executor: generic.local.bash
tags: [tutorials, compile]
source: "src/hello.c"
compilers:
name: ["^(gcc)"]
default:
gcc:
cflags: -O1
config:
gcc_6.5.0:
cflags: -O2
gcc_8.3.0:
cflags: -O3
Let’s build this test, we will see there is one builder instance for each compiler.
$ buildtest build -b /home/spack/buildtest/examples/compilers/gnu_hello_c.yml
╭──────────────────────────────────────────────────── buildtest summary ────────────────────────────────────────────────────╮
│ │
│ User: spack │
│ Hostname: f170978d3d4a │
│ Platform: Linux │
│ Current Time: 2022/03/18 20:27:51 │
│ buildtest path: /home/spack/buildtest/bin/buildtest │
│ buildtest version: 0.13.0 │
│ python path: /home/spack/pyenv/buildtest/bin/python3 │
│ python version: 3.8.6 │
│ Configuration File: /home/spack/buildtest/buildtest/settings/spack_container.yml │
│ Test Directory: /home/spack/runs │
│ Report File: /home/spack/buildtest/var/report.json │
│ Command: /home/spack/buildtest/bin/buildtest build -b /home/spack/buildtest/examples/compilers/gnu_hello_c.yml │
│ │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────────────────────────── Discovering Buildspecs ──────────────────────────────────────────────────────────────────────────────────
Discovered Buildspecs: 1
Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
Discovered buildspecs
╔══════════════════════════════════════════════════════════╗
║ Buildspecs ║
╟──────────────────────────────────────────────────────────╢
║ /home/spack/buildtest/examples/compilers/gnu_hello_c.yml ║
╚══════════════════════════════════════════════════════════╝
──────────────────────────────────────────────────────────────────────────────────── Parsing Buildspecs ─────────────────────────────────────────────────────────────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/spack/buildtest/examples/compilers/gnu_hello_c.yml: VALID
Total builder objects created: 3
Total compiler builder: 3
Total script builder: 0
Total spack builder: 0
Compiler Builder Details
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Builder ┃ Executor ┃ Compiler ┃ description ┃ buildspecs ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ hello_c/a0a8c4a9 │ generic.local.bash │ gcc_7.5.0 │ Hello World C Compilation │ /home/spack/buildtest/examples/compilers/gnu_hello_c.yml │
├──────────────────┼────────────────────┼───────────┼───────────────────────────┼──────────────────────────────────────────────────────────┤
│ hello_c/e1d7f37a │ generic.local.bash │ gcc_6.5.0 │ Hello World C Compilation │ /home/spack/buildtest/examples/compilers/gnu_hello_c.yml │
├──────────────────┼────────────────────┼───────────┼───────────────────────────┼──────────────────────────────────────────────────────────┤
│ hello_c/8d2fdb0c │ generic.local.bash │ gcc_8.3.0 │ Hello World C Compilation │ /home/spack/buildtest/examples/compilers/gnu_hello_c.yml │
└──────────────────┴────────────────────┴───────────┴───────────────────────────┴──────────────────────────────────────────────────────────┘
─────────────────────────────────────────────────────────────────────────────────────── Building Test ───────────────────────────────────────────────────────────────────────────────────────
hello_c/a0a8c4a9: Creating test directory: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9
hello_c/a0a8c4a9: Creating the stage directory: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/stage
hello_c/a0a8c4a9: Writing build script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/hello_c_build.sh
hello_c/e1d7f37a: Creating test directory: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a
hello_c/e1d7f37a: Creating the stage directory: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/stage
hello_c/e1d7f37a: Writing build script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/hello_c_build.sh
hello_c/8d2fdb0c: Creating test directory: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c
hello_c/8d2fdb0c: Creating the stage directory: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/stage
hello_c/8d2fdb0c: Writing build script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/hello_c_build.sh
─────────────────────────────────────────────────────────────────────────────────────── Running Tests ───────────────────────────────────────────────────────────────────────────────────────
Spawning 4 processes for processing builders
──────────────────────────────────────────────────────────────────────────────────────── Iteration 1 ────────────────────────────────────────────────────────────────────────────────────────
hello_c/8d2fdb0c does not have any dependencies adding test to queue
hello_c/e1d7f37a does not have any dependencies adding test to queue
hello_c/a0a8c4a9 does not have any dependencies adding test to queue
hello_c/8d2fdb0c: Running Test via command: bash --norc --noprofile -eo pipefail
hello_c_build.sh
hello_c/e1d7f37a: Running Test via command: bash --norc --noprofile -eo pipefail
hello_c_build.sh
hello_c/a0a8c4a9: Running Test via command: bash --norc --noprofile -eo pipefail
hello_c_build.sh
hello_c/e1d7f37a: Test completed in 0.179623 seconds
hello_c/a0a8c4a9: Test completed in 0.176819 seconds
hello_c/e1d7f37a: Test completed with returncode: 0
hello_c/a0a8c4a9: Test completed with returncode: 0
hello_c/e1d7f37a: Writing output file -
/home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/hello_c.out
hello_c/a0a8c4a9: Writing output file -
/home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/hello_c.out
hello_c/8d2fdb0c: Test completed in 0.194887 seconds
hello_c/a0a8c4a9: Writing error file -
/home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/hello_c.err
hello_c/e1d7f37a: Writing error file -
/home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/hello_c.err
hello_c/8d2fdb0c: Test completed with returncode: 0
hello_c/8d2fdb0c: Writing output file -
/home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/hello_c.out
hello_c/8d2fdb0c: Writing error file -
/home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/hello_c.err
In this iteration we are going to run the following tests: [hello_c/8d2fdb0c, hello_c/e1d7f37a, hello_c/a0a8c4a9]
Test Summary
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Builder ┃ executor ┃ status ┃ Checks (ReturnCode, Regex, Runtime) ┃ ReturnCode ┃ Runtime ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ hello_c/8d2fdb0c │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.194887 │
├──────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ hello_c/e1d7f37a │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.179623 │
├──────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ hello_c/a0a8c4a9 │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.176819 │
└──────────────────┴────────────────────┴────────┴─────────────────────────────────────┴────────────┴──────────┘
Passed Tests: 3/3 Percentage: 100.000%
Failed Tests: 0/3 Percentage: 0.000%
Adding 3 test results to /home/spack/buildtest/var/report.json
Writing Logfile to: /home/spack/buildtest/var/logs/buildtest_q1wllz_r.log
If we inspect the following test, we see each test has its own compiler flags. The default cflag
is -O1
while gcc_6.5.0 will use -O2
and gcc_8.3.0 will use -O3
.
$ buildtest inspect query -t hello_c/
─────────────────────────────────────────────────────────────────────── hello_c/e1d7f37a-aab6-4e47-ba46-72e9ac894510 ────────────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: Hello World C Compilation
State: PASS
Returncode: 0
Runtime: 0.179623 sec
Starttime: 2022/03/18 20:27:51
Endtime: 2022/03/18 20:27:51
Command: bash --norc --noprofile -eo pipefail hello_c_build.sh
Test Script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/hello_c.sh
Build Script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/hello_c_build.sh
Output File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/hello_c.out
Error File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/hello_c.err
Log File: /home/spack/buildtest/var/logs/buildtest_q1wllz_r.log
────────────────────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/e1d7f37a/hello_c.sh ───────────────────────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=hello.c.exe
6 # Loading modules
7 module load gcc/6.5.0-gcc-7.5.0
8 # Compilation Line
9 gcc -O2 -o $_EXEC /home/spack/buildtest/examples/compilers/src/hello.c
10
11
12 # Run executable
13 ./$_EXEC
14
15
─────────────────────────────────────────────────────────────────────── hello_c/8d2fdb0c-d0f8-4bcb-b073-6d9cb60799ad ────────────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: Hello World C Compilation
State: PASS
Returncode: 0
Runtime: 0.194887 sec
Starttime: 2022/03/18 20:27:51
Endtime: 2022/03/18 20:27:51
Command: bash --norc --noprofile -eo pipefail hello_c_build.sh
Test Script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/hello_c.sh
Build Script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/hello_c_build.sh
Output File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/hello_c.out
Error File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/hello_c.err
Log File: /home/spack/buildtest/var/logs/buildtest_q1wllz_r.log
────────────────────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/8d2fdb0c/hello_c.sh ───────────────────────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=hello.c.exe
6 # Loading modules
7 module load gcc/8.3.0-gcc-7.5.0
8 # Compilation Line
9 gcc -O3 -o $_EXEC /home/spack/buildtest/examples/compilers/src/hello.c
10
11
12 # Run executable
13 ./$_EXEC
14
15
─────────────────────────────────────────────────────────────────────── hello_c/a0a8c4a9-e714-4431-89bf-06afffa63a5d ────────────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: Hello World C Compilation
State: PASS
Returncode: 0
Runtime: 0.176819 sec
Starttime: 2022/03/18 20:27:51
Endtime: 2022/03/18 20:27:51
Command: bash --norc --noprofile -eo pipefail hello_c_build.sh
Test Script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/hello_c.sh
Build Script: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/hello_c_build.sh
Output File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/hello_c.out
Error File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/hello_c.err
Log File: /home/spack/buildtest/var/logs/buildtest_q1wllz_r.log
────────────────────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/gnu_hello_c/hello_c/a0a8c4a9/hello_c.sh ───────────────────────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=hello.c.exe
6 # Compilation Line
7 /usr/bin/gcc -O1 -o $_EXEC /home/spack/buildtest/examples/compilers/src/hello.c
8
9
10 # Run executable
11 ./$_EXEC
12
13
Excluding Compilers¶
The exclude
property allows one to exclude compilers upon discovery which is a list of compiler
names that will be removed prior to building test. buildtest will exclude any compilers if they were
found based on regular expression via name
property. In this next example, we will exclude
gcc_6.5.0
compiler from building
buildspecs:
vecadd_gnu_exclude:
type: compiler
description: Vector Addition example with GNU compilers but exclude gcc_6.5.0
tags: [tutorials, compile]
executor: generic.local.bash
source: src/vecAdd.c
compilers:
name: ["^(gcc)"]
exclude: [gcc_6.5.0]
default:
gcc:
cflags: -fopenacc
ldflags: -lm
Now if we run this test, we will notice that there is only one build for this test even though buildtest
discovered both gcc_6.5.0
and gcc_8.3.0
compilers.
$ buildtest build -b /home/spack/buildtest/examples/compilers/compiler_exclude.yml
╭────────────────────────────────────────────────────── buildtest summary ───────────────────────────────────────────────────────╮
│ │
│ User: spack │
│ Hostname: f170978d3d4a │
│ Platform: Linux │
│ Current Time: 2022/03/18 20:27:52 │
│ buildtest path: /home/spack/buildtest/bin/buildtest │
│ buildtest version: 0.13.0 │
│ python path: /home/spack/pyenv/buildtest/bin/python3 │
│ python version: 3.8.6 │
│ Configuration File: /home/spack/buildtest/buildtest/settings/spack_container.yml │
│ Test Directory: /home/spack/runs │
│ Report File: /home/spack/buildtest/var/report.json │
│ Command: /home/spack/buildtest/bin/buildtest build -b /home/spack/buildtest/examples/compilers/compiler_exclude.yml │
│ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────────────────────────── Discovering Buildspecs ──────────────────────────────────────────────────────────────────────────────────
Discovered Buildspecs: 1
Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
Discovered buildspecs
╔═══════════════════════════════════════════════════════════════╗
║ Buildspecs ║
╟───────────────────────────────────────────────────────────────╢
║ /home/spack/buildtest/examples/compilers/compiler_exclude.yml ║
╚═══════════════════════════════════════════════════════════════╝
──────────────────────────────────────────────────────────────────────────────────── Parsing Buildspecs ─────────────────────────────────────────────────────────────────────────────────────
Excluding compiler: gcc_6.5.0 from test generation
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/spack/buildtest/examples/compilers/compiler_exclude.yml: VALID
Total builder objects created: 2
Total compiler builder: 2
Total script builder: 0
Total spack builder: 0
Compiler Builder Details
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Builder ┃ Executor ┃ Compiler ┃ description ┃ buildspecs ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ vecadd_gnu_exclude/46cc9348 │ generic.local.bash │ gcc_7.5.0 │ Vector Addition example with GNU compilers but exclude │ /home/spack/buildtest/examples/compilers/compiler_exclude.ym │
│ │ │ │ gcc_6.5.0 │ l │
├─────────────────────────────┼────────────────────┼───────────┼─────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────┤
│ vecadd_gnu_exclude/b26f6df0 │ generic.local.bash │ gcc_8.3.0 │ Vector Addition example with GNU compilers but exclude │ /home/spack/buildtest/examples/compilers/compiler_exclude.ym │
│ │ │ │ gcc_6.5.0 │ l │
└─────────────────────────────┴────────────────────┴───────────┴─────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────┘
─────────────────────────────────────────────────────────────────────────────────────── Building Test ───────────────────────────────────────────────────────────────────────────────────────
vecadd_gnu_exclude/46cc9348: Creating test directory: /home/spack/runs/generic.local.bash/compiler_exclude/vecadd_gnu_exclude/46cc9348
vecadd_gnu_exclude/46cc9348: Creating the stage directory: /home/spack/runs/generic.local.bash/compiler_exclude/vecadd_gnu_exclude/46cc9348/stage
vecadd_gnu_exclude/46cc9348: Writing build script: /home/spack/runs/generic.local.bash/compiler_exclude/vecadd_gnu_exclude/46cc9348/vecadd_gnu_exclude_build.sh
vecadd_gnu_exclude/b26f6df0: Creating test directory: /home/spack/runs/generic.local.bash/compiler_exclude/vecadd_gnu_exclude/b26f6df0
vecadd_gnu_exclude/b26f6df0: Creating the stage directory: /home/spack/runs/generic.local.bash/compiler_exclude/vecadd_gnu_exclude/b26f6df0/stage
vecadd_gnu_exclude/b26f6df0: Writing build script: /home/spack/runs/generic.local.bash/compiler_exclude/vecadd_gnu_exclude/b26f6df0/vecadd_gnu_exclude_build.sh
─────────────────────────────────────────────────────────────────────────────────────── Running Tests ───────────────────────────────────────────────────────────────────────────────────────
Spawning 4 processes for processing builders
──────────────────────────────────────────────────────────────────────────────────────── Iteration 1 ────────────────────────────────────────────────────────────────────────────────────────
vecadd_gnu_exclude/b26f6df0 does not have any dependencies adding test to queue
vecadd_gnu_exclude/46cc9348 does not have any dependencies adding test to queue
vecadd_gnu_exclude/b26f6df0: Running Test via command: bash --norc --noprofile
-eo pipefail vecadd_gnu_exclude_build.sh
vecadd_gnu_exclude/46cc9348: Running Test via command: bash --norc --noprofile
-eo pipefail vecadd_gnu_exclude_build.sh
vecadd_gnu_exclude/b26f6df0: Test completed in 0.134306 seconds
vecadd_gnu_exclude/b26f6df0: Test completed with returncode: 0
vecadd_gnu_exclude/b26f6df0: Writing output file - /home/spack/runs/generic.loc
al.bash/compiler_exclude/vecadd_gnu_exclude/b26f6df0/vecadd_gnu_exclude.out
vecadd_gnu_exclude/b26f6df0: Writing error file - /home/spack/runs/generic.local
.bash/compiler_exclude/vecadd_gnu_exclude/b26f6df0/vecadd_gnu_exclude.err
vecadd_gnu_exclude/46cc9348: Test completed in 0.145024 seconds
vecadd_gnu_exclude/46cc9348: Test completed with returncode: 0
vecadd_gnu_exclude/46cc9348: Writing output file - /home/spack/runs/generic.loc
al.bash/compiler_exclude/vecadd_gnu_exclude/46cc9348/vecadd_gnu_exclude.out
vecadd_gnu_exclude/46cc9348: Writing error file - /home/spack/runs/generic.local
.bash/compiler_exclude/vecadd_gnu_exclude/46cc9348/vecadd_gnu_exclude.err
In this iteration we are going to run the following tests: [vecadd_gnu_exclude/46cc9348, vecadd_gnu_exclude/b26f6df0]
Test Summary
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Builder ┃ executor ┃ status ┃ Checks (ReturnCode, Regex, Runtime) ┃ ReturnCode ┃ Runtime ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ vecadd_gnu_exclude/b26f6df0 │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.134306 │
├─────────────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ vecadd_gnu_exclude/46cc9348 │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.145024 │
└─────────────────────────────┴────────────────────┴────────┴─────────────────────────────────────┴────────────┴──────────┘
Passed Tests: 2/2 Percentage: 100.000%
Failed Tests: 0/2 Percentage: 0.000%
Adding 2 test results to /home/spack/buildtest/var/report.json
Writing Logfile to: /home/spack/buildtest/var/logs/buildtest_pftgbuvw.log
Setting environment variables¶
We can define environment variables using env
property which is a list of
key/value pair where key is environment name and value is a string assigned to the environment.
The env
property can be used in default
or config
section within a compiler instance.
In this next example we have an OpenMP Hello World example which defines environment variable
OMP_NUM_THREADS that controls number of OpenMP threads to use when running program. In this example
we will set OMP_NUM_THREADS=2
buildspecs:
openmp_hello_c_example:
type: compiler
description: OpenMP Hello World C example
executor: generic.local.bash
tags: [tutorials, compile]
source: "src/hello_omp.c"
compilers:
name: ["^(gcc_7.5.0)"]
default:
gcc:
cflags: -fopenmp
env:
OMP_NUM_THREADS: 2
Now let’s build this test.
$ buildtest build -b /home/spack/buildtest/examples/compilers/openmp_hello.yml
╭──────────────────────────────────────────────────── buildtest summary ─────────────────────────────────────────────────────╮
│ │
│ User: spack │
│ Hostname: f170978d3d4a │
│ Platform: Linux │
│ Current Time: 2022/03/18 20:27:53 │
│ buildtest path: /home/spack/buildtest/bin/buildtest │
│ buildtest version: 0.13.0 │
│ python path: /home/spack/pyenv/buildtest/bin/python3 │
│ python version: 3.8.6 │
│ Configuration File: /home/spack/buildtest/buildtest/settings/spack_container.yml │
│ Test Directory: /home/spack/runs │
│ Report File: /home/spack/buildtest/var/report.json │
│ Command: /home/spack/buildtest/bin/buildtest build -b /home/spack/buildtest/examples/compilers/openmp_hello.yml │
│ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────────────────────────── Discovering Buildspecs ──────────────────────────────────────────────────────────────────────────────────
Discovered Buildspecs: 1
Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
Discovered buildspecs
╔═══════════════════════════════════════════════════════════╗
║ Buildspecs ║
╟───────────────────────────────────────────────────────────╢
║ /home/spack/buildtest/examples/compilers/openmp_hello.yml ║
╚═══════════════════════════════════════════════════════════╝
──────────────────────────────────────────────────────────────────────────────────── Parsing Buildspecs ─────────────────────────────────────────────────────────────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/spack/buildtest/examples/compilers/openmp_hello.yml: VALID
Total builder objects created: 1
Total compiler builder: 1
Total script builder: 0
Total spack builder: 0
Compiler Builder Details
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Builder ┃ Executor ┃ Compiler ┃ description ┃ buildspecs ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ openmp_hello_c_example/a03b3d73 │ generic.local.bash │ gcc_7.5.0 │ OpenMP Hello World C example │ /home/spack/buildtest/examples/compilers/openmp_hello.yml │
└─────────────────────────────────┴────────────────────┴───────────┴──────────────────────────────┴───────────────────────────────────────────────────────────┘
─────────────────────────────────────────────────────────────────────────────────────── Building Test ───────────────────────────────────────────────────────────────────────────────────────
openmp_hello_c_example/a03b3d73: Creating test directory: /home/spack/runs/generic.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73
openmp_hello_c_example/a03b3d73: Creating the stage directory: /home/spack/runs/generic.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73/stage
openmp_hello_c_example/a03b3d73: Writing build script: /home/spack/runs/generic.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73/openmp_hello_c_example_build.sh
─────────────────────────────────────────────────────────────────────────────────────── Running Tests ───────────────────────────────────────────────────────────────────────────────────────
Spawning 4 processes for processing builders
──────────────────────────────────────────────────────────────────────────────────────── Iteration 1 ────────────────────────────────────────────────────────────────────────────────────────
openmp_hello_c_example/a03b3d73 does not have any dependencies adding test to queue
openmp_hello_c_example/a03b3d73: Running Test via command: bash --norc
--noprofile -eo pipefail openmp_hello_c_example_build.sh
openmp_hello_c_example/a03b3d73: Test completed in 0.065993 seconds
openmp_hello_c_example/a03b3d73: Test completed with returncode: 0
openmp_hello_c_example/a03b3d73: Writing output file - /home/spack/runs/generic
.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73/openmp_hello_c_example.
out
openmp_hello_c_example/a03b3d73: Writing error file - /home/spack/runs/generic.l
ocal.bash/openmp_hello/openmp_hello_c_example/a03b3d73/openmp_hello_c_example.er
r
In this iteration we are going to run the following tests: [openmp_hello_c_example/a03b3d73]
Test Summary
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Builder ┃ executor ┃ status ┃ Checks (ReturnCode, Regex, Runtime) ┃ ReturnCode ┃ Runtime ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ openmp_hello_c_example/a03b3d73 │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 0.065993 │
└─────────────────────────────────┴────────────────────┴────────┴─────────────────────────────────────┴────────────┴──────────┘
Passed Tests: 1/1 Percentage: 100.000%
Failed Tests: 0/1 Percentage: 0.000%
Adding 1 test results to /home/spack/buildtest/var/report.json
Writing Logfile to: /home/spack/buildtest/var/logs/buildtest_1z4eqqte.log
We can see the generated test using buildtest inspect query
given the name of test. Take a close
look at the export OMP_NUM_THREADS
in the generated test.
$ buildtest inspect query -t openmp_hello_c_example
──────────────────────────────────────────────────────────────── openmp_hello_c_example/a03b3d73-9d89-46ad-b180-b16560966e92 ────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: OpenMP Hello World C example
State: PASS
Returncode: 0
Runtime: 0.065993 sec
Starttime: 2022/03/18 20:27:54
Endtime: 2022/03/18 20:27:54
Command: bash --norc --noprofile -eo pipefail openmp_hello_c_example_build.sh
Test Script: /home/spack/runs/generic.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73/openmp_hello_c_example.sh
Build Script: /home/spack/runs/generic.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73/openmp_hello_c_example_build.sh
Output File: /home/spack/runs/generic.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73/openmp_hello_c_example.out
Error File: /home/spack/runs/generic.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73/openmp_hello_c_example.err
Log File: /home/spack/buildtest/var/logs/buildtest_1z4eqqte.log
─────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/openmp_hello/openmp_hello_c_example/a03b3d73/openmp_hello_c_example.sh ───────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=hello_omp.c.exe
6 export OMP_NUM_THREADS="2"
7 # Compilation Line
8 /usr/bin/gcc -fopenmp -o $_EXEC /home/spack/buildtest/examples/compilers/src/hello_omp.c
9
10
11 # Run executable
12 ./$_EXEC
13
14
We can define environment variables per compiler instance. buildtest will automatically override
any key in defaults
with one matched under config
for the compiler name. In this next example,
we will define OMP_NUM_THREADS to 4 for gcc_8.3.0 while the default is 2 for all gcc compilers.
buildspecs:
override_environmentvars:
type: compiler
description: override default environment variables
executor: generic.local.bash
tags: [tutorials, compile]
source: "src/hello_omp.c"
compilers:
name: ['^(gcc_7.5.0|gcc_8.3.0)']
default:
gcc:
cflags: -fopenmp
env:
OMP_NUM_THREADS: 2
config:
gcc_8.3.0:
env:
OMP_NUM_THREADS: 4
We can build this test by running:
buildtest build -b $BUILDTEST_ROOT/examples/compilers/envvar_override.yml
Next, let’s see the generated test by running buildtest inspect query -d all -t override_environmentvars
. The
-d all
will display all test records for override_environmentvars
. Take a note that we have
export OMP_NUM_THREADS=4
for gcc_8.3.0 test and export OMP_NUM_THREADS=2
for system gcc.
$ buildtest inspect query -t override_environmentvars/
─────────────────────────────────────────────────────────────── override_environmentvars/8da65eb9-fa63-455a-b864-aa1f0f81e0b2 ───────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: override default environment variables
State: PASS
Returncode: 0
Runtime: 0.139843 sec
Starttime: 2022/03/18 20:27:55
Endtime: 2022/03/18 20:27:55
Command: bash --norc --noprofile -eo pipefail override_environmentvars_build.sh
Test Script: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/8da65eb9/override_environmentvars.sh
Build Script: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/8da65eb9/override_environmentvars_build.sh
Output File: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/8da65eb9/override_environmentvars.out
Error File: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/8da65eb9/override_environmentvars.err
Log File: /home/spack/buildtest/var/logs/buildtest_vb7vj8l_.log
─────────────────────────────── Test File: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/8da65eb9/override_environmentvars.sh ────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=hello_omp.c.exe
6 export OMP_NUM_THREADS="4"
7 # Loading modules
8 module load gcc/8.3.0-gcc-7.5.0
9 # Compilation Line
10 gcc -fopenmp -o $_EXEC /home/spack/buildtest/examples/compilers/src/hello_omp.c
11
12
13 # Run executable
14 ./$_EXEC
15
16
─────────────────────────────────────────────────────────────── override_environmentvars/687d988d-e8fe-429f-94ab-8bec1df87e16 ───────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: override default environment variables
State: PASS
Returncode: 0
Runtime: 0.100356 sec
Starttime: 2022/03/18 20:27:55
Endtime: 2022/03/18 20:27:55
Command: bash --norc --noprofile -eo pipefail override_environmentvars_build.sh
Test Script: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/687d988d/override_environmentvars.sh
Build Script: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/687d988d/override_environmentvars_build.sh
Output File: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/687d988d/override_environmentvars.out
Error File: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/687d988d/override_environmentvars.err
Log File: /home/spack/buildtest/var/logs/buildtest_vb7vj8l_.log
─────────────────────────────── Test File: /home/spack/runs/generic.local.bash/envvar_override/override_environmentvars/687d988d/override_environmentvars.sh ────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=hello_omp.c.exe
6 export OMP_NUM_THREADS="2"
7 # Compilation Line
8 /usr/bin/gcc -fopenmp -o $_EXEC /home/spack/buildtest/examples/compilers/src/hello_omp.c
9
10
11 # Run executable
12 ./$_EXEC
13
14
Tweak how test are passed¶
The status
property is used to determine how buildtest will determine status of test (PASS/FAIL).
By default, an exitcode 0 is a PASS and anything else is FAIL.
Sometimes, it may be useful check output of test to determine using regular expression. This
can be done via regex
property. In this example, we define two tests, the first one defines status
property in the default gcc group. This means all compilers that belong to gcc
group will be matched based on returncode.
In second test we override the status
property for a given compiler instance under the config
section.
The test is expected to produce output of final result: 1.000000
but we will specify a different value in order to
show this test will fail.
buildspecs:
default_status_returncode:
type: compiler
description: status check based on returncode
tags: [tutorials, compile]
executor: generic.local.bash
source: src/vecAdd.c
compilers:
name: ["^(gcc)"]
default:
gcc:
cflags: -fopenacc
ldflags: -lm
status:
returncode: 0
override_status_regex:
type: compiler
description: override 'status' property in compiler gcc_8.3.0 instance
tags: [tutorials, compile]
executor: generic.local.bash
source: src/vecAdd.c
compilers:
name: ["^(gcc)"]
default:
gcc:
cflags: -fopenacc
ldflags: -lm
status:
returncode: 1
config:
gcc_8.3.0:
status:
regex:
stream: stdout
exp: "^final result: 0.99$"
If we build this test, we should expect the first test example should pass based on
returncode 0. If the returncode doesn’t match buildtest will report failure. For the second test example,
we have have specified test will pass if we get a returncode 1 based on default
property however for
gcc_8.3.0
compiler test we have defined a status
property to check based on regular expression.
We will expect both tests to fail since we will have a mismatch on returncode and regular expression
$ buildtest build -b /home/spack/buildtest/examples/compilers/compiler_status_regex.yml
╭───────────────────────────────────────────────────────── buildtest summary ─────────────────────────────────────────────────────────╮
│ │
│ User: spack │
│ Hostname: f170978d3d4a │
│ Platform: Linux │
│ Current Time: 2022/03/18 20:27:57 │
│ buildtest path: /home/spack/buildtest/bin/buildtest │
│ buildtest version: 0.13.0 │
│ python path: /home/spack/pyenv/buildtest/bin/python3 │
│ python version: 3.8.6 │
│ Configuration File: /home/spack/buildtest/buildtest/settings/spack_container.yml │
│ Test Directory: /home/spack/runs │
│ Report File: /home/spack/buildtest/var/report.json │
│ Command: /home/spack/buildtest/bin/buildtest build -b /home/spack/buildtest/examples/compilers/compiler_status_regex.yml │
│ │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────────────────────────── Discovering Buildspecs ──────────────────────────────────────────────────────────────────────────────────
Discovered Buildspecs: 1
Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
Discovered buildspecs
╔════════════════════════════════════════════════════════════════════╗
║ Buildspecs ║
╟────────────────────────────────────────────────────────────────────╢
║ /home/spack/buildtest/examples/compilers/compiler_status_regex.yml ║
╚════════════════════════════════════════════════════════════════════╝
──────────────────────────────────────────────────────────────────────────────────── Parsing Buildspecs ─────────────────────────────────────────────────────────────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/spack/buildtest/examples/compilers/compiler_status_regex.yml: VALID
Total builder objects created: 6
Total compiler builder: 6
Total script builder: 0
Total spack builder: 0
Compiler Builder Details
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Builder ┃ Executor ┃ Compiler ┃ description ┃ buildspecs ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ default_status_returncode/0d46a9b3 │ generic.local.bash │ gcc_7.5.0 │ status check based on returncode │ /home/spack/buildtest/examples/compilers/compiler_status │
│ │ │ │ │ _regex.yml │
├────────────────────────────────────┼────────────────────┼───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────┤
│ default_status_returncode/83e1caf9 │ generic.local.bash │ gcc_6.5.0 │ status check based on returncode │ /home/spack/buildtest/examples/compilers/compiler_status │
│ │ │ │ │ _regex.yml │
├────────────────────────────────────┼────────────────────┼───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────┤
│ default_status_returncode/aeb7a9fb │ generic.local.bash │ gcc_8.3.0 │ status check based on returncode │ /home/spack/buildtest/examples/compilers/compiler_status │
│ │ │ │ │ _regex.yml │
├────────────────────────────────────┼────────────────────┼───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────┤
│ override_status_regex/9bbd537c │ generic.local.bash │ gcc_7.5.0 │ override 'status' property in compiler gcc_8.3.0 │ /home/spack/buildtest/examples/compilers/compiler_status │
│ │ │ │ instance │ _regex.yml │
├────────────────────────────────────┼────────────────────┼───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────┤
│ override_status_regex/f56b56e5 │ generic.local.bash │ gcc_6.5.0 │ override 'status' property in compiler gcc_8.3.0 │ /home/spack/buildtest/examples/compilers/compiler_status │
│ │ │ │ instance │ _regex.yml │
├────────────────────────────────────┼────────────────────┼───────────┼──────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────┤
│ override_status_regex/c3fab452 │ generic.local.bash │ gcc_8.3.0 │ override 'status' property in compiler gcc_8.3.0 │ /home/spack/buildtest/examples/compilers/compiler_status │
│ │ │ │ instance │ _regex.yml │
└────────────────────────────────────┴────────────────────┴───────────┴──────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────┘
─────────────────────────────────────────────────────────────────────────────────────── Building Test ───────────────────────────────────────────────────────────────────────────────────────
default_status_returncode/0d46a9b3: Creating test directory: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/0d46a9b3
default_status_returncode/0d46a9b3: Creating the stage directory: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/0d46a9b3/stage
default_status_returncode/0d46a9b3: Writing build script: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/0d46a9b3/default_status_returncode_build.sh
default_status_returncode/83e1caf9: Creating test directory: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/83e1caf9
default_status_returncode/83e1caf9: Creating the stage directory: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/83e1caf9/stage
default_status_returncode/83e1caf9: Writing build script: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/83e1caf9/default_status_returncode_build.sh
default_status_returncode/aeb7a9fb: Creating test directory: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/aeb7a9fb
default_status_returncode/aeb7a9fb: Creating the stage directory: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/aeb7a9fb/stage
default_status_returncode/aeb7a9fb: Writing build script: /home/spack/runs/generic.local.bash/compiler_status_regex/default_status_returncode/aeb7a9fb/default_status_returncode_build.sh
override_status_regex/9bbd537c: Creating test directory: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/9bbd537c
override_status_regex/9bbd537c: Creating the stage directory: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/9bbd537c/stage
override_status_regex/9bbd537c: Writing build script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/9bbd537c/override_status_regex_build.sh
override_status_regex/f56b56e5: Creating test directory: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/f56b56e5
override_status_regex/f56b56e5: Creating the stage directory: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/f56b56e5/stage
override_status_regex/f56b56e5: Writing build script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/f56b56e5/override_status_regex_build.sh
override_status_regex/c3fab452: Creating test directory: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/c3fab452
override_status_regex/c3fab452: Creating the stage directory: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/c3fab452/stage
override_status_regex/c3fab452: Writing build script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/c3fab452/override_status_regex_build.sh
─────────────────────────────────────────────────────────────────────────────────────── Running Tests ───────────────────────────────────────────────────────────────────────────────────────
Spawning 4 processes for processing builders
──────────────────────────────────────────────────────────────────────────────────────── Iteration 1 ────────────────────────────────────────────────────────────────────────────────────────
default_status_returncode/83e1caf9 does not have any dependencies adding test to queue
default_status_returncode/aeb7a9fb does not have any dependencies adding test to queue
default_status_returncode/0d46a9b3 does not have any dependencies adding test to queue
override_status_regex/c3fab452 does not have any dependencies adding test to queue
override_status_regex/9bbd537c does not have any dependencies adding test to queue
override_status_regex/f56b56e5 does not have any dependencies adding test to queue
default_status_returncode/83e1caf9: Running Test via command: bash --norc
--noprofile -eo pipefail default_status_returncode_build.sh
override_status_regex/c3fab452: Running Test via command: bash --norc
--noprofile -eo pipefail override_status_regex_build.sh
default_status_returncode/0d46a9b3: Running Test via command: bash --norc
--noprofile -eo pipefail default_status_returncode_build.sh
default_status_returncode/aeb7a9fb: Running Test via command: bash --norc
--noprofile -eo pipefail default_status_returncode_build.sh
default_status_returncode/83e1caf9: Test completed in 0.19217 seconds
default_status_returncode/83e1caf9: Test completed with returncode: 0
default_status_returncode/83e1caf9: Writing output file - /home/spack/runs/gene
ric.local.bash/compiler_status_regex/default_status_returncode/83e1caf9/default_
status_returncode.out
default_status_returncode/83e1caf9: Writing error file - /home/spack/runs/generi
c.local.bash/compiler_status_regex/default_status_returncode/83e1caf9/default_st
atus_returncode.err
default_status_returncode/83e1caf9: Checking returncode - 0 is matched in list
[0]
default_status_returncode/0d46a9b3: Test completed in 0.213665 seconds
default_status_returncode/0d46a9b3: Test completed with returncode: 0
default_status_returncode/aeb7a9fb: Test completed in 0.21168 seconds
default_status_returncode/0d46a9b3: Writing output file - /home/spack/runs/gene
ric.local.bash/compiler_status_regex/default_status_returncode/0d46a9b3/default_
status_returncode.out
default_status_returncode/aeb7a9fb: Test completed with returncode: 0
override_status_regex/c3fab452: Test completed in 0.23273 seconds
default_status_returncode/0d46a9b3: Writing error file - /home/spack/runs/generi
c.local.bash/compiler_status_regex/default_status_returncode/0d46a9b3/default_st
atus_returncode.err
default_status_returncode/aeb7a9fb: Writing output file - /home/spack/runs/gene
ric.local.bash/compiler_status_regex/default_status_returncode/aeb7a9fb/default_
status_returncode.out
override_status_regex/c3fab452: Test completed with returncode: 0
default_status_returncode/aeb7a9fb: Writing error file - /home/spack/runs/generi
c.local.bash/compiler_status_regex/default_status_returncode/aeb7a9fb/default_st
atus_returncode.err
override_status_regex/c3fab452: Writing output file - /home/spack/runs/generic.
local.bash/compiler_status_regex/override_status_regex/c3fab452/override_status_
regex.out
default_status_returncode/0d46a9b3: Checking returncode - 0 is matched in list
[0]
override_status_regex/c3fab452: Writing error file - /home/spack/runs/generic.lo
cal.bash/compiler_status_regex/override_status_regex/c3fab452/override_status_re
gex.err
default_status_returncode/aeb7a9fb: Checking returncode - 0 is matched in list
[0]
override_status_regex/c3fab452: performing regular expression - '^final result:
0.99$' on file: /home/spack/runs/generic.local.bash/compiler_status_regex/overri
de_status_regex/c3fab452/override_status_regex.out
override_status_regex/c3fab452: Regular Expression Match - Failed!
override_status_regex/9bbd537c: Running Test via command: bash --norc
--noprofile -eo pipefail override_status_regex_build.sh
override_status_regex/f56b56e5: Running Test via command: bash --norc
--noprofile -eo pipefail override_status_regex_build.sh
override_status_regex/9bbd537c: Test completed in 0.107907 seconds
override_status_regex/9bbd537c: Test completed with returncode: 0
override_status_regex/f56b56e5: Test completed in 0.113869 seconds
override_status_regex/9bbd537c: Writing output file - /home/spack/runs/generic.
local.bash/compiler_status_regex/override_status_regex/9bbd537c/override_status_
regex.out
override_status_regex/f56b56e5: Test completed with returncode: 0
override_status_regex/9bbd537c: Writing error file - /home/spack/runs/generic.lo
cal.bash/compiler_status_regex/override_status_regex/9bbd537c/override_status_re
gex.err
override_status_regex/f56b56e5: Writing output file - /home/spack/runs/generic.
local.bash/compiler_status_regex/override_status_regex/f56b56e5/override_status_
regex.out
override_status_regex/9bbd537c: Checking returncode - 0 is matched in list [1]
override_status_regex/f56b56e5: Writing error file - /home/spack/runs/generic.lo
cal.bash/compiler_status_regex/override_status_regex/f56b56e5/override_status_re
gex.err
override_status_regex/f56b56e5: Checking returncode - 0 is matched in list [1]
In this iteration we are going to run the following tests: [default_status_returncode/83e1caf9, default_status_returncode/aeb7a9fb, default_status_returncode/0d46a9b3, override_status_regex/c3fab452, override_status_regex/9bbd537c, override_status_regex/f56b56e5]
Test Summary
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Builder ┃ executor ┃ status ┃ Checks (ReturnCode, Regex, Runtime) ┃ ReturnCode ┃ Runtime ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ default_status_returncode/83e1caf9 │ generic.local.bash │ PASS │ True False False │ 0 │ 0.19217 │
├────────────────────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ override_status_regex/f56b56e5 │ generic.local.bash │ FAIL │ False False False │ 0 │ 0.113869 │
├────────────────────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ override_status_regex/9bbd537c │ generic.local.bash │ FAIL │ False False False │ 0 │ 0.107907 │
├────────────────────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ override_status_regex/c3fab452 │ generic.local.bash │ FAIL │ False False False │ 0 │ 0.23273 │
├────────────────────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ default_status_returncode/aeb7a9fb │ generic.local.bash │ PASS │ True False False │ 0 │ 0.21168 │
├────────────────────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ default_status_returncode/0d46a9b3 │ generic.local.bash │ PASS │ True False False │ 0 │ 0.213665 │
└────────────────────────────────────┴────────────────────┴────────┴─────────────────────────────────────┴────────────┴──────────┘
Passed Tests: 3/6 Percentage: 50.000%
Failed Tests: 3/6 Percentage: 50.000%
Adding 6 test results to /home/spack/buildtest/var/report.json
Writing Logfile to: /home/spack/buildtest/var/logs/buildtest_ysjq4lge.log
For the second test, we see the generated output is final result: 1.000000 but our regular expression has a different expected value therefore this test will fail even though we have a exitcode of 0.
$ buildtest inspect query -o override_status_regex/
──────────────────────────────────────────────────────────────── override_status_regex/9bbd537c-54c0-4f9e-8082-c8c25e62065e ─────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: override 'status' property in compiler gcc_8.3.0 instance
State: FAIL
Returncode: 0
Runtime: 0.107907 sec
Starttime: 2022/03/18 20:27:58
Endtime: 2022/03/18 20:27:58
Command: bash --norc --noprofile -eo pipefail override_status_regex_build.sh
Test Script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/9bbd537c/override_status_regex.sh
Build Script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/9bbd537c/override_status_regex_build.sh
Output File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/9bbd537c/override_status_regex.out
Error File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/9bbd537c/override_status_regex.err
Log File: /home/spack/buildtest/var/logs/buildtest_ysjq4lge.log
────────────────────────────── Output File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/9bbd537c/override_status_regex.out ──────────────────────────────
final result: 1.000000
──────────────────────────────────────────────────────────────── override_status_regex/f56b56e5-14b0-485d-80dd-4671f778b3ad ─────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: override 'status' property in compiler gcc_8.3.0 instance
State: FAIL
Returncode: 0
Runtime: 0.113869 sec
Starttime: 2022/03/18 20:27:58
Endtime: 2022/03/18 20:27:58
Command: bash --norc --noprofile -eo pipefail override_status_regex_build.sh
Test Script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/f56b56e5/override_status_regex.sh
Build Script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/f56b56e5/override_status_regex_build.sh
Output File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/f56b56e5/override_status_regex.out
Error File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/f56b56e5/override_status_regex.err
Log File: /home/spack/buildtest/var/logs/buildtest_ysjq4lge.log
────────────────────────────── Output File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/f56b56e5/override_status_regex.out ──────────────────────────────
final result: 1.000000
──────────────────────────────────────────────────────────────── override_status_regex/c3fab452-3b93-460b-9f43-96200338fe9e ─────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: override 'status' property in compiler gcc_8.3.0 instance
State: FAIL
Returncode: 0
Runtime: 0.23273 sec
Starttime: 2022/03/18 20:27:57
Endtime: 2022/03/18 20:27:58
Command: bash --norc --noprofile -eo pipefail override_status_regex_build.sh
Test Script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/c3fab452/override_status_regex.sh
Build Script: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/c3fab452/override_status_regex_build.sh
Output File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/c3fab452/override_status_regex.out
Error File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/c3fab452/override_status_regex.err
Log File: /home/spack/buildtest/var/logs/buildtest_ysjq4lge.log
────────────────────────────── Output File: /home/spack/runs/generic.local.bash/compiler_status_regex/override_status_regex/c3fab452/override_status_regex.out ──────────────────────────────
final result: 1.000000
Customize Run Line¶
buildtest will define variable _EXEC
in the job script that can be used to reference
the generated binary. By default, buildtest will run the program standalone, but sometimes you
may want to customize how job is run. This may include passing arguments or running
binary through a job/mpi launcher. The run
property can be used to configure how program is executed.
The compiled executable will be present in local directory which can be accessed via ./$_EXEC
. In example below
we pass arguments 1 3
for builtin_gcc compiler and 100 200
for gcc_8.3.0 compiler.
buildspecs:
custom_run_by_compilers:
type: compiler
description: Customize binary launch based on compiler
executor: generic.local.bash
tags: [tutorials, compile]
source: "src/argc.c"
compilers:
name: ["^(gcc_7.5.0|gcc_8.3.0)"]
config:
gcc_7.5.0:
run: ./$_EXEC 1 3
gcc_8.3.0:
run: ./$_EXEC 100 120
You can build this test by running the following:
buildtest build -b $BUILDTEST_ROOT/examples/compilers/custom_run.yml
Once test is complete let’s inspect the generated test. We see that buildtest will insert the line specified
by run
property after compilation and run the executable.
$ buildtest inspect query -b -t custom_run_by_compilers/
─────────────────────────────────────────────────────────────── custom_run_by_compilers/2c066970-ab50-4e6d-927b-d683616c3673 ────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: Customize binary launch based on compiler
State: PASS
Returncode: 0
Runtime: 0.097202 sec
Starttime: 2022/03/18 20:27:59
Endtime: 2022/03/18 20:28:00
Command: bash --norc --noprofile -eo pipefail custom_run_by_compilers_build.sh
Test Script: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970/custom_run_by_compilers.sh
Build Script: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970/custom_run_by_compilers_build.sh
Output File: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970/custom_run_by_compilers.out
Error File: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970/custom_run_by_compilers.err
Log File: /home/spack/buildtest/var/logs/buildtest_sk2vff4z.log
─────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970/custom_run_by_compilers.sh ───────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=argc.c.exe
6 # Compilation Line
7 /usr/bin/gcc -o $_EXEC /home/spack/buildtest/examples/compilers/src/argc.c
8
9
10 # Run executable
11 ./$_EXEC 1 3
12
13
──────────────────────────────── Test File: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970/custom_run_by_compilers_build.sh ────────────────────────────────
1 #!/bin/bash
2 export BUILDTEST_TEST_NAME=custom_run_by_compilers
3 export BUILDTEST_TEST_ROOT=/home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970
4 export BUILDTEST_BUILDSPEC_DIR=/home/spack/buildtest/examples/compilers
5 export BUILDTEST_STAGE_DIR=/home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970/stage
6 # source executor startup script
7 source /home/spack/buildtest/var/executor/generic.local.bash/before_script.sh
8 # Run generated script
9 /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/2c066970/stage/custom_run_by_compilers.sh
10 # Get return code
11 returncode=$?
12 # Exit with return code
13 exit $returncode
─────────────────────────────────────────────────────────────── custom_run_by_compilers/631edc79-a79d-456e-b6af-11e2d1e8ad45 ────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: Customize binary launch based on compiler
State: PASS
Returncode: 0
Runtime: 0.073572 sec
Starttime: 2022/03/18 20:27:59
Endtime: 2022/03/18 20:27:59
Command: bash --norc --noprofile -eo pipefail custom_run_by_compilers_build.sh
Test Script: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79/custom_run_by_compilers.sh
Build Script: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79/custom_run_by_compilers_build.sh
Output File: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79/custom_run_by_compilers.out
Error File: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79/custom_run_by_compilers.err
Log File: /home/spack/buildtest/var/logs/buildtest_sk2vff4z.log
─────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79/custom_run_by_compilers.sh ───────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=argc.c.exe
6 # Loading modules
7 module load gcc/8.3.0-gcc-7.5.0
8 # Compilation Line
9 gcc -o $_EXEC /home/spack/buildtest/examples/compilers/src/argc.c
10
11
12 # Run executable
13 ./$_EXEC 100 120
14
15
──────────────────────────────── Test File: /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79/custom_run_by_compilers_build.sh ────────────────────────────────
1 #!/bin/bash
2 export BUILDTEST_TEST_NAME=custom_run_by_compilers
3 export BUILDTEST_TEST_ROOT=/home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79
4 export BUILDTEST_BUILDSPEC_DIR=/home/spack/buildtest/examples/compilers
5 export BUILDTEST_STAGE_DIR=/home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79/stage
6 # source executor startup script
7 source /home/spack/buildtest/var/executor/generic.local.bash/before_script.sh
8 # Run generated script
9 /home/spack/runs/generic.local.bash/custom_run/custom_run_by_compilers/631edc79/stage/custom_run_by_compilers.sh
10 # Get return code
11 returncode=$?
12 # Exit with return code
13 exit $returncode
Pre/Post sections for build and run section¶
We can specify arbitrary shell commands before/after compilation or running binary via
pre_build
, post_build
, pre_run
and post_run
property. This can be useful
if you want to specify additional commands required to compile or run executable that are not
generated automatically
This next example illustrates how one can use these properties to have more control over the generated test.
buildspecs:
pre_post_build_run:
type: compiler
description: example using pre_build, post_build, pre_run, post_run example
executor: generic.local.bash
tags: [tutorials, compile]
source: "src/hello.c"
compilers:
name: ["^(gcc_7.5.0)$"]
default:
gcc:
cflags: -Wall
pre_build: |
echo "These are commands run before compilation"
post_build: |
echo "These are commands run after compilation"
pre_run: |
echo "These are commands run before running script"
post_run:
echo "These are commands run after running script"
The format of the test structure is as follows.
#!{shebang path} -- defaults to #!/bin/bash depends on executor name (local.bash, local.sh)
{job directives} -- sbatch or bsub field
{environment variables} -- env field
{variable declaration} -- vars field
{module commands} -- modules field
{pre build commands} -- pre_build field
{compile program} -- build field
{post build commands} -- post_build field
{pre run commands} -- pre_run field
{run executable} -- run field
{post run commands} -- post_run field
You can run this example by running the following command:
buildtest build -b $BUILDTEST_ROOT/examples/compilers/pre_post_build_run.yml
If we inspect the content of test we see that buildtest will insert the shell commands
for pre_build
, post_build
, pre_run
and post_run
in its corresponding section.
$ buildtest inspect query -t pre_post_build_run
────────────────────────────────────────────────────────────────── pre_post_build_run/5c6818d4-632c-4aa9-9255-5e33aa9228a6 ──────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: example using pre_build, post_build, pre_run, post_run example
State: PASS
Returncode: 0
Runtime: 0.071881 sec
Starttime: 2022/03/18 20:28:01
Endtime: 2022/03/18 20:28:01
Command: bash --norc --noprofile -eo pipefail pre_post_build_run_build.sh
Test Script: /home/spack/runs/generic.local.bash/pre_post_build_run/pre_post_build_run/5c6818d4/pre_post_build_run.sh
Build Script: /home/spack/runs/generic.local.bash/pre_post_build_run/pre_post_build_run/5c6818d4/pre_post_build_run_build.sh
Output File: /home/spack/runs/generic.local.bash/pre_post_build_run/pre_post_build_run/5c6818d4/pre_post_build_run.out
Error File: /home/spack/runs/generic.local.bash/pre_post_build_run/pre_post_build_run/5c6818d4/pre_post_build_run.err
Log File: /home/spack/buildtest/var/logs/buildtest_viwq54ie.log
──────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/pre_post_build_run/pre_post_build_run/5c6818d4/pre_post_build_run.sh ────────────────────────────────────
1 #!/bin/bash
2
3
4 # name of executable
5 _EXEC=hello.c.exe
6 ### START OF PRE BUILD SECTION ###
7 echo "These are commands run before compilation"
8
9 ### END OF PRE BUILD SECTION ###
10
11
12 # Compilation Line
13 /usr/bin/gcc -Wall -o $_EXEC /home/spack/buildtest/examples/compilers/src/hello.c
14
15
16 ### START OF POST BUILD SECTION ###
17 echo "These are commands run after compilation"
18
19 ### END OF POST BUILD SECTION ###
20
21
22 ### START OF PRE RUN SECTION ###
23 echo "These are commands run before running script"
24
25 ### END OF PRE RUN SECTION ###
26
27
28 # Run executable
29 ./$_EXEC
30
31
32 ### START OF POST RUN SECTION ###
33 echo "These are commands run after running script"
34 ### END OF POST RUN SECTION ###
35
36
Running Stream Benchmark with multiple compilers¶
In this example, we will show how one can run STREAM benchmark
with multiple compilers with script schema. The compilers
property can be set in the script schema which
is used to search for compilers to create separate test for each discovered compiler. buildtest will set the following
variables in the script that is mapped to each compiler
BUILDTEST_CC: Path to C compiler
BUILDTEST_CXX: Path to C++ compiler
BUILDTEST_FC: Path to Fortran compiler
BUILDTEST_CFLAGS: C compiler flags
BUILDTEST_CXXFLAGS: C++ compiler flags
BUILDTEST_CPPFLAGS: C++ Pre Preprocessor flags
BUILDTEST_LDFLAGS: Linker Flags
In the run
section we can reference these variables to compile stream.c
to build the code and run it. We will
set environment OMP_NUM_THREADS
to control number of OpenMP threads when running the benchmark.
buildspecs:
stream_openmp_c:
executor: generic.local.bash
type: script
description: "STREAM Microbenchmark C Test with OpenMP"
tags: ["benchmark"]
compilers:
name: ['^(gcc)']
default:
gcc:
cflags: -fopenmp -O2
env:
OMP_NUM_THREADS: 8
run: |
wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c
$BUILDTEST_CC $BUILDTEST_CFLAGS stream.c -o stream
./stream
If we build this test we see one test is created per compiler instance defined in our configuration file.
$ buildtest build -b /home/spack/buildtest/examples/compilers/stream_example.yml
╭───────────────────────────────────────────────────── buildtest summary ──────────────────────────────────────────────────────╮
│ │
│ User: spack │
│ Hostname: f170978d3d4a │
│ Platform: Linux │
│ Current Time: 2022/03/18 20:28:03 │
│ buildtest path: /home/spack/buildtest/bin/buildtest │
│ buildtest version: 0.13.0 │
│ python path: /home/spack/pyenv/buildtest/bin/python3 │
│ python version: 3.8.6 │
│ Configuration File: /home/spack/buildtest/buildtest/settings/spack_container.yml │
│ Test Directory: /home/spack/runs │
│ Report File: /home/spack/buildtest/var/report.json │
│ Command: /home/spack/buildtest/bin/buildtest build -b /home/spack/buildtest/examples/compilers/stream_example.yml │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
────────────────────────────────────────────────────────────────────────────────── Discovering Buildspecs ──────────────────────────────────────────────────────────────────────────────────
Discovered Buildspecs: 1
Excluded Buildspecs: 0
Detected Buildspecs after exclusion: 1
Discovered buildspecs
╔═════════════════════════════════════════════════════════════╗
║ Buildspecs ║
╟─────────────────────────────────────────────────────────────╢
║ /home/spack/buildtest/examples/compilers/stream_example.yml ║
╚═════════════════════════════════════════════════════════════╝
──────────────────────────────────────────────────────────────────────────────────── Parsing Buildspecs ─────────────────────────────────────────────────────────────────────────────────────
Valid Buildspecs: 1
Invalid Buildspecs: 0
/home/spack/buildtest/examples/compilers/stream_example.yml: VALID
Total builder objects created: 3
Total compiler builder: 0
Total script builder: 3
Total spack builder: 0
Script Builder Details
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Builder ┃ Executor ┃ Compiler ┃ description ┃ buildspecs ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ stream_openmp_c/a88ca63f │ generic.local.bash │ gcc_7.5.0 │ STREAM Microbenchmark C Test with OpenMP │ /home/spack/buildtest/examples/compilers/stream_example.yml │
├──────────────────────────┼────────────────────┼───────────┼──────────────────────────────────────────┼─────────────────────────────────────────────────────────────┤
│ stream_openmp_c/3b2403ff │ generic.local.bash │ gcc_6.5.0 │ STREAM Microbenchmark C Test with OpenMP │ /home/spack/buildtest/examples/compilers/stream_example.yml │
├──────────────────────────┼────────────────────┼───────────┼──────────────────────────────────────────┼─────────────────────────────────────────────────────────────┤
│ stream_openmp_c/7d0fb6b4 │ generic.local.bash │ gcc_8.3.0 │ STREAM Microbenchmark C Test with OpenMP │ /home/spack/buildtest/examples/compilers/stream_example.yml │
└──────────────────────────┴────────────────────┴───────────┴──────────────────────────────────────────┴─────────────────────────────────────────────────────────────┘
─────────────────────────────────────────────────────────────────────────────────────── Building Test ───────────────────────────────────────────────────────────────────────────────────────
stream_openmp_c/a88ca63f: Creating test directory: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/a88ca63f
stream_openmp_c/a88ca63f: Creating the stage directory: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/a88ca63f/stage
stream_openmp_c/a88ca63f: Writing build script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/a88ca63f/stream_openmp_c_build.sh
stream_openmp_c/3b2403ff: Creating test directory: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/3b2403ff
stream_openmp_c/3b2403ff: Creating the stage directory: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/3b2403ff/stage
stream_openmp_c/3b2403ff: Writing build script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/3b2403ff/stream_openmp_c_build.sh
stream_openmp_c/7d0fb6b4: Creating test directory: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/7d0fb6b4
stream_openmp_c/7d0fb6b4: Creating the stage directory: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/7d0fb6b4/stage
stream_openmp_c/7d0fb6b4: Writing build script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/7d0fb6b4/stream_openmp_c_build.sh
─────────────────────────────────────────────────────────────────────────────────────── Running Tests ───────────────────────────────────────────────────────────────────────────────────────
Spawning 4 processes for processing builders
──────────────────────────────────────────────────────────────────────────────────────── Iteration 1 ────────────────────────────────────────────────────────────────────────────────────────
stream_openmp_c/7d0fb6b4 does not have any dependencies adding test to queue
stream_openmp_c/a88ca63f does not have any dependencies adding test to queue
stream_openmp_c/3b2403ff does not have any dependencies adding test to queue
stream_openmp_c/3b2403ff: Running Test via command: bash --norc --noprofile -eo
pipefail stream_openmp_c_build.sh
stream_openmp_c/a88ca63f: Running Test via command: bash --norc --noprofile -eo
pipefail stream_openmp_c_build.sh
stream_openmp_c/7d0fb6b4: Running Test via command: bash --norc --noprofile -eo
pipefail stream_openmp_c_build.sh
stream_openmp_c/7d0fb6b4: Test completed in 2.621733 seconds
stream_openmp_c/7d0fb6b4: Test completed with returncode: 0
stream_openmp_c/7d0fb6b4: Writing output file - /home/spack/runs/generic.local.
bash/stream_example/stream_openmp_c/7d0fb6b4/stream_openmp_c.out
stream_openmp_c/7d0fb6b4: Writing error file - /home/spack/runs/generic.local.ba
sh/stream_example/stream_openmp_c/7d0fb6b4/stream_openmp_c.err
stream_openmp_c/a88ca63f: Test completed in 2.662157 seconds
stream_openmp_c/3b2403ff: Test completed in 2.674052 seconds
stream_openmp_c/a88ca63f: Test completed with returncode: 0
stream_openmp_c/3b2403ff: Test completed with returncode: 0
stream_openmp_c/a88ca63f: Writing output file - /home/spack/runs/generic.local.
bash/stream_example/stream_openmp_c/a88ca63f/stream_openmp_c.out
stream_openmp_c/3b2403ff: Writing output file - /home/spack/runs/generic.local.
bash/stream_example/stream_openmp_c/3b2403ff/stream_openmp_c.out
stream_openmp_c/a88ca63f: Writing error file - /home/spack/runs/generic.local.ba
sh/stream_example/stream_openmp_c/a88ca63f/stream_openmp_c.err
stream_openmp_c/3b2403ff: Writing error file - /home/spack/runs/generic.local.ba
sh/stream_example/stream_openmp_c/3b2403ff/stream_openmp_c.err
In this iteration we are going to run the following tests: [stream_openmp_c/7d0fb6b4, stream_openmp_c/a88ca63f, stream_openmp_c/3b2403ff]
Test Summary
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Builder ┃ executor ┃ status ┃ Checks (ReturnCode, Regex, Runtime) ┃ ReturnCode ┃ Runtime ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ stream_openmp_c/3b2403ff │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 2.674052 │
├──────────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ stream_openmp_c/7d0fb6b4 │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 2.621733 │
├──────────────────────────┼────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤
│ stream_openmp_c/a88ca63f │ generic.local.bash │ PASS │ N/A N/A N/A │ 0 │ 2.662157 │
└──────────────────────────┴────────────────────┴────────┴─────────────────────────────────────┴────────────┴──────────┘
Passed Tests: 3/3 Percentage: 100.000%
Failed Tests: 0/3 Percentage: 0.000%
Adding 3 test results to /home/spack/buildtest/var/report.json
Writing Logfile to: /home/spack/buildtest/var/logs/buildtest_b43jkx2i.log
Next, let’s see the generated test using buildtest inspect query
, we notice buildtest will set variables BUILDTEST_*
for
each test to map to each compiler.
$ buildtest inspect query -t stream_openmp_c/
─────────────────────────────────────────────────────────────────── stream_openmp_c/7d0fb6b4-f5f2-43fc-9db8-a0fc7edcff4b ────────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: STREAM Microbenchmark C Test with OpenMP
State: PASS
Returncode: 0
Runtime: 2.621733 sec
Starttime: 2022/03/18 20:28:03
Endtime: 2022/03/18 20:28:05
Command: bash --norc --noprofile -eo pipefail stream_openmp_c_build.sh
Test Script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/7d0fb6b4/stream_openmp_c.sh
Build Script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/7d0fb6b4/stream_openmp_c_build.sh
Output File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/7d0fb6b4/stream_openmp_c.out
Error File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/7d0fb6b4/stream_openmp_c.err
Log File: /home/spack/buildtest/var/logs/buildtest_b43jkx2i.log
───────────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/7d0fb6b4/stream_openmp_c.sh ─────────────────────────────────────────
1 #!/bin/bash
2 BUILDTEST_CC="gcc"
3 BUILDTEST_CXX="g++"
4 BUILDTEST_FC="gfortran"
5 BUILDTEST_CFLAGS="-fopenmp -O2"
6 BUILDTEST_CXXFLAGS=
7 BUILDTEST_FFLAGS=
8 BUILDTEST_CPPFLAGS=
9 BUILDTEST_LDFLAGS=
10 export OMP_NUM_THREADS="8"
11 module load gcc/8.3.0-gcc-7.5.0
12 # Content of run section
13 wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c
14 $BUILDTEST_CC $BUILDTEST_CFLAGS stream.c -o stream
15 ./stream
─────────────────────────────────────────────────────────────────── stream_openmp_c/3b2403ff-a32e-45e8-9fef-a4efbdb724af ────────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: STREAM Microbenchmark C Test with OpenMP
State: PASS
Returncode: 0
Runtime: 2.674052 sec
Starttime: 2022/03/18 20:28:03
Endtime: 2022/03/18 20:28:05
Command: bash --norc --noprofile -eo pipefail stream_openmp_c_build.sh
Test Script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/3b2403ff/stream_openmp_c.sh
Build Script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/3b2403ff/stream_openmp_c_build.sh
Output File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/3b2403ff/stream_openmp_c.out
Error File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/3b2403ff/stream_openmp_c.err
Log File: /home/spack/buildtest/var/logs/buildtest_b43jkx2i.log
───────────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/3b2403ff/stream_openmp_c.sh ─────────────────────────────────────────
1 #!/bin/bash
2 BUILDTEST_CC="gcc"
3 BUILDTEST_CXX="g++"
4 BUILDTEST_FC="gfortran"
5 BUILDTEST_CFLAGS="-fopenmp -O2"
6 BUILDTEST_CXXFLAGS=
7 BUILDTEST_FFLAGS=
8 BUILDTEST_CPPFLAGS=
9 BUILDTEST_LDFLAGS=
10 export OMP_NUM_THREADS="8"
11 module load gcc/6.5.0-gcc-7.5.0
12 # Content of run section
13 wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c
14 $BUILDTEST_CC $BUILDTEST_CFLAGS stream.c -o stream
15 ./stream
─────────────────────────────────────────────────────────────────── stream_openmp_c/a88ca63f-253c-4e45-9526-8e348b6f2bb7 ────────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: STREAM Microbenchmark C Test with OpenMP
State: PASS
Returncode: 0
Runtime: 2.662157 sec
Starttime: 2022/03/18 20:28:03
Endtime: 2022/03/18 20:28:05
Command: bash --norc --noprofile -eo pipefail stream_openmp_c_build.sh
Test Script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/a88ca63f/stream_openmp_c.sh
Build Script: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/a88ca63f/stream_openmp_c_build.sh
Output File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/a88ca63f/stream_openmp_c.out
Error File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/a88ca63f/stream_openmp_c.err
Log File: /home/spack/buildtest/var/logs/buildtest_b43jkx2i.log
───────────────────────────────────────── Test File: /home/spack/runs/generic.local.bash/stream_example/stream_openmp_c/a88ca63f/stream_openmp_c.sh ─────────────────────────────────────────
1 #!/bin/bash
2 BUILDTEST_CC="/usr/bin/gcc"
3 BUILDTEST_CXX="/usr/bin/g++"
4 BUILDTEST_FC="/usr/bin/gfortran"
5 BUILDTEST_CFLAGS="-fopenmp -O2"
6 BUILDTEST_CXXFLAGS=
7 BUILDTEST_FFLAGS=
8 BUILDTEST_CPPFLAGS=
9 BUILDTEST_LDFLAGS=
10 export OMP_NUM_THREADS="8"
11 # Content of run section
12 wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c
13 $BUILDTEST_CC $BUILDTEST_CFLAGS stream.c -o stream
14 ./stream
In the next example, we will run STREAM benchmark and extract metrics from test results and assign them to metrics name
copy
, add
, scale
, triad
. Each metrics will be searched using regular expression against stdout stream
buildspecs:
stream_openmp_metrics:
executor: generic.local.bash
type: script
description: "STREAM Microbenchmark C Test with OpenMP"
tags: ["benchmark"]
compilers:
name: ['^(gcc_7.5.0)']
default:
gcc:
cflags: -fopenmp -O2
env:
OMP_NUM_THREADS: 16
run: |
wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c
$BUILDTEST_CC $BUILDTEST_CFLAGS stream.c -o stream
./stream
metrics:
copy:
regex:
stream: stdout
exp: 'Copy:\s+(\S+)\s+.*'
scale:
regex:
stream: stdout
exp: 'Scale:\s+(\S+)\s+.*'
add:
regex:
stream: stdout
exp: 'Add:\s+(\S+)\s+.*'
triad:
regex:
stream: stdout
exp: 'Triad:\s+(\S+)\s+.*'
buildtest will record the metrics in the test report and buildtest inspect query
will display metrics
if found in test. Shown below we see the output of the metrics and its corresponding values.
$ buildtest inspect query -o stream_openmp_metrics/
──────────────────────────────────────────────────────────────── stream_openmp_metrics/6b3e458e-b1e7-43fa-be4e-adb0a6d8cdb7 ─────────────────────────────────────────────────────────────────
Executor: generic.local.bash
Description: STREAM Microbenchmark C Test with OpenMP
State: PASS
Returncode: 0
Runtime: 0.945047 sec
Starttime: 2022/03/18 20:28:07
Endtime: 2022/03/18 20:28:08
Command: bash --norc --noprofile -eo pipefail stream_openmp_metrics_build.sh
Test Script: /home/spack/runs/generic.local.bash/stream_example_metrics/stream_openmp_metrics/6b3e458e/stream_openmp_metrics.sh
Build Script: /home/spack/runs/generic.local.bash/stream_example_metrics/stream_openmp_metrics/6b3e458e/stream_openmp_metrics_build.sh
Output File: /home/spack/runs/generic.local.bash/stream_example_metrics/stream_openmp_metrics/6b3e458e/stream_openmp_metrics.out
Error File: /home/spack/runs/generic.local.bash/stream_example_metrics/stream_openmp_metrics/6b3e458e/stream_openmp_metrics.err
Log File: /home/spack/buildtest/var/logs/buildtest_zaguygi0.log
Metrics
┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Name ┃ Value ┃
┡━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ copy │ Copy: 20151.0 0.009974 0.007940 0.014931 │
│ scale │ Scale: 17703.1 0.010402 0.009038 0.012029 │
│ add │ Add: 17308.6 0.015542 0.013866 0.017875 │
│ triad │ Triad: 18613.4 0.014912 0.012894 0.016963 │
└───────┴────────────────────────────────────────────────────────────────┘
───────────────────────────── Output File: /home/spack/runs/generic.local.bash/stream_example_metrics/stream_openmp_metrics/6b3e458e/stream_openmp_metrics.out ──────────────────────────────
-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 10000000 (elements), Offset = 0 (elements)
Memory per array = 76.3 MiB (= 0.1 GiB).
Total memory required = 228.9 MiB (= 0.2 GiB).
Each kernel will be executed 10 times.
The *best* time for each kernel (excluding the first iteration)
will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 16
Number of Threads counted = 16
-------------------------------------------------------------
Your clock granularity/precision appears to be 10 microseconds.
Each test below will take on the order of 7197 microseconds.
(= 719 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
-------------------------------------------------------------
WARNING -- The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
-------------------------------------------------------------
Function Best Rate MB/s Avg time Min time Max time
Copy: 20151.0 0.009974 0.007940 0.014931
Scale: 17703.1 0.010402 0.009038 0.012029
Add: 17308.6 0.015542 0.013866 0.017875
Triad: 18613.4 0.014912 0.012894 0.016963
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------