cacao does not build on its own. It is a plugin of
milk: the cacao sources are placed in
milk/plugins/cacao-src/ and compiled as part of milk.
cacao targets Linux. It is built and tested on Ubuntu 24.04.
On Ubuntu/Debian:
sudo apt-get install \
git cmake make pkg-config gcc g++ gfortran \
bison flex libbison-dev libfl-dev \
libcfitsio-dev libgsl-dev libfftw3-dev libncurses-dev libreadline-dev \
libopenblas-dev liblapacke-dev \
python3-dev pybind11-dev python3-pybind11This is the same list the repository's Dockerfile installs, which CI
builds on every change.
Optional:
- CUDA toolkit, for GPU computation (configure with
-DUSE_CUDA=ON) - MAGMA, for GPU linear algebra (
-DUSE_MAGMA=ON, requires CUDA) - Intel MKL, used instead of OpenBLAS when found by pkg-config (
mkl-sdl) tmux, used by the cacao loop setup scripts
git clone https://github.com/milk-org/milk.git
cd milk
git clone https://github.com/CaltechOpticalObservatories/cacao.git plugins/cacao-src
cmake -S . -B _build -DCMAKE_BUILD_TYPE=Release -DINSTALLMAKEDEFAULT=ON
cmake --build _build -j "$(nproc)"
sudo cmake --install _build:::{important}
Run cmake from the milk source root, as shown. milk finds plugins with a
find plugins relative to the directory cmake is run from, so configuring
from inside _build/ (cd _build; cmake .., which is what milk's
compile.sh does) silently builds milk without cacao.
:::
milk installs to /usr/local/milk-<version>. -DINSTALLMAKEDEFAULT=ON also
points the symlink /usr/local/milk at that version.
milk's fetch_cacao_dev.sh script can clone cacao for you. By default it
clones the upstream cacao-org/cacao dev branch. To use this fork instead:
CACAO_REPOSITORY=https://github.com/CaltechOpticalObservatories/cacao.git \
CACAO_BRANCH=dev \
./fetch_cacao_dev.shThe script only clones when plugins/cacao-src does not exist. Otherwise it
runs git pull in the existing checkout.
Add to ~/.bashrc (or equivalent):
export MILK_ROOT=$HOME/src/milk # milk source directory (edit as needed)
export MILK_INSTALLDIR=/usr/local/milk
export PATH=${PATH}:${MILK_INSTALLDIR}/bin
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:${MILK_INSTALLDIR}/lib/pkgconfigMILK_ROOT must be set. cacao-loop-deploy reads the example
configurations from $MILK_ROOT/plugins/cacao-src.
Image streams and their semaphores are files in a shared-memory directory. The directory is chosen in this order:
$MILK_SHM_DIR, if it is set and exists/milk/shm/tmp
For real-time use, mount a tmpfs at /milk/shm:
sudo mkdir -p /milk/shm
echo "tmpfs /milk/shm tmpfs rw,nosuid,nodev" | sudo tee -a /etc/fstab
sudo mount /milk/shmThe repository's Dockerfile builds milk with the cacao sources from the
current checkout:
docker build -t cacao .
docker run --rm -it cacaoBuild against a different milk branch with
--build-arg MILK_REF=<branch>.
milk-check
cacao-loop-deploy -h