Back to Or Tools

OR-Tools CMake Build Instructions

cmake/README.md

2016-0619.4 KB
Original Source

OR-Tools CMake Build Instructions

OSC++PythonJava.NET
amd64 Linux
arm64 MacOS
amd64 MacOS
amd64 Windows
<!-- disableFinding(LINK_RELATIVE_G3DOC) -->

Dockers: [AlmaLinux, Alpine, Archlinux, Debian, Fedora, OpenSuse, RockyLinux, Ubuntu]x [C++, Python, Java, .Net]:

Introduction

<nav for="cmake"> | <a href="#requirement">Requirement</a> | <a href="#dependencies">Dependencies</a> | <a href="#cmake-options">Options</a> | <a href="docs/cpp.md">C++</a> | <a href="docs/swig.md">Swig</a> | <a href="docs/python.md">Python 3</a> | <a href="docs/dotnet.md">.Net Core</a> | <a href="docs/java.md">Java</a> | <a href="#integrating-or-tools-in-your-cmake-project">Integration</a> | <a href="docs/ci.md">CI</a> | </nav>

OR-Tools comes with a CMake-based build (CMakeLists.txt) that can be used on a wide range of platforms (the "C" stands for cross-platform). If you don't have CMake installed already, you can download it for free from http://www.cmake.org/.

CMake works by generating native Makefiles or build projects that can be used in the compiler environment of your choice. You can either build OR-Tools with CMake as a standalone project or incorporate it into an existing CMake project.

Requirement

You'll need:

  • CMake >= 3.24.
  • A C++20 compiler (GCC 10 or above)

Solvers supported

Here the list of supported solvers:

  • CBC
  • CLP
  • CP-SAT
  • CPLEX*
  • GLOP
  • GLPK*
  • HiGHS*
  • PDLP
  • SCIP
  • XPRESS

*: these solvers are disabled by default.

Dependencies

OR-Tools depends on several mandatory librariess, either as infrastructure or as optimization solvers. You can either compile them all at configure time using the option -DBUILD_DEPS=ON (OFF by default) or compile some of them using the options below (see CMake Options below).

  • zlib (BUILD_ZLIB),

  • bzip2 (BUILD_BZip2),

  • Google Abseil-cpp (BUILD_absl),

  • Google Protobuf (BUILD_Protobuf),

  • COIN-OR solvers:

    • COIN-OR CoinUtils (BUILD_CoinUtils),

    • COIN-OR Osi (BUILD_Osi),

    • COIN-OR Clp (BUILD_Clp),

    • COIN-OR Cgl (BUILD_Cgl),

    • COIN-OR Cbc (BUILD_Cbc),

      note: You can disable the support of COIN-OR solvers (i.e. Cbc and Clp solver) by using -DUSE_COINOR=OFF (ON by default).

  • HIGHS (BUILD_HIGHS),

    note: You must enable the support of HiGHS solver by using -DUSE_HIGHS=ON (OFF by default).

  • SCIP (BUILD_SCIP),

    note: You can disable the support of SCIP solver by using -DUSE_SCIP=OFF (ON by default).

OR-Tools can also optionally (disabled by default i.e. OFF) be compiled with support for the following third-party solvers:

  • GLPK (BUILD_GLPK),

    note: You must enable the support of GLPK solver by using -DUSE_GLPK=ON (OFF by default).

  • CPLEX (USE_CPLEX),

warning: Since these solvers are either proprietary (and require a specific license) or available under the GPL, we can't test them on public CI and their support may be broken.

Enabling CPLEX Support

To enable CPLEX support, configure with -DUSE_CPLEX=ON and -DCPLEX_ROOT=/absolute/path/to/CPLEX/root/dir, replacing /absolute/path/to/CPLEX/root/dir with the path to your CPLEX installation. CPLEX_ROOT can also be defined as an environment variable rather than an option at configure time.

For ease of migration from legacy make third_party builds, CMake will also read the CPLEX installation path from the UNIX_CPLEX_DIR environment variable, if defined.

CMake Options

There are several options that can be passed to CMake to modify how the code is built.

To set these options and parameters, use -D<Parameter_name>=<value>.

All CMake options are passed at configure time, i.e., by running

cmake -S. -B<your_chosen_build_directory> -DOPTION_ONE=ON -DOPTION_TWO=OFF ...

before running cmake --build <your_chosen_build_directory>

For example, to generate build files including dependencies in a new subdirectory called 'build', run:

sh
cmake -S. -Bbuild -DBUILD_DEPS:BOOL=ON

and then build with:

sh
cmake --build build

Following is a list of available options, for the full list run:

