You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

279 lines
9.8 KiB

cmake_minimum_required (VERSION 2.8.6)
# Set project name
project (glpk CXX C)
# Add the resources/cmake folder to Module Search Path for FindMySQL.cmake
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/resources/")
# Add base folder for better inclusion paths
include_directories("${PROJECT_SOURCE_DIR}")
include_directories("${PROJECT_SOURCE_DIR}/src")
include_directories("${PROJECT_SOURCE_DIR}/src/amd")
include_directories("${PROJECT_SOURCE_DIR}/src/bflib")
include_directories("${PROJECT_SOURCE_DIR}/src/cglib")
include_directories("${PROJECT_SOURCE_DIR}/src/colamd")
include_directories("${PROJECT_SOURCE_DIR}/src/env")
include_directories("${PROJECT_SOURCE_DIR}/src/minisat")
include_directories("${PROJECT_SOURCE_DIR}/src/misc")
include_directories("${PROJECT_SOURCE_DIR}/src/proxy")
include_directories("${PROJECT_SOURCE_DIR}/src/zlib")
#############################################################
##
## CMake options of GLPK
##
#############################################################
option(WITH_GLPK_EXAMPLES "Also build examples and standalone executables" OFF)
option(WITH_GMP "Use GNU MO bignum library" OFF)
option(ENABLE_DL "Enable shared library support" OFF)
option(ENABLE_ODBC "Enable MathProg ODBC support" OFF)
option(ENABLE_MYSQL "Enable MathProg MySQL support" OFF)
option(DEBUG "Sets whether the DEBUG mode is used" OFF)
set(ADDITIONAL_INCLUDE_DIRS "" CACHE STRING "Additional directories added to the include directories.")
set(ADDITIONAL_LINK_DIRS "" CACHE STRING "Additional directories added to the link directories.")
# If the DEBUG option was turned on, we will target a debug version and a release version otherwise
if (DEBUG)
set (CMAKE_BUILD_TYPE "DEBUG")
else()
set (CMAKE_BUILD_TYPE "RELEASE")
endif()
message(STATUS "GLPK - Building ${CMAKE_BUILD_TYPE} version.")
message(STATUS "GLPK - CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message(STATUS "GLPK - CMAKE_BUILD_TYPE (ENV): $ENV{CMAKE_BUILD_TYPE}")
#############################################################
##
## Compiler specific settings and definitions
##
#############################################################
if(CMAKE_COMPILER_IS_GNUCC)
message(STATUS "GLPK - Using Compiler Configuration: GCC")
# Set standard flags for GCC
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-return-type -Wno-parentheses -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -Wno-unused-function -Wno-address -Wno-unused-label")
add_definitions(-DHAVE_CONFIG_H=1)
elseif(MSVC)
message(STATUS "GLPK - Using Compiler Configuration: MSVC")
add_definitions(/D_SCL_SECURE_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS)
add_definitions(/D_VARIADIC_MAX=10)
add_definitions(/DNOMINMAX)
add_definitions(/DHAVE_CONFIG_H=1)
else(CLANG)
message(STATUS "GLPK - Using Compiler Configuration: Clang (LLVM)")
# As CLANG is not set as a variable, we need to set it in case we have not matched another compiler.
set (CLANG ON)
# Set standard flags for clang
set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -funroll-loops -O3")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-return-type -Wno-return-type-c-linkage -Wno-unused-label -Wno-unused-value -Wno-unused-function -Wno-unused-variable -Wno-logical-op-parentheses -Wno-macro-redefined -Wno-uninitialized -Wno-sometimes-uninitialized -Wno-self-assign")
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
add_definitions(-DHAVE_CONFIG_H=1)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -version-info=37:0:1 -export-symbols-regex='^glp_*'")
endif()
#############################################################
##
## CMake-generated Config File for GLPK
##
#############################################################
include(CheckIncludeFiles)
include(CheckFunctionExists)
CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H)
CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
CHECK_INCLUDE_FILES(ltdl.h HAVE_LTDL)
CHECK_INCLUDE_FILES(dlfcn.h HAVE_DLFCN)
if(WITH_GMP)
message(STATUS "GLPK - Building with GMP Support")
CHECK_INCLUDE_FILE(gmp.h HAVE_GMP_H)
if (NOT HAVE_GMP_H)
message(SEND_ERROR "Could not find gmp.h!")
endif()
set(GLPK_HAVE_GMP "define")
else()
set(GLPK_HAVE_GMP "undef")
endif()
if (UNIX AND NOT APPLE)
set(LIBIODBC "libiodbc.so")
set(LIBODBC "libodbc.so")
set(LIBMYSQL "libmysqlclient.so")
elseif(UNIX AND APPLE)
set(LIBIODBC "libiodbc.dylib")
set(LIBODBC "libodbc.dylib")
set(LIBMYSQL "libmysqlclient.dylib")
elseif(MSVC)
set(LIBIODBC "odbc32.lib")
set(LIBODBC "odbc32.lib")
set(LIBMYSQL "mysqlclient.lib")
endif()
if(ENABLE_ODBC)
message(STATUS "GLPK - Building with ODBC Support")
find_package(ODBC REQUIRED)
if (NOT ENABLE_DL)
message(SEND_ERROR "ENABLE_ODBC required ENABLE_DL")
endif()
include_directories(ODBC_INCLUDE_DIRECTORIES)
set(GLPK_HAVE_ODBC "define")
set(GLPK_ODBC_DLNAME "${ODBC_LIBRARIES}")
else()
set(GLPK_HAVE_ODBC "undef")
set(GLPK_ODBC_DLNAME "")
endif()
if(ENABLE_MYSQL)
message(STATUS "GLPK - Building with MySQL Support")
find_package(MySQL REQUIRED)
if (NOT ENABLE_DL)
message(SEND_ERROR "ENABLE_MYSQL required ENABLE_DL")
endif()
include_directories(MYSQL_INCLUDE_DIR)
set(GLPK_HAVE_MYSQL "define")
set(GLPK_MYSQL_DLNAME "${MYSQL_LIBRARIES}")
else()
set(GLPK_HAVE_MYSQL "undef")
set(GLPK_MYSQL_DLNAME "")
endif()
# Convert to CMake Variables to be used in the Config File
if(HAVE_SYS_TIME_H)
set(GLPK_HAVE_SYS_TIME_H "define")
else()
set (GLPK_HAVE_SYS_TIME_H "undef")
endif()
if(HAVE_GETTIMEOFDAY)
set(GLPK_HAVE_GETTIMEOFDAY "define")
else()
set (GLPK_HAVE_GETTIMEOFDAY "undef")
endif()
if(HAVE_LTDL)
set(GLPK_HAVE_LTDL "define")
else()
set (GLPK_HAVE_LTDL "undef")
endif()
if(HAVE_DLFCN)
set(GLPK_HAVE_DLFCN "define")
else()
set (GLPK_HAVE_DLFCN "undef")
endif()
# Configure a header file to pass some of the CMake settings to the source code
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.cmake.in"
"${PROJECT_BINARY_DIR}/include/config.h"
)
# Add the binary dir include directory for config.h
include_directories("${PROJECT_BINARY_DIR}/include")
#############################################################
##
## Source file aggregation and clustering
##
#############################################################
file(GLOB_RECURSE GLPK_LIB_HEADERS ${PROJECT_SOURCE_DIR}/src/*.h)
file(GLOB_RECURSE GLPK_LIB_SOURCES ${PROJECT_SOURCE_DIR}/src/*.c)
file(GLOB_RECURSE GLPK_LIB_DEF ${PROJECT_SOURCE_DIR}/w64/*.def)
set(GLPK_EXAMPLE_GLPSOL_SOURCES ${PROJECT_SOURCE_DIR}/examples/glpsol.c)
set(GLPK_EXAMPLE_IPTSAMP_SOURCES ${PROJECT_SOURCE_DIR}/examples/iptsamp.c)
set(GLPK_EXAMPLE_MPLSAMP1_SOURCES ${PROJECT_SOURCE_DIR}/examples/mplsamp1.c)
set(GLPK_EXAMPLE_MPLSAMP2_SOURCES ${PROJECT_SOURCE_DIR}/examples/mplsamp2.c)
set(GLPK_EXAMPLE_SAMPLE_SOURCES ${PROJECT_SOURCE_DIR}/examples/sample.c)
set(GLPK_EXAMPLE_SPXSAMP1_SOURCES ${PROJECT_SOURCE_DIR}/examples/spxsamp1.c)
set(GLPK_EXAMPLE_SPXSAMP2_SOURCES ${PROJECT_SOURCE_DIR}/examples/spxsamp2.c)
set(GLPK_EXAMPLE_NETGEN_SOURCES ${PROJECT_SOURCE_DIR}/examples/netgen.c)
# Additional include files like the storm-config.h
file(GLOB_RECURSE GLPK_BUILD_HEADERS ${PROJECT_BINARY_DIR}/include/*.h)
# Add custom additional include or link directories
if (ADDITIONAL_INCLUDE_DIRS)
message(STATUS "GLPK - Using additional include directories ${ADDITIONAL_INCLUDE_DIRS}")
include_directories(${ADDITIONAL_INCLUDE_DIRS})
endif(ADDITIONAL_INCLUDE_DIRS)
if (ADDITIONAL_LINK_DIRS)
message(STATUS "GLPK - Using additional link directories ${ADDITIONAL_LINK_DIRS}")
link_directories(${ADDITIONAL_LINK_DIRS})
endif(ADDITIONAL_LINK_DIRS)
###############################################################################
## #
## Executable Creation #
## #
## All link_directories() calls MUST be made before this point #
## #
###############################################################################
if(WITH_GLPK_EXAMPLES)
add_executable(glpsol ${GLPK_EXAMPLE_GLPSOL_SOURCES})
add_executable(iptsamp ${GLPK_EXAMPLE_IPTSAMP_SOURCES})
add_executable(mplsamp1 ${GLPK_EXAMPLE_MPLSAMP1_SOURCES})
add_executable(mplsamp2 ${GLPK_EXAMPLE_MPLSAMP2_SOURCES})
add_executable(spxsamp1 ${GLPK_EXAMPLE_SPXSAMP1_SOURCES})
add_executable(spxsamp2 ${GLPK_EXAMPLE_SPXSAMP2_SOURCES})
add_executable(netgen ${GLPK_EXAMPLE_NETGEN_SOURCES})
add_executable(sample ${GLPK_EXAMPLE_SAMPLE_SOURCES})
endif()
if(ENABLE_DL)
set(GLPK_BUILD_TYPE SHARED)
else()
set(GLPK_BUILD_TYPE STATIC)
endif()
if (NOT MSVC)
set(GLPK_LIB_DEF "")
endif()
add_library(glpk ${GLPK_BUILD_TYPE} ${GLPK_LIB_SOURCES} ${GLPK_LIB_HEADERS} ${GLPK_LIB_DEF})
IF(UNIX)
target_link_libraries(glpk m)
ENDIF(UNIX)
if(HAVE_LTDL)
target_link_libraries(glpk ltdl)
endif(HAVE_LTDL)
if(HAVE_DLFCN)
target_link_libraries(glpk dl)
endif(HAVE_DLFCN)
if(WITH_GLPK_EXAMPLES)
# Dependency for the Executable
add_dependencies(glpsol glpk)
add_dependencies(iptsamp glpk)
add_dependencies(mplsamp1 glpk)
add_dependencies(mplsamp2 glpk)
add_dependencies(spxsamp1 glpk)
add_dependencies(spxsamp2 glpk)
add_dependencies(netgen glpk)
add_dependencies(sample glpk)
target_link_libraries(glpsol glpk)
target_link_libraries(iptsamp glpk)
target_link_libraries(mplsamp1 glpk)
target_link_libraries(mplsamp2 glpk)
target_link_libraries(spxsamp1 glpk)
target_link_libraries(spxsamp2 glpk)
target_link_libraries(netgen glpk)
target_link_libraries(sample glpk)
endif()
#############################################################
##
## ODBC
##
#############################################################
if(ODBC_FOUND)
target_link_libraries(glpk ${ODBC_LIBRARIES})
endif()
#############################################################
##
## MySQL
##
#############################################################
if(MYSQL_FOUND)
target_link_libraries(glpk ${MYSQL_LIBRARIES})
endif()