Skip to content

Commit 726ab1f

Browse files
committed
Add CMake based build support
- Fix super build (e.g. FetchContent) integration - cmake: option() honors normal variables (CMP0077)
1 parent c67528f commit 726ab1f

File tree

8 files changed

+503
-0
lines changed

8 files changed

+503
-0
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*.swp
2+
.vs/
3+
build/
4+
cache/

CMakeLists.txt

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
3+
4+
# option() honors normal variables.
5+
if(POLICY CMP0077)
6+
cmake_policy(SET CMP0077 NEW)
7+
endif()
8+
9+
# MSVC runtime library flags are selected by an abstraction.
10+
if(POLICY CMP0091)
11+
cmake_policy(SET CMP0091 NEW)
12+
endif()
13+
14+
include(ParseAc)
15+
parse_ac(VERSION MAJOR MINOR PATCH)
16+
17+
project(Osi VERSION ${VERSION})
18+
19+
# config options
20+
if(NOT CMAKE_BUILD_TYPE)
21+
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
22+
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
23+
FORCE)
24+
endif(NOT CMAKE_BUILD_TYPE)
25+
26+
option(BUILD_SHARED_LIBS "" ON)
27+
if(BUILD_SHARED_LIBS AND MSVC)
28+
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
29+
endif(BUILD_SHARED_LIBS AND MSVC)
30+
31+
# config options
32+
if(MSVC)
33+
# Build with multiple processes
34+
add_definitions(/MP)
35+
add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_DEPRECATE)
36+
# MSVC warning suppressions
37+
add_definitions(
38+
/wd4018 # 'expression' : signed/unsigned mismatch
39+
/wd4065 # switch statement contains 'default' but no 'case' labels
40+
/wd4101 # 'identifier' : unreferenced local variable
41+
/wd4102 # 'label' : unreferenced label
42+
/wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data
43+
/wd4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data
44+
/wd4309 # 'conversion' : truncation of constant value
45+
/wd4805 # 'operation' : unsafe mix of type 'type1' and type 'type2' in operation.
46+
/wd4996 # The compiler encountered a deprecated declaration.
47+
)
48+
endif()
49+
if(APPLE)
50+
set(
51+
CMAKE_CXX_FLAGS
52+
"${CMAKE_CXX_FLAGS} -Wno-inconsistent-missing-override -Wno-unused-command-line-argument -Wno-unused-result -Wno-exceptions"
53+
)
54+
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X deployment version")
55+
endif(APPLE)
56+
57+
# ZLIB
58+
if(NOT TARGET ZLIB::ZLIB)
59+
find_package(ZLIB)
60+
endif()
61+
if(ZLIB_FOUND OR TARGET ZLIB::ZLIB)
62+
message(STATUS "Use zlib")
63+
set(HAVE_ZLIB_H "1" CACHE INTERNAL "Use zlib")
64+
set(COIN_HAS_ZLIB "1" CACHE INTERNAL "Use zlib")
65+
endif()
66+
67+
# PThread
68+
set(THREADS_PREFER_PTHREAD_FLAG ON)
69+
find_package(Threads)
70+
if(CMAKE_USE_PTHREADS_INIT)
71+
set(PTHREADS_FOUND TRUE)
72+
else()
73+
set(PTHREADS_FOUND FALSE)
74+
endif()
75+
76+
# CoinUtils
77+
if(NOT TARGET Coin::CoinUtils)
78+
find_package(CoinUtils REQUIRED CONFIG)
79+
endif()
80+
81+
include(CheckEnv)
82+
include(CTest)
83+
84+
add_subdirectory(Osi)
85+
86+
include(GNUInstallDirs)
87+
install(EXPORT ${PROJECT_NAME}Targets
88+
NAMESPACE Coin::
89+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
90+
include(CMakePackageConfigHelpers)
91+
configure_package_config_file(cmake/Config.cmake.in
92+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
93+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
94+
write_basic_package_version_file(
95+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
96+
COMPATIBILITY SameMajorVersion)
97+
install(
98+
FILES
99+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
100+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
101+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
102+
COMPONENT Devel)

Osi/CMakeLists.txt

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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+
add_library(Osi ${_SRCS} ${_HDRS})
46+
target_include_directories(Osi PUBLIC
47+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
48+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/Osi>
49+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
50+
$<INSTALL_INTERFACE:include/coin>)
51+
target_compile_definitions(Osi
52+
PUBLIC HAVE_CONFIG_H
53+
PRIVATE OSI_BUILD)
54+
if(CMAKE_VERSION VERSION_LESS "3.8.2")
55+
set_property(TARGET Osi PROPERTY CXX_STANDARD 11)
56+
set_property(TARGET Osi PROPERTY CXX_STANDARD_REQUIRED ON)
57+
else()
58+
target_compile_features(Osi PUBLIC cxx_std_11)
59+
endif()
60+
target_link_libraries(Osi PUBLIC Coin::CoinUtils)
61+
set_target_properties(Osi PROPERTIES
62+
PUBLIC_HEADER "${_HDRS};${CMAKE_CURRENT_BINARY_DIR}/config_osi.h"
63+
VERSION ${PROJECT_VERSION}
64+
SOVERSION ${PROJECT_VERSION_MAJOR})
65+
add_library(Coin::Osi ALIAS Osi)
66+
67+
# Install
68+
include(GNUInstallDirs)
69+
install(TARGETS Osi
70+
EXPORT ${PROJECT_NAME}Targets
71+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin
72+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
73+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
74+
)

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+

Osi/config_osi.h.cmake.in

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef __CONFIG_${NAME}_H__
2+
#define __CONFIG_${NAME}_H__
3+
4+
/* ${NAME}_VERSION */
5+
#define ${NAME}_VERSION "${VERSION}"
6+
/* ${NAME}_VERSION_MAJOR */
7+
#define ${NAME}_VERSION_MAJOR ${MAJOR}
8+
/* ${NAME}_VERSION_MINOR */
9+
#define ${NAME}_VERSION_MINOR ${MINOR}
10+
/* ${NAME}_VERSION_RELEASE */
11+
#define ${NAME}_VERSION_RELEASE ${PATCH}
12+
13+
#endif

0 commit comments

Comments
 (0)