This repository has been archived by the owner on Jun 9, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added cplex-shared.cmake, which creates shared libraries from pre-exi…
…sting CPLEX static libraries.
- Loading branch information
1 parent
b53e438
commit 8b4071f
Showing
3 changed files
with
225 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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} ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters