Skip to content

Commit 596d25c

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 596d25c

File tree

8 files changed

+658
-0
lines changed

8 files changed

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

CoinUtils/CMakeLists.txt

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
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+
)

0 commit comments

Comments
 (0)