Skip to content

Commit 603b963

Browse files
committed
Add CMake-based build system
- Fix ZLIB usage - Fix super build (e.g. FetchContent) integration - Add install_rpath
1 parent cc64457 commit 603b963

File tree

10 files changed

+705
-9
lines changed

10 files changed

+705
-9
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
*.swp
2+
.vs/
3+
build/
4+
cache/
5+
16
aclocal.m4*
27
aclocal.m4.orig*
38
acinclude.m4

CMakeLists.txt

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
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(CoinUtils 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+
include(CheckEnv)
114+
include(CTest)
115+
116+
add_subdirectory(CoinUtils)
117+
118+
include(GNUInstallDirs)
119+
install(EXPORT ${PROJECT_NAME}Targets
120+
NAMESPACE Coin::
121+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
122+
include(CMakePackageConfigHelpers)
123+
configure_package_config_file(cmake/Config.cmake.in
124+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
125+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
126+
write_basic_package_version_file(
127+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
128+
COMPATIBILITY SameMajorVersion)
129+
install(
130+
FILES
131+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
132+
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
133+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
134+
COMPONENT Devel)

CoinUtils/CMakeLists.txt

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
set(NAME "COINUTILS")
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_coinutils.h.cmake.in config_coinutils.h)
14+
15+
set(_SRCS
16+
src/CoinAlloc.cpp
17+
src/CoinBuild.cpp
18+
src/CoinDenseVector.cpp
19+
src/CoinError.cpp
20+
src/CoinFactorization1.cpp
21+
src/CoinFactorization2.cpp
22+
src/CoinFactorization3.cpp
23+
src/CoinFactorization4.cpp
24+
src/CoinSimpFactorization.cpp
25+
src/CoinDenseFactorization.cpp
26+
src/CoinOslFactorization.cpp
27+
src/CoinOslFactorization2.cpp
28+
src/CoinOslFactorization3.cpp
29+
src/CoinFileIO.cpp
30+
src/CoinFinite.cpp
31+
src/CoinIndexedVector.cpp
32+
src/CoinLpIO.cpp
33+
src/CoinMessage.cpp
34+
src/CoinMessageHandler.cpp
35+
src/CoinModel.cpp
36+
src/CoinStructuredModel.cpp
37+
src/CoinModelUseful.cpp
38+
src/CoinModelUseful2.cpp
39+
src/CoinMpsIO.cpp
40+
src/CoinPackedMatrix.cpp
41+
src/CoinPackedVector.cpp
42+
src/CoinPackedVectorBase.cpp
43+
src/CoinParam.cpp
44+
src/CoinParamUtils.cpp
45+
src/CoinPostsolveMatrix.cpp
46+
src/CoinPrePostsolveMatrix.cpp
47+
src/CoinPresolveDoubleton.cpp
48+
src/CoinPresolveDual.cpp
49+
src/CoinPresolveDupcol.cpp
50+
src/CoinPresolveEmpty.cpp
51+
src/CoinPresolveFixed.cpp
52+
src/CoinPresolveForcing.cpp
53+
src/CoinPresolveHelperFunctions.cpp
54+
src/CoinPresolveImpliedFree.cpp
55+
src/CoinPresolveIsolated.cpp
56+
src/CoinPresolveMatrix.cpp
57+
src/CoinPresolvePsdebug.cpp
58+
src/CoinPresolveMonitor.cpp
59+
src/CoinPresolveSingleton.cpp
60+
src/CoinPresolveSubst.cpp
61+
src/CoinPresolveTighten.cpp
62+
src/CoinPresolveTripleton.cpp
63+
src/CoinPresolveUseless.cpp
64+
src/CoinPresolveZeros.cpp
65+
src/CoinSearchTree.cpp
66+
src/CoinShallowPackedVector.cpp
67+
src/CoinSnapshot.cpp
68+
src/CoinWarmStartBasis.cpp
69+
src/CoinWarmStartVector.cpp
70+
src/CoinWarmStartDual.cpp
71+
src/CoinWarmStartPrimalDual.cpp
72+
src/CoinRational.cpp)
73+
74+
set(_HDRS
75+
src/Coin_C_defines.h
76+
src/CoinUtilsConfig.h
77+
src/CoinAlloc.hpp
78+
src/CoinBuild.hpp
79+
src/CoinDenseVector.hpp
80+
src/CoinDistance.hpp
81+
src/CoinError.hpp
82+
src/CoinFactorization.hpp
83+
src/CoinSimpFactorization.hpp
84+
src/CoinDenseFactorization.hpp
85+
src/CoinOslFactorization.hpp
86+
src/CoinFileIO.hpp
87+
src/CoinFinite.hpp
88+
src/CoinFloatEqual.hpp
89+
src/CoinHelperFunctions.hpp
90+
src/CoinIndexedVector.hpp
91+
src/CoinLpIO.hpp
92+
src/CoinMessage.hpp
93+
src/CoinMessageHandler.hpp
94+
src/CoinModel.hpp
95+
src/CoinStructuredModel.hpp
96+
src/CoinModelUseful.hpp
97+
src/CoinMpsIO.hpp
98+
src/CoinPackedMatrix.hpp
99+
src/CoinPackedVector.hpp
100+
src/CoinPackedVectorBase.hpp
101+
src/CoinParam.hpp
102+
src/CoinPragma.hpp
103+
src/CoinPresolveDoubleton.hpp
104+
src/CoinPresolveDual.hpp
105+
src/CoinPresolveDupcol.hpp
106+
src/CoinPresolveEmpty.hpp
107+
src/CoinPresolveFixed.hpp
108+
src/CoinPresolveForcing.hpp
109+
src/CoinPresolveImpliedFree.hpp
110+
src/CoinPresolveIsolated.hpp
111+
src/CoinPresolveMatrix.hpp
112+
src/CoinPresolveMonitor.hpp
113+
src/CoinPresolvePsdebug.hpp
114+
src/CoinPresolveSingleton.hpp
115+
src/CoinPresolveSubst.hpp
116+
src/CoinPresolveTighten.hpp
117+
src/CoinPresolveTripleton.hpp
118+
src/CoinPresolveUseless.hpp
119+
src/CoinPresolveZeros.hpp
120+
src/CoinSearchTree.hpp
121+
src/CoinShallowPackedVector.hpp
122+
src/CoinSignal.hpp
123+
src/CoinSmartPtr.hpp
124+
src/CoinSnapshot.hpp
125+
src/CoinSort.hpp
126+
src/CoinTime.hpp
127+
src/CoinTypes.hpp
128+
src/CoinUtility.hpp
129+
src/CoinWarmStart.hpp
130+
src/CoinWarmStartBasis.hpp
131+
src/CoinWarmStartVector.hpp
132+
src/CoinWarmStartDual.hpp
133+
src/CoinWarmStartPrimalDual.hpp
134+
src/CoinRational.hpp)
135+
136+
include(GNUInstallDirs)
137+
138+
add_library(CoinUtils ${_SRCS} ${_HDRS})
139+
target_include_directories(CoinUtils PUBLIC
140+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
141+
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
142+
$<INSTALL_INTERFACE:include/coin>)
143+
target_compile_definitions(CoinUtils
144+
PUBLIC HAVE_CONFIG_H
145+
PRIVATE COINUTILS_BUILD)
146+
if(CMAKE_VERSION VERSION_LESS "3.8.2")
147+
set_property(TARGET CoinUtils PROPERTY CXX_STANDARD 11)
148+
set_property(TARGET CoinUtils PROPERTY CXX_STANDARD_REQUIRED ON)
149+
else()
150+
target_compile_features(CoinUtils PUBLIC cxx_std_11)
151+
endif()
152+
if(APPLE)
153+
set_target_properties(CoinUtils PROPERTIES INSTALL_RPATH "@loader_path")
154+
elseif(UNIX)
155+
set_target_properties(CoinUtils PROPERTIES INSTALL_RPATH "$ORIGIN")
156+
endif()
157+
if(TARGET ZLIB::ZLIB)
158+
target_link_libraries(CoinUtils PRIVATE ZLIB::ZLIB)
159+
endif()
160+
if(CMAKE_USE_PTHREADS_INIT)
161+
target_link_libraries(CoinUtils PRIVATE Threads::Threads)
162+
endif()
163+
set_target_properties(CoinUtils PROPERTIES
164+
PUBLIC_HEADER "${_HDRS};${CMAKE_CURRENT_BINARY_DIR}/config_coinutils.h"
165+
VERSION ${PROJECT_VERSION}
166+
SOVERSION ${PROJECT_VERSION_MAJOR})
167+
add_library(Coin::CoinUtils ALIAS CoinUtils)
168+
169+
# Install
170+
install(TARGETS CoinUtils
171+
EXPORT ${PROJECT_NAME}Targets
172+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin
173+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
174+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
175+
)
176+
177+
if(BUILD_TESTING)
178+
add_subdirectory(test)
179+
endif()

0 commit comments

Comments
 (0)