Skip to content

Commit

Permalink
Add CMake-based build system
Browse files Browse the repository at this point in the history
- Fix ZLIB usage
- Fix super build (e.g. FetchContent) integration
- Add install_rpath
  • Loading branch information
Mizux committed Dec 6, 2024
1 parent cd2800f commit ac4a849
Show file tree
Hide file tree
Showing 10 changed files with 705 additions and 9 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
*.swp
.vs/
build/
cache/

aclocal.m4*
aclocal.m4.orig*
acinclude.m4
Expand Down
134 changes: 134 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
cmake_minimum_required(VERSION 3.16)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

include(ParseAc)
parse_ac(VERSION MAJOR MINOR PATCH)

project(CoinUtils VERSION ${VERSION} LANGUAGES CXX C)
set(PROJECT_NAMESPACE coin)
message(STATUS "${PROJECT_NAME} version: ${PROJECT_VERSION}")
#message(STATUS "major: ${PROJECT_VERSION_MAJOR}")
#message(STATUS "minor: ${PROJECT_VERSION_MINOR}")
#message(STATUS "patch: ${PROJECT_VERSION_PATCH}")

# Default Build Type to be Release
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(isMultiConfig)
if(NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES "Release;Debug" CACHE STRING
"Choose the type of builds, options are: Debug Release RelWithDebInfo MinSizeRel. (default: Release;Debug)"
FORCE)
endif()
message(STATUS "Configuration types: ${CMAKE_CONFIGURATION_TYPES}")
else()
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel. (default: Release)"
FORCE)
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
endif()

# Layout build dir like install dir
include(GNUInstallDirs)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_BUILD_RPATH_USE_ORIGIN ON)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON)
if(UNIX)
option(BUILD_SHARED_LIBS "Build shared libraries (.so or .dylib)." ON)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
# for multi-config build system (e.g. Xcode, Ninja Multi-Config)
foreach(OutputConfig IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER ${OutputConfig} OUTPUTCONFIG)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
endforeach()
else()
# Currently Only support static build for windows
option(BUILD_SHARED_LIBS "Build shared libraries (.dll)." OFF)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
# for multi-config builds (e.g. msvc)
foreach(OutputConfig IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER ${OutputConfig} OUTPUTCONFIG)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/${OutputConfig}/${CMAKE_INSTALL_BINDIR})
endforeach()
endif()

if(MSVC AND BUILD_SHARED_LIBS)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()

# config options
if(MSVC)
# Build with multiple processes
add_definitions(/MP)
add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_DEPRECATE)
# MSVC warning suppressions
add_definitions(
/wd4018 # 'expression' : signed/unsigned mismatch
/wd4065 # switch statement contains 'default' but no 'case' labels
/wd4101 # 'identifier' : unreferenced local variable
/wd4102 # 'label' : unreferenced label
/wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data
/wd4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data
/wd4309 # 'conversion' : truncation of constant value
/wd4805 # 'operation' : unsafe mix of type 'type1' and type 'type2' in operation.
/wd4996 # The compiler encountered a deprecated declaration.
)
endif()
if(APPLE)
set(
CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -Wno-inconsistent-missing-override -Wno-unused-command-line-argument -Wno-unused-result -Wno-exceptions"
)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
endif()

# ZLIB
if(NOT TARGET ZLIB::ZLIB)
find_package(ZLIB)
endif()
if(ZLIB_FOUND OR TARGET ZLIB::ZLIB)
message(STATUS "Use zlib")
set(HAVE_ZLIB_H "1" CACHE INTERNAL "Use zlib")
set(COIN_HAS_ZLIB "1" CACHE INTERNAL "Use zlib")
endif()

# PThread
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)
if(CMAKE_USE_PTHREADS_INIT)
set(PTHREADS_FOUND TRUE)
else()
set(PTHREADS_FOUND FALSE)
endif()

include(CheckEnv)
include(CTest)

add_subdirectory(CoinUtils)

