393 lines
12 KiB
CMake
393 lines
12 KiB
CMake
# Copyright 2010-2025 Google LLC
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
if(NOT BUILD_GLOP)
|
|
return()
|
|
endif()
|
|
|
|
|
|
# Generate Protobuf cpp sources
|
|
set(PROTO_HDRS)
|
|
set(PROTO_SRCS)
|
|
set(proto_files
|
|
"ortools/linear_solver/linear_solver.proto"
|
|
"ortools/glop/parameters.proto"
|
|
"ortools/util/optional_boolean.proto"
|
|
)
|
|
## Get Protobuf include dir
|
|
get_target_property(protobuf_dirs protobuf::libprotobuf INTERFACE_INCLUDE_DIRECTORIES)
|
|
foreach(dir IN LISTS protobuf_dirs)
|
|
if (NOT "${dir}" MATCHES "INSTALL_INTERFACE|-NOTFOUND")
|
|
message(STATUS "Adding proto path: ${dir}")
|
|
list(APPEND PROTO_DIRS "--proto_path=${dir}")
|
|
endif()
|
|
endforeach()
|
|
|
|
foreach(PROTO_FILE IN LISTS proto_files)
|
|
#message(STATUS "protoc proto(cc): ${PROTO_FILE}")
|
|
get_filename_component(PROTO_DIR ${PROTO_FILE} DIRECTORY)
|
|
get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE)
|
|
set(PROTO_HDR ${PROJECT_BINARY_DIR}/${PROTO_DIR}/${PROTO_NAME}.pb.h)
|
|
set(PROTO_SRC ${PROJECT_BINARY_DIR}/${PROTO_DIR}/${PROTO_NAME}.pb.cc)
|
|
#message(STATUS "protoc hdr: ${PROTO_HDR}")
|
|
#message(STATUS "protoc src: ${PROTO_SRC}")
|
|
add_custom_command(
|
|
OUTPUT ${PROTO_SRC} ${PROTO_HDR}
|
|
COMMAND ${PROTOC_PRG}
|
|
"--proto_path=${PROJECT_SOURCE_DIR}"
|
|
${PROTO_DIRS}
|
|
"--cpp_out=${PROJECT_BINARY_DIR}"
|
|
${PROTO_FILE}
|
|
DEPENDS ${PROTO_FILE} ${PROTOC_PRG}
|
|
COMMENT "Generate C++ protocol buffer for ${PROTO_FILE}"
|
|
VERBATIM)
|
|
list(APPEND PROTO_HDRS ${PROTO_HDR})
|
|
list(APPEND PROTO_SRCS ${PROTO_SRC})
|
|
endforeach()
|
|
|
|
list(APPEND GLOP_COMPILE_DEFINITIONS
|
|
"-DOR_TOOLS_MAJOR=${PROJECT_VERSION_MAJOR}"
|
|
"-DOR_TOOLS_MINOR=${PROJECT_VERSION_MINOR}"
|
|
"-DOR_TOOLS_PATCH=${PROJECT_VERSION_PATCH}"
|
|
)
|
|
|
|
add_library(glop_proto OBJECT ${PROTO_SRCS} ${PROTO_HDRS})
|
|
set_target_properties(glop_proto PROPERTIES
|
|
POSITION_INDEPENDENT_CODE ON
|
|
CXX_STANDARD 17
|
|
CXX_STANDARD_REQUIRED ON
|
|
CXX_EXTENSIONS OFF)
|
|
target_include_directories(glop_proto PRIVATE
|
|
${PROJECT_SOURCE_DIR}
|
|
${PROJECT_BINARY_DIR}
|
|
$<TARGET_PROPERTY:protobuf::libprotobuf,INTERFACE_INCLUDE_DIRECTORIES>
|
|
)
|
|
target_compile_definitions(glop_proto PUBLIC ${GLOP_COMPILE_DEFINITIONS})
|
|
target_compile_options(glop_proto PUBLIC ${GLOP_COMPILE_OPTIONS})
|
|
target_link_libraries(glop_proto PRIVATE protobuf::libprotobuf)
|
|
|
|
# Main Target
|
|
add_library(glop)
|
|
target_sources(glop PRIVATE
|
|
ortools/base/accurate_sum.h
|
|
ortools/base/base_export.h
|
|
ortools/base/basictypes.h
|
|
ortools/base/commandlineflags.h
|
|
ortools/base/file.cc
|
|
ortools/base/file.h
|
|
ortools/base/gzipstring.h
|
|
ortools/base/hash.h
|
|
ortools/base/int_type.h
|
|
ortools/base/logging.h
|
|
ortools/base/macros.h
|
|
ortools/base/sysinfo.cc
|
|
ortools/base/sysinfo.h
|
|
ortools/base/timer.h
|
|
ortools/base/types.h
|
|
ortools/base/version.cc
|
|
ortools/base/version.h
|
|
ortools/glop/basis_representation.cc
|
|
ortools/glop/basis_representation.h
|
|
ortools/glop/dual_edge_norms.cc
|
|
ortools/glop/dual_edge_norms.h
|
|
ortools/glop/entering_variable.cc
|
|
ortools/glop/entering_variable.h
|
|
ortools/glop/initial_basis.cc
|
|
ortools/glop/initial_basis.h
|
|
ortools/glop/lp_solver.cc
|
|
ortools/glop/lp_solver.h
|
|
ortools/glop/lu_factorization.cc
|
|
ortools/glop/lu_factorization.h
|
|
ortools/glop/markowitz.cc
|
|
ortools/glop/markowitz.h
|
|
ortools/glop/preprocessor.cc
|
|
ortools/glop/preprocessor.h
|
|
ortools/glop/primal_edge_norms.cc
|
|
ortools/glop/primal_edge_norms.h
|
|
ortools/glop/reduced_costs.cc
|
|
ortools/glop/reduced_costs.h
|
|
ortools/glop/revised_simplex.cc
|
|
ortools/glop/revised_simplex.h
|
|
ortools/glop/status.cc
|
|
ortools/glop/status.h
|
|
ortools/glop/update_row.cc
|
|
ortools/glop/update_row.h
|
|
ortools/glop/variable_values.cc
|
|
ortools/glop/variable_values.h
|
|
ortools/glop/variables_info.cc
|
|
ortools/glop/variables_info.h
|
|
ortools/lp_data/lp_data.cc
|
|
ortools/lp_data/lp_data.h
|
|
ortools/lp_data/lp_data_utils.cc
|
|
ortools/lp_data/lp_data_utils.h
|
|
ortools/lp_data/lp_print_utils.cc
|
|
ortools/lp_data/lp_print_utils.h
|
|
ortools/lp_data/lp_types.cc
|
|
ortools/lp_data/lp_types.h
|
|
ortools/lp_data/lp_utils.cc
|
|
ortools/lp_data/lp_utils.h
|
|
ortools/lp_data/matrix_scaler.cc
|
|
ortools/lp_data/matrix_scaler.h
|
|
ortools/lp_data/matrix_utils.cc
|
|
ortools/lp_data/matrix_utils.h
|
|
ortools/lp_data/proto_utils.cc
|
|
ortools/lp_data/proto_utils.h
|
|
ortools/lp_data/sparse.cc
|
|
ortools/lp_data/sparse.h
|
|
ortools/lp_data/sparse_column.cc
|
|
ortools/port/sysinfo.h
|
|
ortools/port/sysinfo.cc
|
|
ortools/util/file_util.cc
|
|
ortools/util/file_util.h
|
|
ortools/util/fp_utils.cc
|
|
ortools/util/fp_utils.h
|
|
ortools/util/logging.cc
|
|
ortools/util/logging.h
|
|
ortools/util/rational_approximation.cc
|
|
ortools/util/rational_approximation.h
|
|
ortools/util/stats.cc
|
|
ortools/util/stats.h
|
|
ortools/util/strong_integers.h
|
|
ortools/util/time_limit.cc
|
|
ortools/util/time_limit.h
|
|
)
|
|
if(BUILD_LP_PARSER)
|
|
target_sources(glop PRIVATE
|
|
ortools/base/case.cc
|
|
ortools/base/case.h
|
|
ortools/lp_data/lp_parser.cc
|
|
ortools/lp_data/lp_parser.h)
|
|
endif()
|
|
|
|
if(WIN32)
|
|
list(APPEND GLOP_COMPILE_DEFINITIONS "__WIN32__")
|
|
endif()
|
|
if(MSVC)
|
|
list(APPEND GLOP_COMPILE_OPTIONS
|
|
"/bigobj" # Allow big object
|
|
"/DNOMINMAX"
|
|
"/DWIN32_LEAN_AND_MEAN=1"
|
|
"/D_CRT_SECURE_NO_WARNINGS"
|
|
"/D_CRT_SECURE_NO_DEPRECATE"
|
|
"/MP" # Build with multiple processes
|
|
"/Zc:preprocessor" # Enable preprocessor conformance mode
|
|
)
|
|
# MSVC warning suppressions
|
|
list(APPEND GLOP_COMPILE_OPTIONS
|
|
"/wd4005" # 'macro-redefinition'
|
|
"/wd4018" # 'expression' : signed/unsigned mismatch
|
|
"/wd4065" # switch statement contains 'default' but no 'case' labels
|
|
"/wd4068" # 'unknown pragma'
|
|
"/wd4101" # 'identifier' : unreferenced local variable
|
|
"/wd4146" # unary minus operator applied to unsigned type, result still unsigned
|
|
"/wd4200" # nonstandard extension used : zero-sized array in struct/union
|
|
"/wd4244" # 'conversion' conversion from 'type1' to 'type2', possible loss of data
|
|
"/wd4251" # 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
|
|
"/wd4267" # 'var' : conversion from 'size_t' to 'type', possible loss of data
|
|
"/wd4305" # 'identifier' : truncation from 'type1' to 'type2'
|
|
"/wd4307" # 'operator' : integral constant overflow
|
|
"/wd4309" # 'conversion' : truncation of constant value
|
|
"/wd4334" # 'operator' : result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
|
|
"/wd4355" # 'this' : used in base member initializer list
|
|
"/wd4477" # 'fwprintf' : format string '%s' requires an argument of type 'wchar_t *'
|
|
"/wd4506" # no definition for inline function 'function'
|
|
"/wd4715" # function' : not all control paths return a value
|
|
"/wd4800" # 'type' : forcing value to bool 'true' or 'false' (performance warning)
|
|
"/wd4996" # The compiler encountered a deprecated declaration.
|
|
)
|
|
else()
|
|
list(APPEND GLOP_COMPILE_OPTIONS "-fwrapv")
|
|
endif()
|
|
|
|
# Includes
|
|
target_include_directories(glop PUBLIC
|
|
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
|
|
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
|
|
$<INSTALL_INTERFACE:include>
|
|
)
|
|
|
|
# Compile options
|
|
set_target_properties(glop PROPERTIES
|
|
CXX_STANDARD 17
|
|
CXX_STANDARD_REQUIRED ON
|
|
CXX_EXTENSIONS OFF
|
|
)
|
|
target_compile_features(glop PUBLIC cxx_std_17)
|
|
target_compile_definitions(glop PUBLIC ${GLOP_COMPILE_DEFINITIONS})
|
|
target_compile_options(glop PUBLIC ${GLOP_COMPILE_OPTIONS})
|
|
|
|
# Properties
|
|
if(NOT APPLE)
|
|
set_target_properties(glop PROPERTIES VERSION ${PROJECT_VERSION})
|
|
if(UNIX)
|
|
set_target_properties(glop PROPERTIES INSTALL_RPATH "$ORIGIN")
|
|
endif()
|
|
else()
|
|
# Clang don't support version x.y.z with z > 255
|
|
set_target_properties(glop PROPERTIES
|
|
INSTALL_RPATH "@loader_path"
|
|
VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR})
|
|
endif()
|
|
set_target_properties(glop PROPERTIES
|
|
SOVERSION ${PROJECT_VERSION_MAJOR}
|
|
POSITION_INDEPENDENT_CODE ON
|
|
INTERFACE_POSITION_INDEPENDENT_CODE ON
|
|
)
|
|
set_target_properties(glop PROPERTIES INTERFACE_glop_MAJOR_VERSION ${PROJECT_VERSION_MAJOR})
|
|
set_target_properties(glop PROPERTIES COMPATIBLE_INTERFACE_STRING glop_MAJOR_VERSION)
|
|
|
|
# Dependencies
|
|
target_sources(glop PRIVATE $<TARGET_OBJECTS:glop_proto>)
|
|
add_dependencies(glop glop_proto)
|
|
|
|
target_link_libraries(glop PUBLIC
|
|
ZLIB::ZLIB
|
|
absl::memory
|
|
absl::hash
|
|
absl::flags
|
|
absl::log
|
|
absl::log_globals
|
|
absl::log_initialize
|
|
absl::check
|
|
absl::die_if_null
|
|
absl::status
|
|
absl::time
|
|
absl::strings
|
|
absl::statusor
|
|
absl::str_format
|
|
absl::random_random
|
|
protobuf::libprotobuf
|
|
)
|
|
if(WIN32)
|
|
#target_link_libraries(glop PUBLIC psapi.lib ws2_32.lib)
|
|
endif()
|
|
|
|
# ALIAS
|
|
add_library(${PROJECT_NAME}::glop ALIAS glop)
|
|
|
|
# Install rules
|
|
include(GNUInstallDirs)
|
|
include(GenerateExportHeader)
|
|
GENERATE_EXPORT_HEADER(glop)
|
|
install(FILES ${PROJECT_BINARY_DIR}/glop_export.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/glop
|
|
COMPONENT Devel)
|
|
|
|
install(TARGETS glop
|
|
EXPORT glopTargets
|
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
)
|
|
|
|
install(EXPORT glopTargets
|
|
NAMESPACE ortools::
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/glop)
|
|
|
|
# glop headers
|
|
install(DIRECTORY ortools/glop
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools
|
|
COMPONENT Devel
|
|
FILES_MATCHING
|
|
PATTERN "*.h")
|
|
# dependencies headers
|
|
install(FILES
|
|
ortools/base/accurate_sum.h
|
|
ortools/base/base_export.h
|
|
ortools/base/basictypes.h
|
|
ortools/base/commandlineflags.h
|
|
ortools/base/file.h
|
|
ortools/base/gzipstring.h
|
|
ortools/base/hash.h
|
|
ortools/base/int_type.h
|
|
ortools/base/logging.h
|
|
ortools/base/macros.h
|
|
ortools/base/recordio.h
|
|
ortools/base/strong_int.h
|
|
ortools/base/strong_vector.h
|
|
ortools/base/sysinfo.h
|
|
ortools/base/timer.h
|
|
ortools/base/types.h
|
|
ortools/base/version.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/base
|
|
COMPONENT Devel)
|
|
install(FILES
|
|
ortools/lp_data/lp_data.h
|
|
ortools/lp_data/permutation.h
|
|
ortools/lp_data/scattered_vector.h
|
|
ortools/lp_data/sparse_column.h
|
|
ortools/lp_data/sparse_row.h
|
|
ortools/lp_data/sparse_vector.h
|
|
ortools/lp_data/lp_types.h
|
|
ortools/lp_data/lp_utils.h
|
|
ortools/lp_data/lp_print_utils.h
|
|
ortools/lp_data/matrix_scaler.h
|
|
ortools/lp_data/matrix_utils.h
|
|
ortools/lp_data/proto_utils.h
|
|
ortools/lp_data/sparse.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/lp_data
|
|
COMPONENT Devel)
|
|
install(FILES
|
|
ortools/graph/iterators.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/graph
|
|
COMPONENT Devel)
|
|
install(FILES
|
|
ortools/port/sysinfo.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/port
|
|
COMPONENT Devel)
|
|
install(FILES
|
|
ortools/util/bitset.h
|
|
ortools/util/file_util.h
|
|
ortools/util/fp_utils.h
|
|
ortools/util/logging.h
|
|
ortools/util/random_engine.h
|
|
ortools/util/rational_approximation.h
|
|
ortools/util/return_macros.h
|
|
ortools/util/running_stat.h
|
|
ortools/util/stats.h
|
|
ortools/util/strong_integers.h
|
|
ortools/util/time_limit.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/util
|
|
COMPONENT Devel)
|
|
# proto headers
|
|
install(FILES
|
|
${PROJECT_BINARY_DIR}/ortools/glop/parameters.pb.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/glop
|
|
COMPONENT Devel)
|
|
install(FILES
|
|
${PROJECT_BINARY_DIR}/ortools/linear_solver/linear_solver.pb.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/linear_solver
|
|
COMPONENT Devel)
|
|
install(FILES
|
|
${PROJECT_BINARY_DIR}/ortools/util/optional_boolean.pb.h
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ortools/util
|
|
COMPONENT Devel)
|
|
|
|
include(CMakePackageConfigHelpers)
|
|
string (TOUPPER "glop" PACKAGE_PREFIX)
|
|
configure_package_config_file(cmake/glopConfig.cmake.in
|
|
"${PROJECT_BINARY_DIR}/glopConfig.cmake"
|
|
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/glop"
|
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO)
|
|
write_basic_package_version_file(
|
|
"${PROJECT_BINARY_DIR}/glopConfigVersion.cmake"
|
|
COMPATIBILITY SameMajorVersion
|
|
)
|
|
install(
|
|
FILES
|
|
"${PROJECT_BINARY_DIR}/glopConfig.cmake"
|
|
"${PROJECT_BINARY_DIR}/glopConfigVersion.cmake"
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/glop"
|
|
COMPONENT Devel)
|