2017-12-11 09:20:43 +01:00
|
|
|
# This file is just an orchestration
|
2020-05-14 18:01:23 +02:00
|
|
|
cmake_minimum_required(VERSION 3.14)
|
2017-12-11 09:20:43 +01:00
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
|
|
|
|
|
|
|
|
|
# Apple: Don't modify install_name when touching RPATH.
|
|
|
|
|
if(POLICY CMP0068)
|
2018-10-10 15:16:27 +02:00
|
|
|
cmake_policy(SET CMP0068 NEW)
|
2017-12-11 09:20:43 +01:00
|
|
|
endif()
|
|
|
|
|
|
2020-02-24 17:32:53 +01:00
|
|
|
# Define file(GENERATE) behavior for relative paths.
|
|
|
|
|
if(POLICY CMP0070)
|
|
|
|
|
cmake_policy(SET CMP0070 NEW)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# target_sources: use absolute path for INTERFACE_SOURCES.
|
|
|
|
|
if(POLICY CMP0076)
|
|
|
|
|
cmake_policy(SET CMP0076 NEW)
|
|
|
|
|
endif()
|
|
|
|
|
|
2020-03-06 11:34:51 +01:00
|
|
|
# option() honors normal variables.
|
|
|
|
|
if(POLICY CMP0077)
|
2020-07-23 14:55:21 +02:00
|
|
|
cmake_policy(SET CMP0077 NEW)
|
2020-03-06 11:34:51 +01:00
|
|
|
endif()
|
|
|
|
|
|
2020-02-24 17:32:53 +01:00
|
|
|
# SWIG: use standard target name.
|
2019-08-06 18:21:29 +02:00
|
|
|
if(POLICY CMP0078)
|
2020-02-24 17:32:53 +01:00
|
|
|
cmake_policy(SET CMP0078 NEW)
|
2019-08-06 18:21:29 +02:00
|
|
|
endif()
|
|
|
|
|
|
2020-02-24 17:32:53 +01:00
|
|
|
# SWIG: use SWIG_MODULE_NAME property.
|
2019-08-06 18:21:29 +02:00
|
|
|
if(POLICY CMP0086)
|
|
|
|
|
cmake_policy(SET CMP0086 NEW)
|
|
|
|
|
endif()
|
|
|
|
|
|
2020-07-31 17:43:50 +02:00
|
|
|
# MSVC runtime library flags are selected by an abstraction.
|
|
|
|
|
if(POLICY CMP0091)
|
|
|
|
|
cmake_policy(SET CMP0091 NEW)
|
|
|
|
|
endif()
|
|
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
include(utils)
|
|
|
|
|
set_version(VERSION)
|
|
|
|
|
|
2019-04-11 17:10:11 +02:00
|
|
|
project(ortools VERSION ${VERSION} LANGUAGES CXX)
|
2020-05-22 11:05:48 +02:00
|
|
|
set(PROJECT_NAMESPACE ortools)
|
2020-03-05 11:01:42 +01:00
|
|
|
message(STATUS "${PROJECT_NAME} version: ${PROJECT_VERSION}")
|
|
|
|
|
#message(STATUS "major: ${PROJECT_VERSION_MAJOR}")
|
|
|
|
|
#message(STATUS "minor: ${PROJECT_VERSION_MINOR}")
|
|
|
|
|
#message(STATUS "patch: ${PROJECT_VERSION_PATCH}")
|
2019-04-03 17:26:27 +02:00
|
|
|
|
2020-08-11 12:19:52 +02:00
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
# Default Build Type to be Release
|
|
|
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
|
|
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
|
|
|
|
|
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel. (default: Release)"
|
|
|
|
|
FORCE)
|
|
|
|
|
endif()
|
2017-12-11 09:20:43 +01:00
|
|
|
|
2020-05-22 11:05:48 +02:00
|
|
|
# Layout build dir like install dir
|
|
|
|
|
include(GNUInstallDirs)
|
2017-12-11 09:20:43 +01:00
|
|
|
if(UNIX)
|
2020-05-22 11:05:48 +02:00
|
|
|
option(BUILD_SHARED_LIBS "Build shared libraries(.so or .dyld)." ON)
|
|
|
|
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
|
|
|
|
|
# for multi-config build system (e.g. xcode)
|
|
|
|
|
foreach(OUTPUTCONFIG IN LISTS CMAKE_CONFIGURATION_TYPES)
|
|
|
|
|
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
|
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_LIBDIR})
|
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_LIBDIR})
|
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR})
|
|
|
|
|
endforeach()
|
|
|
|
|
else()
|
|
|
|
|
# Currently Only support static build for windows
|
2018-10-10 15:16:27 +02:00
|
|
|
set(BUILD_SHARED_LIBS OFF)
|
2020-05-22 11:05:48 +02:00
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
|
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
|
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
|
|
|
|
|
# for multi-config builds (e.g. msvc)
|
|
|
|
|
foreach(OUTPUTCONFIG IN LISTS CMAKE_CONFIGURATION_TYPES)
|
|
|
|
|
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
|
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR})
|
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR})
|
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OUTPUTCONFIG}/${CMAKE_INSTALL_BINDIR})
|
|
|
|
|
endforeach()
|
2017-12-11 09:20:43 +01:00
|
|
|
endif()
|
|
|
|
|
|
2020-01-29 17:32:40 +01:00
|
|
|
# By default only build the C++ library.
|
2019-04-03 17:26:27 +02:00
|
|
|
option(BUILD_CXX "Build C++ library" ON)
|
|
|
|
|
message(STATUS "Build C++ library: ${BUILD_CXX}")
|
2020-01-29 17:32:40 +01:00
|
|
|
|
|
|
|
|
option(BUILD_PYTHON "Build Python Library" OFF)
|
2019-04-03 17:26:27 +02:00
|
|
|
message(STATUS "Build Python: ${BUILD_PYTHON}")
|
2020-01-29 17:32:40 +01:00
|
|
|
option(BUILD_JAVA "Build Java Library" OFF)
|
2019-04-03 17:26:27 +02:00
|
|
|
message(STATUS "Build Java: ${BUILD_JAVA}")
|
2020-01-29 17:32:40 +01:00
|
|
|
option(BUILD_DOTNET "Build .NET Library" OFF)
|
2019-04-03 17:26:27 +02:00
|
|
|
message(STATUS "Build .Net: ${BUILD_DOTNET}")
|
2018-02-13 15:47:15 +01:00
|
|
|
|
2020-05-22 11:05:48 +02:00
|
|
|
# If wrapper are built, we need to have the install rpath in BINARY_DIR to package
|
|
|
|
|
if(BUILD_PYTHON OR BUILD_JAVA OR BUILD_DOTNET)
|
|
|
|
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
|
|
|
|
endif()
|
|
|
|
|
|
2020-09-11 16:05:03 +02:00
|
|
|
include(CMakeDependentOption)
|
2020-07-26 00:05:52 +02:00
|
|
|
option(BUILD_SAMPLES "Build samples" ON)
|
|
|
|
|
message(STATUS "Build samples: ${BUILD_SAMPLES}")
|
2020-09-11 16:05:03 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_CXX_SAMPLES "Build cxx samples" ON "BUILD_SAMPLES;BUILD_CXX" OFF)
|
|
|
|
|
message(STATUS "Build C++ samples: ${BUILD_CXX_SAMPLES}")
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_PYTHON_SAMPLES "Build python samples" ON "BUILD_SAMPLES;BUILD_PYTHON" OFF)
|
|
|
|
|
message(STATUS "Build Python samples: ${BUILD_PYTHON_SAMPLES}")
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_JAVA_SAMPLES "Build java samples" ON "BUILD_SAMPLES;BUILD_JAVA" OFF)
|
|
|
|
|
message(STATUS "Build Java samples: ${BUILD_JAVA_SAMPLES}")
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_DOTNET_SAMPLES "Build dotnet samples" ON "BUILD_SAMPLES;BUILD_DOTNET" OFF)
|
|
|
|
|
message(STATUS "Build .Net samples: ${BUILD_DOTNET_SAMPLES}")
|
|
|
|
|
|
2020-07-26 00:05:52 +02:00
|
|
|
|
2020-03-02 10:02:57 +01:00
|
|
|
option(BUILD_EXAMPLES "Build examples" ON)
|
|
|
|
|
message(STATUS "Build examples: ${BUILD_EXAMPLES}")
|
2020-09-11 16:05:03 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_CXX_EXAMPLES "Build cxx samples" ON "BUILD_EXAMPLES;BUILD_CXX" OFF)
|
|
|
|
|
message(STATUS "Build C++ samples: ${BUILD_CXX_EXAMPLES}")
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_PYTHON_EXAMPLES "Build python samples" ON "BUILD_EXAMPLES;BUILD_PYTHON" OFF)
|
|
|
|
|
message(STATUS "Build Python samples: ${BUILD_PYTHON_EXAMPLES}")
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_JAVA_EXAMPLES "Build java samples" ON "BUILD_EXAMPLES;BUILD_JAVA" OFF)
|
|
|
|
|
message(STATUS "Build Java samples: ${BUILD_JAVA_EXAMPLES}")
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_DOTNET_EXAMPLES "Build dotnet samples" ON "BUILD_EXAMPLES;BUILD_DOTNET" OFF)
|
|
|
|
|
message(STATUS "Build .Net samples: ${BUILD_DOTNET_EXAMPLES}")
|
2020-03-02 10:02:57 +01:00
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
#option(BUILD_DOC "Build doxygen" OFF)
|
|
|
|
|
#message(STATUS "Build doxygen: ${BUILD_DOC}")
|
|
|
|
|
|
2020-01-29 17:32:40 +01:00
|
|
|
# By default all dependencies are NOT built (i.e. BUILD_DEPS=OFF),
|
|
|
|
|
# BUT if building any wrappers (Python, Java or .Net) then BUILD_DEPS=ON.
|
|
|
|
|
if(BUILD_PYTHON OR BUILD_JAVA OR BUILD_DOTNET)
|
|
|
|
|
option(BUILD_DEPS "Build all dependencies" ON)
|
|
|
|
|
else()
|
|
|
|
|
option(BUILD_DEPS "Build all dependencies" OFF)
|
|
|
|
|
endif()
|
|
|
|
|
message(STATUS "Build all dependencies: ${BUILD_DEPS}")
|
2020-01-30 13:25:40 +01:00
|
|
|
# Install built dependencies if any,
|
|
|
|
|
option(INSTALL_BUILD_DEPS "Install build all dependencies" ON)
|
2020-01-29 17:32:40 +01:00
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
# IF BUILD_DEPS=ON THEN Force all BUILD_*=ON
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_ZLIB "Build the ZLIB dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
2020-02-07 08:56:13 +01:00
|
|
|
message(STATUS "Build ZLIB: ${BUILD_ZLIB}")
|
|
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_absl "Build the abseil-cpp dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
2020-02-07 08:56:13 +01:00
|
|
|
message(STATUS "Build abseil-cpp: ${BUILD_absl}")
|
|
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_gflags "Build the gflags dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
2020-02-07 08:56:13 +01:00
|
|
|
message(STATUS "Build gflags: ${BUILD_gflags}")
|
|
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_glog "Build the glog dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
2020-02-07 08:56:13 +01:00
|
|
|
message(STATUS "Build glog: ${BUILD_glog}")
|
2020-02-06 18:32:40 +01:00
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_Protobuf "Build the Protobuf dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
|
|
|
|
message(STATUS "Build protobuf: ${BUILD_Protobuf}")
|
2020-02-06 18:32:40 +01:00
|
|
|
|
|
|
|
|
# Optional third party solvers (enabled by default)
|
2020-07-03 16:16:50 +02:00
|
|
|
option(USE_SCIP "Use the SCIP solver" ON)
|
|
|
|
|
message(STATUS "SCIP support: ${USE_SCIP}")
|
|
|
|
|
if(USE_SCIP)
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_SCIP "Build the SCIP dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
|
|
|
|
message(STATUS "Build SCIP: ${BUILD_SCIP}")
|
|
|
|
|
endif()
|
|
|
|
|
|
2020-02-06 18:32:40 +01:00
|
|
|
option(USE_COINOR "Use the COIN-OR solver" ON)
|
|
|
|
|
message(STATUS "COIN-OR support: ${USE_COINOR}")
|
|
|
|
|
if(USE_COINOR)
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_CoinUtils "Build the CoinUtils dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
|
|
|
|
message(STATUS "Build CoinUtils: ${BUILD_CoinUtils}")
|
|
|
|
|
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_Osi "Build the Osi dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
|
|
|
|
message(STATUS "Build Osi: ${BUILD_Osi}")
|
|
|
|
|
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_Clp "Build the Clp dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
|
|
|
|
message(STATUS "Build Clp: ${BUILD_Clp}")
|
|
|
|
|
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_Cgl "Build the Cgl dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
|
|
|
|
message(STATUS "Build Cgl: ${BUILD_Cgl}")
|
|
|
|
|
|
|
|
|
|
CMAKE_DEPENDENT_OPTION(BUILD_Cbc "Build the Cbc dependency Library" OFF
|
|
|
|
|
"NOT BUILD_DEPS" ON)
|
|
|
|
|
message(STATUS "Build Cbc: ${BUILD_Cbc}")
|
|
|
|
|
endif()
|
2018-10-10 15:16:27 +02:00
|
|
|
|
2020-01-29 17:32:40 +01:00
|
|
|
# Optional third party solvers (disabled by default)
|
|
|
|
|
option(USE_CPLEX "Use the CPLEX solver" OFF)
|
|
|
|
|
message(STATUS "CPLEX support: ${USE_CPLEX}")
|
2020-02-06 18:32:40 +01:00
|
|
|
|
2020-01-29 17:32:40 +01:00
|
|
|
option(USE_XPRESS "Use the XPRESS solver" OFF)
|
|
|
|
|
message(STATUS "XPRESS support: ${USE_XPRESS}")
|
2019-08-06 18:21:29 +02:00
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
# Build Needed dependencies
|
|
|
|
|
add_subdirectory(cmake/dependencies dependencies)
|
2020-02-28 14:29:53 +01:00
|
|
|
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_BINARY_DIR}/dependencies/install)
|
2017-12-11 09:20:43 +01:00
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
include(CTest)
|
2018-10-10 15:16:27 +02:00
|
|
|
|
2020-02-12 16:16:23 +01:00
|
|
|
# Basic type
|
|
|
|
|
include(CMakePushCheckState)
|
|
|
|
|
cmake_push_check_state(RESET)
|
|
|
|
|
set(CMAKE_EXTRA_INCLUDE_FILES "cstdint")
|
|
|
|
|
include(CheckTypeSize)
|
|
|
|
|
check_type_size("long" SIZEOF_LONG LANGUAGE CXX)
|
|
|
|
|
message(STATUS "Found long size: ${SIZEOF_LONG}")
|
|
|
|
|
check_type_size("long long" SIZEOF_LONG_LONG LANGUAGE CXX)
|
|
|
|
|
message(STATUS "Found long long size: ${SIZEOF_LONG_LONG}")
|
|
|
|
|
check_type_size("int64_t" SIZEOF_INT64_T LANGUAGE CXX)
|
|
|
|
|
message(STATUS "Found int64_t size: ${SIZEOF_INT64_T}")
|
|
|
|
|
|
|
|
|
|
check_type_size("unsigned long" SIZEOF_ULONG LANGUAGE CXX)
|
|
|
|
|
message(STATUS "Found unsigned long size: ${SIZEOF_ULONG}")
|
|
|
|
|
check_type_size("unsigned long long" SIZEOF_ULONG_LONG LANGUAGE CXX)
|
|
|
|
|
message(STATUS "Found unsigned long long size: ${SIZEOF_ULONG_LONG}")
|
|
|
|
|
check_type_size("uint64_t" SIZEOF_UINT64_T LANGUAGE CXX)
|
|
|
|
|
message(STATUS "Found uint64_t size: ${SIZEOF_UINT64_T}")
|
|
|
|
|
|
|
|
|
|
check_type_size("int *" SIZEOF_INT_P LANGUAGE CXX)
|
|
|
|
|
message(STATUS "Found int * size: ${SIZEOF_INT_P}")
|
|
|
|
|
cmake_pop_check_state()
|
|
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
include(cpp)
|
2018-01-18 15:15:13 +01:00
|
|
|
|
2019-04-03 17:26:27 +02:00
|
|
|
include(python)
|
|
|
|
|
include(java)
|
|
|
|
|
include(dotnet)
|
2020-03-02 11:36:57 +01:00
|
|
|
|
|
|
|
|
# Since samples mix all languages we must parse them once we have included all
|
|
|
|
|
# <language>.cmake files
|
2020-07-26 00:05:52 +02:00
|
|
|
if(BUILD_SAMPLES)
|
|
|
|
|
foreach(SAMPLES IN ITEMS algorithms graph linear_solver constraint_solver sat)
|
|
|
|
|
add_subdirectory(ortools/${SAMPLES}/samples)
|
|
|
|
|
endforeach()
|
|
|
|
|
endif()
|