sh
cmake -S. -Bbuild -LH
CMake OptionDefault ValueNote
CMAKE_BUILD_TYPEReleasesee CMake documentation here
BUILD_CXXONBuild C++
BUILD_DOTNETOFFBuild .Net wrapper and packages
BUILD_JAVAOFFBuild Java wrapper and packages
BUILD_PYTHONOFFBuild Python wrapper and package
BUILD_FLATZINCON*Build the flatzinc library
Forced to OFF if BUILD_CXX=OFF
BUILD_GLOPOFF*Build the standalone Glop library
Forced to OFF if BUILD_CXX=ON, otherwise default to ON
Dependencies
BUILD_DEPSOFF*Default to ON if BUILD_JAVA=ON or BUILD_PYTHON=ON or BUILD_DOTNET=ON
BUILD_ZLIBOFF*Build the zlib dynamic library
Forced to ON if BUILD_DEPS=ON
BUILD_BZip2OFF*Build the bzip2 dynamic library
Forced to ON if BUILD_DEPS=ON
BUILD_abslOFF*Build the abseil-cpp dynamic libraries
Forced to ON if BUILD_DEPS=ON
BUILD_ProtobufOFF*Build the protobuf dynamic libraries
Forced to ON if BUILD_DEPS=ON
BUILD_re2OFF*Build the re2 dynamic libraries
Forced to ON if BUILD_DEPS=ON
BUILD_Eigen3OFF*Build the Eigen3 libraries
Forced to ON if BUILD_DEPS=ON
Coin-OR
USE_COINORON*Enable Coin-OR support
Forced to OFF if BUILD_CXX=OFF
BUILD_CoinUtilsOFF*Build the CoinUtils dynamic library
Forced to ON if USE_COINOR=ON and BUILD_DEPS=ON
BUILD_OsiOFF*Build the Osi dynamic library
Forced to ON if USE_COINOR=ON and BUILD_DEPS=ON
BUILD_ClpOFF*Build the Clp dynamic library
Forced to ON if USE_COINOR=ON and BUILD_DEPS=ON
BUILD_CglOFF*Build the Cgl dynamic library
Forced to ON if USE_COINOR=ON and BUILD_DEPS=ON
BUILD_CbcOFF*Build the Cbc dynamic library
Forced to ON if USE_COINOR=ON and BUILD_DEPS=ON
GLPK
USE_GLPKOFF*Enable GLPK support
Forced to OFF if BUILD_CXX=OFF
BUILD_GLPKOFF*Build the GLPK dynamic libraries
Forced to ON if USE_GLPK=ON and BUILD_DEPS=ON
HiGHS
USE_HIGHSON*Enable HIGHS support
Forced to OFF if BUILD_CXX=OFF
BUILD_HIGHSOFF*Build the HiGHS dynamic libraries
Forced to ON if USE_HIGHS=ON and BUILD_DEPS=ON
SCIP
USE_SCIPON*Enable SCIP support
Forced to OFF if BUILD_CXX=OFF
BUILD_SCIPOFF*Build the SCIP dynamic libraries
Forced to ON if USE_SCIP=ON and BUILD_DEPS=ON
CPLEX
USE_CPLEXOFFEnable CPLEX support
Documentation
BUILD_DOCOFF*Build all documentations
BUILD_CXX_DOCOFF*Build C++ documentation
Forced to ON if BUILD_DOC=ON
BUILD_DOTNET_DOCOFF*Build .Net documentation
Forced to ON if BUILD_DOC=ON
BUILD_JAVA_DOCOFF*Build Java documentation
Forced to ON if BUILD_DOC=ON
BUILD_PYTHON_DOCOFF*Build Python documentation
Forced to ON if BUILD_DOC=ON
INSTALL_DOCOFF*Install all documentations
Forced to OFF if BUILD_CXX=OFF or BUILD_DOC=OFF
Samples
BUILD_SAMPLESON*Build all samples
Default to ON if BUILD_DEPS=ON
BUILD_CXX_SAMPLESON*Build all C++ samples
Forced to OFF if BUILD_CXX=OFF or BUILD_SAMPLE=OFF
BUILD_DOTNET_SAMPLESON*Build all .Net samples
Forced to OFF if BUILD_DOTNET=OFF or BUILD_SAMPLE=OFF
BUILD_JAVA_SAMPLESON*Build all Java samples
Forced to OFF if BUILD_JAVA=OFF or BUILD_SAMPLE=OFF
BUILD_PYTHON_SAMPLESON*Build all Python samples
Forced to OFF if BUILD_PYTHON=OFF or BUILD_SAMPLE=OFF
Examples
BUILD_EXAMPLESON*Build all examples
Default to ON if BUILD_DEPS=ON
BUILD_CXX_EXAMPLESON*Build all C++ examples
Forced to OFF if BUILD_CXX=OFF or BUILD_SAMPLE=OFF
BUILD_DOTNET_EXAMPLESON*Build all .Net examples
Forced to OFF if BUILD_DOTNET=OFF or BUILD_SAMPLE=OFF
BUILD_JAVA_EXAMPLESON*Build all Java examples
Forced to OFF if BUILD_JAVA=OFF or BUILD_SAMPLE=OFF
BUILD_PYTHON_EXAMPLESON*Build all Python examples
Forced to OFF if BUILD_PYTHON=OFF or BUILD_SAMPLE=OFF
.Net
USE_DOTNET_46OFFEnable .Net Framework 4.6 support
Only available if BUILD_DOTNET=ON
USE_DOTNET_461OFFEnable .Net Framework 4.6.1 support
Only available if BUILD_DOTNET=ON
USE_DOTNET_462OFFEnable .Net Framework 4.6.2 support
Only available if BUILD_DOTNET=ON
USE_DOTNET_48OFFEnable .Net Framework 4.8 support
Only available if BUILD_DOTNET=ON
USE_DOTNET_STD_21OFFEnable .Net Standard 2.1 support
Only available if BUILD_DOTNET=ON and not targeting arm64 platform
USE_DOTNET_CORE_31OFFEnable .Net Core 3.1 LTS support
Only available if BUILD_DOTNET=ON and not targeting arm64 platform
USE_DOTNET_6OFFEnable .Net 6 LTS support
Only available if BUILD_DOTNET=ON
USE_DOTNET_7OFFEnable .Net 7 support
Only available if BUILD_DOTNET=ON
USE_DOTNET_8ONEnable .Net 8 LTS support
Only available if BUILD_DOTNET=ON
USE_DOTNET_9OFFEnable .Net 9 support
Only available if BUILD_DOTNET=ON
UNIVERSAL_DOTNET_PACKAGEOFFBuild a multi platform package (i.e. Google.OrTools will depends on all runtime packages)
Only available if BUILD_DOTNET=ON
Java
SKIP_GPGONDisable GPG sign
Only available if BUILD_JAVA=ON
UNIVERSAL_JAVA_PACKAGEOFFBuild a multi platform package (i.e. ortools-java will depends on all native packages)
Only available if BUILD_JAVA=ON
BUILD_FAT_JAROFFBuild a ortools-java .jar that includes all of its own Maven dependencies, including the native package
Only available if BUILD_JAVA=ON
Python
BUILD_pybind11BUILD_DEPSStatic build the pybind11 libraries
Forced to ON if BUILD_DEPS=ON
Only available if BUILD_PYTHON=ON
BUILD_pybind11_abseilBUILD_DEPSStatic build the pybind11_abseil libraries
Forced to ON if BUILD_DEPS=ON
Only available if BUILD_PYTHON=ON
BUILD_pybind11_protobufBUILD_DEPSStatic build the pybind11_protobuf libraries
Forced to ON if BUILD_DEPS=ON
Only available if BUILD_PYTHON=ON
GENERATE_PYTHON_STUBONGenerate python stub files
Only available if BUILD_PYTHON=ON
BUILD_VENVBUILD_TESTINGCreate python venv in BINARY_DIR/python/venv
Forced to ON if BUILD_TESTING=ON
Only available if BUILD_PYTHON=ON
VENV_USE_SYSTEM_SITE_PACKAGESOFFPython venv can use system site package (e.g. py3-numpy on Alpine)
Only available if BUILD_PYTHON=ON and BUILD_VENV=ON
FETCH_PYTHON_DEPSBUILD_DEPSFetch python modules needed to build ortools package
Only available if BUILD_PYTHON=ON

