Enable fallback for gflags, glog and protobuf

This commit is contained in:
Amit Prakash Ambasta
2017-05-31 16:22:00 +05:30
parent 84c9eddc61
commit 50151907e1
6 changed files with 213 additions and 11 deletions

View File

@@ -4,6 +4,7 @@ PROJECT(ortools LANGUAGES CXX)
SET(CMAKE_CXX_STANDARD 11)
INCLUDE(FindPkgConfig)
INCLUDE(ExternalProject)
SET(CMAKE_INSTALL_LIBDIR lib)
SET(CMAKE_INSTALL_BINDIR bin)
@@ -14,19 +15,56 @@ IF(UNIX)
INCLUDE(GNUInstallDirs)
ENDIF()
ENDIF()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fwrapv -DNDEBUG")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fwrapv -DNDEBUG -DUSE_GLOP -DUSE_BOP")
SET(BUILD_CXX ON)
SET(DOWNLOAD_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/downloads"
CACHE PATH "Location where external projects will be downloaded.")
MARK_AS_ADVANCED(BUILD_CXX)
MARK_AS_ADVANCED(DOWNLOAD_LOCATION)
SET(${PROJECT_NAME}externalLibraries "")
SET(${PROJECT_NAME}externalTargets "")
IF(BUILD_CXX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_GLOP -DUSE_BOP")
FIND_PACKAGE(Threads REQUIRED)
FIND_PACKAGE(Protobuf REQUIRED)
SET(Protobuf_VERSION 3.0.2)
FIND_PACKAGE(Protobuf ${Protobuf_VERSION} QUIET)
FILE(GLOB_RECURSE proto_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "ortools/*.proto")
SET(PROTOBUF_GENERATE_CPP_APPEND_PATH OFF)
FIND_PACKAGE(Gflags REQUIRED)
IF(NOT Protobuf_FOUND)
MESSAGE(STATUS "Did not find system protobuff. Building as an external project")
INCLUDE(cmake/external/zlib.cmake)
INCLUDE(cmake/external/protobuf.cmake)
LIST(APPEND ${PROJECT_NAME}externalLibraries ${Protobuf_STATIC_LIBRARIES})
ENDIF()
LIST(APPEND ${PROJECT_NAME}externalLibraries ${Protobuf_LIBRARIES})
INCLUDE_DIRECTORIES(${Protobuf_INCLUDE_DIRS})
SET(Gflags_VERSION 2.2.0)
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()
LIST(APPEND ${PROJECT_NAME}externalLibraries ${Gflags_LIBRARIES})
INCLUDE_DIRECTORIES(${Gflags_INCLUDE_DIRS})
SET(GLOG_VERSION 0.3.5)
PKG_CHECK_MODULES(GLOG libglog>=${GLOG_VERSION})
# Set again since pkg_check_module resets GLOG_VERSION
SET(GLOG_VERSION 0.3.5)
IF(NOT GLOG_FOUND)
MESSAGE(STATUS "Did not find system glog. Building as an external project ${GLOG_VERSION}")
INCLUDE(cmake/external/glog.cmake)
ENDIF()
LIST(APPEND ${PROJECT_NAME}externalLibraries ${GLOG_LIBRARIES})
INCLUDE_DIRECTORIES(${GLOG_INCLUDE_DIRS})
SET(CBC_VERSION 2.9.8)
PKG_CHECK_MODULES(CBC cbc)
IF(CBC_FOUND)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CBC_CFLAGS} -DUSE_CBC")
@@ -37,7 +75,8 @@ IF(BUILD_CXX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CLP_CFLAGS} -DUSE_CLP")
ENDIF(CLP_FOUND)
PKG_CHECK_MODULES(GLOG libglog)
FILE(GLOB_RECURSE proto_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "ortools/*.proto")
SET(PROTOBUF_GENERATE_CPP_APPEND_PATH OFF)
INCLUDE_DIRECTORIES(.)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
@@ -45,6 +84,7 @@ IF(BUILD_CXX)
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 "")
@@ -56,12 +96,12 @@ IF(BUILD_CXX)
LIST(APPEND SUBTARGETS "$<TARGET_OBJECTS:${PROJECT_NAME}Proto>")
MESSAGE(STATUS "Libraries : ${${PROJECT_NAME}externalLibraries}")
ADD_LIBRARY(${PROJECT_NAME} SHARED ${SUBTARGETS})
TARGET_LINK_LIBRARIES(${PROJECT_NAME}
${GLOG_LIBRARIES}
${Protobuf_LIBRARIES}
${gflags_LIBRARIES}
${CBC_LIBRARIES})
${${PROJECT_NAME}externalLibraries}
${CBC_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT})
ADD_DEPENDENCIES(${PROJECT_NAME} ${PROJECT_NAME}Proto)
INSTALL(TARGETS ${PROJECT_NAME}

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

@@ -0,0 +1,27 @@
SET(CBC_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/src)
SET(CBC_URL https://github.com/google/protobuf)
IF(WIN32)
SET(CBC_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/${CMAKE_BUILD_TYPE}/libcbc.lib)
ELSE()
SET(CBC_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/libprotobuf.a)
ENDIF()
ExternalProject_Add(Cbc
PREFIX Cbc
GIT_REPOSITORY ${CBC_URL}
GIT_TAG "v${CBC_VERSION}"
DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
BUILD_IN_SOURCE 1
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf
CONFIGURE_COMMAND ${CMAKE_COMMAND} cmake/
-Dprotobuf_BUILD_TESTS=OFF
-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)
LIST(APPEND ${PROJECT_NAME}externalTargets Protobuf)

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

@@ -0,0 +1,27 @@
SET(Gflags_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/gflags/src/gflags/include/)
SET(Gflags_URL https://github.com/gflags/gflags)
IF(WIN32)
SET(Gflags_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/gflags/src/gflags/${CMAKE_BUILD_TYPE}/libgflags.lib)
ELSE()
SET(Gflags_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/gflags/src/gflags/lib/libgflags.a)
ENDIF()
ExternalProject_Add(Gflags
PREFIX Gflags
GIT_REPOSITORY ${Gflags_URL}
GIT_TAG "v${Gflags_VERSION}"
DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
BUILD_IN_SOURCE 1
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/gflags/src/gflags
CONFIGURE_COMMAND ${CMAKE_COMMAND}
-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)
LIST(APPEND ${PROJECT_NAME}externalTargets Gflags)

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

@@ -0,0 +1,29 @@
SET(GLOG_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/glog/src/glog/)
LIST(APPEND GLOG_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/glog/src/glog/src/)
SET(GLOG_URL https://github.com/google/glog)
IF(WIN32)
SET(GLOG_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/glog/src/glog/${CMAKE_BUILD_TYPE}/libglog.lib)
ELSE()
SET(GLOG_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/glog/src/glog/libglog.a)
ENDIF()
MESSAGE("Glog: ${GLOG_VERSION}")
ExternalProject_Add(Glog
PREFIX Glog
GIT_REPOSITORY ${GLOG_URL}
GIT_TAG "v${GLOG_VERSION}"
DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
BUILD_IN_SOURCE 1
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/glog/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)
LIST(APPEND ${PROJECT_NAME}externalTargets Glog)

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

@@ -0,0 +1,34 @@
SET(Protobuf_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/src)
SET(Protobuf_URL https://github.com/google/protobuf)
IF(WIN32)
SET(Protobuf_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/${CMAKE_BUILD_TYPE}/libprotobuf.lib)
SET(Protobuf_PROTOC_EXECUTABLE
${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/${CMAKE_BUILD_TYPE}/protoc.exe)
SET(Protobuf_ADDITIONAL_CMAKE_OPTIONS -Dprotobuf_MSVC_STATIC_RUNTIME:BOOL=OFF -A x64)
ELSE()
SET(Protobuf_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/libprotobuf.a)
SET(Protobuf_PROTOC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf/protoc)
ENDIF()
ExternalProject_Add(Protobuf
PREFIX Protobuf
DEPENDS Zlib
GIT_REPOSITORY ${Protobuf_URL}
GIT_TAG "v${Protobuf_VERSION}"
DOWNLOAD_DIR "${DOWNLOAD_LOCATION}"
BUILD_IN_SOURCE 1
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf/src/protobuf
CONFIGURE_COMMAND ${CMAKE_COMMAND} cmake/
-Dprotobuf_BUILD_TESTS=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DZLIB_ROOT=${ZLIB_INSTALL}
${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
-DZLIB_ROOT:STRING=${ZLIB_INSTALL})
LIST(APPEND ${PROJECT_NAME}externalTargets Protobuf)

45
cmake/external/zlib.cmake vendored Normal file
View File

@@ -0,0 +1,45 @@
INCLUDE(ExternalProject)
SET(Zlib_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/zlib_archive)
SET(Zlib_URL https://github.com/madler/zlib)
SET(Zlib_BUILD ${CMAKE_CURRENT_BINARY_DIR}/zlib/src/zlib)
SET(Zlib_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/zlib/install)
SET(Zlib_TAG 50893291621658f355bc5b4d450a8d06a563053d)
IF(WIN32)
SET(Zlib_STATIC_LIBRARIES
debug ${CMAKE_CURRENT_BINARY_DIR}/zlib/install/lib/zlibstaticd.lib
optimized ${CMAKE_CURRENT_BINARY_DIR}/zlib/install/lib/zlibstatic.lib)
ELSE()
SET(Zlib_STATIC_LIBRARIES
${CMAKE_CURRENT_BINARY_DIR}/zlib/install/lib/libz.a)
ENDIF()
SET(Zlib_HEADERS
"${Zlib_INSTALL}/include/zconf.h"
"${Zlib_INSTALL}/include/zlib.h")
ExternalProject_Add(Zlib
PREFIX zlib
GIT_REPOSITORY ${Zlib_URL}
GIT_TAG ${Zlib_TAG}
INSTALL_DIR ${Zlib_INSTALL}
BUILD_IN_SOURCE 1
DOWNLOAD_DIR ${DOWNLOAD_LOCATION}
CMAKE_CACHE_ARGS
-DCMAKE_BUILD_TYPE:STRING=RELEASE
-DCMAKE_INSTALL_PREFIX:STRING=${Zlib_INSTALL}
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON)
ADD_CUSTOM_TARGET(Zlib_CREATE_DESTINATION_DIR
COMMAND ${CMAKE_COMMAND} -E make_directory ${Zlib_INCLUDE_DIR}
DEPENDS Zlib)
ADD_CUSTOM_TARGET(Zlib_COPY_HEADERS_TO_DESTINATION DEPENDS Zlib_CREATE_DESTINATION_DIR)
FOREACH(header_file ${ZLIB_HEADERS})
ADD_CUSTOM_COMMAND(TARGET Zlib_COPY_HEADERS_TO_DESTINATION PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${header_file} ${Zlib_INCLUDE_DIR})
ENDFOREACH()
LIST(APPEND ${PROJECT_NAME}externalTargets Zlib)