Skip to content

Latest commit

 

History

History

cmake

OR-Tools CMake Build Instructions

OS C++ Python Java .NET
Linux Status Status Status Status
macOS Status Status Status Status
Windows Status Status Status Status

Dockers: Status

Introduction

| Dependencies | C++ | Swig | Python 3 | .Net Core | Java | Integration | CI |

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 it can be incorporated into an existing CMake project.

warning: Currently OR-Tools CMake doesn't support Java nor .Net, please use the Makefile based build instead.

OR-Tools depends on severals mandatory libraries. You can compile them all at configure time using the option -DBUILD_DEPS=ON (OFF by default) or you can compile few of them using the options below.

  • ZLIB (BUILD_ZLIB),
  • Google Abseil-cpp (BUILD_absl),
  • Google Gflags (BUILD_gflags),
  • Google Glog (BUILD_glog),
  • Google Protobuf (BUILD_Protobuf),
  • 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.

OR-Tools also have few (ed compile time) optional solvers support (disabled by default):

  • SCIP (USE_SCIP),
  • CPLEX (USE_CPLEX),
  • XPRESS (USE_XPRESS)

warning: Since these solvers require license and are proprietary, we can't test it on public CI and support can be broken.

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_minimum_required(VERSION 3.0.2)
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 (https://github.com/google/googletest/blob/master/googletest/README.md#incorporating-into-an-existing-cmake-project)

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_minimum_required(VERSION 3.0.2)
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.14.7 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_minimum_required(VERSION 3.11.4)
project(myproj VERSION 1.0 LANGUAGES CXX)

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

# 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 or-tools dependencies as well.