Skip to content

Commit a3d0a30

Browse files
committed
Add CMake based build support
- Fix super build (e.g. FetchContent) integration - cmake: option() honors normal variables (CMP0077) - add some Osi test to cmake adapt test to ignore when mps file are not present
1 parent cafff3e commit a3d0a30

12 files changed

+721
-108
lines changed

.gitignore

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,4 @@
1-
# Ignore VS files
2-
*.suo
3-
*.db
4-
*.bak
5-
*.user
6-
**/.vs/
7-
**/MSVisualStudio/**/Release/
8-
**/MSVisualStudio/**/ReleaseParallel/
9-
**/MSVisualStudio/**/Debug/
10-
11-
# Ignore files created during unit tests
12-
**/MSVisualStudio/**/*.mps
13-
**/MSVisualStudio/**/*.lp
14-
**/MSVisualStudio/**/*.out
15-
16-
# Ignore autotools cache files
17-
aclocal.m4*
18-
acinclude.m4
19-
autom4te*
1+
*.swp
2+
.vs/
3+
build/
4+
cache/

CMakeLists.txt

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
cmake_minimum_required(VERSION 3.16)
2+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
3+
4+
include(ParseAc)
5+
parse_ac(VERSION MAJOR MINOR PATCH)
6+
7+
project(Osi VERSION ${VERSION} LANGUAGES CXX C)
8+
set(PROJECT_NAMESPACE coin)
9+
message(STATUS "${PROJECT_NAME} version: ${PROJECT_VERSION}")
10+
#message(STATUS "major: ${PROJECT_VERSION_MAJOR}")
11+
#message(STATUS "minor: ${PROJECT_VERSION_MINOR}")
12+
#message(STATUS "patch: ${PROJECT_VERSION_PATCH}")
13+
14+
# Default Build Type to be Release
15+
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
16+
if(isMultiConfig)
17+
if(NOT CMAKE_CONFIGURATION_TYPES)
18+
set(CMAKE_CONFIGURATION_TYPES "Release;Debug" CACHE STRING
19+
"Choose the type of builds, options are: Debug Release RelWithDebInfo MinSizeRel. (default: Release;Debug)"
20+
FORCE)
21+
endif()
22+
message(STATUS "Configuration types: ${CMAKE_CONFIGURATION_TYPES}")
23+
else()
24+
if(NOT CMAKE_BUILD_TYPE)
25+
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
26+
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel. (default: Release)"
27+
FORCE)
28+
endif()
29+
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
30+
endif()
31+
32+
# Layout build dir like install dir
33+
include(GNUInstallDirs)
34+
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
35+
set(CMAKE_BUILD_RPATH_USE_ORIGIN ON)
36+
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON)
37+
if(UNIX)
38+
option(BUILD_SHARED_LIBS "Build shared libraries (.so or .dylib)." ON)
39+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
40+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
41+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
42+
# for multi-config build system (e.g. Xcode, Ninja Multi-Config)
43+
foreach(OutputConfig IN LISTS CMAKE_CONFIGURATION_TYPES)
44+
string(TOUPPER ${OutputConfig} OUTPUTCONFIG)
45+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_LIBDIR})
46+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_LIBDIR})
47+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
48+
endforeach()
49+
else()
50+
# Currently Only support static build for windows
51+
option(BUILD_SHARED_LIBS "Build shared libraries (.dll)." OFF)
52+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
53+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
54+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
55+
# for multi-config builds (e.g. msvc)
56+
foreach(OutputConfig IN LISTS CMAKE_CONFIGURATION_TYPES)
57+
string(TOUPPER ${OutputConfig} OUTPUTCONFIG)
58+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
59+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
60+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
61+
endforeach()
62+
endif()
63+
64+
if(MSVC AND BUILD_SHARED_LIBS)
65+
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
66+
endif()
67+
68+
# config options
69+
if(MSVC)
70+
# Build with multiple processes
71+
add_definitions(/MP)
72+
add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_DEPRECATE)
73+
# MSVC warning suppressions
74+
add_definitions(
75+
/wd4018 # 'expression' : signed/unsigned mismatch
76+
/wd4065 # switch statement contains 'default' but no 'case' labels
77+
/wd4101 # 'identifier' : unreferenced local variable
78+
/wd4102 # 'label' : unreferenced label
79+
/wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data
80+
/wd4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data
81+
/wd4309 # 'conversion' : truncation of constant value
82+
/wd4805 # 'operation' : unsafe mix of type 'type1' and type 'type2' in operation.
83+
/wd4996 # The compiler encountered a deprecated declaration.
84+
)
85+
endif()
86+
if(APPLE)
87+
set(
88+
CMAKE_CXX_FLAGS
89+
"${CMAKE_CXX_FLAGS} -Wno-inconsistent-missing-override -Wno-unused-command-line-argument -Wno-unused-result -Wno-exceptions"
90+
)
91+
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
92+
endif()
93+
94+
# ZLIB
95+
if(NOT TARGET ZLIB::ZLIB)
96+
find_package(ZLIB)
97+
endif()
98+
if(ZLIB_FOUND OR TARGET ZLIB::ZLIB)
99+
message(STATUS "Use zlib")
100+
set(HAVE_ZLIB_H "1" CACHE INTERNAL "Use zlib")
101+
set(COIN_HAS_ZLIB "1" CACHE INTERNAL "Use zlib")
102+
endif()
103+
104+
# PThread
105+
set(THREADS_PREFER_PTHREAD_FLAG ON)
106+
find_package(Threads)
107+
if(CMAKE_USE_PTHREADS_INIT)
108+
set(PTHREADS_FOUND TRUE)
109+
else()
110+
set(PTHREADS_FOUND FALSE)
111+
endif()
112+
113+
# CoinUtils
114+
if(NOT TARGET Coin::CoinUtils)
115+
find_package(CoinUtils REQUIRED CONFIG)
116+
endif()
117+
118+
include(CheckEnv)
119+
include(CTest)
120+
121+
add_subdirectory(Osi)
122+
123+
include(GNUInstallDirs)
124+
install(EXPORT ${PROJECT_NAME}Targets
125+
NAMESPACE Coin::
126+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
127+
include(CMakePackageConfigHelpers)
128+
configure_package_config_file(cmake/Config.cmake.in
129+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
130+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
131+
write_basic_package_version_file(
132+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
133+
COMPATIBILITY SameMajorVersion)
134+
install(
135+
FILES
136+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
137+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
138+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
139+
COMPONENT Devel)

Osi/CMakeLists.txt

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
set(NAME "OSI")
2+
3+
# PTHREAD
4+
if(PTHREADS_FOUND)
5+
set(${NAME}_PTHREADS "1" CACHE INTERNAL "Use pthread")
6+
endif()
7+
8+
set(COIN_${NAME}_CHECKLEVEL "0" CACHE INTERNAL
9+
"${NAME} check level")
10+
set(COIN_${NAME}_VERBOSITY "0" CACHE INTERNAL
11+
"${NAME} verbosity level")
12+
configure_file(config.h.cmake.in config.h)
13+
configure_file(config_osi.h.cmake.in config_osi.h)
14+
15+
set(_SRCS
16+
src/Osi/OsiAuxInfo.cpp
17+
src/Osi/OsiBranchingObject.cpp
18+
src/Osi/OsiChooseVariable.cpp
19+
src/Osi/OsiColCut.cpp
20+
src/Osi/OsiCut.cpp
21+
src/Osi/OsiCuts.cpp
22+
src/Osi/OsiNames.cpp
23+
src/Osi/OsiPresolve.cpp
24+
src/Osi/OsiRowCut.cpp
25+
src/Osi/OsiRowCutDebugger.cpp
26+
src/Osi/OsiSolverBranch.cpp
27+
src/Osi/OsiSolverInterface.cpp)
28+
29+
set(_HDRS
30+
src/Osi/OsiConfig.h
31+
src/Osi/OsiAuxInfo.hpp
32+
src/Osi/OsiBranchingObject.hpp
33+
src/Osi/OsiChooseVariable.hpp
34+
src/Osi/OsiColCut.hpp
35+
src/Osi/OsiCollections.hpp
36+
src/Osi/OsiCut.hpp
37+
src/Osi/OsiCuts.hpp
38+
src/Osi/OsiPresolve.hpp
39+
src/Osi/OsiRowCut.hpp
40+
src/Osi/OsiRowCutDebugger.hpp
41+
src/Osi/OsiSolverBranch.hpp
42+
src/Osi/OsiSolverInterface.hpp
43+
src/Osi/OsiSolverParameters.hpp)
44+
45+
include(GNUInstallDirs)
46+
47+
add_library(Osi ${_SRCS} ${_HDRS})
48+
target_include_directories(Osi PUBLIC
49+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
50+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/Osi>
51+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
52+
$<INSTALL_INTERFACE:include/coin>)
53+
target_compile_definitions(Osi
54+
PUBLIC HAVE_CONFIG_H
55+
PRIVATE OSI_BUILD)
56+
if(CMAKE_VERSION VERSION_LESS "3.8.2")
57+
set_property(TARGET Osi PROPERTY CXX_STANDARD 11)
58+
set_property(TARGET Osi PROPERTY CXX_STANDARD_REQUIRED ON)
59+
else()
60+
target_compile_features(Osi PUBLIC cxx_std_11)
61+
endif()
62+
if(APPLE)
63+
set_target_properties(Osi PROPERTIES INSTALL_RPATH "@loader_path")
64+
elseif(UNIX)
65+
set_target_properties(Osi PROPERTIES INSTALL_RPATH "$ORIGIN")
66+
endif()
67+
target_link_libraries(Osi PUBLIC Coin::CoinUtils)
68+
set_target_properties(Osi PROPERTIES
69+
PUBLIC_HEADER "${_HDRS};${CMAKE_CURRENT_BINARY_DIR}/config_osi.h"
70+
VERSION ${PROJECT_VERSION}
71+
SOVERSION ${PROJECT_VERSION_MAJOR})
72+
add_library(Coin::Osi ALIAS Osi)
73+
74+
# Install
75+
install(TARGETS Osi
76+
EXPORT ${PROJECT_NAME}Targets
77+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin
78+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
79+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
80+
)
81+
82+
if(BUILD_TESTING)
83+
add_library(OsiCommonTest "")
84+
target_sources(OsiCommonTest PRIVATE
85+
src/OsiCommonTest/OsiColCutTest.cpp
86+
src/OsiCommonTest/OsiCutsTest.cpp
87+
src/OsiCommonTest/OsiNetlibTest.cpp
88+
src/OsiCommonTest/OsiRowCutDebuggerTest.cpp
89+
src/OsiCommonTest/OsiRowCutTest.cpp
90+
src/OsiCommonTest/OsiSimplexAPITest.cpp
91+
src/OsiCommonTest/OsiSolverInterfaceTest.cpp
92+
src/OsiCommonTest/OsiUnitTests.hpp
93+
src/OsiCommonTest/OsiUnitTestUtils.cpp)
94+
target_include_directories(OsiCommonTest PUBLIC
95+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
96+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/OsiCommonTest>
97+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
98+
$<INSTALL_INTERFACE:include/coin>)
99+
target_compile_definitions(OsiCommonTest
100+
PUBLIC HAVE_CONFIG_H
101+
PRIVATE OSI_BUILD)
102+
target_compile_features(OsiCommonTest PUBLIC cxx_std_11)
103+
if(APPLE)
104+
set_target_properties(OsiCommonTest PROPERTIES INSTALL_RPATH "@loader_path")
105+
elseif(UNIX)
106+
set_target_properties(OsiCommonTest PROPERTIES INSTALL_RPATH "$ORIGIN")
107+
endif()
108+
target_link_libraries(OsiCommonTest PUBLIC Coin::Osi)
109+
set_target_properties(OsiCommonTest PROPERTIES
110+
PUBLIC_HEADER "src/OsiCommonTest/OsiUnitTests.hpp"
111+
VERSION ${PROJECT_VERSION}
112+
SOVERSION ${PROJECT_VERSION_MAJOR})
113+
add_library(Coin::OsiCommonTest ALIAS OsiCommonTest)
114+
115+
add_subdirectory(test)
116+
endif()

Osi/config.h.cmake.in

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/*config.h. Generated by configure_file.*/
2+
3+
#define COIN_HAS_COINUTILS 1
4+
5+
/* VERSION */
6+
#define VERSION "${VERSION}"
7+
/* ${NAME}_VERSION */
8+
#define ${NAME}_VERSION "${VERSION}"
9+
/* ${NAME}_VERSION_MAJOR */
10+
#define ${NAME}_VERSION_MAJOR ${MAJOR}
11+
/* ${NAME}_VERSION_MINOR */
12+
#define ${NAME}_VERSION_MINOR ${MINOR}
13+
/* ${NAME}_VERSION_RELEASE */
14+
#define ${NAME}_VERSION_RELEASE ${PATCH}
15+
16+
/* HAVE_MATH_H */
17+
#cmakedefine HAVE_MATH_H ${HAVE_MATH_H}
18+
/* HAVE_CTYPE_H */
19+
#cmakedefine HAVE_CTYPE_H ${HAVE_CTYPE_H}
20+
/* HAVE_INTTYPES_H */
21+
#cmakedefine HAVE_INTTYPES_H ${HAVE_INTTYPES_H}
22+
/* HAVE_FLOAT_H */
23+
#cmakedefine HAVE_FLOAT_H ${HAVE_FLOAT_H}
24+
/* HAVE_IEEEFP_H */
25+
#cmakedefine HAVE_IEEEFP_H ${HAVE_IEEEFP_H}
26+
/* HAVE_STDARG_H */
27+
#cmakedefine HAVE_STDARG_H ${HAVE_STDARG_H}
28+
/* HAVE_STDDEF_H */
29+
#cmakedefine HAVE_STDDEF_H ${HAVE_STDDEF_H}
30+
/* HAVE_STDINT_H */
31+
#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H}
32+
/* HAVE_STDIO_H */
33+
#cmakedefine HAVE_STDIO_H ${HAVE_STDIO_H}
34+
/* HAVE_STDLIB_H */
35+
#cmakedefine HAVE_STDLIB_H ${HAVE_STDLIB_H}
36+
/* HAVE_ASSERT_H */
37+
#cmakedefine HAVE_ASSERT_H ${HAVE_ASSERT_H}
38+
/* HAVE_DLFCN_H */
39+
#cmakedefine HAVE_DLFCN_H ${HAVE_DLFCN_H}
40+
/* HAVE_ENDIAN_H */
41+
#cmakedefine HAVE_ENDIAN_H ${HAVE_ENDIAN_H}
42+
/* HAVE_MEMORY_H */
43+
#cmakedefine HAVE_MEMORY_H ${HAVE_MEMORY_H}
44+
/* HAVE_STRINGS_H */
45+
#cmakedefine HAVE_STRINGS_H ${HAVE_STRINGS_H}
46+
/* HAVE_STRING_H */
47+
#cmakedefine HAVE_STRING_H ${HAVE_STRING_H}
48+
/* HAVE_TIME_H */
49+
#cmakedefine HAVE_TIME_H ${HAVE_TIME_H}
50+
/* HAVE_UNISTD_H */
51+
#cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H}
52+
/* HAVE_SYS_STAT_H */
53+
#cmakedefine HAVE_SYS_STAT_H ${HAVE_SYS_STAT_H}
54+
/* HAVE_SYS_TYPES_H */
55+
#cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H}
56+
57+
/* HAVE_CMATH */
58+
#cmakedefine HAVE_CMATH ${HAVE_CMATH}
59+
/* HAVE_CCTYPE */
60+
#cmakedefine HAVE_CCTYPE ${HAVE_CCTYPE}
61+
/* HAVE_CINTTYPES */
62+
#cmakedefine HAVE_CINTTYPES ${HAVE_CINTTYPES}
63+
/* HAVE_CFLOAT */
64+
#cmakedefine HAVE_CFLOAT ${HAVE_CFLOAT}
65+
/* HAVE_CIEEEFP */
66+
#cmakedefine HAVE_CIEEEFP ${HAVE_CIEEEFP}
67+
/* HAVE_CSTDARG */
68+
#cmakedefine HAVE_CSTDARG ${HAVE_CSTDARG}
69+
/* HAVE_CSTDDEF */
70+
#cmakedefine HAVE_CSTDDEF ${HAVE_CSTDDEF}
71+
/* HAVE_CSTDINT */
72+
#cmakedefine HAVE_CSTDINT ${HAVE_CSTDINT}
73+
/* HAVE_CSTDIO */
74+
#cmakedefine HAVE_CSTDIO ${HAVE_CSTDIO}
75+
/* HAVE_CSTDLIB */
76+
#cmakedefine HAVE_CSTDLIB ${HAVE_CSTDLIB}
77+
/* HAVE_CASSERT */
78+
#cmakedefine HAVE_CASSERT ${HAVE_CASSERT}
79+
/* HAVE_CSTRING */
80+
#cmakedefine HAVE_CSTRING ${HAVE_CSTRING}
81+
/* HAVE_CTIME */
82+
#cmakedefine HAVE_CTIME ${HAVE_CTIME}
83+
84+
/* COIN_C_FINITE */
85+
#cmakedefine COIN_C_FINITE ${COIN_C_FINITE}
86+
/* COIN_C_ISNAN */
87+
#cmakedefine COIN_C_ISNAN ${COIN_C_ISNAN}
88+
/* COIN_INT64_T */
89+
#cmakedefine COIN_INT64_T ${COIN_INT64_T}
90+
/* COIN_UINT64_T */
91+
#cmakedefine COIN_UINT64_T ${COIN_UINT64_T}
92+
/* COIN_INTPTR_T */
93+
#cmakedefine COIN_INTPTR_T ${COIN_INTPTR_T}
94+
95+
/* COIN_${NAME}_CHECKLEVEL */
96+
#define COIN_${NAME}_CHECKLEVEL ${COIN_${NAME}_CHECKLEVEL}
97+
/* COIN_${NAME}_VERBOSITY */
98+
#define COIN_${NAME}_VERBOSITY ${COIN_${NAME}_VERBOSITY}
99+
100+
/* PACKAGE */
101+
#cmakedefine PACKAGE
102+
/* PACKAGE_NAME */
103+
#cmakedefine PACKAGE_NAME
104+
/* PACKAGE_VERSION */
105+
#cmakedefine PACKAGE_VERSION
106+
/* PACKAGE_STRING */
107+
#cmakedefine PACKAGE_STRING
108+
/* PACKAGE_TARNAME */
109+
#cmakedefine PACKAGE_TARNAME
110+
/* PACKAGE_BUGREPORT */
111+
#cmakedefine PACKAGE_BUGREPORT
112+

0 commit comments

Comments
 (0)