1.1 --- a/CMakeLists.txt Mon Jul 16 16:21:40 2018 +0200
1.2 +++ b/CMakeLists.txt Wed Oct 17 19:14:07 2018 +0200
1.3 @@ -1,4 +1,13 @@
1.4 -CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
1.5 +CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
1.6 +
1.7 +IF(POLICY CMP0048)
1.8 + CMAKE_POLICY(SET CMP0048 OLD)
1.9 +ENDIF(POLICY CMP0048)
1.10 +
1.11 +IF(POLICY CMP0026)
1.12 + #This is for copying the dll's needed by glpk (in lp_test and mip_test)
1.13 + CMAKE_POLICY(SET CMP0026 OLD)
1.14 +ENDIF(POLICY CMP0026)
1.15
1.16 SET(PROJECT_NAME "LEMON")
1.17 PROJECT(${PROJECT_NAME})
1.18 @@ -12,29 +21,47 @@
1.19 SET(LEMON_VERSION $ENV{LEMON_VERSION} CACHE STRING "LEMON version string.")
1.20 ELSE()
1.21 EXECUTE_PROCESS(
1.22 - COMMAND ${PYTHON_EXECUTABLE} ./scripts/chg-len.py
1.23 + COMMAND
1.24 + hg log -r. --template "{latesttag}"
1.25 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
1.26 - OUTPUT_VARIABLE HG_REVISION_PATH
1.27 + OUTPUT_VARIABLE HG_REVISION_TAG
1.28 ERROR_QUIET
1.29 OUTPUT_STRIP_TRAILING_WHITESPACE
1.30 )
1.31 EXECUTE_PROCESS(
1.32 - COMMAND hg id -i
1.33 + COMMAND
1.34 + hg log -r. --template "{latesttagdistance}"
1.35 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
1.36 - OUTPUT_VARIABLE HG_REVISION
1.37 + OUTPUT_VARIABLE HG_REVISION_DIST
1.38 ERROR_QUIET
1.39 OUTPUT_STRIP_TRAILING_WHITESPACE
1.40 )
1.41 - IF(HG_REVISION STREQUAL "")
1.42 + EXECUTE_PROCESS(
1.43 + COMMAND
1.44 + hg log -r. --template "{node|short}"
1.45 + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
1.46 + OUTPUT_VARIABLE HG_REVISION_ID
1.47 + ERROR_QUIET
1.48 + OUTPUT_STRIP_TRAILING_WHITESPACE
1.49 + )
1.50 +
1.51 + IF(HG_REVISION_TAG STREQUAL "")
1.52 SET(HG_REVISION_ID "hg-tip")
1.53 ELSE()
1.54 - IF(HG_REVISION_PATH STREQUAL "")
1.55 - SET(HG_REVISION_ID ${HG_REVISION})
1.56 + IF(HG_REVISION_TAG STREQUAL "null")
1.57 + SET(HG_REVISION_TAG "trunk")
1.58 + ELSEIF(HG_REVISION_TAG MATCHES "^r")
1.59 + STRING(SUBSTRING ${HG_REVISION_TAG} 1 -1 HG_REVISION_TAG)
1.60 + ENDIF()
1.61 + IF(HG_REVISION_DIST STREQUAL "0")
1.62 + SET(HG_REVISION ${HG_REVISION_TAG})
1.63 ELSE()
1.64 - SET(HG_REVISION_ID ${HG_REVISION_PATH}.${HG_REVISION})
1.65 + SET(HG_REVISION
1.66 + "${HG_REVISION_TAG}+${HG_REVISION_DIST}-${HG_REVISION_ID}")
1.67 ENDIF()
1.68 ENDIF()
1.69 - SET(LEMON_VERSION ${HG_REVISION_ID} CACHE STRING "LEMON version string.")
1.70 +
1.71 + SET(LEMON_VERSION ${HG_REVISION} CACHE STRING "LEMON version string.")
1.72 ENDIF()
1.73
1.74 SET(PROJECT_VERSION ${LEMON_VERSION})
1.75 @@ -43,9 +70,84 @@
1.76
1.77 FIND_PACKAGE(Doxygen)
1.78 FIND_PACKAGE(Ghostscript)
1.79 -FIND_PACKAGE(GLPK 4.33)
1.80 -FIND_PACKAGE(CPLEX)
1.81 -FIND_PACKAGE(COIN)
1.82 +
1.83 +IF(WIN32)
1.84 + SET(LEMON_WIN32 TRUE)
1.85 +ENDIF(WIN32)
1.86 +
1.87 +SET(LEMON_ENABLE_GLPK YES CACHE STRING "Enable GLPK solver backend.")
1.88 +SET(LEMON_ENABLE_ILOG YES CACHE STRING "Enable ILOG (CPLEX) solver backend.")
1.89 +SET(LEMON_ENABLE_COIN YES CACHE STRING "Enable COIN solver backend.")
1.90 +SET(LEMON_ENABLE_SOPLEX YES CACHE STRING "Enable SoPlex solver backend.")
1.91 +
1.92 +IF(LEMON_ENABLE_GLPK)
1.93 + FIND_PACKAGE(GLPK 4.33)
1.94 + IF(GLPK_FOUND)
1.95 + SET(LEMON_HAVE_LP TRUE)
1.96 + SET(LEMON_HAVE_MIP TRUE)
1.97 + SET(LEMON_HAVE_GLPK TRUE)
1.98 + ENDIF(GLPK_FOUND)
1.99 +ENDIF(LEMON_ENABLE_GLPK)
1.100 +IF(LEMON_ENABLE_ILOG)
1.101 + FIND_PACKAGE(ILOG)
1.102 + IF(ILOG_FOUND)
1.103 + SET(LEMON_HAVE_LP TRUE)
1.104 + SET(LEMON_HAVE_MIP TRUE)
1.105 + SET(LEMON_HAVE_CPLEX TRUE)
1.106 + ENDIF(ILOG_FOUND)
1.107 +ENDIF(LEMON_ENABLE_ILOG)
1.108 +IF(LEMON_ENABLE_COIN)
1.109 + FIND_PACKAGE(COIN)
1.110 + IF(COIN_FOUND)
1.111 + SET(LEMON_HAVE_LP TRUE)
1.112 + SET(LEMON_HAVE_MIP TRUE)
1.113 + SET(LEMON_HAVE_CLP TRUE)
1.114 + SET(LEMON_HAVE_CBC TRUE)
1.115 + ENDIF(COIN_FOUND)
1.116 +ENDIF(LEMON_ENABLE_COIN)
1.117 +IF(LEMON_ENABLE_SOPLEX)
1.118 + FIND_PACKAGE(SOPLEX)
1.119 + IF(SOPLEX_FOUND)
1.120 + SET(LEMON_HAVE_LP TRUE)
1.121 + SET(LEMON_HAVE_SOPLEX TRUE)
1.122 + ENDIF(SOPLEX_FOUND)
1.123 +ENDIF(LEMON_ENABLE_SOPLEX)
1.124 +
1.125 +IF(ILOG_FOUND)
1.126 + SET(DEFAULT_LP "CPLEX")
1.127 + SET(DEFAULT_MIP "CPLEX")
1.128 +ELSEIF(COIN_FOUND)
1.129 + SET(DEFAULT_LP "CLP")
1.130 + SET(DEFAULT_MIP "CBC")
1.131 +ELSEIF(GLPK_FOUND)
1.132 + SET(DEFAULT_LP "GLPK")
1.133 + SET(DEFAULT_MIP "GLPK")
1.134 +ELSEIF(SOPLEX_FOUND)
1.135 + SET(DEFAULT_LP "SOPLEX")
1.136 +ENDIF()
1.137 +
1.138 +IF(NOT LEMON_DEFAULT_LP OR
1.139 + (NOT ILOG_FOUND AND (LEMON_DEFAULT_LP STREQUAL "CPLEX")) OR
1.140 + (NOT COIN_FOUND AND (LEMON_DEFAULT_LP STREQUAL "CLP")) OR
1.141 + (NOT GLPK_FOUND AND (LEMON_DEFAULT_LP STREQUAL "GLPK")) OR
1.142 + (NOT SOPLEX_FOUND AND (LEMON_DEFAULT_LP STREQUAL "SOPLEX")))
1.143 + SET(LEMON_DEFAULT_LP ${DEFAULT_LP} CACHE STRING
1.144 + "Default LP solver backend (GLPK, CPLEX, CLP or SOPLEX)" FORCE)
1.145 +ELSE()
1.146 + SET(LEMON_DEFAULT_LP ${DEFAULT_LP} CACHE STRING
1.147 + "Default LP solver backend (GLPK, CPLEX, CLP or SOPLEX)")
1.148 +ENDIF()
1.149 +IF(NOT LEMON_DEFAULT_MIP OR
1.150 + (NOT ILOG_FOUND AND (LEMON_DEFAULT_MIP STREQUAL "CPLEX")) OR
1.151 + (NOT COIN_FOUND AND (LEMON_DEFAULT_MIP STREQUAL "CBC")) OR
1.152 + (NOT GLPK_FOUND AND (LEMON_DEFAULT_MIP STREQUAL "GLPK")))
1.153 + SET(LEMON_DEFAULT_MIP ${DEFAULT_MIP} CACHE STRING
1.154 + "Default MIP solver backend (GLPK, CPLEX or CBC)" FORCE)
1.155 +ELSE()
1.156 + SET(LEMON_DEFAULT_MIP ${DEFAULT_MIP} CACHE STRING
1.157 + "Default MIP solver backend (GLPK, CPLEX or CBC)")
1.158 +ENDIF()
1.159 +
1.160
1.161 IF(DEFINED ENV{LEMON_CXX_WARNING})
1.162 SET(CXX_WARNING $ENV{LEMON_CXX_WARNING})
1.163 @@ -56,10 +158,13 @@
1.164 SET(CMAKE_C_FLAGS_DEBUG CACHE STRING "-ggdb")
1.165 ELSEIF(MSVC)
1.166 # This part is unnecessary 'casue the same is set by the lemon/core.h.
1.167 - # Still keep it as an example.
1.168 - SET(CXX_WARNING "/wd4250 /wd4355 /wd4503 /wd4800 /wd4996")
1.169 + # Still kept as an example.
1.170 +
1.171 + # SET(CXX_WARNING "/wd4250 /wd4267 /wd4355 /wd4503 /wd4800 /wd4996")
1.172 +
1.173 # Suppressed warnings:
1.174 # C4250: 'class1' : inherits 'class2::member' via dominance
1.175 + # C4267: conversion from 'size_t' to 'type', possible loss of data
1.176 # C4355: 'this' : used in base member initializer list
1.177 # C4503: 'function' : decorated name length exceeded, name was truncated
1.178 # C4800: 'type' : forcing value to bool 'true' or 'false'
1.179 @@ -73,20 +178,39 @@
1.180
1.181 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LEMON_CXX_WARNING_FLAGS}")
1.182
1.183 -SET( CMAKE_CXX_FLAGS_MAINTAINER "-Werror -ggdb -O0" CACHE STRING
1.184 +IF(MSVC)
1.185 + SET(CMAKE_CXX_FLAGS "/bigobj ${CMAKE_CXX_FLAGS}")
1.186 + SET( CMAKE_CXX_FLAGS_MAINTAINER "/WX ${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING
1.187 "Flags used by the C++ compiler during maintainer builds."
1.188 - FORCE )
1.189 -SET( CMAKE_C_FLAGS_MAINTAINER "-Werror -O0" CACHE STRING
1.190 + )
1.191 + SET( CMAKE_C_FLAGS_MAINTAINER "/WX ${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING
1.192 "Flags used by the C compiler during maintainer builds."
1.193 - FORCE )
1.194 -SET( CMAKE_EXE_LINKER_FLAGS_MAINTAINER
1.195 - "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING
1.196 + )
1.197 + SET( CMAKE_EXE_LINKER_FLAGS_MAINTAINER
1.198 + "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING
1.199 "Flags used for linking binaries during maintainer builds."
1.200 - FORCE )
1.201 -SET( CMAKE_SHARED_LINKER_FLAGS_MAINTAINER
1.202 - "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING
1.203 + )
1.204 + SET( CMAKE_SHARED_LINKER_FLAGS_MAINTAINER
1.205 + "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING
1.206 "Flags used by the shared libraries linker during maintainer builds."
1.207 - FORCE )
1.208 + )
1.209 +ELSE()
1.210 + SET( CMAKE_CXX_FLAGS_MAINTAINER "-Werror -ggdb -O0" CACHE STRING
1.211 + "Flags used by the C++ compiler during maintainer builds."
1.212 + )
1.213 + SET( CMAKE_C_FLAGS_MAINTAINER "-Werror -O0" CACHE STRING
1.214 + "Flags used by the C compiler during maintainer builds."
1.215 + )
1.216 + SET( CMAKE_EXE_LINKER_FLAGS_MAINTAINER
1.217 + "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING
1.218 + "Flags used for linking binaries during maintainer builds."
1.219 + )
1.220 + SET( CMAKE_SHARED_LINKER_FLAGS_MAINTAINER
1.221 + "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING
1.222 + "Flags used by the shared libraries linker during maintainer builds."
1.223 + )
1.224 +ENDIF()
1.225 +
1.226 MARK_AS_ADVANCED(
1.227 CMAKE_CXX_FLAGS_MAINTAINER
1.228 CMAKE_C_FLAGS_MAINTAINER
1.229 @@ -114,7 +238,27 @@
1.230 CHECK_TYPE_SIZE("long long" LONG_LONG)
1.231 SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG})
1.232
1.233 -INCLUDE(FindPythonInterp)
1.234 +INCLUDE(FindThreads)
1.235 +
1.236 +IF(NOT LEMON_THREADING)
1.237 + IF(CMAKE_USE_PTHREADS_INIT)
1.238 + SET(LEMON_THREADING "Pthread")
1.239 + ELSEIF(CMAKE_USE_WIN32_THREADS_INIT)
1.240 + SET(LEMON_THREADING "Win32")
1.241 + ELSE()
1.242 + SET(LEMON_THREADING "None")
1.243 + ENDIF()
1.244 +ENDIF()
1.245 +
1.246 +SET( LEMON_THREADING "${LEMON_THREADING}" CACHE STRING
1.247 + "Choose the threading library, options are: Pthread Win32 None."
1.248 + FORCE )
1.249 +
1.250 +IF(LEMON_THREADING STREQUAL "Pthread")
1.251 + SET(LEMON_USE_PTHREAD TRUE)
1.252 +ELSEIF(LEMON_THREADING STREQUAL "Win32")
1.253 + SET(LEMON_USE_WIN32_THREADS TRUE)
1.254 +ENDIF()
1.255
1.256 ENABLE_TESTING()
1.257
1.258 @@ -126,6 +270,7 @@
1.259
1.260 ADD_SUBDIRECTORY(lemon)
1.261 IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
1.262 + ADD_SUBDIRECTORY(contrib)
1.263 ADD_SUBDIRECTORY(demo)
1.264 ADD_SUBDIRECTORY(tools)
1.265 ADD_SUBDIRECTORY(doc)
1.266 @@ -149,6 +294,33 @@
1.267 )
1.268 ENDIF()
1.269
1.270 +CONFIGURE_FILE(
1.271 + ${PROJECT_SOURCE_DIR}/cmake/version.cmake.in
1.272 + ${PROJECT_BINARY_DIR}/cmake/version.cmake
1.273 + @ONLY
1.274 +)
1.275 +
1.276 +SET(ARCHIVE_BASE_NAME ${CMAKE_PROJECT_NAME})
1.277 +STRING(TOLOWER ${ARCHIVE_BASE_NAME} ARCHIVE_BASE_NAME)
1.278 +SET(ARCHIVE_NAME ${ARCHIVE_BASE_NAME}-${PROJECT_VERSION})
1.279 +ADD_CUSTOM_TARGET(dist
1.280 + COMMAND cmake -E remove_directory ${ARCHIVE_NAME}
1.281 + COMMAND hg archive ${ARCHIVE_NAME}
1.282 + COMMAND cmake -E copy cmake/version.cmake ${ARCHIVE_NAME}/cmake/version.cmake
1.283 + COMMAND tar -czf ${ARCHIVE_BASE_NAME}-nodoc-${PROJECT_VERSION}.tar.gz ${ARCHIVE_NAME}
1.284 + COMMAND zip -r ${ARCHIVE_BASE_NAME}-nodoc-${PROJECT_VERSION}.zip ${ARCHIVE_NAME}
1.285 + COMMAND cmake -E copy_directory doc/html ${ARCHIVE_NAME}/doc/html
1.286 + COMMAND tar -czf ${ARCHIVE_NAME}.tar.gz ${ARCHIVE_NAME}
1.287 + COMMAND zip -r ${ARCHIVE_NAME}.zip ${ARCHIVE_NAME}
1.288 + COMMAND cmake -E copy_directory doc/html ${ARCHIVE_BASE_NAME}-doc-${PROJECT_VERSION}
1.289 + COMMAND tar -czf ${ARCHIVE_BASE_NAME}-doc-${PROJECT_VERSION}.tar.gz ${ARCHIVE_BASE_NAME}-doc-${PROJECT_VERSION}
1.290 + COMMAND zip -r ${ARCHIVE_BASE_NAME}-doc-${PROJECT_VERSION}.zip ${ARCHIVE_BASE_NAME}-doc-${PROJECT_VERSION}
1.291 + COMMAND cmake -E remove_directory ${ARCHIVE_NAME}
1.292 + COMMAND cmake -E remove_directory ${ARCHIVE_BASE_NAME}-doc-${PROJECT_VERSION}
1.293 + DEPENDS html
1.294 + WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
1.295 +
1.296 +# CPACK config (Basically for NSIS)
1.297 IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
1.298 SET(CPACK_PACKAGE_NAME ${PROJECT_NAME})
1.299 SET(CPACK_PACKAGE_VENDOR "EGRES")