include(GNUInstallDirs)
install(EXPORT ${PROJECT_NAME}Targets
NAMESPACE Coin::
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
include(CMakePackageConfigHelpers)
configure_package_config_file(cmake/Config.cmake.in
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
write_basic_package_version_file(
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
COMPATIBILITY SameMajorVersion)
install(
FILES
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
COMPONENT Devel)
179 changes: 179 additions & 0 deletions CoinUtils/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
set(NAME "COINUTILS")

# PTHREAD
if(PTHREADS_FOUND)
set(${NAME}_PTHREADS "1" CACHE INTERNAL "Use pthread")
endif()

set(COIN_${NAME}_CHECKLEVEL "0" CACHE INTERNAL
"${NAME} check level")
set(COIN_${NAME}_VERBOSITY "0" CACHE INTERNAL
"${NAME} verbosity level")
configure_file(config.h.cmake.in config.h)
configure_file(config_coinutils.h.cmake.in config_coinutils.h)

set(_SRCS
src/CoinAlloc.cpp
src/CoinBuild.cpp
src/CoinDenseVector.cpp
src/CoinError.cpp
src/CoinFactorization1.cpp
src/CoinFactorization2.cpp
src/CoinFactorization3.cpp
src/CoinFactorization4.cpp
src/CoinSimpFactorization.cpp
src/CoinDenseFactorization.cpp
src/CoinOslFactorization.cpp
src/CoinOslFactorization2.cpp
src/CoinOslFactorization3.cpp
src/CoinFileIO.cpp
src/CoinFinite.cpp
src/CoinIndexedVector.cpp
src/CoinLpIO.cpp
src/CoinMessage.cpp
src/CoinMessageHandler.cpp
src/CoinModel.cpp
src/CoinStructuredModel.cpp
src/CoinModelUseful.cpp
src/CoinModelUseful2.cpp
src/CoinMpsIO.cpp
src/CoinPackedMatrix.cpp
src/CoinPackedVector.cpp
src/CoinPackedVectorBase.cpp
src/CoinParam.cpp
src/CoinParamUtils.cpp
src/CoinPostsolveMatrix.cpp
src/CoinPrePostsolveMatrix.cpp
src/CoinPresolveDoubleton.cpp
src/CoinPresolveDual.cpp
src/CoinPresolveDupcol.cpp
src/CoinPresolveEmpty.cpp
src/CoinPresolveFixed.cpp
src/CoinPresolveForcing.cpp
src/CoinPresolveHelperFunctions.cpp
src/CoinPresolveImpliedFree.cpp
src/CoinPresolveIsolated.cpp
src/CoinPresolveMatrix.cpp
src/CoinPresolvePsdebug.cpp
src/CoinPresolveMonitor.cpp
src/CoinPresolveSingleton.cpp
src/CoinPresolveSubst.cpp
src/CoinPresolveTighten.cpp
src/CoinPresolveTripleton.cpp
src/CoinPresolveUseless.cpp
src/CoinPresolveZeros.cpp
src/CoinSearchTree.cpp
src/CoinShallowPackedVector.cpp
src/CoinSnapshot.cpp
src/CoinWarmStartBasis.cpp
src/CoinWarmStartVector.cpp
src/CoinWarmStartDual.cpp
src/CoinWarmStartPrimalDual.cpp
src/CoinRational.cpp)

set(_HDRS
src/Coin_C_defines.h
src/CoinUtilsConfig.h
src/CoinAlloc.hpp
src/CoinBuild.hpp
src/CoinDenseVector.hpp
src/CoinDistance.hpp
src/CoinError.hpp
src/CoinFactorization.hpp
src/CoinSimpFactorization.hpp
src/CoinDenseFactorization.hpp
src/CoinOslFactorization.hpp
src/CoinFileIO.hpp
src/CoinFinite.hpp
src/CoinFloatEqual.hpp
src/CoinHelperFunctions.hpp
src/CoinIndexedVector.hpp
src/CoinLpIO.hpp
src/CoinMessage.hpp
src/CoinMessageHandler.hpp
src/CoinModel.hpp
src/CoinStructuredModel.hpp
src/CoinModelUseful.hpp
src/CoinMpsIO.hpp
src/CoinPackedMatrix.hpp
src/CoinPackedVector.hpp
src/CoinPackedVectorBase.hpp
src/CoinParam.hpp
src/CoinPragma.hpp
src/CoinPresolveDoubleton.hpp
src/CoinPresolveDual.hpp
src/CoinPresolveDupcol.hpp
src/CoinPresolveEmpty.hpp
src/CoinPresolveFixed.hpp
src/CoinPresolveForcing.hpp
src/CoinPresolveImpliedFree.hpp
src/CoinPresolveIsolated.hpp
src/CoinPresolveMatrix.hpp
src/CoinPresolveMonitor.hpp
src/CoinPresolvePsdebug.hpp
src/CoinPresolveSingleton.hpp
src/CoinPresolveSubst.hpp
src/CoinPresolveTighten.hpp
src/CoinPresolveTripleton.hpp
src/CoinPresolveUseless.hpp
src/CoinPresolveZeros.hpp
src/CoinSearchTree.hpp
src/CoinShallowPackedVector.hpp
src/CoinSignal.hpp
src/CoinSmartPtr.hpp
src/CoinSnapshot.hpp
src/CoinSort.hpp
src/CoinTime.hpp
src/CoinTypes.hpp
src/CoinUtility.hpp
src/CoinWarmStart.hpp
src/CoinWarmStartBasis.hpp
src/CoinWarmStartVector.hpp
src/CoinWarmStartDual.hpp
src/CoinWarmStartPrimalDual.hpp
src/CoinRational.hpp)

include(GNUInstallDirs)

add_library(CoinUtils ${_SRCS} ${_HDRS})
target_include_directories(CoinUtils PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:include/coin>)
target_compile_definitions(CoinUtils
PUBLIC HAVE_CONFIG_H
PRIVATE COINUTILS_BUILD)
if(CMAKE_VERSION VERSION_LESS "3.8.2")
set_property(TARGET CoinUtils PROPERTY CXX_STANDARD 11)
set_property(TARGET CoinUtils PROPERTY CXX_STANDARD_REQUIRED ON)
else()
target_compile_features(CoinUtils PUBLIC cxx_std_11)
endif()
if(APPLE)
set_target_properties(CoinUtils PROPERTIES INSTALL_RPATH "@loader_path")
elseif(UNIX)
set_target_properties(CoinUtils PROPERTIES INSTALL_RPATH "$ORIGIN")
endif()
if(TARGET ZLIB::ZLIB)
target_link_libraries(CoinUtils PRIVATE ZLIB::ZLIB)
endif()
if(CMAKE_USE_PTHREADS_INIT)
target_link_libraries(CoinUtils PRIVATE Threads::Threads)
endif()
set_target_properties(CoinUtils PROPERTIES
PUBLIC_HEADER "${_HDRS};${CMAKE_CURRENT_BINARY_DIR}/config_coinutils.h"
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR})
add_library(Coin::CoinUtils ALIAS CoinUtils)

# Install
install(TARGETS CoinUtils
EXPORT ${PROJECT_NAME}Targets
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

if(BUILD_TESTING)
add_subdirectory(test)
endif()
Loading

0 comments on commit ac4a849

Please sign in to comment.