Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/better find package #1019

Closed
wants to merge 17 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 33 additions & 18 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,6 @@ if(NOT CMAKE_BUILD_TYPE)
FORCE)
endif(NOT CMAKE_BUILD_TYPE)

# Use find_package everywhere, no-op if it's a subproject
macro(find_package)
if(NOT TARGET ${ARGV0} AND NOT TARGET ${ARGV0}::${ARGV0})
_find_package(${ARGV})
else()
if(TARGET ${ARGV0})
get_target_property(TGT_VER ${ARGV0} VERSION)
set(TGT ${ARGV0})
else()
get_target_property(TGT_VER ${ARGV0}::${ARGV0} VERSION)
set(TGT ${ARGV0}::${ARGV0})
endif()
message(STATUS "Found ${ARGV0}: CMake Target ${TGT} (found version \"${TGT_VER}\")")
set(${ARGV0}_FOUND TRUE)
endif()
endmacro()
# Apple: Don't modify install_name when touching RPATH.
if(POLICY CMP0068)
cmake_policy(SET CMP0068 NEW)
Expand Down Expand Up @@ -51,6 +35,19 @@ endif()

include(CMakeDependentOption)
option(BUILD_DEPS "Force re-build of all dependencies" ON)
CMAKE_DEPENDENT_OPTION(BUILD_gflags "Install the gflags dependency Library" ON
"BUILD_DEPS;" OFF)
CMAKE_DEPENDENT_OPTION(BUILD_glog "Install the glog dependency Library" ON
"BUILD_DEPS;" OFF)
CMAKE_DEPENDENT_OPTION(BUILD_ZLIB "Install the ZLIB dependency Library" ON
"BUILD_DEPS;" OFF)
CMAKE_DEPENDENT_OPTION(BUILD_Protobuf "Install the Protobuf dependency Library" ON
"BUILD_DEPS;" OFF)
CMAKE_DEPENDENT_OPTION(BUILD_abseil-cpp "Install the abseil-cpp dependency Library" ON
"BUILD_DEPS;" OFF)
CMAKE_DEPENDENT_OPTION(BUILD_Cbc "Install the Cbc dependency Library" ON
"BUILD_DEPS;" OFF)

option(BUILD_CXX "Build C++ library" ON)
CMAKE_DEPENDENT_OPTION(BUILD_PYTHON "Build Python Library" OFF
"BUILD_CXX; NOT ORTOOLS_IS_SUBPROJECT" OFF)
Expand All @@ -66,8 +63,26 @@ message(STATUS "Build Java Binding: ${BUILD_JAVA}")
message(STATUS "Build .Net Binding: ${BUILD_DOTNET}")

# Add OR Tools Dependencies as CMake subproject if missing
if(BUILD_DEPS)
add_subdirectory(cmake/external external)
if(NOT DEFINED Swig_MODULE_PATH AND BUILD_DEPS)
set(Swig_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/external/Swig)
endif()
if(BUILD_gflags)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/external/gflags/ExternalProject_gflags.cmake)
endif()
if(BUILD_glog)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/external/glog/ExternalProject_glog.cmake)
endif()
if(BUILD_ZLIB)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/external/ZLIB/ExternalProject_ZLIB.cmake)
endif()
if(BUILD_Protobuf)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/external/Protobuf/ExternalProject_Protobuf.cmake)
endif()
if(BUILD_abseil-cpp)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/external/abseil-cpp/ExternalProject_abseil-cpp.cmake)
endif()
if(BUILD_Cbc)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/external/Cbc/ExternalProject_Cbc.cmake)
endif()

if(BUILD_CXX)
Expand Down
140 changes: 129 additions & 11 deletions cmake/cpp.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,130 @@ if(MSVC)
else()
add_definitions(-fwrapv)
endif()
add_definitions(-DUSE_GLOP -DUSE_BOP -DUSE_CBC -DUSE_CLP)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# Force dependencies to be built as static
set(BUILD_SHARED_BCKP ${BUILD_SHARED_LIBS})
set(BUILD_SHARED_LIBS OFF)

# Disable test rules for dependencies
set(BUILD_TESTING OFF)

# Since it is not possible to ALIAS an already aliased target, this macro get
# the real target name of an aliased target and create a new alias
macro(alias_target target_to_aliased alias_name)
get_target_property(alias_TARGET ${target_to_aliased} ALIASED_TARGET)
if (NOT ${alias_TARGET})
# The target was not an alias so we can use it !
set(alias_TARGET ${target_to_aliased})
endif()
add_library(${alias_name} ALIAS ${alias_TARGET})
endmacro()

