CMakeLists.txt
changeset 1177 3c00344f49c9
parent 1146 ca4e4a5e9b6e
     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")