---
# System prepended metadata

title: UPS products for protoDUNE DAQ
tags: [DAQ, DUNE, artdaq, protoDUNE]

---

# UPS products for protoDUNE DAQ

###### tags: `DAQ` `protoDUNE` `artdaq` `DUNE`

[TOC]

* [Jira Issue 95](https://its.cern.ch/jira/browse/NP04DAQ-95)

## Dependency graphs
* [dune_artdaq v2019_07_30_develop](https://home.fnal.gov/~dingpf/SetupDUNEARTDAQ_forRunning_dep_graph.svg) ![](https://i.imgur.com/JvtFgdF.png)
* [artdaq v3_06_01 s83](https://home.fnal.gov/~dingpf/e17_s83_v3_06_01.svg) ![](https://i.imgur.com/7iluyM6.png)
* [artdaq v3_06_01 s85](https://home.fnal.gov/~dingpf/e17_s85_v3_06_01.svg) ![](https://i.imgur.com/7XUHSn5.png)


## List of UPS products

- [x] 1. dim (`v2-r26 e15|e17`)
- [x] 2. uhal (`v2_6_4 e17:prof:s85|s83`)
- [x] 3. pugixml (`v1_10 e15|e17`)
- [x] 4. netio (rebuilt `netio-Oct v0_8_0` into `netio v0_8_0a e17:prof:s83|s85` )
- [x] 5. rogue (`v3_7_0 e17:prof|debug:s85:s83`)
- [ ] 6. QAT - [QATzip](https://github.com/intel/QATzip)
- [x] 7. zmq (`v4_3_2 e17`)
- [x] 8. cppzmq (`v4_4_1 NULL`)
- [x] 9. pyzmq (`v18_1_0 p2715a`)
- [x] 10. czmq (`v4_2_0 e17`)
- [x] 11. protobuf (deployed `v3_5_2a e15|e17` from scisoft, also built newer version `v3_10_0 e17`)
- [x] 12. ftd2xx (`v1_4_8 NULL`, should be falvored build `-f Linux64bit+3.10-2.17`)
- [x] 13. ptmp (built `v0_6_2 e17`)
- [x] 14. ptmp_tcs (built `v0_1_1a e17`)
- [x] 15. protodune_wibsoft (`v351a`, SVN revision 351, `e17:s85|s83:prof|debug`)
- [x] 16. jsoncpp (`v1_8_4 e17:prof|debug`)
- [x] 17. dunepdsprce (deployed `v1_1_0 avx2|gen:e17:prof` from scisoft)
- [x] 18. protodune_timing
- [x] 19. libxml2 (compiled latest version `v2_9_9 prof|debug`)
- [ ] 20. artdaq_dim_plugin
- [ ] 21. dune-artdaq-InhibitMaster


### Building dim

* [build instruction](https://dim.web.cern.ch/dim_unix.html)
* `dim` depends on gcc only, making a e15 and e17 build.
* source package and install instructions can be found [here](https://dim.web.cern.ch/dim_unix.html).
* Here is the [source zip file.](https://dim.web.cern.ch/dim_v20r26.zip)
* `dim` requires `motif-devel`
* Tested local build on `mu2edaq13.fnal.gov:/home/dingpf/build_dim/dim_v20r26/linux`
* Installed LIB, BIN and INC directories in the UPS product.
* Did not make libjdim.so (shareable library to be used from java).
* Accidentally cleaned `UPS_OVERRIDE` in my docker container used for building the UPS product, which in turn, make the `Linux64bit+4.15-2.17-e15` and `Linux64bit+4.15-2.17-e17` builds.

### Building uhal

* [build instruction](https://ipbus.web.cern.ch/ipbus/doc/user/html/software/install/compile.html) 
* [git repo](https://github.com/ipbus/ipbus-software)
* [source tarball](https://github.com/ipbus/ipbus-software/archive/v2.6.4.tar.gz)
* e and s qualified builds (depends on art);
* debug and prof build types;
* using makefile, not cmake;
* `uhal` requires `pugixml-devel`, previously pugixml shared lib and headers are put in uhal UPS package on protoDUNE DAQ;
* python-devel is needed (pyconfig.h) for build;
* ~~escript is needed for build; install `erlang-rebar`;~~ (This is for `controlhub`)
* `make all` does not work for `uhal/gui`; should use `make` instead;
~~* `make install` requires dbus, docker container needs to be started with `--privileged` and needs `systemd` in it; otherwise gets `Failed to get D-Bus connection: Operation not permitted` [more info here.](https://serverfault.com/questions/824975/failed-to-get-d-bus-connection-operation-not-permitted)~~ (This is for `controlhub`)
* build on mu2edaq or np04-srv-023 instead;
* setup required pugixml (will set up gcc)
* setup boost
* setup gcc (not necessary, but good to have for indicating e qualifier);

#### Patches for v2_6_4:

* patch file created and put in source package (`patch -b -p1 < ipbus.patch`)
* remove `-lboost_python` from pychoal Makefile (scisoft's version of boost does not contain boost_python .so)... this bypass the build, but the python binding may not work... 
* adding `#include <boost/core/noncopyable.hpp>` into two header files: ` uhal/uhal/include/uhal/ClientFactory.hpp` and `uhal/uhal/include/uhal/ConnectionManager.hpp`
* ~~omit some install commands in controlhub Makefile which installs configuration files under system path, and restarts rsyslog service.~~ (This is no needed if doing `Set=uhal` installation.)

#### ENVs needed:

```shell=
     export EXTERN_BOOST_INCLUDE_PREFIX=$BOOST_INC
     export EXTERN_BOOST_LIB_PREFIX=$BOOST_LIB
     export EXTERN_PUGIXML_INCLUDE_PREFIX=$PUGIXML_INC
     export EXTERN_PUGIXML_LIB_PREFIX=$PUGIXML_LIB
```

#### Clean-ups

There is a bug in its Makefile for `install` target. It puts several copies of itself under nested levels of sub-directories (e.g.  include/install/include/install/include/install/includ), this happends for both `lib` and `include`. I did not track down the bug, but just to clean things up, I simply removed the first level sub-dir under `lib` and `include`.

### Building pugixml

* [repo and build instruction](https://pugixml.org/docs/quickstart.html)
* e qualified build, with `-D CMAKE_CXX_FLAGS="-std=c++17"` for `e17`
* with ` -DBUILD_STATIC_LIBS=OFF `
* use `source define_basics NO_TYPE ` for no `debug/prof` builds in ssibuildshims.

### Buliding netio

* [repo and build instruction](https://gitlab.cern.ch/atlas-tdaq-felix/netio)
* Depends on tbb, so need to be s qualified as tbb is in art bundle;
* e and s qualified builds;
* extra qualifiers needed (prof, debug)
* using cmake
* disbale FELIX_BUILD, so it does not depend on zmq etc, only need one .so and netio.hpp
* requires gcc and tbb
* requires `libfabric-devel`; yum packages available on CentOS7. Install via YUM.
* Dev head no longer has `main_unsub.cpp`, so `netio_unsub` executable is no longer produced.

### Building rogue

* [build instruction](https://slaclab.github.io/rogue/installing/build.html);
* [git repo](https://github.com/slaclab/rogue)
* e and s qualified builds; (squalified may not need, non python build does not depend on boost)
* (requires python3 >= 3.6 for python bindings...) setup this for build only...
* requires bzip2-devel for compiling from source installation;
* requires zmq
* use boost v1_69_0
* using cmake;
* REQUIRES GIT TO BUILD... (in CMakeList.txt, it gets version number from git tag... and states "git is requried to build rogue"...)
* Need to patch CMakeList.txt to remove `python3` from `find_package(Boost ... python3)`
* `export BOOST_PATH=$BOOST_FQ_DIR`
* `cmake ../rogue -DROGUE_INSTALL=custom -DROGUE_DIR=/path/to/custom/dir`
* previous rogue UPS package contains bzip2's header and share lib in it... not planning to make a bzip2 package but install the rpm package across the cluster. (It appears that `bzip2-devel` is already installed on all np04 nodes.)


#### Steps to build rogue on np04-srv-023

* Note: you have to use `np04-srv-023` where I have removed the system package `zeromq3-devel` and `zeromq3`. The reason is the default CMake setting in rogue finds the system zeromq first, but we want to use the UPS product `v4_3_2` instead.
* The steps to build it on `np04-srv-023` are as the following:
```shell=
# setup ups, making gcc, cmake available
source /nfs/sw/artdaq/products/setup
# add the source products path to the $PRODUCTS env
export PRODUCTS=/nfs/sw/ups_source_packages/products:$PRODUCTS

cd /nfs/sw/ups_source_packages/products/rogue/v3_7_0

# remove existing built products (otherwise the build script will
# fail at "git clone" stage)
rm -rf Linux64bit+3.10-2.17-e1*

# run the build script
./build_rogue.sh /nfs/sw/ups_source_packages/products/ e17 prof s83

# run the build script again with "tar" option; this will create
# a tarball in the source prodcuts directory level.
./build_rogue.sh /nfs/sw/ups_source_packages/products/ e17 prof s83 tar

```

### Building zmq

* This is the `libzmq` core package;
* [repo](https://github.com/zeromq/libzmq)
* straight forward installation with `configure --prefix=${pkgdir}` followed by `make` and `make install`;
* Removed `cppzmq` header installation from previous build script.

### Making cppzmq

* [repo](https://github.com/zeromq/cppzmq)
* This is a header-only package;
* Created a `NULL` flavor;
* No dependencies of `zmq`, since it should work with different versions of `zmq`;
* But one has to either have system `zmq` or setup one version of `zmq` UPS product before using `cppzmq`.

### Building pyzmq

* [repo](https://github.com/zeromq/pyzmq)
* setup required python and zmq version in ups table file;
```shell=
python setup.py configure --zmq=${ZMQ_FQ_DIR} || ssi_die "python setup.py build failed"
python setup.py build
python -m compileall ./build/lib.linux-x86_64-2.7
mv build/lib.linux-x86_64-2.7/*  ${pkgdir}/lib
```

### Building czmq

* [repo and build instructions](https://github.com/zeromq/czmq#building-and-installing)
```shell=
export CXXFLAGS="$cxxflg"
export CFLAGS="${cflg} -I${ZMQ_INC}"
export CC=${cc}
export CXX=${cxx}
export LD_FLAGS=-L${ZMQ_LIB}
export PKG_CONFIG=$ZMQ_LIB/pkgconfig
./configure --prefix=${pkgdir} && make -j 8 && make install
```

### Building protobuf

* Used exisiting scisoft script to build newer version of protobuf;
* [official release](https://github.com/protocolbuffers/protobuf/releases);
* Added `./autogen.sh` in build script;
* Skipped `make check`, bug existed in `v3_10_0`, missing `third_party/googletest/googletest` directory.


### Making ftd2xx

* [Official download](https://www.ftdichip.com/Drivers/D2XX.htm)
* Tarball contains a full release, simply move header files and share libs into directories structured accordoing to UPS standards.

### Building protodune-timing

* [repo](https://gitlab.cern.ch/protoDUNE-SP-DAQ/timing-board-software)
* v5_1_0 tag name is `v5b0`;
* Builds with Makefiles;
* Depends on `uhal v2_6_4 e17:prof:s85|s83`
* [Build instructions](https://twiki.cern.ch/twiki/bin/view/CENF/PDuneSPTimingInstallSW) in Twiki;
* Rewrite build procedure using `ssibuildshims`
* build `core` subdirectory only;
* changed c++ standard to `c++14` (e15) or `c++17` (e17).

### Building ptmp
* https://github.com/brettviren/ptmp tag 0.6.1
* UPS build notes https://github.com/brettviren/ptmp/blob/master/docs/ups.org
* Example build command line: `./tools/create-ups-product.sh /nfs/sw/work_dirs/phrodrig/tmp/ups v0_6_0 e15 czmq protobuf zmq` after setting up the appropriate packages;
* it should now depend on `cppzmq` as well.
* Now using `ssibuildshims`, the following is the configuration and install part of the script.
```shell=
cflg="-g -ggdb3 -O2"

if [[ "${basequal}" == e1[45] ]]
then
  cxxflg="${cflg} -std=c++14 -Wno-deprecated-declarations"
elif [[ "${basequal}" == e1[79] ]]
then
  cxxflg="${cflg} -std=c++17 -Wno-deprecated-declarations"
else
  echo "ERROR: unrecognized qualifier ${basequal}"
  usage
  exit 1
fi

#make -j ${ncore} || ssi_die "ERROR: make failed."
./tools/waf configure --jobs=${ncore} --cxxflags="${cxxflg}" --prefix=${pkgdir} \
      --with-libzmq-lib=$ZMQ_LIB --with-libzmq-include=$ZMQ_INC \
      --with-libczmq-lib=$CZMQ_LIB --with-libczmq-include=$CZMQ_INC \
      --with-protobuf=$PROTOBUF_FQ_DIR || ssi_die "ERROR: failed to configure with waf!"

./tools/waf --notests install || ssi_die "ERROR: failed to install with waf!"
```

### Building ptmp-tcs

* [repo](https://github.com/brettviren/ptmp-tcs)
* Same idea as ptmp. Set up ptmp, then `./tools/create-ups-product.sh /nfs/sw/work_dirs/phrodrig/tmp/ups v0_2_0 e15 czmq protobuf zmq ptmp`
* similar as `ptmp`, the following is the configuration part with `waf`.
```shell=
#make -j ${ncore} || ssi_die "ERROR: make failed."
./tools/waf configure --jobs=${ncore} --cxxflags="${cxxflg}" --prefix=${pkgdir} \
      --with-ptmp-include=$PTMP_INC --with-ptmp-lib=$PTMP_LIB \
      --with-libzmq-lib=$ZMQ_LIB --with-libzmq-include=$ZMQ_INC \
      --with-libczmq-lib=$CZMQ_LIB --with-libczmq-include=$CZMQ_INC \
      --with-protobuf=$PROTOBUF_FQ_DIR || ssi_die "ERROR: failed to configure with waf!"
```

### Building jsoncpp

* Used existing scisoft build script for jsoncpp;
* built newer version `v1_8_4` with `e17:prof` and `e17:debug`;
* had problems with building the newer versions `v1_9_0` and up (not going to resolve now).

### Building protodune_wibsoft

* Previous [Build instructions](https://twiki.cern.ch/twiki/bin/view/CENF/WIBArtDAQOp)
* Rewrote build procedure using `ssibuildshims`...
* Generated patch files for revision 351.

### Building libxml2

* latest version is `v2_9_9`;
* [Official repo](https://gitlab.gnome.org/GNOME/libxml2/);
* renamed source directory name in tarball (to follow `pkg-dot-version` name convention);
* used `autogen.sh` instead of `configure` in SciSoft's build script.

### Building QAT

* 

---


## Random notes

* jsoncpp build script is designed for e qualified debug and prof build (extra qualifiers); with cmake...
* [ipbb framework](https://indico.fnal.gov/event/18746/contribution/4/material/slides/0.pdf) -- building felix firmware
* [ipbus release](https://github.com/ipbus/ipbus-software/releases)
