The following steps have been tested on `iceberg03.fnal.gov` under user `dunesw`.
## Install dependencies
Dependencies are installed via spack. Note that during the installation, I had to change the ownership of `/var/log/nvidia` to `dunesw` (or made it writable to `dunesw`) to allow `spack install cuda` to proceed correctly.
### Install spack
```bash!
git clone --depth=100 --branch=releases/v0.20 https://github.com/spack/spack.git ~/dingpf/spack
```
### Apply changes to spack configuration files
```diff=
diff --git a/etc/spack/defaults/config.yaml b/etc/spack/defaults/config.yaml
index 43f8a98d..30c579ec 100644
--- a/etc/spack/defaults/config.yaml
+++ b/etc/spack/defaults/config.yaml
@@ -93,7 +93,7 @@ config:
# Timeout in seconds used for downloading sources etc. This only applies
# to the connection phase and can be increased for slow connections or
# servers. 0 means no timeout.
- connect_timeout: 10
+ connect_timeout: 100
# If this is false, tools like curl that use SSL will not verify
@@ -203,7 +203,7 @@ config:
# dependencies. Their type can either be "rpath" or "runpath". For glibc, rpath is
# inherited and has precedence over LD_LIBRARY_PATH; runpath is not inherited
# and of lower precedence. DO NOT MIX these within the same install tree.
- type: rpath
+ type: runpath
# (Experimental) Embed absolute paths of dependent libraries directly in ELF
diff --git a/etc/spack/defaults/packages.yaml b/etc/spack/defaults/packages.yaml
index 22b76626..23875c65 100644
--- a/etc/spack/defaults/packages.yaml
+++ b/etc/spack/defaults/packages.yaml
@@ -62,3 +62,13 @@ packages:
permissions:
read: world
write: user
+ libxpm:
+ externals:
+ - spec: libxpm@3.5.12%gcc@11.3.1
+ prefix: /usr
+ buildable: False
+ python:
+ externals:
+ - spec: python@3.9.16%gcc@11.3.1
+ prefix: /usr
+ buildable: False
```
### Install dependencies
```bash=
source ~/dingpf/spack/share/spack/setup-env.sh
spack install --reuse root@6.28.04%gcc@11.3.1^python@3.9.16 \
py-numpy@1.24.3^python@3.9.16 \
opencv@4.6.0+imgcodecs+cuda+python3+ml+cudnn+highgui+imgproc^python@3.9.16
```
## Build `larcv2`
### Obtain `larcv2` source
```bash!
cd ~/dingpf
git clone https://github.com/DeepLearnPhysics/larcv2.git
# Current head of develop points to tag: v2_1_2
cd larcv2
```
### Apply patches to `larcv2` source
```diff=
diff --git a/larcv/core/CVUtil/CVUtil.cxx b/larcv/core/CVUtil/CVUtil.cxx
index 75161fe..c88b886 100644
--- a/larcv/core/CVUtil/CVUtil.cxx
+++ b/larcv/core/CVUtil/CVUtil.cxx
@@ -123,7 +123,7 @@ namespace larcv {
Image2D imread(const std::string file_name)
{
::cv::Mat image;
- image = ::cv::imread(file_name.c_str(), CV_LOAD_IMAGE_COLOR);
+ image = ::cv::imread(file_name.c_str(), cv::IMREAD_COLOR);
ImageMeta meta(image.cols,image.rows,image.cols, image.rows, 0., 0.);
Image2D larcv_img(meta);
@@ -147,7 +147,7 @@ namespace larcv {
Image2D imread_gray(const std::string file_name)
{
::cv::Mat image;
- image = ::cv::imread(file_name.c_str(), CV_LOAD_IMAGE_GRAYSCALE);
+ image = ::cv::imread(file_name.c_str(), cv::IMREAD_GRAYSCALE);
ImageMeta meta(image.cols,image.rows,image.cols, image.rows, 0., 0.);
Image2D larcv_img(meta);
```
### Build `larcv2`
#### Find out the path to the `opencv` installation
```bash=
[dunesw@iceberg03 dingpf]$ spack find -p opencv
-- linux-almalinux9-icelake / gcc@11.3.1 ------------------------
opencv@4.6.0 /home/dunesw/dingpf/spack/opt/spack/linux-almalinux9-icelake/gcc-11.3.1/opencv-4.6.0-tkgbpxskrub4v2xzxscru3soiopot3x3
==> 1 installed package
```
#### Load dependencies and set ENVs required for building `larcv2`
```bash=
spack load root
spack load opencv
export OPENCV_LIBDIR=/home/dunesw/dingpf/spack/opt/spack/linux-almalinux9-icelake/gcc-11.3.1/opencv-4.6.0-tkgbpxskrub4v2xzxscru3soiopot3x3/lib64
export OPENCV_INCDIR=/home/dunesw/dingpf/spack/opt/spack/linux-almalinux9-icelake/gcc-11.3.1/opencv-4.6.0-tkgbpxskrub4v2xzxscru3soiopot3x3/include/opencv4
```
#### Build `larcv2`
```bash
cd ~/dingpf/larcv2
source configure.sh
make -j 50
```
## Next steps
In `larcv2` source package, there is `ups/create_ups_release.sh` which creates a UPS package for the version built above.
The script creates a skeleton UPS package first, and then copy `bin, lib, include` from the build directory (`larcv2/build`) into the UPS package.
It should be straight-forward to write a spack recipe file (`package.py`) for `larcv2`, which does the following things:
1. sets up dependencies for `larcv2`;
2. set environment variables for `opencv`;
3. run the build steps;
4. install the `bin, lib, include` directories.
With that recipe file in place, installing and using `larcv2` can be as simple as `spack install larcv2@<version>` and `spack load larcv2`.