########
# Swig #
########

if(WIN32 AND (BUILD_PYTHON OR BUILD_JAVA OR BUILD_CSHARP))
find_package(Swig REQUIRED)
endif()

##########
# gflags #
##########

find_package(gflags REQUIRED)

if(NOT TARGET gflags::gflags)
if(TARGET gflags)
set_target_properties(gflags PROPERTIES IMPORTED_GLOBAL TRUE)
alias_target(gflags gflags::gflags)
else()
message(FATAL_ERROR "Cannot find target gflags::gflags")
endif()
endif()

########
# glog #
########

find_package(glog REQUIRED)

if(NOT TARGET glog::glog)
if(TARGET glog)
set_target_properties(glog PROPERTIES IMPORTED_GLOBAL TRUE)
alias_target(glog glog::glog)
else()
message(FATAL_ERROR "Cannot find target glog::glog")
endif()
endif()

########
# ZLIB #
########

find_package(ZLIB REQUIRED)

if(NOT TARGET ZLIB::ZLIB)
if(BUILD_SHARED_LIBS AND TARGET ZLIB::zlib)
set_target_properties(ZLIB::zlib PROPERTIES IMPORTED_GLOBAL TRUE)
alias_target(ZLIB::zlib ZLIB::ZLIB)
elseif(NOT BUILD_SHARED_LIBS AND TARGET ZLIB::zlibstatic)
set_target_properties(ZLIB::zlibstatic PROPERTIES IMPORTED_GLOBAL TRUE)
alias_target(ZLIB::zlibstatic ZLIB::ZLIB)
else()
message(FATAL_ERROR "Cannot find target ZLIB::ZLIB")
endif()
endif()

############
# Protobuf #
############

find_package(Protobuf REQUIRED)

# By default, not present until CMake v3.9
if(NOT TARGET protobuf::libprotobuf)
if(TARGET libprotobuf)
set_target_properties(libprotobuf PROPERTIES IMPORTED_GLOBAL TRUE)
add_library(protobuf::libprotobuf ALIAS libprotobuf)
else()
message(FATAL_ERROR "Cannot find target protobuf::libprotobuf")
endif()
endif()

# By default, not present until CMake v3.10
if(NOT TARGET protobuf::protoc)
if(TARGET protoc)
set_target_properties(libprotoc PROPERTIES IMPORTED_GLOBAL TRUE)
add_library(protobuf::protoc ALIAS protoc)
else()
message(FATAL_ERROR "Cannot find target protobuf::protoc")
endif()
endif()

##########
# abseil #
##########

find_package(abseil-cpp REQUIRED)

#######
# Cbc #
#######

find_package(Cbc REQUIRED)

# Reapply previous state
set(BUILD_SHARED_LIBS ${BUILD_SHARED_BCKP})

# Verify Dependencies
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)

add_definitions(-DUSE_GLOP -DUSE_BOP -DUSE_CBC -DUSE_CLP)

# Main Target
add_library(${PROJECT_NAME} "")
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_11)
Expand Down Expand Up @@ -77,15 +195,15 @@ target_include_directories(${PROJECT_NAME} INTERFACE
)
target_link_libraries(${PROJECT_NAME} PUBLIC
ZLIB::ZLIB
absl::base
absl::container
absl::hash
absl::memory
absl::meta
absl::str_format
absl::strings
absl::synchronization
absl::types
absl::absl_base
absl::absl_container
absl::absl_hash
absl::absl_memory
absl::absl_meta
absl::absl_str_format
absl::absl_strings
absl::absl_synchronization
absl::absl_types
gflags::gflags glog::glog
protobuf::libprotobuf
Cbc::CbcSolver Cbc::OsiCbc Cbc::ClpSolver Cbc::OsiClp
Expand Down Expand Up @@ -124,7 +242,7 @@ foreach (PROTO_FILE ${proto_files})
OUTPUT ${PROTO_SRC} ${PROTO_HDR}
COMMAND protobuf::protoc
"--proto_path=${PROJECT_SOURCE_DIR}"
"${PROTO_DIRS}"
${PROTO_DIRS}
"--cpp_out=${PROJECT_BINARY_DIR}"
${PROTO_FILE}
DEPENDS ${PROTO_FILE} protobuf::protoc
Expand Down
Loading