# Using Spack Infrastructure
###### tags: `DUNE-DAQ` `spack`
## Convert existing UPS products area
### Test setup
* Using UPS products put into the nighly docker image used by CI jobs. The nightly docker image is: `dunedaq/sl7-minimal-nightly:N21-12-26`;
* This image is based on `dunedaq/sl7-minimal:latest` with addtional cvmfs mirrors containing UPS products and the latest DAQ development release;
* The tests in this note will be all done with running `dingpf/sl7` ~~(may be `dunedaq/sl7-minimal:latest`?)~~ docker container with the same cvmfs mirror found in the nightly image, running on a host machine with `Ubuntu 20.04.1 LTS`.
### Details of the test
* The test is done by following [this documentation](https://cdcvs.fnal.gov/redmine/projects/spack-infrastructure/wiki/Converting);
* Note: there is a difference `spack infrastructure` repo in the official spack org; the equivelant one to that in Fermilab Redmine is under Marc Mengel's personal Github account [here](https://github.com/marcmengel/spack-infrastructure);
* Another note: the latest tagged version is `v2_16_01_01`, where `v2_16_01` is the tag of `spack` the package targets towards.
* tested with `dunedaq/sl7-minimal:latest`, but got prompt that the following RPMs are needed when installing `bzip2`?
```
==> patchelf: Successfully installed patchelf-0.9-3kdvjmz4caxq7g4wwkecdyp6gsqo32ti
Fetch: 1.01s. Build: 6.99s. Total: 7.99s.
[+] /cvmfs/dunedaq.opensciencegrid.org/products/patchelf/0.9/linux-scientific7-x86_64-gcc-8.2.0-3kdvjmz4caxq7g4wwkecdyp6gsqo32ti
==> Warning: No manifest file in tarball for spec bzip2/rbgyavo
==> Error: No compilers for operating system scientific7 satisfy spec gcc@4.8.5
make_packages_yaml: INFO: creating /cvmfs/dunedaq.opensciencegrid.org/products/spack/v0.16.1.fermi/NULL/etc/spack/scientific7/packages.yaml
Need to install rpm: expat-devel
Need to install rpm: gdbm-devel
Need to install rpm: gettext-devel
Need to install rpm: libdrm-devel
Need to install rpm: libedit-devel
Need to install rpm: libffi-devel
Need to install rpm: libgcrypt-devel
Notice: no version found for package libjpeg-turbo
Need to install rpm: libpciaccess-devel
Need to install rpm: libpng-devel
Need to install rpm: lz4-devel
Need to install rpm: ncurses-devel
Need to install rpm: pcre2-devel
Need to install rpm: readline-devel
[root@280b06af7721 scratch]#
```
#### Step 1
Start the docker container `dingpf/sl7` with cvmfs mirrors found in `dunedaq/sl7-minimal-nightly:N21-12-26`.
#### Step 2
Obtain `spack_infrastructure` by copying over `spack_infrastructure` UPS products from `/cvmfs/fermilab.opensciencegrid.org/products/` to the local products area.
#### Step 3
Put a spcak instance into UPS products area.
```
P1=/cvmfs/dunedaq.opensciencegrid.org/products;
source $P1/setup
setup spack_infrastructure
setup gcc v8_2_0
make_spack -u $P1
```
Failed with the following errors:
```
==> Error: invalid syntax in /cvmfs/dunedaq.opensciencegrid.org/products/spack/v0.16.1.fermi/NULL/var/spack/repos/fnal_art/packages/gm2pip/package.py, line 96
^Bmake_packages_yaml: INFO: creating /cvmfs/dunedaq.opensciencegrid.org/products/spack/v0.16.1.fermi/NULL/etc/spack/scientific7/packages.yaml
Need to install rpm: gettext-devel
Need to install rpm: libedit-devel
Need to install rpm: libgcrypt-devel
Need to install rpm: libpciaccess-devel
Need to install rpm: lz4-devel
Need to install rpm: pcre2-devel
```
Installed these RPMs with `yum install -y gettext-devel libedit-devel libgcrypt-devel libpciaccess-devel lz4-devel pcre2-devel`
Rerun `make_spack -u $P1`
Note: although I did `setup gcc v8_2_0`, make_spack still installs things for the system `gcc 4.8.5` and `python 2.7`.
Might worth trying with setting up both gcc and python UPS products...
Got error
```
==> Error: invalid syntax in /cvmfs/dunedaq.opensciencegrid.org/products/spack/v0.16.1.fermi/NULL/var/spack/repos/fnal_art/packages/gm2pip/package.py, line 96
make_packages_yaml: INFO: creating /cvmfs/dunedaq.opensciencegrid.org/products/spack/v0.16.1.fermi/NULL/etc/spack/scientific7/packages.yaml
```
That line seems to be just comments, removed the whole comments section, and rerun `make_spack -u $P1`.
#### Step 4
Add Spack declarations for UPS products
```
P1=/cvmfs/dunedaq.opensciencegrid.org/products;
source $P1/setup
source $P1/setup-env.sh
ups_to_spack -a
spack reindex
```
`spack find` shows the following
```
[root@e1515878b09d scratch]# spack find
==> 87 installed packages
-- linux-scientific7-x86_64 / gcc@4.8.5 -------------------------
bzip2@1.0.8 openssl@1.1.1c
bzip2@1.0.8 patchelf@0.9
clang-runtime@7.0.0rc3 patchelf@0.9
cmake@3.17.2 python@2.7.16
expat@2.2.5 readline@7.0
expat@2.2.5 readline@7.0
gcc-runtime@9.3.0 spack-infrastructure@1.0
gdb@9.2 spack-infrastructure@1.2
gdbm@1.18.1 spack-infrastructure@1.4
gdbm@1.18.1 spack-infrastructure@1.5
gettext@0.19.8.1 spack-infrastructure@1.6
gettext@0.19.8.1 spack-infrastructure@1.7
libbsd@0.9.1 spack-infrastructure@2.16.01
libbsd@0.9.1 spack-infrastructure@2.16.01.01
libffi@3.2.1 sqlite@3.29.0
libffi@3.2.1 sqlite@3.29.0
libiconv@1.15 tar@1.31
libiconv@1.15 tar@1.31
libxml2@2.9.9 trace@3.16.02
libxml2@2.9.9 ups@6.0.8
ncurses@6.1 xz@5.2.4
ncurses@6.1 xz@5.2.4
ninja@1.10.0 zlib@1.2.11
openssl@1.1.1c zlib@1.2.11
-- linux-scientific7-x86_64 / gcc@8.2.0 -------------------------
boost@1.73.0 fmt@6.2.1 msgpack-c@3.3.0
boost@1.73.0 folly@2021.12.13 nlohmann-json@3.9.0c
cetlib@3.11.01 gcc-runtime@8.2.0 pistache@2020.10.07
cetlib@3.11.01 glog@0.4.0 pistache@2020.10.07
cetlib-except@1.05.00 hdf5@1.12.0a protobuf@3.14.0
cetlib-except@1.05.00 hdf5@1.12.0a pugixml@1.11
cetpkgsupport@1.14.01 hep-concurrency@1.05.00 pybind11@2.6.2
cppunit@1.15.1a hep-concurrency@1.05.00 python@3.8.3b
cppunit@1.15.1a highfive@2.3.1 sqlite@3.32.03.00
cppzmq@4.3.0 intel-tbb@2020.2a uhal@2.8.1
cpr@1.5.2 intel-tbb@2020.2a yaml-cpp@0.6.3
double-conversion@3.1.5 libevent@2.1.8 zmq@4.3.1c
felix@1.2.0 librdkafka@1.7.0 zstd@1.5.0
```
This is the list of UPS products.
```
[root@e1515878b09d scratch]# ups list -aK+
"boost" "v1_73_0" "Linux64bit+3.10-2.17" "e19:prof" ""
"boost" "v1_73_0" "Linux64bit+3.10-2.17" "debug:e19" ""
"bzip2" "1.0.8" "Linux64bit+3.10-2.17" "" ""
"cetlib" "v3_11_01" "Linux64bit+3.10-2.17" "e19:prof" ""
"cetlib" "v3_11_01" "Linux64bit+3.10-2.17" "debug:e19" ""
"cetlib_except" "v1_05_00" "Linux64bit+3.10-2.17" "e19:prof" ""
"cetlib_except" "v1_05_00" "Linux64bit+3.10-2.17" "debug:e19" ""
"cetpkgsupport" "v1_14_01" "NULL" "" "current"
"clang" "v7_0_0rc3" "Linux64bit+3.10-2.17" "" ""
"cmake" "v3_17_2" "Linux64bit+3.10-2.17" "" ""
"cppunit" "v1_15_1a" "Linux64bit+3.10-2.17" "e19:prof" ""
"cppunit" "v1_15_1a" "Linux64bit+3.10-2.17" "debug:e19" ""
"cppzmq" "v4_3_0" "Linux64bit+3.10-2.17" "e19:prof" ""
"cpr" "v1_5_2" "Linux64bit+3.10-2.17" "e19:prof" ""
"double_conversion" "v3_1_5" "Linux64bit+3.10-2.17" "e19:prof" ""
"expat" "2.2.5" "Linux64bit+3.10-2.17" "" ""
"felix" "v1_2_0" "Linux64bit+3.10-2.17" "e19:prof" ""
"fmt" "v6_2_1" "Linux64bit+3.10-2.17" "e19:prof" ""
"folly" "v2021_12_13" "Linux64bit+3.10-2.17" "e19:prof" ""
"gcc" "v8_2_0" "Linux64bit+3.10-2.17" "" ""
"gcc" "v9_3_0" "Linux64bit+3.10-2.17" "" ""
"gdb" "v9_2" "Linux64bit+3.10-2.17" "" "current"
"gdbm" "1.18.1" "Linux64bit+3.10-2.17" "" ""
"gettext" "0.19.8.1" "Linux64bit+3.10-2.17" "" ""
"glog" "v0_4_0" "Linux64bit+3.10-2.17" "e19:prof" ""
"hdf5" "v1_12_0a" "Linux64bit+3.10-2.17" "e19:prof" ""
"hdf5" "v1_12_0a" "Linux64bit+3.10-2.17" "debug:e19" ""
"hep_concurrency" "v1_05_00" "Linux64bit+3.10-2.17" "e19:prof" ""
"hep_concurrency" "v1_05_00" "Linux64bit+3.10-2.17" "debug:e19" ""
"highfive" "v2_3_1" "Linux64bit+3.10-2.17" "e19:prof" ""
"libbsd" "0.9.1" "Linux64bit+3.10-2.17" "" ""
"libevent" "v2_1_8" "Linux64bit+3.10-2.17" "e19:prof" ""
"libffi" "3.2.1" "Linux64bit+3.10-2.17" "" ""
"libiconv" "1.15" "Linux64bit+3.10-2.17" "" ""
"librdkafka" "v1_7_0" "Linux64bit+3.10-2.17" "e19:prof" ""
"libxml2" "2.9.9" "Linux64bit+3.10-2.17" "" ""
"msgpack_c" "v3_3_0" "Linux64bit+3.10-2.17" "e19:prof" ""
"ncurses" "6.1" "Linux64bit+3.10-2.17" "" ""
"ninja" "v1_10_0" "Linux64bit+3.10-2.17" "" "current"
"nlohmann_json" "v3_9_0c" "Linux64bit+3.10-2.17" "e19:prof" ""
"openssl" "1.1.1c" "Linux64bit+3.10-2.17" "" ""
"patchelf" "0.9" "Linux64bit+3.10-2.17" "" ""
"pistache" "v2020_10_07" "Linux64bit+3.10-2.17" "e19:prof" ""
"pistache" "v2020_10_07" "Linux64bit+3.10-2.17" "debug:e19" ""
"protobuf" "v3_14_0" "Linux64bit+3.10-2.17" "e19" ""
"pugixml" "v1_11" "Linux64bit+3.10-2.17" "e19:prof" ""
"pybind11" "v2_6_2" "Linux64bit+3.10-2.17" "e19:prof" ""
"python" "v3_8_3b" "Linux64bit+3.10-2.17" "" "current"
"readline" "7.0" "Linux64bit+3.10-2.17" "" ""
"spack_infrastructure" "v1_0" "NULL" "" ""
"spack_infrastructure" "v2_16_01" "NULL" "" ""
"spack_infrastructure" "v1_6" "NULL" "" ""
"spack_infrastructure" "v2_16_01_01" "NULL" "" "current"
"spack_infrastructure" "v1_4" "NULL" "" ""
"spack_infrastructure" "v1_2" "NULL" "" ""
"spack_infrastructure" "v1_5" "NULL" "" ""
"spack_infrastructure" "v1_7" "NULL" "" ""
"sqlite" "3.29.0" "Linux64bit+3.10-2.17" "" ""
"sqlite" "v3_32_03_00" "Linux64bit+3.10-2.17" "" ""
"tar" "1.31" "Linux64bit+3.10-2.17" "" ""
"tbb" "v2020_2a" "Linux64bit+3.10-2.17" "e19:prof" ""
"tbb" "v2020_2a" "Linux64bit+3.10-2.17" "debug:e19" ""
"TRACE" "v3_16_02" "Linux64bit+3.10-2.17" "" ""
"uhal" "v2_8_1" "Linux64bit+3.10-2.17" "e19:prof" ""
"ups" "v6_0_8" "Linux64bit+3.10-2.17" "" "current"
"xz" "5.2.4" "Linux64bit+3.10-2.17" "" ""
"yaml_cpp" "v0_6_3" "Linux64bit+3.10-2.17" "e19:prof" ""
"zlib" "1.2.11" "Linux64bit+3.10-2.17" "" ""
"zmq" "v4_3_1c" "Linux64bit+3.10-2.17" "e19:prof" ""
"zstd" "v1_5_0" "Linux64bit+3.10-2.17" "e19:prof" ""
```
I saw no spack module for `gcc` was generated, but `gcc-runtime@8.2.0`. When I tried to load any module depending on `gcc 8.2.0`, I got:
```
[root@e1515878b09d scratch]# spack load zmq@4.3.1c
==> Error: No compilers for operating system scientific7 satisfy spec gcc@8.2.0
```
Doing `spack compilers` gives me `gcc@4.8.5` only.
Doing `spack install gcc@8.2.0` gives me:
```
[root@e1515878b09d scratch]# spack install gcc@8.2.0
==> Error: trying to set variants "shared, pic, or optimize" in package "zlib", but the package has no such variants [happened during concretization of zlib@1.2.7%gcc@4.8.5+optimize+pic+shared arch=linux-scientific7-None]
```
After consulting Marc, I was able to fix the issue with:
1. setting up `gcc v8_2_0` UPS product;
2. do `spack compiler find --scope=site` to make spack aware of the compiler. Spack will put the info into `/cvmfs/dunedaq.opensciencegrid.org/products/spack/v0.16.1.fermi/NULL/etc/spack/compilers.yaml`
```
compilers:
- compiler:
paths:
cc: /cvmfs/dunedaq.opensciencegrid.org/products/gcc/v8_2_0/Linux64bit+3.10-2.17/bin/gcc
cxx: /cvmfs/dunedaq.opensciencegrid.org/products/gcc/v8_2_0/Linux64bit+3.10-2.17/bin/g++
f77: /cvmfs/dunedaq.opensciencegrid.org/products/gcc/v8_2_0/Linux64bit+3.10-2.17/bin/gfortran
fc: /cvmfs/dunedaq.opensciencegrid.org/products/gcc/v8_2_0/Linux64bit+3.10-2.17/bin/gfortran
operating_system: scientific7
target: x86_64
modules: []
environment: {}
extra_rpaths: []
flags: {}
spec: gcc@8.2.0
- compiler:
paths:
cc: /usr/bin/gcc
cxx: /usr/bin/g++
f77:
fc:
operating_system: scientific7
target: x86_64
modules: []
environment: {}
extra_rpaths: []
flags: {}
spec: gcc@4.8.5
```
NOTE: when loading a package where two variants exist with only difference being the hash, one can specify the variant by `spack load package/hash`.
## Using chained spack instances to build (`subspack`)
## Using external UPS products installed by Spack