Skip to content
This repository has been archived by the owner on Jun 9, 2022. It is now read-only.

Commit

Permalink
Added cplex-shared.cmake, which creates shared libraries from pre-exi…
Browse files Browse the repository at this point in the history
…sting CPLEX static libraries.
  • Loading branch information
stuarteberg committed Jan 24, 2014
1 parent b53e438 commit 8b4071f
Show file tree
Hide file tree
Showing 3 changed files with 225 additions and 0 deletions.
151 changes: 151 additions & 0 deletions FindCplex.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
# This module finds cplex.
#
# User can give CPLEX_ROOT_DIR as a hint stored in the cmake cache.
#
# It sets the following variables:
# CPLEX_FOUND - Set to false, or undefined, if cplex isn't found.
# CPLEX_INCLUDE_DIRS - include directory
# CPLEX_LIBRARIES - library files

if(WIN32)
execute_process(COMMAND cmd /C set CPLEX_STUDIO_DIR OUTPUT_VARIABLE CPLEX_STUDIO_DIR_VAR ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

if(NOT CPLEX_STUDIO_DIR_VAR)
MESSAGE(FATAL_ERROR "Unable to find CPLEX: environment variable CPLEX_STUDIO_DIR<VERSION> not set.")
endif()

STRING(REGEX REPLACE "^CPLEX_STUDIO_DIR" "" CPLEX_STUDIO_DIR_VAR ${CPLEX_STUDIO_DIR_VAR})
STRING(REGEX MATCH "^[0-9]+" CPLEX_WIN_VERSION ${CPLEX_STUDIO_DIR_VAR})
STRING(REGEX REPLACE "^[0-9]+=" "" CPLEX_STUDIO_DIR_VAR ${CPLEX_STUDIO_DIR_VAR})
file(TO_CMAKE_PATH "${CPLEX_STUDIO_DIR_VAR}" CPLEX_ROOT_DIR_GUESS)

set(CPLEX_WIN_VERSION ${CPLEX_WIN_VERSION} CACHE STRING "CPLEX version to be used.")
set(CPLEX_ROOT_DIR "${CPLEX_ROOT_DIR_GUESS}" CACHE PATH "CPLEX root directory.")

MESSAGE(STATUS "Found CLPEX version ${CPLEX_WIN_VERSION} at '${CPLEX_ROOT_DIR}'")

STRING(REGEX REPLACE "/VC/bin/.*" "" VISUAL_STUDIO_PATH ${CMAKE_C_COMPILER})
STRING(REGEX MATCH "Studio [0-9]+" CPLEX_WIN_VS_VERSION ${VISUAL_STUDIO_PATH})
STRING(REGEX REPLACE "Studio " "" CPLEX_WIN_VS_VERSION ${CPLEX_WIN_VS_VERSION})

if(${CPLEX_WIN_VS_VERSION} STREQUAL "9")
set(CPLEX_WIN_VS_VERSION 2008)
elseif(${CPLEX_WIN_VS_VERSION} STREQUAL "10")
set(CPLEX_WIN_VS_VERSION 2010)
elseif(${CPLEX_WIN_VS_VERSION} STREQUAL "11")
set(CPLEX_WIN_VS_VERSION 2012)
else()
MESSAGE(FATAL_ERROR "CPLEX: unknown Visual Studio version at '${VISUAL_STUDIO_PATH}'.")
endif()

set(CPLEX_WIN_VS_VERSION ${CPLEX_WIN_VS_VERSION} CACHE STRING "Visual Studio Version")

if("${CMAKE_C_COMPILER}" MATCHES "amd64")
set(CPLEX_WIN_BITNESS x64)
else()
set(CPLEX_WIN_BITNESS x86)
endif()

set(CPLEX_WIN_BITNESS ${CPLEX_WIN_BITNESS} CACHE STRING "On Windows: x86 or x64 (32bit resp. 64bit)")

MESSAGE(STATUS "CPLEX: using Visual Studio ${CPLEX_WIN_VS_VERSION} ${CPLEX_WIN_BITNESS} at '${VISUAL_STUDIO_PATH}'")

if(NOT CPLEX_WIN_LINKAGE)
set(CPLEX_WIN_LINKAGE mda CACHE STRING "CPLEX linkage variant on Windows. One of these: mda (dll, release), mdd (dll, debug), mta (static, release), mtd (static, debug)")
endif(NOT CPLEX_WIN_LINKAGE)

# now, generate platform string
set(CPLEX_WIN_PLATFORM "${CPLEX_WIN_BITNESS}_windows_vs${CPLEX_WIN_VS_VERSION}/stat_${CPLEX_WIN_LINKAGE}")

else()

set(CPLEX_ROOT_DIR "" CACHE PATH "CPLEX root directory.")
set(CPLEX_WIN_PLATFORM "")

endif()


FIND_PATH(CPLEX_INCLUDE_DIR
ilcplex/cplex.h
HINTS ${CPLEX_ROOT_DIR}/cplex/include
${CPLEX_ROOT_DIR}/include
PATHS ENV C_INCLUDE_PATH
ENV C_PLUS_INCLUDE_PATH
ENV INCLUDE_PATH
)

FIND_PATH(CPLEX_CONCERT_INCLUDE_DIR
ilconcert/iloenv.h
HINTS ${CPLEX_ROOT_DIR}/concert/include
${CPLEX_ROOT_DIR}/include
PATHS ENV C_INCLUDE_PATH
ENV C_PLUS_INCLUDE_PATH
ENV INCLUDE_PATH
)

FIND_LIBRARY(CPLEX_LIBRARY
NAMES cplex${CPLEX_WIN_VERSION} cplex
HINTS ${CPLEX_ROOT_DIR}/cplex/lib/${CPLEX_WIN_PLATFORM} #windows
${CPLEX_ROOT_DIR}/cplex/lib/x86-64_debian4.0_4.1/static_pic #unix
${CPLEX_ROOT_DIR}/cplex/lib/x86-64_sles10_4.1/static_pic #unix
${CPLEX_ROOT_DIR}/cplex/lib/x86-64_osx/static_pic #osx
PATHS ENV LIBRARY_PATH #unix
ENV LD_LIBRARY_PATH #unix
)
message(STATUS "CPLEX Library: ${CPLEX_LIBRARY}")

FIND_LIBRARY(CPLEX_ILOCPLEX_LIBRARY
ilocplex
HINTS ${CPLEX_ROOT_DIR}/cplex/lib/${CPLEX_WIN_PLATFORM} #windows
${CPLEX_ROOT_DIR}/cplex/lib/x86-64_debian4.0_4.1/static_pic #unix
${CPLEX_ROOT_DIR}/cplex/lib/x86-64_sles10_4.1/static_pic #unix
${CPLEX_ROOT_DIR}/cplex/lib/x86-64_osx/static_pic #osx
PATHS ENV LIBRARY_PATH
ENV LD_LIBRARY_PATH
)
message(STATUS "ILOCPLEX Library: ${CPLEX_ILOCPLEX_LIBRARY}")

FIND_LIBRARY(CPLEX_CONCERT_LIBRARY
concert
HINTS ${CPLEX_ROOT_DIR}/concert/lib/${CPLEX_WIN_PLATFORM} #windows
${CPLEX_ROOT_DIR}/concert/lib/x86-64_debian4.0_4.1/static_pic #unix
${CPLEX_ROOT_DIR}/concert/lib/x86-64_sles10_4.1/static_pic #unix
${CPLEX_ROOT_DIR}/concert/lib/x86-64_osx/static_pic #osx
PATHS ENV LIBRARY_PATH
ENV LD_LIBRARY_PATH
)
message(STATUS "CONCERT Library: ${CPLEX_CONCERT_LIBRARY}")

if(WIN32)
FIND_PATH(CPLEX_BIN_DIR
cplex${CPLEX_WIN_VERSION}.dll
HINTS ${CPLEX_ROOT_DIR}/cplex/bin/${CPLEX_WIN_PLATFORM} #windows
)
else()
FIND_PATH(CPLEX_BIN_DIR
cplex
HINTS ${CPLEX_ROOT_DIR}/cplex/bin/x86-64_sles10_4.1 #unix
${CPLEX_ROOT_DIR}/cplex/bin/x86-64_debian4.0_4.1 #unix
${CPLEX_ROOT_DIR}/cplex/bin/x86-64_osx #osx
ENV LIBRARY_PATH
ENV LD_LIBRARY_PATH
)
endif()
message(STATUS "CPLEX Bin Dir: ${CPLEX_BIN_DIR}")

INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(CPLEX DEFAULT_MSG
CPLEX_LIBRARY CPLEX_INCLUDE_DIR CPLEX_ILOCPLEX_LIBRARY CPLEX_CONCERT_LIBRARY CPLEX_CONCERT_INCLUDE_DIR)

IF(CPLEX_FOUND)
SET(CPLEX_INCLUDE_DIRS ${CPLEX_INCLUDE_DIR} ${CPLEX_CONCERT_INCLUDE_DIR})
SET(CPLEX_LIBRARIES ${CPLEX_CONCERT_LIBRARY} ${CPLEX_ILOCPLEX_LIBRARY} ${CPLEX_LIBRARY} )
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
SET(CPLEX_LIBRARIES "${CPLEX_LIBRARIES};m;pthread")
ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
ENDIF(CPLEX_FOUND)

MARK_AS_ADVANCED(CPLEX_LIBRARY CPLEX_INCLUDE_DIR CPLEX_ILOCPLEX_LIBRARY CPLEX_CONCERT_INCLUDE_DIR CPLEX_CONCERT_LIBRARY)



71 changes: 71 additions & 0 deletions cplex-shared.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# This cmake script can be used to locate cplex and generate shared libraries from
# Find cplex, and convert its static libraries into shared ones, as described in the pgmlink readme:
# https://github.com/bekaus/pgmlink

# From the command-line, this can be achieved with something like:
# (Linux)
# g++ -fpic -shared -Wl,-all_load libcplex.a -Wl,-noall_load -o libcplex.dylib
# g++ -fpic -shared -Wl,-all_load libilocplex.a -Wl,-noall_load -o libilocplex.dylib
# g++ -fpic -shared -Wl,-all_load libconcert.a -Wl,-noall_load -o libconcert.dylib

# (Mac OS X)
# g++ -fpic -shared -Wl,-all_load libcplex.a -Wl,-noall_load -o libcplex.dylib
# g++ -fpic -shared -Wl,-all_load libconcert.a -Wl,-noall_load -o libconcert.dylib
# g++ -fpic -shared -Wl,-all_load libilocplex.a -Wl,-noall_load -L. -L../../../../concert/lib/x86-64_osx/static_pic -lcplex -lconcert -o libilocplex.dylib

# Find the CPLEX static libraries (must already be installed somewhere)
find_package( Cplex REQUIRED )

##
## -- Create a shared library from libcplex.a
##
set( CPLEX_LIBRARY_STATIC ${CPLEX_LIBRARY} )
get_filename_component(CPLEX_LIB_DIR "${CPLEX_LIBRARY_STATIC}" PATH)

# Create an empty cpp file to use as a stand-in for cpp sources in the library
set (EMPTY_CPP ${CMAKE_CURRENT_BINARY_DIR}/empty.cpp)
file(WRITE ${EMPTY_CPP} "// This is an empty file generated by cplex-shared.cmake" )

add_library( cplex-shared SHARED ${EMPTY_CPP} )
target_link_libraries( cplex-shared ${CPLEX_LIBRARY_STATIC} )
set_target_properties( cplex-shared PROPERTIES
LINK_FLAGS -all_load
COMPILE_FLAGS -fpic
OUTPUT_NAME cplex
LIBRARY_OUTPUT_DIRECTORY ${CPLEX_LIB_DIR} )

get_property(CPLEX_LIB_LOCATION TARGET cplex-shared PROPERTY LOCATION)


##
## -- Create a shared library from libconcert.a
##
set( CONCERT_LIBRARY_STATIC ${CPLEX_CONCERT_LIBRARY} )
get_filename_component(CONCERT_LIB_DIR "${CONCERT_LIBRARY_STATIC}" PATH)

add_library( concert-shared SHARED ${EMPTY_CPP} )
target_link_libraries( concert-shared ${CONCERT_LIBRARY_STATIC} )
set_target_properties( concert-shared PROPERTIES
LINK_FLAGS -all_load
COMPILE_FLAGS -fpic
OUTPUT_NAME concert
LIBRARY_OUTPUT_DIRECTORY ${CONCERT_LIB_DIR} )

get_property(CONCERT_LIB_LOCATION TARGET concert-shared PROPERTY LOCATION)

##
## -- Create a shared library from libilocplex.a, which depends on the above two libraries.
##
set( ILOCPLEX_LIBRARY_STATIC ${CPLEX_ILOCPLEX_LIBRARY} )
get_filename_component(ILOCPLEX_LIB_DIR "${ILOCPLEX_LIBRARY_STATIC}" PATH)

add_library( ilocplex-shared SHARED ${EMPTY_CPP} )
add_dependencies( ilocplex-shared cplex-shared concert-shared )
target_link_libraries( ilocplex-shared ${ILOCPLEX_LIBRARY_STATIC} ${CPLEX_LIB_LOCATION} ${CONCERT_LIB_LOCATION} )
set_target_properties( ilocplex-shared PROPERTIES
LINK_FLAGS -all_load
COMPILE_FLAGS -fpic
OUTPUT_NAME ilocplex
LIBRARY_OUTPUT_DIRECTORY ${ILOCPLEX_LIB_DIR} )
3 changes: 3 additions & 0 deletions pgmlink.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,16 @@ else()
include (dlib)
include (python)

include (cplex-shared)

external_git_repo (pgmlink
364bef9a809fc533fff292c99d1c8eb489a3c591
https://github.com/ilastik/pgmlink)

message ("Installing ${pgmlink_NAME} into FlyEM build aread: ${BUILDEM_DIR} ...")
ExternalProject_Add(${pgmlink_NAME}
DEPENDS ${ann_NAME} ${lemon_NAME} ${vigra_NAME} ${boost_NAME} ${opengm_NAME}
${cplex-shared} ${ilocplex-shared} ${concert-shared}
${dlib_NAME}
PREFIX ${BUILDEM_DIR}
GIT_REPOSITORY ${pgmlink_URL}
Expand Down

0 comments on commit 8b4071f

Please sign in to comment.