From 50151907e15e1795cb87ab5f87ef022b9603af4e Mon Sep 17 00:00:00 2001 From: Amit Prakash Ambasta Date: Wed, 31 May 2017 16:22:00 +0530 Subject: [PATCH] Enable fallback for gflags, glog and protobuf --- CMakeLists.txt | 62 ++++++++++++++++++++++++++++------- cmake/external/cbc.cmake | 27 +++++++++++++++ cmake/external/gflags.cmake | 27 +++++++++++++++ cmake/external/glog.cmake | 29 ++++++++++++++++ cmake/external/protobuf.cmake | 34 +++++++++++++++++++ cmake/external/zlib.cmake | 45 +++++++++++++++++++++++++ 6 files changed, 213 insertions(+), 11 deletions(-) create mode 100644 cmake/external/cbc.cmake create mode 100644 cmake/external/gflags.cmake create mode 100644 cmake/external/glog.cmake create mode 100644 cmake/external/protobuf.cmake create mode 100644 cmake/external/zlib.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 93922af69a..b1c7f22c79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 "$") + 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} diff --git a/cmake/external/cbc.cmake b/cmake/external/cbc.cmake new file mode 100644 index 0000000000..e784cbe5a5 --- /dev/null +++ b/cmake/external/cbc.cmake @@ -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) \ No newline at end of file diff --git a/cmake/external/gflags.cmake b/cmake/external/gflags.cmake new file mode 100644 index 0000000000..d5d1047f34 --- /dev/null +++ b/cmake/external/gflags.cmake @@ -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) \ No newline at end of file diff --git a/cmake/external/glog.cmake b/cmake/external/glog.cmake new file mode 100644 index 0000000000..03ed327e92 --- /dev/null +++ b/cmake/external/glog.cmake @@ -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) \ No newline at end of file diff --git a/cmake/external/protobuf.cmake b/cmake/external/protobuf.cmake new file mode 100644 index 0000000000..31e6ac158d --- /dev/null +++ b/cmake/external/protobuf.cmake @@ -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) \ No newline at end of file diff --git a/cmake/external/zlib.cmake b/cmake/external/zlib.cmake new file mode 100644 index 0000000000..d89682e45c --- /dev/null +++ b/cmake/external/zlib.cmake @@ -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) \ No newline at end of file