Skip to content

Commit 11a1226

Browse files
committed
Add CMake based build
- Fix super build (e.g. FetchContent) integration - cmake: option() honors normal variables (CMP0077)
1 parent 1d91b9c commit 11a1226

File tree

8 files changed

+634
-0
lines changed

8 files changed

+634
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,6 @@
1717
aclocal.m4*
1818
acinclude.m4
1919
autom4te*
20+
*.swp
21+
.vs/
22+
build/

CMakeLists.txt

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
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(Cgl 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+
# Osi
118+
if(NOT TARGET Coin::Osi)
119+
find_package(Osi REQUIRED CONFIG)
120+
endif()
121+
# Clp
122+
if(NOT TARGET Coin::Clp)
123+
find_package(Clp REQUIRED CONFIG)
124+
endif()
125+
126+
include(CheckEnv)
127+
include(CTest)
128+
129+
add_subdirectory(Cgl)
130+
131+
include(GNUInstallDirs)
132+
install(EXPORT ${PROJECT_NAME}Targets
133+
NAMESPACE Coin::
134+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
135+
include(CMakePackageConfigHelpers)
136+
configure_package_config_file(cmake/Config.cmake.in
137+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
138+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
139+
write_basic_package_version_file(
140+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
141+
COMPATIBILITY SameMajorVersion)
142+
install(
143+
FILES
144+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
145+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
146+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
147+
COMPONENT Devel)

Cgl/CMakeLists.txt

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
set(NAME "CGL")
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_cgl.h.cmake.in config_cgl.h)
14+
15+
set(_SRCS
16+
src/CglMixedIntegerRounding/CglMixedIntegerRoundingTest.cpp
17+
src/CglMixedIntegerRounding/CglMixedIntegerRounding.cpp
18+
src/CglDuplicateRow/CglDuplicateRow.cpp
19+
src/CglCutGenerator.cpp
20+
src/CglPreProcess/CglPreProcess.cpp
21+
src/CglProbing/CglProbing.cpp
22+
src/CglProbing/CglProbingTest.cpp
23+
src/CglMixedIntegerRounding2/CglMixedIntegerRounding2.cpp
24+
src/CglMixedIntegerRounding2/CglMixedIntegerRounding2Test.cpp
25+
src/CglLandP/CglLandPUtils.cpp
26+
src/CglLandP/CglLandPTest.cpp
27+
src/CglLandP/CglLandPTabRow.cpp
28+
src/CglLandP/CglLandPSimplex.cpp
29+
src/CglLandP/CglLandPValidator.cpp
30+
src/CglLandP/CglLandPMessages.cpp
31+
src/CglLandP/CglLandP.cpp
32+
src/CglOddHole/CglOddHoleTest.cpp
33+
src/CglOddHole/CglOddHole.cpp
34+
src/CglRedSplit/CglRedSplitParam.cpp
35+
src/CglRedSplit/CglRedSplit.cpp
36+
src/CglRedSplit/CglRedSplitTest.cpp
37+
src/CglAllDifferent/CglAllDifferent.cpp
38+
src/CglKnapsackCover/CglKnapsackCoverTest.cpp
39+
src/CglKnapsackCover/CglKnapsackCover.cpp
40+
src/CglSimpleRounding/CglSimpleRoundingTest.cpp
41+
src/CglSimpleRounding/CglSimpleRounding.cpp
42+
src/CglZeroHalf/CglZeroHalfTest.cpp
43+
src/CglZeroHalf/Cgl012cut.cpp
44+
src/CglZeroHalf/CglZeroHalf.cpp
45+
src/CglRedSplit2/CglRedSplit2Test.cpp
46+
src/CglRedSplit2/CglRedSplit2Param.cpp
47+
src/CglRedSplit2/CglRedSplit2.cpp
48+
src/CglMessage.cpp
49+
src/CglStored.cpp
50+
src/CglParam.cpp
51+
src/CglResidualCapacity/CglResidualCapacity.cpp
52+
src/CglResidualCapacity/CglResidualCapacityTest.cpp
53+
src/CglTwomir/CglTwomirTest.cpp
54+
src/CglTwomir/CglTwomir.cpp
55+
src/CglFlowCover/CglFlowCoverTest.cpp
56+
src/CglFlowCover/CglFlowCover.cpp
57+
src/CglClique/CglCliqueHelper.cpp
58+
src/CglClique/CglCliqueTest.cpp
59+
src/CglClique/CglClique.cpp
60+
src/CglTreeInfo.cpp
61+
src/CglLiftAndProject/CglLiftAndProject.cpp
62+
src/CglGomory/CglGomoryTest.cpp
63+
src/CglGomory/CglGomory.cpp
64+
src/CglGMI/CglGMI.cpp
65+
src/CglGMI/CglGMIParam.cpp)
66+
67+
set(_HDRS
68+
src/CglConfig.h
69+
src/CglMixedIntegerRounding/CglMixedIntegerRounding.hpp
70+
src/CglDuplicateRow/CglDuplicateRow.hpp
71+
src/CglStored.hpp
72+
src/CglPreProcess/CglPreProcess.hpp
73+
src/CglProbing/CglProbing.hpp
74+
src/CglMixedIntegerRounding2/CglMixedIntegerRounding2.hpp
75+
src/CglLandP/CglLandP.hpp
76+
src/CglLandP/CglLandPUtils.hpp
77+
src/CglLandP/CglLandPValidator.hpp
78+
src/CglLandP/CglLandPTabRow.hpp
79+
src/CglLandP/CglLandPMessages.hpp
80+
src/CglLandP/CglLandPSimplex.hpp
81+
src/CglOddHole/CglOddHole.hpp
82+
src/CglRedSplit/CglRedSplitParam.hpp
83+
src/CglRedSplit/CglRedSplit.hpp
84+
src/CglAllDifferent/CglAllDifferent.hpp
85+
src/CglKnapsackCover/CglKnapsackCover.hpp
86+
src/CglSimpleRounding/CglSimpleRounding.hpp
87+
src/CglMessage.hpp
88+
src/CglZeroHalf/CglZeroHalf.hpp
89+
src/CglZeroHalf/Cgl012cut.hpp
90+
src/CglRedSplit2/CglRedSplit2Param.hpp
91+
src/CglRedSplit2/CglRedSplit2.hpp
92+
src/CglCutGenerator.hpp
93+
src/CglResidualCapacity/CglResidualCapacity.hpp
94+
src/CglTwomir/CglTwomir.hpp
95+
src/CglFlowCover/CglFlowCover.hpp
96+
src/CglClique/CglClique.hpp
97+
src/CglLiftAndProject/CglLiftAndProject.hpp
98+
src/CglGomory/CglGomory.hpp
99+
src/CglGMI/CglGMIParam.hpp
100+
src/CglGMI/CglGMI.hpp
101+
src/CglParam.hpp
102+
src/CglTreeInfo.hpp)
103+
104+
include(GNUInstallDirs)
105+
106+
add_library(Cgl ${_SRCS} ${_HDRS})
107+
target_include_directories(Cgl PUBLIC
108+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
109+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglClique>
110+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglDuplicateRow>
111+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglFlowCover>
112+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglGMI>
113+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglGomory>
114+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglKnapsackCover>
115+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglLandP>
116+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglMixedIntegerRounding>
117+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglMixedIntegerRounding2>
118+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglPreProcess>
119+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglProbing>
120+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglOddHole>
121+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglRedSplit>
122+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglRedSplit2>
123+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglResidualCapacity>
124+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglSimpleRounding>
125+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglTwomir>
126+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CglZeroHalf>
127+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
128+
$<INSTALL_INTERFACE:include/coin>)
129+
target_compile_definitions(Cgl
130+
PUBLIC HAVE_CONFIG_H
131+
PRIVATE CGL_BUILD)
132+
if(CMAKE_VERSION VERSION_LESS "3.8.2")
133+
set_property(TARGET Cgl PROPERTY CXX_STANDARD 11)
134+
set_property(TARGET Cgl PROPERTY CXX_STANDARD_REQUIRED ON)
135+
else()
136+
target_compile_features(Cgl PUBLIC cxx_std_11)
137+
endif()
138+
if(APPLE)
139+
set_target_properties(Cgl PROPERTIES INSTALL_RPATH "@loader_path")
140+
elseif(UNIX)
141+
set_target_properties(Cgl PROPERTIES INSTALL_RPATH "$ORIGIN")
142+
endif()
143+
target_link_libraries(Cgl PUBLIC
144+
Coin::CoinUtils
145+
Coin::Osi
146+
Coin::OsiClp)
147+
set_target_properties(Cgl PROPERTIES
148+
PUBLIC_HEADER "${_HDRS};${CMAKE_CURRENT_BINARY_DIR}/config_cgl.h"
149+
VERSION ${PROJECT_VERSION}
150+
SOVERSION ${PROJECT_VERSION_MAJOR})
151+
add_library(Coin::Cgl ALIAS Cgl)
152+
153+
# Install
154+
install(TARGETS Cgl
155+
EXPORT ${PROJECT_NAME}Targets
156+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin
157+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
158+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
159+
)

0 commit comments

Comments
 (0)