From e22bbdb41948b2fd76c19fcfac7c04d00d2996ed Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Thu, 28 Mar 2019 14:20:47 +0100 Subject: [PATCH 1/6] Add CMake-based build system --- .gitignore | 4 + CMakeLists.txt | 84 ++++++++++++++++ cmake/CheckEnv.cmake | 151 ++++++++++++++++++++++++++++ cmake/Config.cmake.in | 13 +++ cmake/ParseAc.cmake | 28 ++++++ src/CMakeLists.txt | 169 ++++++++++++++++++++++++++++++++ src/config.h.cmake.in | 127 ++++++++++++++++++++++++ src/config_coinutils.h.cmake.in | 22 +++++ 8 files changed, 598 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 cmake/CheckEnv.cmake create mode 100644 cmake/Config.cmake.in create mode 100644 cmake/ParseAc.cmake create mode 100644 src/CMakeLists.txt create mode 100644 src/config.h.cmake.in create mode 100644 src/config_coinutils.h.cmake.in diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..0b76a74bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.swp +.vs/ +build/ +cache/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..0bfe0e1d7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,84 @@ +cmake_minimum_required(VERSION 3.5) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +include(ParseAc) +parse_ac(VERSION MAJOR MINOR PATCH) + +project(CoinUtils VERSION ${VERSION}) + +# config options +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." + FORCE) +endif(NOT CMAKE_BUILD_TYPE) + +option(BUILD_SHARED_LIBS "" ON) +if(BUILD_SHARED_LIBS AND MSVC) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +endif(BUILD_SHARED_LIBS AND MSVC) + +# 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.9" CACHE STRING "Minimum OS X deployment version") +endif(APPLE) + +# ZLIB +find_package(ZLIB) +if(ZLIB_FOUND) + 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(src) + +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) diff --git a/cmake/CheckEnv.cmake b/cmake/CheckEnv.cmake new file mode 100644 index 000000000..b24770250 --- /dev/null +++ b/cmake/CheckEnv.cmake @@ -0,0 +1,151 @@ +# Flags +include (CheckIncludeFile) +check_include_file(math.h HAVE_MATH_H) +check_include_file(ctype.h HAVE_CTYPE_H) +check_include_file(inttypes.h HAVE_INTTYPES_H) +check_include_file(float.h HAVE_FLOAT_H) +check_include_file(ieeefp.h HAVE_IEEEFP_H) +check_include_file(stdarg.h HAVE_STDARG_H) +check_include_file(stddef.h HAVE_STDDEF_H) +check_include_file(stdint.h HAVE_STDINT_H) +check_include_file(stdio.h HAVE_STDIO_H) +check_include_file(stdlib.h HAVE_STDLIB_H) +check_include_file(assert.h HAVE_ASSERT_H) +check_include_file(dlfcn.h HAVE_DLFCN_H) +check_include_file(endian.h HAVE_ENDIAN_H) +check_include_file(memory.h HAVE_MEMORY_H) +check_include_file(strings.h HAVE_STRINGS_H) +check_include_file(string.h HAVE_STRING_H) +check_include_file(time.h HAVE_TIME_H) +check_include_file(unistd.h HAVE_UNISTD_H) +check_include_file(sys/stat.h HAVE_SYS_STAT_H) +check_include_file(sys/types.h HAVE_SYS_TYPES_H) + +include (CheckIncludeFileCXX) +check_include_file_cxx(cmath HAVE_CMATH) +check_include_file_cxx(cctype HAVE_CCTYPE) +check_include_file_cxx(cinttypes HAVE_CINTTYPES) +check_include_file_cxx(cfloat HAVE_CFLOAT) +check_include_file_cxx(cieeefp HAVE_CIEEEFP) +check_include_file_cxx(cstdarg HAVE_CSTDARG) +check_include_file_cxx(cstddef HAVE_CSTDDEF) +check_include_file_cxx(cstdint HAVE_CSTDINT) +check_include_file_cxx(cstdio HAVE_CSTDIO) +check_include_file_cxx(cstdlib HAVE_CSTDLIB) +check_include_file_cxx(cassert HAVE_CASSERT) +check_include_file_cxx(cstring HAVE_CSTRING) +check_include_file_cxx(ctime HAVE_CTIME) + +set(STDC_HEADERS 1 CACHE INTERNAL "System has ANSI C header files") + +set(TEST_INCLUDES "") +if(HAVE_CMATH) + list(APPEND TEST_INCLUDES "cmath") +endif() +if(HAVE_CFLOAT) + list(APPEND TEST_INCLUDES "cfloat") +endif() +if(HAVE_CIEEEFP) + list(APPEND TEST_INCLUDES "cieeefp") +endif() +if(HAVE_MATH_H) + list(APPEND TEST_INCLUDES "math.h") +endif() +if(HAVE_FLOAT_H) + list(APPEND TEST_INCLUDES "float.h") +endif() +if(HAVE_IEEEFP_H) + list(APPEND TEST_INCLUDES "ieeefp.h") +endif() + +# ISFINITE +include(CheckCXXSourceCompiles) +check_cxx_source_compiles( + "#include \nint main(){return std::isfinite(0);}" + HAVE_STD_ISFINITE) +include(CheckFunctionExists) +include(CheckCXXSymbolExists) +check_cxx_symbol_exists(isfinite "${TEST_INCLUDES}" HAVE_ISFINITE) +check_cxx_symbol_exists(finite "${TEST_INCLUDES}" HAVE_FINITE) +check_cxx_symbol_exists(_finite "${TEST_INCLUDES}" HAVE__FINITE) +check_cxx_symbol_exists(__finite "${TEST_INCLUDES}" HAVE___FINITE) +if(HAVE_STD_ISFINITE) + set(COIN_C_FINITE "std::isfinite") +elseif(HAVE_ISFINITE) + set(COIN_C_FINITE "isfinite") +elseif(HAVE_FINITE) + set(COIN_C_FINITE "finite") +elseif(HAVE__FINITE) + set(COIN_C_FINITE "_finite") +elseif(HAVE___FINITE) + set(COIN_C_FINITE "__finite") +else() + message(FATAL_ERROR "Can't find isfinite()") +endif() +message(STATUS "Found isfinite: ${COIN_C_FINITE}") + +# ISNAN +include(CheckCXXSourceCompiles) +check_cxx_source_compiles( + "#include \nint main(){return std::isnan(0);}" + HAVE_STD_ISNAN) +include(CheckFunctionExists) +include(CheckCXXSymbolExists) +check_cxx_symbol_exists(isnan "${TEST_INCLUDES}" HAVE_ISNAN) +check_cxx_symbol_exists(_isnan "${TEST_INCLUDES}" HAVE__ISNAN) +check_cxx_symbol_exists(__isnan "${TEST_INCLUDES}" HAVE___ISNAN) +if(HAVE_STD_ISNAN) + set(COIN_C_ISNAN "std::isnan") +elseif(HAVE_ISNAN) + set(COIN_C_ISNAN "isnan") +elseif(HAVE__ISNAN) + set(COIN_C_ISNAN "_isnan") +elseif(HAVE___ISNAN) + set(COIN_C_ISNAN "__isnan") +else() + message(FATAL_ERROR "Can't find isnan()") +endif() +message(STATUS "Found isnan: ${COIN_C_ISNAN}") + +# Basic type +include(CheckTypeSize) +check_type_size("int64_t" SIZEOF_INT64_T) +check_type_size("long long" SIZEOF_LONG_LONG) +check_type_size("long" SIZEOF_LONG) +check_type_size("uint64_t" SIZEOF_UINT64_T) +check_type_size("unsigned long long" SIZEOF_ULONG_LONG) +check_type_size("unsigned long" SIZEOF_ULONG) +check_type_size("intptr_t" SIZEOF_INTPTR_T) +check_type_size("int *" SIZEOF_INT_P) + +if(SIZEOF_INT64_T EQUAL "8") + set(COIN_INT64_T "int64_t") +elseif(SIZEOF_LONG EQUAL "8") + set(COIN_INT64_T "long") +elseif(SIZEOF_LONG_LONG EQUAL "8") + set(COIN_INT64_T "long long") +else() + message(FATAL_ERROR "Can't find suitable int64_t") +endif() +message(STATUS "Found int64_t: ${COIN_INT64_T}") + +if(SIZEOF_UINT64_T EQUAL "8") + set(COIN_UINT64_T "uint64_t") +elseif(SIZEOF_ULONG EQUAL "8") + set(COIN_INT64_T "unsigned long") +elseif(SIZEOF_ULONG_LONG EQUAL "8") + set(COIN_INT64_T "unsigned long long") +else() + message(FATAL_ERROR "Can't find suitable uint64_t") +endif() +message(STATUS "Found uint64_t: ${COIN_UINT64_T}") + +if(SIZEOF_INTPTR_T) + set(COIN_INTPTR_T "intptr_t") +elseif(SIZEOF_INT_P) + set(COIN_INTPTR_T "int *") +else() + message(FATAL_ERROR "Can't find suitable intptr_t") +endif() +message(STATUS "Found intptr_t: ${COIN_INTPTR_T}") + diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 000000000..935d0356b --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,13 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) + +if(@ZLIB_FOUND@) + find_dependency(ZLIB) +endif() + +if(@PTHREADS_FOUND@) + find_dependency(Threads) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") diff --git a/cmake/ParseAc.cmake b/cmake/ParseAc.cmake new file mode 100644 index 000000000..9729aaca3 --- /dev/null +++ b/cmake/ParseAc.cmake @@ -0,0 +1,28 @@ +function(parse_ac VERSION_STRING VERSION_MAJOR VERSION_MINOR VERSION_PATCH) + file(READ "configure.ac" IN) + if(IN MATCHES "AC_INIT\\(.*trunk.*\\)") + message(WARNING "using trunk...") + set(MAJOR 999) + set(MINOR 0) + set(PATCH 0) + else() + # AC_INIT([CoinUtils],[major.minor.patch or trunk],[url or email]) + string(REGEX MATCH + "AC_INIT\\([^,]+,\\[([0-9]+)\\.([0-9]+)(\\.([0-9]+))?\\],[^\\)]+\\)" AC_INIT ${IN}) + message(STATUS "AC_INIT: ${AC_INIT}") + set(MAJOR ${CMAKE_MATCH_1}) + set(MINOR ${CMAKE_MATCH_2}) + if(CMAKE_MATCH_3) + set(PATCH ${CMAKE_MATCH_4}) + else() + set(PATCH 0) + endif() + endif() + set(VERSION "${MAJOR}.${MINOR}.${PATCH}") + + set(${VERSION_MAJOR} ${MAJOR} PARENT_SCOPE) + set(${VERSION_MINOR} ${MINOR} PARENT_SCOPE) + set(${VERSION_PATCH} ${PATCH} PARENT_SCOPE) + set(${VERSION_STRING} ${VERSION} PARENT_SCOPE) + message(STATUS "version: ${VERSION}") +endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..a0aa54934 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,169 @@ +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 + CoinAlloc.cpp + CoinBuild.cpp + CoinDenseVector.cpp + CoinError.cpp + CoinFactorization1.cpp + CoinFactorization2.cpp + CoinFactorization3.cpp + CoinFactorization4.cpp + CoinSimpFactorization.cpp + CoinDenseFactorization.cpp + CoinOslFactorization.cpp + CoinOslFactorization2.cpp + CoinOslFactorization3.cpp + CoinFileIO.cpp + CoinFinite.cpp + CoinIndexedVector.cpp + CoinLpIO.cpp + CoinMessage.cpp + CoinMessageHandler.cpp + CoinModel.cpp + CoinStructuredModel.cpp + CoinModelUseful.cpp + CoinModelUseful2.cpp + CoinMpsIO.cpp + CoinPackedMatrix.cpp + CoinPackedVector.cpp + CoinPackedVectorBase.cpp + CoinParam.cpp + CoinParamUtils.cpp + CoinPostsolveMatrix.cpp + CoinPrePostsolveMatrix.cpp + CoinPresolveDoubleton.cpp + CoinPresolveDual.cpp + CoinPresolveDupcol.cpp + CoinPresolveEmpty.cpp + CoinPresolveFixed.cpp + CoinPresolveForcing.cpp + CoinPresolveHelperFunctions.cpp + CoinPresolveImpliedFree.cpp + CoinPresolveIsolated.cpp + CoinPresolveMatrix.cpp + CoinPresolvePsdebug.cpp + CoinPresolveMonitor.cpp + CoinPresolveSingleton.cpp + CoinPresolveSubst.cpp + CoinPresolveTighten.cpp + CoinPresolveTripleton.cpp + CoinPresolveUseless.cpp + CoinPresolveZeros.cpp + CoinSearchTree.cpp + CoinShallowPackedVector.cpp + CoinSnapshot.cpp + CoinWarmStartBasis.cpp + CoinWarmStartVector.cpp + CoinWarmStartDual.cpp + CoinWarmStartPrimalDual.cpp + CoinRational.cpp) + +set(_HDRS + Coin_C_defines.h + CoinUtilsConfig.h + CoinAlloc.hpp + CoinBuild.hpp + CoinDenseVector.hpp + CoinDistance.hpp + CoinError.hpp + CoinFactorization.hpp + CoinSimpFactorization.hpp + CoinDenseFactorization.hpp + CoinOslFactorization.hpp + CoinFileIO.hpp + CoinFinite.hpp + CoinFloatEqual.hpp + CoinHelperFunctions.hpp + CoinIndexedVector.hpp + CoinLpIO.hpp + CoinMessage.hpp + CoinMessageHandler.hpp + CoinModel.hpp + CoinStructuredModel.hpp + CoinModelUseful.hpp + CoinMpsIO.hpp + CoinPackedMatrix.hpp + CoinPackedVector.hpp + CoinPackedVectorBase.hpp + CoinParam.hpp + CoinPragma.hpp + CoinPresolveDoubleton.hpp + CoinPresolveDual.hpp + CoinPresolveDupcol.hpp + CoinPresolveEmpty.hpp + CoinPresolveFixed.hpp + CoinPresolveForcing.hpp + CoinPresolveImpliedFree.hpp + CoinPresolveIsolated.hpp + CoinPresolveMatrix.hpp + CoinPresolveMonitor.hpp + CoinPresolvePsdebug.hpp + CoinPresolveSingleton.hpp + CoinPresolveSubst.hpp + CoinPresolveTighten.hpp + CoinPresolveTripleton.hpp + CoinPresolveUseless.hpp + CoinPresolveZeros.hpp + CoinSearchTree.hpp + CoinShallowPackedVector.hpp + CoinSignal.hpp + CoinSmartPtr.hpp + CoinSnapshot.hpp + CoinSort.hpp + CoinTime.hpp + CoinTypes.hpp + CoinUtility.hpp + CoinWarmStart.hpp + CoinWarmStartBasis.hpp + CoinWarmStartVector.hpp + CoinWarmStartDual.hpp + CoinWarmStartPrimalDual.hpp + CoinRational.hpp) + +add_library(CoinUtils ${_SRCS} ${_HDRS}) +target_include_directories(CoinUtils PUBLIC + $ + $ + $) +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(ZLIB_FOUND) + 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 +include(GNUInstallDirs) +install(TARGETS CoinUtils + EXPORT ${PROJECT_NAME}Targets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/coin + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in new file mode 100644 index 000000000..bc4fc1255 --- /dev/null +++ b/src/config.h.cmake.in @@ -0,0 +1,127 @@ +/*config.h. Generated by configure_file.*/ + +/* VERSION */ +#define VERSION "${VERSION}" +/* ${NAME}_VERSION */ +#define ${NAME}_VERSION "${VERSION}" +/* ${NAME}_VERSION_MAJOR */ +#define ${NAME}_VERSION_MAJOR ${MAJOR} +/* ${NAME}_VERSION_MINOR */ +#define ${NAME}_VERSION_MINOR ${MINOR} +/* ${NAME}_VERSION_RELEASE */ +#define ${NAME}_VERSION_RELEASE ${PATCH} + +/* HAVE_MATH_H */ +#cmakedefine HAVE_MATH_H ${HAVE_MATH_H} +/* HAVE_CTYPE_H */ +#cmakedefine HAVE_CTYPE_H ${HAVE_CTYPE_H} +/* HAVE_INTTYPES_H */ +#cmakedefine HAVE_INTTYPES_H ${HAVE_INTTYPES_H} +/* HAVE_FLOAT_H */ +#cmakedefine HAVE_FLOAT_H ${HAVE_FLOAT_H} +/* HAVE_IEEEFP_H */ +#cmakedefine HAVE_IEEEFP_H ${HAVE_IEEEFP_H} +/* HAVE_STDARG_H */ +#cmakedefine HAVE_STDARG_H ${HAVE_STDARG_H} +/* HAVE_STDDEF_H */ +#cmakedefine HAVE_STDDEF_H ${HAVE_STDDEF_H} +/* HAVE_STDINT_H */ +#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H} +/* HAVE_STDIO_H */ +#cmakedefine HAVE_STDIO_H ${HAVE_STDIO_H} +/* HAVE_STDLIB_H */ +#cmakedefine HAVE_STDLIB_H ${HAVE_STDLIB_H} +/* HAVE_ASSERT_H */ +#cmakedefine HAVE_ASSERT_H ${HAVE_ASSERT_H} +/* HAVE_DLFCN_H */ +#cmakedefine HAVE_DLFCN_H ${HAVE_DLFCN_H} +/* HAVE_ENDIAN_H */ +#cmakedefine HAVE_ENDIAN_H ${HAVE_ENDIAN_H} +/* HAVE_MEMORY_H */ +#cmakedefine HAVE_MEMORY_H ${HAVE_MEMORY_H} +/* HAVE_STRINGS_H */ +#cmakedefine HAVE_STRINGS_H ${HAVE_STRINGS_H} +/* HAVE_STRING_H */ +#cmakedefine HAVE_STRING_H ${HAVE_STRING_H} +/* HAVE_TIME_H */ +#cmakedefine HAVE_TIME_H ${HAVE_TIME_H} +/* HAVE_UNISTD_H */ +#cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H} +/* HAVE_SYS_STAT_H */ +#cmakedefine HAVE_SYS_STAT_H ${HAVE_SYS_STAT_H} +/* HAVE_SYS_TYPES_H */ +#cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H} + +/* HAVE_CMATH */ +#cmakedefine HAVE_CMATH ${HAVE_CMATH} +/* HAVE_CCTYPE */ +#cmakedefine HAVE_CCTYPE ${HAVE_CCTYPE} +/* HAVE_CINTTYPES */ +#cmakedefine HAVE_CINTTYPES ${HAVE_CINTTYPES} +/* HAVE_CFLOAT */ +#cmakedefine HAVE_CFLOAT ${HAVE_CFLOAT} +/* HAVE_CIEEEFP */ +#cmakedefine HAVE_CIEEEFP ${HAVE_CIEEEFP} +/* HAVE_CSTDARG */ +#cmakedefine HAVE_CSTDARG ${HAVE_CSTDARG} +/* HAVE_CSTDDEF */ +#cmakedefine HAVE_CSTDDEF ${HAVE_CSTDDEF} +/* HAVE_CSTDINT */ +#cmakedefine HAVE_CSTDINT ${HAVE_CSTDINT} +/* HAVE_CSTDIO */ +#cmakedefine HAVE_CSTDIO ${HAVE_CSTDIO} +/* HAVE_CSTDLIB */ +#cmakedefine HAVE_CSTDLIB ${HAVE_CSTDLIB} +/* HAVE_CASSERT */ +#cmakedefine HAVE_CASSERT ${HAVE_CASSERT} +/* HAVE_CSTRING */ +#cmakedefine HAVE_CSTRING ${HAVE_CSTRING} +/* HAVE_CTIME */ +#cmakedefine HAVE_CTIME ${HAVE_CTIME} + +/* STDC_HEADERS */ +#cmakedefine STDC_HEADERS ${STDC_HEADERS} +/* COIN_C_FINITE */ +#cmakedefine COIN_C_FINITE ${COIN_C_FINITE} +/* COIN_C_ISNAN */ +#cmakedefine COIN_C_ISNAN ${COIN_C_ISNAN} +/* COIN_INT64_T */ +#cmakedefine COIN_INT64_T ${COIN_INT64_T} +/* COIN_UINT64_T */ +#cmakedefine COIN_UINT64_T ${COIN_UINT64_T} +/* COIN_INTPTR_T */ +#cmakedefine COIN_INTPTR_T ${COIN_INTPTR_T} + +/* COIN_${NAME}_CHECKLEVEL */ +#define COIN_${NAME}_CHECKLEVEL ${COIN_${NAME}_CHECKLEVEL} +/* COIN_${NAME}_VERBOSITY */ +#define COIN_${NAME}_VERBOSITY ${COIN_${NAME}_VERBOSITY} + +/* ${NAME}_HAS_CSTDINT */ +#ifdef HAVE_CSTDINT +#define ${NAME}_HAS_CSTDINT 1 +#endif + +/* ${NAME}_PTHREADS */ +#cmakedefine COINUTILS_PTHREADS ${COINUTILS_PTHREADS} +/* ${NAME}_MEMPOOL_MAXPOOLED */ +#define ${NAME}_MEMPOOL_MAXPOOLED -1 + +/* HAVE_ZLIB_H */ +#cmakedefine HAVE_ZLIB_H ${HAVE_ZLIB_H} +/* COIN_HAS_ZLIB */ +#cmakedefine COIN_HAS_ZLIB ${COIN_HAS_ZLIB} + +/* PACKAGE */ +#cmakedefine PACKAGE +/* PACKAGE_NAME */ +#cmakedefine PACKAGE_NAME +/* PACKAGE_VERSION */ +#cmakedefine PACKAGE_VERSION +/* PACKAGE_STRING */ +#cmakedefine PACKAGE_STRING +/* PACKAGE_TARNAME */ +#cmakedefine PACKAGE_TARNAME +/* PACKAGE_BUGREPORT */ +#cmakedefine PACKAGE_BUGREPORT + diff --git a/src/config_coinutils.h.cmake.in b/src/config_coinutils.h.cmake.in new file mode 100644 index 000000000..0d85fd71f --- /dev/null +++ b/src/config_coinutils.h.cmake.in @@ -0,0 +1,22 @@ +#ifndef __CONFIG_${NAME}_H__ +#define __CONFIG_${NAME}_H__ + +#define ${NAME}_HAS_CSTDINT 1 + +/* ${NAME}_VERSION */ +#define ${NAME}_VERSION "${VERSION}" +/* ${NAME}_VERSION_MAJOR */ +#define ${NAME}_VERSION_MAJOR ${MAJOR} +/* ${NAME}_VERSION_MINOR */ +#define ${NAME}_VERSION_MINOR ${MINOR} +/* ${NAME}_VERSION_RELEASE */ +#define ${NAME}_VERSION_RELEASE ${PATCH} + +/* COIN_INT64_T */ +#cmakedefine COIN_INT64_T ${COIN_INT64_T} +/* COIN_UINT64_T */ +#cmakedefine COIN_UINT64_T ${COIN_UINT64_T} +/* COIN_INTPTR_T */ +#cmakedefine COIN_INTPTR_T ${COIN_INTPTR_T} + +#endif From 2ce50acfdc8a8e97ee6c92bbc108265f2b9cdb15 Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Thu, 28 Mar 2019 14:20:06 +0100 Subject: [PATCH 2/6] Add CMake ci --- .ci/Makefile | 179 ++++++++++++++++++++++++++++++++ .ci/docker/alpine/Dockerfile | 30 ++++++ .ci/docker/archlinux/Dockerfile | 30 ++++++ .ci/docker/centos/Dockerfile | 36 +++++++ .ci/docker/debian/Dockerfile | 33 ++++++ .ci/docker/fedora/Dockerfile | 33 ++++++ .ci/docker/opensuse/Dockerfile | 34 ++++++ .ci/docker/ubuntu/Dockerfile | 33 ++++++ .ci/sample/CMakeLists.txt | 22 ++++ .ci/sample/main.cpp | 8 ++ .dockerignore | 21 ++++ 11 files changed, 459 insertions(+) create mode 100644 .ci/Makefile create mode 100644 .ci/docker/alpine/Dockerfile create mode 100644 .ci/docker/archlinux/Dockerfile create mode 100644 .ci/docker/centos/Dockerfile create mode 100644 .ci/docker/debian/Dockerfile create mode 100644 .ci/docker/fedora/Dockerfile create mode 100644 .ci/docker/opensuse/Dockerfile create mode 100644 .ci/docker/ubuntu/Dockerfile create mode 100644 .ci/sample/CMakeLists.txt create mode 100644 .ci/sample/main.cpp create mode 100644 .dockerignore diff --git a/.ci/Makefile b/.ci/Makefile new file mode 100644 index 000000000..f2021fab4 --- /dev/null +++ b/.ci/Makefile @@ -0,0 +1,179 @@ +PROJECT := coinutils +BRANCH := $(shell git rev-parse --abbrev-ref HEAD) +SHA1 := $(shell git rev-parse --verify HEAD) + +# General commands +.PHONY: help +BOLD=\e[1m +RESET=\e[0m + +help: + @echo -e "${BOLD}SYNOPSIS${RESET}" + @echo -e "\tmake [NOCACHE=1]" + @echo + @echo -e "${BOLD}DESCRIPTION${RESET}" + @echo -e "\ttest build inside docker container to have a reproductible build." + @echo + @echo -e "${BOLD}MAKE TARGETS${RESET}" + @echo -e "\t${BOLD}help${RESET}: display this help and exit." + @echo + @echo -e "\t${BOLD}env${RESET}: build a virtual env image." + @echo -e "\t${BOLD}sh_env_${RESET}: run a container using the virtual env image (debug purpose)." + @echo + @echo -e "\t${BOLD}devel${RESET}: build the library using all devel images." + @echo -e "\t${BOLD}devel_${RESET}: build the library using a specific devel image." + @echo -e "\t${BOLD}test_${RESET}: auto test using the devel image." + @echo -e "\t${BOLD}sh_${RESET}: run a container using the devel image (debug purpose)." + @echo + @echo -e "\t${BOLD}install${RESET}: execute the cmake target ${BOLD}install${RESET} using all devel image container, then create an install image with it." + @echo -e "\t${BOLD}install_${RESET}: execute the cmake target ${BOLD}install${RESET} using the devel image container specified, then create an install image with it." + @echo -e "\t${BOLD}test_install${RESET}: configure, build, install then test a sample project against it using all ${BOLD}install${RESET} image containers." + @echo -e "\t${BOLD}test_install_${RESET}: configure, build, install then test a sample project against it using the ${BOLD}install${RESET} image container specified." + @echo -e "\t${BOLD}sh_install_${RESET}: run a container using the install image (debug purpose)." + @echo + @echo -e "\t${BOLD}clean${RESET}: Remove cache and docker image." + @echo -e "\t${BOLD}clean_${RESET}: Remove cache and docker image for the specified distro." + @echo + @echo -e "\t${BOLD}${RESET}:" + @echo -e "\t\t${BOLD}alpine${RESET} (latest)" + @echo -e "\t\t${BOLD}archlinux${RESET} (latest)" + @echo -e "\t\t${BOLD}centos${RESET} (latest)" + @echo -e "\t\t${BOLD}fedora${RESET} (latest)" + @echo -e "\t\t${BOLD}opensuse${RESET} (tumbleweed)" + @echo -e "\t\t${BOLD}debian${RESET} (latest)" + @echo -e "\t\t${BOLD}ubuntu${RESET} (latest)" + @echo -e "\te.g. 'make test_ubuntu'" + @echo + @echo -e "\t${BOLD}NOCACHE=1${RESET}: use 'docker build --no-cache' when building container (default use cache)." + @echo + @echo -e "branch: $(BRANCH)" + @echo -e "sha1: $(SHA1)" + +# Need to add cmd_distro to PHONY otherwise target are ignored since they do not +# contain recipe (using FORCE do not work here) +.PHONY: all +all: devel + +# Delete all implicit rules to speed up makefile +MAKEFLAGS += --no-builtin-rules +.SUFFIXES: +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = +# Keep all intermediate files +# ToDo: try to remove it later +.SECONDARY: + +# Docker image name prefix. +IMAGE := ${PROJECT} + +ifdef NOCACHE +DOCKER_BUILD_CMD := docker build --no-cache +else +DOCKER_BUILD_CMD := docker build +endif + +DOCKER_RUN_CMD := docker run --rm --init --net=host + +# Currently supported distro +DISTROS = alpine archlinux centos fedora opensuse debian ubuntu + +# $* stem +# $< first prerequist +# $@ target name + +# ENV +targets = $(addprefix env_, $(DISTROS)) +.PHONY: env $(targets) +env: $(targets) +$(targets): env_%: cache/%/docker_env.tar +cache/%/docker_env.tar: docker/%/Dockerfile + @docker image rm -f ${IMAGE}_$*:env 2>/dev/null + ${DOCKER_BUILD_CMD} --target=env --tag ${IMAGE}_$*:env -f $< docker/$* + @rm -f $@ + mkdir -p cache/$* + docker save ${IMAGE}_$*:env -o $@ + +# Run a container using the env image. +targets = $(addprefix sh_env_, $(DISTROS)) +.PHONY: $(targets) +$(targets): sh_env_%: cache/%/docker_env.tar + ${DOCKER_RUN_CMD} -it --name ${IMAGE}_$* ${IMAGE}_$*:env /bin/sh + +# DEVEL +targets = $(addprefix devel_, $(DISTROS)) +.PHONY: devel $(targets) +devel: $(targets) +$(targets): devel_%: cache/%/docker_devel.tar +cache/%/docker_devel.tar: docker/%/Dockerfile \ + ../CMakeLists.txt ../cmake \ + ../src + @docker image rm -f ${IMAGE}_$*:devel 2>/dev/null + ${DOCKER_BUILD_CMD} --target=devel --tag ${IMAGE}_$*:devel -f $< .. + @rm -f $@ + mkdir -p cache/$* + docker save ${IMAGE}_$*:devel -o $@ + +# DOCKER BASH INSTALL (debug) +targets = $(addprefix sh_devel_, $(DISTROS)) +.PHONY: $(targets) +$(targets): sh_devel_%: cache/%/docker_devel.tar + ${DOCKER_RUN_CMD} -it --name ${IMAGE}_$* ${IMAGE}_$*:devel /bin/sh + +# TEST DEVEL +targets = $(addprefix test_, $(DISTROS)) +.PHONY: test $(targets) +test: $(targets) +$(targets): test_%: cache/%/docker_devel.tar + ${DOCKER_RUN_CMD} -t --name ${IMAGE}_$* ${IMAGE}_$*:devel cmake --build build --target test + +# INSTALL +targets = $(addprefix install_, $(DISTROS)) +.PHONY: install $(targets) +install: $(targets) +$(targets): install_%: cache/%/docker_install.tar +cache/%/docker_install.tar: docker/%/Dockerfile \ + sample + @docker image rm -f ${IMAGE}_$*:install 2>/dev/null + ${DOCKER_BUILD_CMD} --target=install --tag ${IMAGE}_$*:install -f $< .. + @rm -f $@ + mkdir -p cache/$* + docker save ${IMAGE}_$*:install -o $@ + +# DOCKER BASH INSTALL (debug) +targets = $(addprefix sh_install_, $(DISTROS)) +.PHONY: $(targets) +$(targets): sh_install_%: cache/%/docker_install.tar + ${DOCKER_RUN_CMD} -it --name ${IMAGE}_$* ${IMAGE}_$*:install /bin/sh + +# TEST INSTALL +targets = $(addprefix test_install_, $(DISTROS)) +.PHONY: test_install $(targets) +test_install: $(targets) +$(targets): test_install_%: cache/%/docker_install.tar sample + @docker load -i cache/$*/docker_install.tar + ${DOCKER_RUN_CMD} -t --name ${IMAGE}_$* ${IMAGE}_$*:install /bin/sh -c \ + "cmake -H. -Bbuild; \ + cmake --build build --target all; \ + cmake --build build --target test; \ + cmake --build build --target install" + +# CLEAN +targets = $(addprefix clean_, $(DISTROS)) +.PHONY: clean $(targets) +clean: $(targets) + -rmdir cache +$(targets): clean_%: + docker container prune -f + docker image prune -f + -docker image rm -f ${IMAGE}_$*:install 2>/dev/null + -docker image rm -f ${IMAGE}_$*:devel 2>/dev/null + -docker image rm -f ${IMAGE}_$*:env 2>/dev/null + -rm -f cache/$*/docker_install.tar + -rm -f cache/$*/docker_devel.tar + -rm -f cache/$*/docker_env.tar + -rmdir cache/$* + +.PHONY: distclean +distclean: clean + -docker container rm -f $$(docker container ls -aq) + -docker image rm -f $$(docker image ls -aq) diff --git a/.ci/docker/alpine/Dockerfile b/.ci/docker/alpine/Dockerfile new file mode 100644 index 000000000..c58de1b3c --- /dev/null +++ b/.ci/docker/alpine/Dockerfile @@ -0,0 +1,30 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/alpine +FROM alpine:edge AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN apk add --no-cache git build-base linux-headers cmake + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all -v +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/archlinux/Dockerfile b/.ci/docker/archlinux/Dockerfile new file mode 100644 index 000000000..d5364eea9 --- /dev/null +++ b/.ci/docker/archlinux/Dockerfile @@ -0,0 +1,30 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/archlinux/ +FROM archlinux/base AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN pacman -Syu --noconfirm base-devel git cmake + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all -v +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/centos/Dockerfile b/.ci/docker/centos/Dockerfile new file mode 100644 index 000000000..ad88b2030 --- /dev/null +++ b/.ci/docker/centos/Dockerfile @@ -0,0 +1,36 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/centos +FROM centos:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN yum -y update \ +&& yum -y groupinstall "Development Tools" \ +&& yum -y install epel-release \ +&& yum -y install cmake3 \ +&& ln -s /usr/bin/cmake3 /usr/local/bin/cmake \ +&& yum clean all \ +&& rm -rf /var/cache/yum + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -H. -Bbuild +# CMake build +RUN cmake --build build --target all +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/debian/Dockerfile b/.ci/docker/debian/Dockerfile new file mode 100644 index 000000000..556d06a6a --- /dev/null +++ b/.ci/docker/debian/Dockerfile @@ -0,0 +1,33 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/debian +FROM debian:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN apt-get update -q && \ +apt-get install -yq git build-essential cmake && \ +apt-get clean && \ +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/fedora/Dockerfile b/.ci/docker/fedora/Dockerfile new file mode 100644 index 000000000..a87ed945d --- /dev/null +++ b/.ci/docker/fedora/Dockerfile @@ -0,0 +1,33 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/fedora +FROM fedora:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN dnf -y update \ +&& dnf -y groupinstall "Development Tools" \ +&& dnf -y install cmake gcc-c++ \ +&& dnf clean all + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all -v +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/opensuse/Dockerfile b/.ci/docker/opensuse/Dockerfile new file mode 100644 index 000000000..1f6127d69 --- /dev/null +++ b/.ci/docker/opensuse/Dockerfile @@ -0,0 +1,34 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/r/opensuse/tumbleweed +FROM opensuse/tumbleweed AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN zypper up -y \ +&& zypper install -y gcc gcc-c++ cmake git \ +&& zypper clean -a + +ENV CC=gcc CXX=g++ + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -S. -Bbuild +# CMake build +RUN cmake --build build --target all -v +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/docker/ubuntu/Dockerfile b/.ci/docker/ubuntu/Dockerfile new file mode 100644 index 000000000..6fc74c5a6 --- /dev/null +++ b/.ci/docker/ubuntu/Dockerfile @@ -0,0 +1,33 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/ubuntu +FROM ubuntu:latest AS env +LABEL maintainer="corentinl@google.com" +# Install system build dependencies +ENV PATH=$PATH:/usr/local/bin +RUN apt-get update -q && \ +apt-get install -yq git build-essential cmake && \ +apt-get clean && \ +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +CMD [ "/bin/sh" ] + +# Add the library src to our build env +FROM env AS devel +# Create lib directory +WORKDIR /home/lib +# Bundle lib source +COPY . . +# CMake configure +RUN cmake -H. -Bbuild +# CMake build +RUN cmake --build build --target all +# CMake build +RUN cmake --build build --target install + +# Create an install image +FROM env AS install +# Copy lib from devel to prod +COPY --from=devel /usr/local /usr/local/ +# Copy sample +WORKDIR /home/sample +COPY .ci/sample . diff --git a/.ci/sample/CMakeLists.txt b/.ci/sample/CMakeLists.txt new file mode 100644 index 000000000..2531c98f7 --- /dev/null +++ b/.ci/sample/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.5) +project(Sample VERSION 1.0.0 LANGUAGES CXX) + +include(CTest) +find_package(CoinUtils REQUIRED) + +add_executable(sample main.cpp) +#target_compile_features(sample PUBLIC cxx_std_11) +set_target_properties(sample PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + VERSION ${PROJECT_VERSION}) +target_link_libraries(sample PRIVATE Coin::CoinUtils) + +if(BUILD_TESTING) + add_test(NAME sample_UT COMMAND sample) +endif() + +include(GNUInstallDirs) +install(TARGETS sample + EXPORT SampleTargets + DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/.ci/sample/main.cpp b/.ci/sample/main.cpp new file mode 100644 index 000000000..295884931 --- /dev/null +++ b/.ci/sample/main.cpp @@ -0,0 +1,8 @@ +#include +#include + +int main(int argc, char** argv) { + std::cout << "version: " << COINUTILS_VERSION << std::endl; + return 0; +} + diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..64ca80501 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,21 @@ +# Project Files unneeded by docker +.ci/cache +.ci/docker +.git +.gitignore +.github +.dockerignore +.travis.yml +.clang-format +AUTHORS +INSTALL +install-sh +missing +README +README.md + +build/ + +# Editor directories and files +*.user +*.swp From 2f6dfe70e42b9d9f4ee268e164c335503c9500bf Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Wed, 5 Feb 2020 12:01:27 +0100 Subject: [PATCH 3/6] Update travis --- .travis.yml | 71 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 13c140a4e..b8dfe1e8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,41 +1,82 @@ -language: cpp matrix: include: - - os: linux + - language: cpp + os: linux addons: apt: packages: - gfortran - liblapack-dev - - os: linux + - language: cpp + os: linux dist: bionic addons: apt: packages: - gfortran - liblapack-dev - - os: osx + - language: cpp + os: osx osx_image: xcode11 - env: OSX=10.14 CC=gcc CXX=g++ + env: OSX=10.14 CC=gcc CXX=g++ compiler: clang - - os: osx + - language: cpp + os: osx osx_image: xcode11 - env: OSX=10.14 + env: OSX=10.14 compiler: clang - - os: osx + - language: cpp + os: osx osx_image: xcode10 - env: OSX=10.13 + env: OSX=10.13 compiler: clang + - language: minimal + dist: bionic + env: DISTRO=alpine + - language: minimal + dist: bionic + env: DISTRO=archlinux + - language: minimal + dist: bionic + env: DISTRO=centos + - language: minimal + dist: bionic + env: DISTRO=debian + - language: minimal + dist: bionic + env: DISTRO=fedora + - language: minimal + dist: bionic + env: DISTRO=opensuse + - language: minimal + dist: bionic + env: DISTRO=ubuntu + + allow_failures: + - language: cpp + os: osx + +install: true + before_script: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; brew install bash gcc; clang --version; gfortran --version; fi - if [[ "$TRAVIS_OS_NAME $CC" == "osx gcc" ]]; then export CC=gcc-9 ; export CXX=g++-9 ; $CC --version; $CXX --version; fi - - cd .. - - wget https://raw.githubusercontent.com/coin-or/coinbrew/master/coinbrew - - export PROJECT_URL=https://github.com/$TRAVIS_REPO_SLUG - - export PROJECT=`echo $TRAVIS_REPO_SLUG | cut -d "/" -f 2` - - bash ./coinbrew fetch $PROJECT_URL:$TRAVIS_BRANCH --no-prompt --skip-update > /dev/null + - if [[ -z "$DISTRO" ]]; then cd ..; fi + - if [[ -z "$DISTRO" ]]; then wget https://raw.githubusercontent.com/coin-or/coinbrew/master/coinbrew; fi + - if [[ -z "$DISTRO" ]]; then export PROJECT_URL=https://github.com/$TRAVIS_REPO_SLUG; fi + - if [[ -z "$DISTRO" ]]; then export PROJECT=`echo $TRAVIS_REPO_SLUG | cut -d "/" -f 2`; fi + - if [[ -z "$DISTRO" ]]; then bash ./coinbrew fetch $PROJECT_URL:$TRAVIS_BRANCH --no-prompt --skip-update > /dev/null; fi script: - - bash ./coinbrew build $PROJECT --no-prompt --verbosity=2 --test + - if [[ -z "$DISTRO" ]]; then bash ./coinbrew build $PROJECT --no-prompt --verbosity=2 --test; fi + + - > + if [[ ! -z "$DISTRO" ]]; then ( + cd .ci && + make env_${DISTRO} && + make devel_${DISTRO} && + make install_${DISTRO} && + make test_install_${DISTRO} || + travis_terminate 1 ); fi From fb8655cab4faa977241d74cbdcc5d424ec1321fd Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Wed, 5 Feb 2020 17:50:31 +0100 Subject: [PATCH 4/6] Fixup alpine CI missing libexecinfo-dev --- .ci/docker/alpine/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/docker/alpine/Dockerfile b/.ci/docker/alpine/Dockerfile index c58de1b3c..433494243 100644 --- a/.ci/docker/alpine/Dockerfile +++ b/.ci/docker/alpine/Dockerfile @@ -4,7 +4,7 @@ FROM alpine:edge AS env LABEL maintainer="corentinl@google.com" # Install system build dependencies ENV PATH=$PATH:/usr/local/bin -RUN apk add --no-cache git build-base linux-headers cmake +RUN apk add --no-cache git build-base linux-headers libexecinfo-dev cmake CMD [ "/bin/sh" ] From bd8ba4166722e1443623f51f304c388bcaa011ae Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Wed, 5 Feb 2020 17:50:41 +0100 Subject: [PATCH 5/6] CMake: add missing file --- src/CMakeLists.txt | 64 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a0aa54934..503d3b560 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,19 +13,19 @@ configure_file(config.h.cmake.in config.h) configure_file(config_coinutils.h.cmake.in config_coinutils.h) set(_SRCS + CoinAdjacencyVector.cpp CoinAlloc.cpp CoinBuild.cpp + CoinCliqueList.cpp + CoinConflictGraph.cpp + CoinDenseFactorization.cpp CoinDenseVector.cpp + CoinDynamicConflictGraph.cpp CoinError.cpp CoinFactorization1.cpp CoinFactorization2.cpp CoinFactorization3.cpp CoinFactorization4.cpp - CoinSimpFactorization.cpp - CoinDenseFactorization.cpp - CoinOslFactorization.cpp - CoinOslFactorization2.cpp - CoinOslFactorization3.cpp CoinFileIO.cpp CoinFinite.cpp CoinIndexedVector.cpp @@ -33,10 +33,13 @@ set(_SRCS CoinMessage.cpp CoinMessageHandler.cpp CoinModel.cpp - CoinStructuredModel.cpp CoinModelUseful.cpp CoinModelUseful2.cpp CoinMpsIO.cpp + CoinOslC.h + CoinOslFactorization.cpp + CoinOslFactorization2.cpp + CoinOslFactorization3.cpp CoinPackedMatrix.cpp CoinPackedVector.cpp CoinPackedVectorBase.cpp @@ -54,35 +57,47 @@ set(_SRCS CoinPresolveImpliedFree.cpp CoinPresolveIsolated.cpp CoinPresolveMatrix.cpp - CoinPresolvePsdebug.cpp CoinPresolveMonitor.cpp + CoinPresolvePsdebug.cpp CoinPresolveSingleton.cpp CoinPresolveSubst.cpp CoinPresolveTighten.cpp CoinPresolveTripleton.cpp CoinPresolveUseless.cpp CoinPresolveZeros.cpp + CoinRational.cpp CoinSearchTree.cpp CoinShallowPackedVector.cpp + CoinSimpFactorization.cpp CoinSnapshot.cpp + CoinStructuredModel.cpp CoinWarmStartBasis.cpp - CoinWarmStartVector.cpp CoinWarmStartDual.cpp CoinWarmStartPrimalDual.cpp - CoinRational.cpp) + CoinWarmStartVector.cpp + bron_kerbosch.cpp + cgraph.cpp + clique.cpp + clique_extender.cpp + clique_separation.cpp + cut.cpp + node_heap.cpp + str_utils.cpp + vint_set.cpp + ) set(_HDRS - Coin_C_defines.h - CoinUtilsConfig.h + CoinAdjacencyVector.hpp CoinAlloc.hpp CoinBuild.hpp + CoinCliqueList.hpp + CoinConflictGraph.hpp + CoinDenseFactorization.hpp CoinDenseVector.hpp CoinDistance.hpp + CoinDynamicConflictGraph.hpp CoinError.hpp CoinFactorization.hpp - CoinSimpFactorization.hpp - CoinDenseFactorization.hpp - CoinOslFactorization.hpp CoinFileIO.hpp CoinFinite.hpp CoinFloatEqual.hpp @@ -92,9 +107,9 @@ set(_HDRS CoinMessage.hpp CoinMessageHandler.hpp CoinModel.hpp - CoinStructuredModel.hpp CoinModelUseful.hpp CoinMpsIO.hpp + CoinOslFactorization.hpp CoinPackedMatrix.hpp CoinPackedVector.hpp CoinPackedVectorBase.hpp @@ -117,21 +132,36 @@ set(_HDRS CoinPresolveTripleton.hpp CoinPresolveUseless.hpp CoinPresolveZeros.hpp + CoinRational.hpp CoinSearchTree.hpp CoinShallowPackedVector.hpp CoinSignal.hpp + CoinSimpFactorization.hpp CoinSmartPtr.hpp CoinSnapshot.hpp CoinSort.hpp + CoinStaticConflictGraph.hpp + CoinStructuredModel.hpp CoinTime.hpp CoinTypes.hpp CoinUtility.hpp + CoinUtilsConfig.h CoinWarmStart.hpp CoinWarmStartBasis.hpp - CoinWarmStartVector.hpp CoinWarmStartDual.hpp CoinWarmStartPrimalDual.hpp - CoinRational.hpp) + CoinWarmStartVector.hpp + Coin_C_defines.h + bron_kerbosch.h + cgraph.h + clique.h + clique_extender.h + clique_separation.h + cut.h + node_heap.h + str_utils.h + vint_set.h + ) add_library(CoinUtils ${_SRCS} ${_HDRS}) target_include_directories(CoinUtils PUBLIC From d92accd9a2aa4cffe84e8f9a5a71eea06fb1ba87 Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Thu, 6 Feb 2020 08:56:27 +0100 Subject: [PATCH 6/6] Update config*.h.cmake.in --- cmake/CheckEnv.cmake | 12 ++-- src/config.h.cmake.in | 116 ++++++++++++++++++-------------- src/config_coinutils.h.cmake.in | 16 +++++ 3 files changed, 89 insertions(+), 55 deletions(-) diff --git a/cmake/CheckEnv.cmake b/cmake/CheckEnv.cmake index b24770250..7a5690433 100644 --- a/cmake/CheckEnv.cmake +++ b/cmake/CheckEnv.cmake @@ -1,10 +1,10 @@ # Flags include (CheckIncludeFile) +check_include_file(float.h HAVE_FLOAT_H) +check_include_file(ieeefp.h HAVE_IEEEFP_H) check_include_file(math.h HAVE_MATH_H) check_include_file(ctype.h HAVE_CTYPE_H) check_include_file(inttypes.h HAVE_INTTYPES_H) -check_include_file(float.h HAVE_FLOAT_H) -check_include_file(ieeefp.h HAVE_IEEEFP_H) check_include_file(stdarg.h HAVE_STDARG_H) check_include_file(stddef.h HAVE_STDDEF_H) check_include_file(stdint.h HAVE_STDINT_H) @@ -17,19 +17,19 @@ check_include_file(memory.h HAVE_MEMORY_H) check_include_file(strings.h HAVE_STRINGS_H) check_include_file(string.h HAVE_STRING_H) check_include_file(time.h HAVE_TIME_H) -check_include_file(unistd.h HAVE_UNISTD_H) check_include_file(sys/stat.h HAVE_SYS_STAT_H) check_include_file(sys/types.h HAVE_SYS_TYPES_H) +check_include_file(unistd.h HAVE_UNISTD_H) include (CheckIncludeFileCXX) +check_include_file_cxx(cfloat HAVE_CFLOAT) +check_include_file_cxx(cieeefp HAVE_CIEEEFP) check_include_file_cxx(cmath HAVE_CMATH) +check_include_file_cxx(cstdint HAVE_CSTDINT) check_include_file_cxx(cctype HAVE_CCTYPE) check_include_file_cxx(cinttypes HAVE_CINTTYPES) -check_include_file_cxx(cfloat HAVE_CFLOAT) -check_include_file_cxx(cieeefp HAVE_CIEEEFP) check_include_file_cxx(cstdarg HAVE_CSTDARG) check_include_file_cxx(cstddef HAVE_CSTDDEF) -check_include_file_cxx(cstdint HAVE_CSTDINT) check_include_file_cxx(cstdio HAVE_CSTDIO) check_include_file_cxx(cstdlib HAVE_CSTDLIB) check_include_file_cxx(cassert HAVE_CASSERT) diff --git a/src/config.h.cmake.in b/src/config.h.cmake.in index bc4fc1255..aa9ab19c0 100644 --- a/src/config.h.cmake.in +++ b/src/config.h.cmake.in @@ -1,32 +1,83 @@ /*config.h. Generated by configure_file.*/ -/* VERSION */ -#define VERSION "${VERSION}" +/* Library Visibility Attribute */ +#define ${NAME}LIB_EXPORT + +/* Define to 1 if CoinUtils uses C++11 */ +#define ${NAME}_CPLUSPLUS11 1 + +/* HAVE_CSTDINT */ +#cmakedefine HAVE_CSTDINT ${HAVE_CSTDINT} +/* ${NAME}_HAS_CSTDINT */ +#ifdef HAVE_CSTDINT +#define ${NAME}_HAS_CSTDINT 1 +#endif + +/* HAVE_STDINT_H */ +#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H} +/* ${NAME}_HAS_STDINT_H */ +#ifdef HAVE_STDINT_H +#define ${NAME}_HAS_STDINT_H 1 +#endif + +/* ${NAME}_MEMPOOL_MAXPOOLED */ +#define ${NAME}_MEMPOOL_MAXPOOLED -1 + +/* ${NAME}_PTHREADS */ +#cmakedefine COINUTILS_PTHREADS ${COINUTILS_PTHREADS} + /* ${NAME}_VERSION */ #define ${NAME}_VERSION "${VERSION}" + /* ${NAME}_VERSION_MAJOR */ #define ${NAME}_VERSION_MAJOR ${MAJOR} + /* ${NAME}_VERSION_MINOR */ #define ${NAME}_VERSION_MINOR ${MINOR} + /* ${NAME}_VERSION_RELEASE */ #define ${NAME}_VERSION_RELEASE ${PATCH} +/* COIN_${NAME}_CHECKLEVEL */ +#define COIN_${NAME}_CHECKLEVEL ${COIN_${NAME}_CHECKLEVEL} + +/* COIN_${NAME}_VERBOSITY */ +#define COIN_${NAME}_VERBOSITY ${COIN_${NAME}_VERBOSITY} + +/* COIN_C_FINITE */ +#cmakedefine COIN_C_FINITE ${COIN_C_FINITE} + +/* COIN_C_ISNAN */ +#cmakedefine COIN_C_ISNAN ${COIN_C_ISNAN} + +/* HAVE_ZLIB_H */ +#cmakedefine HAVE_ZLIB_H ${HAVE_ZLIB_H} +/* COIN_HAS_ZLIB */ +#cmakedefine COIN_HAS_ZLIB ${COIN_HAS_ZLIB} + +/* COIN_INT64_T */ +#cmakedefine COIN_INT64_T ${COIN_INT64_T} + +/* COIN_UINT64_T */ +#cmakedefine COIN_UINT64_T ${COIN_UINT64_T} + +/* COIN_INTPTR_T */ +#cmakedefine COIN_INTPTR_T ${COIN_INTPTR_T} + +/* HAVE_FLOAT_H */ +#cmakedefine HAVE_FLOAT_H ${HAVE_FLOAT_H} +/* HAVE_IEEEFP_H */ +#cmakedefine HAVE_IEEEFP_H ${HAVE_IEEEFP_H} /* HAVE_MATH_H */ #cmakedefine HAVE_MATH_H ${HAVE_MATH_H} /* HAVE_CTYPE_H */ #cmakedefine HAVE_CTYPE_H ${HAVE_CTYPE_H} /* HAVE_INTTYPES_H */ #cmakedefine HAVE_INTTYPES_H ${HAVE_INTTYPES_H} -/* HAVE_FLOAT_H */ -#cmakedefine HAVE_FLOAT_H ${HAVE_FLOAT_H} -/* HAVE_IEEEFP_H */ -#cmakedefine HAVE_IEEEFP_H ${HAVE_IEEEFP_H} /* HAVE_STDARG_H */ #cmakedefine HAVE_STDARG_H ${HAVE_STDARG_H} /* HAVE_STDDEF_H */ #cmakedefine HAVE_STDDEF_H ${HAVE_STDDEF_H} -/* HAVE_STDINT_H */ -#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H} /* HAVE_STDIO_H */ #cmakedefine HAVE_STDIO_H ${HAVE_STDIO_H} /* HAVE_STDLIB_H */ @@ -45,29 +96,27 @@ #cmakedefine HAVE_STRING_H ${HAVE_STRING_H} /* HAVE_TIME_H */ #cmakedefine HAVE_TIME_H ${HAVE_TIME_H} -/* HAVE_UNISTD_H */ -#cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H} /* HAVE_SYS_STAT_H */ #cmakedefine HAVE_SYS_STAT_H ${HAVE_SYS_STAT_H} /* HAVE_SYS_TYPES_H */ #cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H} +/* HAVE_UNISTD_H */ +#cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H} +/* HAVE_CFLOAT */ +#cmakedefine HAVE_CFLOAT ${HAVE_CFLOAT} +/* HAVE_CIEEEFP */ +#cmakedefine HAVE_CIEEEFP ${HAVE_CIEEEFP} /* HAVE_CMATH */ #cmakedefine HAVE_CMATH ${HAVE_CMATH} /* HAVE_CCTYPE */ #cmakedefine HAVE_CCTYPE ${HAVE_CCTYPE} /* HAVE_CINTTYPES */ #cmakedefine HAVE_CINTTYPES ${HAVE_CINTTYPES} -/* HAVE_CFLOAT */ -#cmakedefine HAVE_CFLOAT ${HAVE_CFLOAT} -/* HAVE_CIEEEFP */ -#cmakedefine HAVE_CIEEEFP ${HAVE_CIEEEFP} /* HAVE_CSTDARG */ #cmakedefine HAVE_CSTDARG ${HAVE_CSTDARG} /* HAVE_CSTDDEF */ #cmakedefine HAVE_CSTDDEF ${HAVE_CSTDDEF} -/* HAVE_CSTDINT */ -#cmakedefine HAVE_CSTDINT ${HAVE_CSTDINT} /* HAVE_CSTDIO */ #cmakedefine HAVE_CSTDIO ${HAVE_CSTDIO} /* HAVE_CSTDLIB */ @@ -79,39 +128,6 @@ /* HAVE_CTIME */ #cmakedefine HAVE_CTIME ${HAVE_CTIME} -/* STDC_HEADERS */ -#cmakedefine STDC_HEADERS ${STDC_HEADERS} -/* COIN_C_FINITE */ -#cmakedefine COIN_C_FINITE ${COIN_C_FINITE} -/* COIN_C_ISNAN */ -#cmakedefine COIN_C_ISNAN ${COIN_C_ISNAN} -/* COIN_INT64_T */ -#cmakedefine COIN_INT64_T ${COIN_INT64_T} -/* COIN_UINT64_T */ -#cmakedefine COIN_UINT64_T ${COIN_UINT64_T} -/* COIN_INTPTR_T */ -#cmakedefine COIN_INTPTR_T ${COIN_INTPTR_T} - -/* COIN_${NAME}_CHECKLEVEL */ -#define COIN_${NAME}_CHECKLEVEL ${COIN_${NAME}_CHECKLEVEL} -/* COIN_${NAME}_VERBOSITY */ -#define COIN_${NAME}_VERBOSITY ${COIN_${NAME}_VERBOSITY} - -/* ${NAME}_HAS_CSTDINT */ -#ifdef HAVE_CSTDINT -#define ${NAME}_HAS_CSTDINT 1 -#endif - -/* ${NAME}_PTHREADS */ -#cmakedefine COINUTILS_PTHREADS ${COINUTILS_PTHREADS} -/* ${NAME}_MEMPOOL_MAXPOOLED */ -#define ${NAME}_MEMPOOL_MAXPOOLED -1 - -/* HAVE_ZLIB_H */ -#cmakedefine HAVE_ZLIB_H ${HAVE_ZLIB_H} -/* COIN_HAS_ZLIB */ -#cmakedefine COIN_HAS_ZLIB ${COIN_HAS_ZLIB} - /* PACKAGE */ #cmakedefine PACKAGE /* PACKAGE_NAME */ @@ -125,3 +141,5 @@ /* PACKAGE_BUGREPORT */ #cmakedefine PACKAGE_BUGREPORT +/* STDC_HEADERS */ +#cmakedefine STDC_HEADERS ${STDC_HEADERS} diff --git a/src/config_coinutils.h.cmake.in b/src/config_coinutils.h.cmake.in index 0d85fd71f..a5810654f 100644 --- a/src/config_coinutils.h.cmake.in +++ b/src/config_coinutils.h.cmake.in @@ -1,8 +1,24 @@ #ifndef __CONFIG_${NAME}_H__ #define __CONFIG_${NAME}_H__ +/* Library Visibility Attribute */ +#define ${NAME}LIB_EXPORT + +/* Define to 1 if CoinUtils uses C++11 */ +#define ${NAME}_CPLUSPLUS11 1 + +/* Define to 1 if stdint.h is available for CoinUtils */ +#define ${NAME}_HAS_STDINT_H 1 + +/* Define to 1 if cstdint is available for CoinUtils */ #define ${NAME}_HAS_CSTDINT 1 +/* COIN_C_FINITE */ +#cmakedefine COIN_C_FINITE ${COIN_C_FINITE} + +/* COIN_C_ISNAN */ +#cmakedefine COIN_C_ISNAN ${COIN_C_ISNAN} + /* ${NAME}_VERSION */ #define ${NAME}_VERSION "${VERSION}" /* ${NAME}_VERSION_MAJOR */