Skip to content

Commit 19cac6b

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

File tree

8 files changed

+637
-0
lines changed

8 files changed

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