Installation guide

July 10, 2026 ยท View on GitHub

Contents

Precompiled libraries and executables

We provide precompiled Uno libraries and executables in the releases tab for Linux (x64 and aarch64), macOS (x64 and aarch64), and Windows (x64).

Note

The shared library libhsl.so / libhsl.dylib / libhsl.dll provided in the precompiled archive is a dummy version that does not include the official HSL linear solvers such as MA27 or MA57. However, it can be safely replaced with the official precompiled libHSL library without the need to recompile anything. The routine symbols are identical, allowing seamless hot-swapping of the library.

On some platforms, the dynamic linker needs to know where to look for libraries at runtime. You might need to set the following environment variables:

  • LD_LIBRARY_PATH on Linux
  • DYLD_LIBRARY_PATH or DYLD_FALLBACK_LIBRARY_PATH on macOS
  • PATH on Windows

These variables should include the directories where you extracted the library files. For all platforms, the environment variable PATH is needed to locate the binary uno_ampl / uno_ampl.exe:

=== "Linux"

```console
tar -xzf Uno.vX.Y.Z.linux.tar.gz
export LD_LIBRARY_PATH=/path/to/extracted/Uno/lib:/path/to/extracted/Uno/deps:$LD_LIBRARY_PATH
export PATH=/path/to/extracted/Uno/bin:$PATH
```

=== "macOS"

```console
tar -xzf Uno.vX.Y.Z.macos.tar.gz
export DYLD_LIBRARY_PATH=/path/to/extracted/Uno/lib:/path/to/extracted/Uno/deps:$DYLD_LIBRARY_PATH
export PATH=/path/to/extracted/Uno/bin:$PATH
```

=== "Windows (PowerShell)"

```console
tar -xzf Uno.vX.Y.Z.windows.zip
$env:PATH="C:\path\to\extracted\Uno\bin;C:\path\to\extracted\Uno\lib;C:\path\to\extracted\Uno\deps;$env:PATH"
```

=== "Windows (Command Prompt)"

```console
tar -xzf Uno.vX.Y.Z.windows.zip
set PATH=C:\path\to\extracted\Uno\bin;C:\path\to\extracted\Uno\lib;C:\path\to\extracted\Uno\deps;%PATH%
```

Dependencies

  • install cmake, BLAS and LAPACK:
sudo apt update
sudo apt install cmake
sudo apt install libblas-dev liblapack-dev
  • (optional) download the AMPL solver library (ASL)

  • (optional) download solvers:

    • BQPD (null-space active set solver for nonconvex quadratic programming): get a precompiled binary for your architecture or get in touch with Sven Leyffer to apply for an academic license
    • MA27 (sparse indefinite symmetric linear solver)
    • MA57 (sparse indefinite symmetric linear solver)
    • MA86 (sparse indefinite symmetric linear solver)
    • LIBHSL (collection of solvers for sparse linear systems)
    • MUMPS (sparse indefinite symmetric linear solver)
    • SSIDS (sparse indefinite symmetric linear solver) from the SPRAL library
    • HiGHS (linear programming and convex quadratic programming solver)
  • to compile MUMPS in sequential mode, remove the flag -fopenmp at the end of your Makefile.inc and set the following variables:

INCS = $(INCSEQ)
LIBS = $(LIBSEQ)
LIBSEQNEEDED = libseqneeded
  • compile SSIDS without OpenMP with the Meson flag -Dopenmp=false

  • you may experience a short lag at startup (about 1/4s) when running Uno with SSIDS. This is due to hwloc (hardware locality), a tool that aims at discovering hardware resources in parallel architectures. To precompute the required topology, run the following commands before running Uno:

lstopo --of xml ~/.config/hwloc-topology.xml
echo 'export HWLOC_XMLFILE=$HOME/.config/hwloc-topology.xml' >> ~/.bashrc

Compiling and installing Uno from source

The sequence of commands to configure and build is as follows (assuming the build directory is build):

cmake -S . -B build [options]
cmake --build build --parallel

See the list of CMake options here.

To install the built libraries and headers:

cmake --install build

To configure, compile and run the test suite:

cmake -S . -B build -DENABLE_TESTS=ON
cmake --build build --target run_unotest --parallel
ctest --test-dir build

CMake options

You can pass the following options as -DOPTION=value:

OptionDescriptionPossible values
CMAKE_BUILD_TYPEbuild typeRelease, Debug
ENABLE_TESTSenable the unit testsON, OFF
BUILD_STATIC_LIBSbuild the Uno static libraryON, OFF
BUILD_SHARED_LIBSbuild the Uno shared libraryON, OFF
LAPACK_LIBRARIESpath(s) to the LAPACK library, separated by ;paths
BLAS_LIBRARIESpath(s) to the BLAS library, separated by ;paths
AMPLSOLVERpath(s) to the ASL librarypath_to_libamplsolver
BQPDpath to the BQPD librarypath_to_libbqpd
MA27path to the MA27 librarypath_to_libma27
MA57path to the MA57 librarypath_to_libma57
MA86path to the MA86 librarypath_to_libma86
HSLpath to the HSL librarypath_to_libhsl
HSL_RUNTIME_LOADINGload HSL linear solvers at runtime via dlopen; requires BUILD_SHARED_LIBS=ONON, OFF
HIGHSpath to the HiGHS libraries (typically libhighs and libhighs_extras)path_to_libhighs
HIGHS_INCLUDE_DIRpath to HiGHS include directorypath_to_highs_include_dir
METISpath to the METIS librarypath_to_libmetis
MUMPS_LIBRARYpath to the MUMPS librarypath_to_libdmumps
MUMPS_COMMON_LIBRARYpath to the MUMPS common librarypath_to_libmumps_common
MUMPS_PORD_LIBRARYpath to the MUMPS PORD librarypath_to_libpord
MUMPS_MPISEQ_LIBRARYpath to the MUMPS MPISEQ librarypath_to_libmpiseq
MUMPS_INCLUDE_DIRpath to MUMPS include directorypath_to_mumps_include_dir
SPRALpath to SPRAL library
(requires libhwloc passed to AUXILIARY_LIBRARIES)
path_to_libspral
SPRAL_INCLUDE_DIRpath to SPRAL include directorypath_to_spral_include_dir
AUXILIARY_LIBRARIESpath(s) to additional libraries to link against, separated by ;
(e.g., libhwloc and libstdc++)
paths

Note

-DHSL_RUNTIME_LOADING=ON requires a shared build (-DBUILD_SHARED_LIBS=ON): the mode is meant to dlopen a shared library libhsl from a shared libuno, so a static-only build is rejected by CMake.

With -DHSL_RUNTIME_LOADING=ON, Uno is built without linking any HSL library and instead dlopens it on first use (as IPOPT does), so the same binary can be shipped with or without HSL. At runtime, the shared library is resolved in this order:

  1. the libhsl_path option (empty by default);
  2. the UNO_HSL_LIBRARY environment variable;
  3. the platform default libhsl.so / libhsl.dylib / libhsl.dll.

Since the default linear_solver is auto-selected before user options are parsed, use UNO_HSL_LIBRARY (rather than the libhsl_path option) if you want MA27/MA57/MA86 to be picked automatically when the library is not on the default search path.