Integrating OR-Tools in your CMake Project

You should be able to integrate OR-Tools in your C++ CMake project following one of these methods.

For API/ABI compatibility reasons, if you will be using OR-Tools inside a larger C++ project, we recommend using CMake and incorporate OR-Tools as a CMake subproject (i.e. using add_sudirectory() or FetchContent).

Consuming OR-Tools in a CMake Project

If you already have OR-Tools installed in your system, you can use the CMake command find_package() to include OR-Tools in your C++ CMake Project.

note: You may need to set CMAKE_PREFIX_PATH in order for CMake to find your OR-Tools installation.

cmake
cmake_minimum_required(VERSION 3.14)
project(myproj VERSION 1.0)

find_package(ortools CONFIG REQUIRED)

add_executable(myapp main.cpp)
target_link_libraries(myapp ortools::ortools)

Include directories, compile definitions and compile options will be added automatically to your target as needed.

Incorporating OR-Tools into a CMake Super Project

Using add_subdirectory

The recommendations below are similar to those for using CMake within the googletest framework

Thus, you can use the CMake command add_subdirectory() to include OR-Tools directly from a subdirectory of your C++ CMake project.

Note: The ortools::ortools target is in this case an ALIAS library target for the ortools library target.

cmake
cmake_minimum_required(VERSION 3.18)
project(myproj VERSION 1.0)

add_subdirectory(or-tools)

add_executable(myapp main.cpp)
target_link_libraries(myapp ortools::ortools)

Again, include directories, compile definitions and compile options will be added automatically to your target as needed.

Using FetchContent

If you have CMake >= 3.18 you can use the built-in module FetchContent instead. Note: The ortools::ortools target is in this case an ALIAS library target for the ortools library target.

cmake
cmake_minimum_required(VERSION 3.18)
project(myproj VERSION 1.0 LANGUAGES CXX)

include(FetchContent)
FetchContent_Declare(
  or-tools
  GIT_REPOSITORY https://github.com/google/or-tools.git
  GIT_TAG        main
)

# After the following call, the CMake targets defined by OR-Tools
# will be defined and available to the rest of the build
FetchContent_MakeAvailable(or-tools)

add_executable(myapp main.cpp)
target_link_libraries(myapp ortools::ortools)

note: You may need to use the option -DBUILD_DEPS=ON to get all the OR-Tools dependencies as well.