Merge pull request #398 from ambasta/master

Improvements to CMake Build Structure
This commit is contained in:
lperron
2017-06-05 17:43:39 +02:00
committed by GitHub
13 changed files with 212 additions and 56 deletions

View File

@@ -4,57 +4,79 @@ PROJECT(ortools LANGUAGES CXX)
SET(CMAKE_CXX_STANDARD 11)
INCLUDE(FindPkgConfig)
INCLUDE(ExternalProject)
SET(CMAKE_INSTALL_LIBDIR lib)
SET(CMAKE_INSTALL_BINDIR bin)
SET(CMAKE_INSTALL_INCLUDEDIR include)
IF(UNIX)
IF(NOT APPLE)
INCLUDE(GNUInstallDirs)
ENDIF()
ENDIF()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fwrapv -DNDEBUG")
IF(BUILD_PYTHON)
SET(BUILD_CXX ON)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
SET(BUILD_CXX ON)
SET(DOWNLOAD_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/downloads" CACHE PATH "Location where external projects will be downloaded.")
IF(PYTHON_VERSION_MAJOR GREATER_EQUAL 3)
SET(CMAKE_SWIG_FLAGS "${CMAKE_SWIG_FLAGS};-py3;-DPY3")
ENDIF()
MARK_AS_ADVANCED(BUILD_CXX)
MARK_AS_ADVANCED(DOWNLOAD_LOCATION)
FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(cmake/UseSWIG.cmake)
ENDIF(BUILD_PYTHON)
SET(${PROJECT_NAME}externalTargets "")
FILE(READ ${CMAKE_CURRENT_SOURCE_DIR}/Dependencies.txt _Dependency_file)
FOREACH(DEPENDENCY Protobuf Gflags Glog cbc CoinUtils Osi Clp Cgl)
STRING(REGEX REPLACE ".*${DEPENDENCY} = ([0-9.]+).*" "\\1" ${DEPENDENCY}_VERSION ${_Dependency_file})
ENDFOREACH()
IF(BUILD_CXX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_GLOP -DUSE_BOP")
FIND_PACKAGE(Threads REQUIRED)
FIND_PACKAGE(Protobuf REQUIRED)
FIND_PACKAGE(Protobuf ${Protobuf_VERSION} QUIET)
IF(NOT Protobuf_FOUND)
MESSAGE(STATUS "Did not find system protobuff. Building as an external project")
INCLUDE(cmake/external/protobuf.cmake)
ENDIF()
INCLUDE_DIRECTORIES(${Protobuf_INCLUDE_DIRS})
FILE(GLOB_RECURSE proto_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
"ortools/*.proto")
FIND_PACKAGE(Gflags ${Gflags_VERSION} QUIET)
IF(NOT Gflags_FOUND)
MESSAGE(STATUS "Did not find system gflags. Building as an external project")
INCLUDE(cmake/external/gflags.cmake)
ENDIF()
INCLUDE_DIRECTORIES(${Gflags_INCLUDE_DIRS})
SET(GLOG_VERSION ${Glog_VERSION})
PKG_CHECK_MODULES(GLOG libglog>=${GLOG_VERSION})
# Set again since pkg_check_module resets GLOG_VERSION
SET(GLOG_VERSION ${Glog_VERSION})
IF(NOT GLOG_FOUND)
MESSAGE(STATUS "Did not find system glog. Building as an external project.")
INCLUDE(cmake/external/glog.cmake)
ENDIF()
INCLUDE_DIRECTORIES(${GLOG_INCLUDE_DIRS})
SET(Cbc_VERSION ${cbc_VERSION})
PKG_CHECK_MODULES(Cbc cbc)
SET(Cbc_VERSION ${cbc_VERSION})
IF(NOT Cbc_FOUND)
MESSAGE(STATUS "Did not find system coin-cbc. Building as an external Project.")
INCLUDE(cmake/external/cbc.cmake)
ENDIF()
INCLUDE_DIRECTORIES(${Cbc_INCLUDE_DIRS})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fwrapv -DNDEBUG -DUSE_GLOP -DUSE_BOP -DUSE_CBC -DUSE_CLP")
FILE(GLOB_RECURSE proto_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "ortools/*.proto")
SET(PROTOBUF_GENERATE_CPP_APPEND_PATH OFF)
FIND_PACKAGE(Gflags REQUIRED)
PKG_CHECK_MODULES(CBC cbc)
IF(CBC_FOUND)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CBC_CFLAGS} -DUSE_CBC")
ENDIF(CBC_FOUND)
PKG_CHECK_MODULES(CLP clp)
IF(CLP_FOUND)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CLP_CFLAGS} -DUSE_CLP")
ENDIF(CLP_FOUND)
PKG_CHECK_MODULES(GLOG libglog)
INCLUDE_DIRECTORIES(.)
INCLUDE_DIRECTORIES(examples)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIRS})
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${proto_files})
ADD_LIBRARY(${PROJECT_NAME}Proto OBJECT ${PROTO_SRCS} ${PROTO_HDRS})
ADD_DEPENDENCIES(${PROJECT_NAME}Proto ${${PROJECT_NAME}externalTargets})
SET_TARGET_PROPERTIES(${PROJECT_NAME}Proto PROPERTIES POSITION_INDEPENDENT_CODE ON)
SET(SUBTARGETS "")
@@ -68,10 +90,11 @@ IF(BUILD_CXX)
ADD_LIBRARY(${PROJECT_NAME} SHARED ${SUBTARGETS})
TARGET_LINK_LIBRARIES(${PROJECT_NAME}
${GLOG_LIBRARIES}
${Cbc_LIBRARIES}
${Gflags_LIBRARIES}
${Protobuf_LIBRARIES}
${gflags_LIBRARIES}
${CBC_LIBRARIES})
${GLOG_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT})
ADD_DEPENDENCIES(${PROJECT_NAME} ${PROJECT_NAME}Proto)
INSTALL(TARGETS ${PROJECT_NAME}
@@ -82,12 +105,6 @@ IF(BUILD_CXX)
ADD_SUBDIRECTORY(examples/cpp)
ENDIF(BUILD_CXX)
IF(BUILD_PYTHON)
FOREACH(SUBPROJECT constraint_solver algorithms graph linear_solver)
ADD_SUBDIRECTORY(ortools/${SUBPROJECT}/python)
ENDFOREACH(SUBPROJECT constraint_solver algorithms)
ENDIF(BUILD_PYTHON)
INSTALL(DIRECTORY ortools
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h")

8
Dependencies.txt Normal file
View File

@@ -0,0 +1,8 @@
Protobuf = 3.3.0
Gflags = 2.2.0
Glog = 0.3.5
cbc = 2.9.8
CoinUtils = 2.10.13
Osi = 0.107.8
Clp = 1.16.10
Cgl = 0.59.9

47
cmake/external/cbc.cmake vendored Normal file
View File

@@ -0,0 +1,47 @@
SET(ADD_CXXFLAGS "-DCBC_THREAD_SAFE -DCBC_NO_INTERRUPT")
FOREACH(COIN_PROJECT CoinUtils Osi Clp Cgl Cbc)
SET(${COIN_PROJECT}_URL https://github.com/coin-or/${COIN_PROJECT}.git)
SET(${COIN_PROJECT}_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/install/include)
ExternalProject_Add(${COIN_PROJECT}_project
PREFIX ${COIN_PROJECT}
GIT_REPOSITORY ${${COIN_PROJECT}_URL}
GIT_TAG "releases/${${COIN_PROJECT}_VERSION}"
DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
UPDATE_COMMAND ""
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${COIN_PROJECT}/src/${COIN_PROJECT}_project/configure
--disable-bzlib --without-lapack --with-pic --enable-static --prefix=${CMAKE_CURRENT_BINARY_DIR}/install
ADD_CXXFLAGS=${ADD_CXXFLAGS})
ADD_LIBRARY(${COIN_PROJECT} STATIC IMPORTED)
SET_PROPERTY(TARGET ${COIN_PROJECT} PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/install/lib/lib${COIN_PROJECT}.a)
IF (${COIN_PROJECT} STREQUAL "Cbc" OR ${COIN_PROJECT} STREQUAL "Clp")
ADD_LIBRARY(Osi${COIN_PROJECT} STATIC IMPORTED)
SET_PROPERTY(TARGET Osi${COIN_PROJECT} PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/install/lib/libOsi${COIN_PROJECT}.a)
ADD_LIBRARY(${COIN_PROJECT}Solver STATIC IMPORTED)
SET_PROPERTY(TARGET ${COIN_PROJECT}Solver PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/install/lib/lib${COIN_PROJECT}Solver.a)
ENDIF()
ADD_DEPENDENCIES(${COIN_PROJECT} ${COIN_PROJECT}_project)
ENDFOREACH()
ADD_DEPENDENCIES(Osi_project CoinUtils_project)
ADD_DEPENDENCIES(Clp_project Osi_project)
ADD_DEPENDENCIES(Cgl_project Clp_project)
ADD_DEPENDENCIES(Cbc_project Cgl_project)
SET_PROPERTY(TARGET Osi PROPERTY INTERFACE_LINK_LIBRARIES CoinUtils)
SET_PROPERTY(TARGET Clp PROPERTY INTERFACE_LINK_LIBRARIES Osi)
SET_PROPERTY(TARGET OsiClp PROPERTY INTERFACE_LINK_LIBRARIES Clp)
SET_PROPERTY(TARGET ClpSolver PROPERTY INTERFACE_LINK_LIBRARIES Clp)
SET_PROPERTY(TARGET Cgl PROPERTY INTERFACE_LINK_LIBRARIES Clp)
SET_PROPERTY(TARGET Cbc PROPERTY INTERFACE_LINK_LIBRARIES Cgl)
SET_PROPERTY(TARGET OsiCbc PROPERTY INTERFACE_LINK_LIBRARIES Cbc)
SET_PROPERTY(TARGET CbcSolver PROPERTY INTERFACE_LINK_LIBRARIES Cbc)
LIST(APPEND ${PROJECT_NAME}externalTargets Cbc)
SET(Cbc_LIBRARIES "")
LIST(APPEND Cbc_LIBRARIES Cbc OsiCbc CbcSolver ClpSolver OsiClp)

26
cmake/external/gflags.cmake vendored Normal file
View File

@@ -0,0 +1,26 @@
SET(Gflags_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/gflags_project/src/gflags/include/)
SET(Gflags_URL https://github.com/gflags/gflags)
ExternalProject_Add(Gflags_project
PREFIX Gflags
GIT_REPOSITORY ${Gflags_URL}
GIT_TAG "v${Gflags_VERSION}"
DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
UPDATE_COMMAND ""
BUILD_IN_SOURCE 1
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/gflags_project/src/gflags
CONFIGURE_COMMAND ${CMAKE_COMMAND}
-DBUILD_STATIC_LIBS=ON
-DBUILD_TESTING=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
${Gflags_ADDITIONAL_CMAKE_OPTIONS}
INSTALL_COMMAND ""
CMAKE_CACHE_ARGS
-DCMAKE_BUILD_TYPE:STRING=Release
-DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON)
ADD_LIBRARY(Gflags STATIC IMPORTED)
SET_PROPERTY(TARGET Gflags PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/gflags_project/src/gflags/lib/libgflags.a)
SET(Gflags_LIBRARIES "")
LIST(APPEND Gflags_LIBRARIES Gflags)

26
cmake/external/glog.cmake vendored Normal file
View File

@@ -0,0 +1,26 @@
SET(GLOG_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/glog_project/src/glog/)
LIST(APPEND GLOG_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/glog_project/src/glog/src/)
SET(GLOG_URL https://github.com/google/glog)
ExternalProject_Add(Glog_project
PREFIX Glog
GIT_REPOSITORY ${GLOG_URL}
GIT_TAG "v${GLOG_VERSION}"
DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
UPDATE_COMMAND ""
BUILD_IN_SOURCE 1
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/glog_project/src/glog
CONFIGURE_COMMAND ${CMAKE_COMMAND}
-DBUILD_TESTING=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
${Glogs_ADDITIONAL_CMAKE_OPTIONS}
INSTALL_COMMAND ""
CMAKE_CACHE_ARGS
-DCMAKE_BUILD_TYPE:STRING=Release
-DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON)
ADD_LIBRARY(GLOG STATIC IMPORTED)
SET_PROPERTY(TARGET GLOG PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/glog_project/src/glog/libglog.a)
SET(GLOG_LIBRARIES "")
LIST(APPEND GLOG_LIBRARIES GLOG)

30
cmake/external/protobuf.cmake vendored Normal file
View File

@@ -0,0 +1,30 @@
FIND_PACKAGE(ZLIB REQUIRED)
SET(Protobuf_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/protobuf_project/src/protobuf/src)
SET(Protobuf_URL https://github.com/google/protobuf)
ExternalProject_Add(Protobuf_project
PREFIX Protobuf
GIT_REPOSITORY ${Protobuf_URL}
GIT_TAG "v${Protobuf_VERSION}"
DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
UPDATE_COMMAND ""
BUILD_IN_SOURCE 1
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf_project/src/protobuf
CONFIGURE_COMMAND ${CMAKE_COMMAND} cmake/
-Dprotobuf_BUILD_TESTS=OFF
-DBUILD_STATIC_LIBS=ON
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
${Protobuf_ADDITIONAL_CMAKE_OPTIONS}
INSTALL_COMMAND ""
CMAKE_CACHE_ARGS
-DCMAKE_BUILD_TYPE:STRING=Release
-DCMAKE_VERBOSE_MAKEFILE:BOOL=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON)
ADD_LIBRARY(Protobuf STATIC IMPORTED)
SET_PROPERTY(TARGET Protobuf PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/protobuf_project/src/protobuf/libprotobuf.a)
SET(Protobuf_LIBRARIES "")
LIST(APPEND Protobuf_LIBRARIES Protobuf ${ZLIB_LIBRARIES})
SET(Protobuf_PROTOC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/protobuf_project/src/protobuf/protoc)

View File

@@ -1,10 +1,17 @@
ADD_LIBRARY(executable_libs STATIC
ADD_LIBRARY(${PROJECT_NAME}examples SHARED
cvrptw_lib.cc
parse_dimacs_assignment.cc
fap_model_printer.cc
fap_parser.cc
fap_utilities.cc)
ADD_DEPENDENCIES(executable_libs ${PROJECT_NAME}Proto)
INSTALL(TARGETS ${PROJECT_NAME}examples
EXPORT ${PROJECT_NAME}_Exports
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
ADD_DEPENDENCIES(${PROJECT_NAME}examples ${PROJECT_NAME}Proto)
FOREACH(EXECUTABLE
costas_array
@@ -44,6 +51,6 @@ FOREACH(EXECUTABLE
tsp
weighted_tardiness_sat)
ADD_EXECUTABLE(${EXECUTABLE} ${EXECUTABLE}.cc)
TARGET_LINK_LIBRARIES(${EXECUTABLE} executable_libs ${PROJECT_NAME})
TARGET_LINK_LIBRARIES(${EXECUTABLE} ${PROJECT_NAME}examples ${PROJECT_NAME})
INSTALL(TARGETS ${EXECUTABLE} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
ENDFOREACH()

View File

@@ -4,4 +4,6 @@ IF(BUILD_PYTHON)
SWIG_ADD_LIBRARY(pywrapknapsack_solver TYPE MODULE LANGUAGE python SOURCES knapsack_solver.i)
SWIG_LINK_LIBRARIES(pywrapknapsack_solver ${PROJECT_NAME})
INSTALL(TARGETS _pywrapknapsack_solver DESTINATION ${PYTHON_MODULE_PATH})
ENDIF(BUILD_PYTHON)

View File

@@ -4,15 +4,6 @@ PROJECT(${PROJECT_NAME}_constraint_solver)
FILE(GLOB ${PROJECT_NAME}_SOURCES "*.cc")
IF(BUILD_PYTHON)
PROTOBUF_GENERATE_PYTHON(PY_ASSIGN_PROTO_SRCS assignment.proto)
PROTOBUF_GENERATE_PYTHON(PY_SEARCH_PROTO_SRCS search_limit.proto)
PROTOBUF_GENERATE_PYTHON(PY_MODEL__PROTO_SRCS model.proto)
PROTOBUF_GENERATE_PYTHON(PY_ROUTEN_PROTO_SRCS routing_enums.proto)
PROTOBUF_GENERATE_PYTHON(PY_SOLVER_PROTO_SRCS solver_parameters.proto)
PROTOBUF_GENERATE_PYTHON(PY_ROUTPA_PROTO_SRCS routing_parameters.proto)
ENDIF(BUILD_PYTHON)
ADD_LIBRARY(${PROJECT_NAME} OBJECT ${${PROJECT_NAME}_SOURCES})
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)

View File

@@ -4,4 +4,6 @@ IF(BUILD_PYTHON)
SWIG_ADD_LIBRARY(pywrapcp TYPE MODULE LANGUAGE python SOURCES routing.i)
SWIG_LINK_LIBRARIES(pywrapcp ${PROJECT_NAME})
INSTALL(TARGETS _pywrapcp DESTINATION ${PYTHON_MODULE_PATH})
ENDIF(BUILD_PYTHON)

View File

@@ -4,4 +4,6 @@ IF(BUILD_PYTHON)
SWIG_ADD_LIBRARY(pywrapgraph TYPE MODULE LANGUAGE python SOURCES graph.i)
SWIG_LINK_LIBRARIES(pywrapgraph ${PROJECT_NAME})
INSTALL(TARGETS _pywrapgraph DESTINATION ${PYTHON_MODULE_PATH})
ENDIF(BUILD_PYTHON)

View File

@@ -4,11 +4,7 @@ PROJECT(${PROJECT_NAME}_linear_solver)
FILE(GLOB ${PROJECT_NAME}_SOURCES "*.cc")
IF(BUILD_PYTHON)
PROTOBUF_GENERATE_PYTHON(PY_PROTO_SRCS linear_solver.proto)
ENDIF(BUILD_PYTHON)
ADD_LIBRARY(${PROJECT_NAME} OBJECT ${${PROJECT_NAME}_SOURCES})
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
ADD_DEPENDENCIES(${PROJECT_NAME} ${ROOT_PROJECT}Proto)
ADD_DEPENDENCIES(${PROJECT_NAME} ${ROOT_PROJECT}Proto)

View File

@@ -4,4 +4,6 @@ IF(BUILD_PYTHON)
SWIG_ADD_LIBRARY(pywraplp TYPE MODULE LANGUAGE python SOURCES linear_solver.i)
SWIG_LINK_LIBRARIES(pywraplp ${PROJECT_NAME})
INSTALL(TARGETS _pywraplp DESTINATION ${PYTHON_MODULE_PATH})
ENDIF()