Skip to content

Commit

Permalink
Fix OMSISolver build on macOS
Browse files Browse the repository at this point in the history
  - Made reading of sundials version more robust in OMSI/solver/CMakeList.txt
  - Only use Sundials from 3rdParty because specific header are needed
  • Loading branch information
AnHeuermann authored and adrpo committed Jul 1, 2019
1 parent 6604e0d commit 708c502
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 82 deletions.
20 changes: 12 additions & 8 deletions OMCompiler/SimulationRuntime/OMSI/base/CMakeLists.txt
Expand Up @@ -29,20 +29,27 @@ add_library(${OSUBaseName}

include_directories ("${OMSI_SOURCE_DIR}/solver/include")

# Set RPATH for mac to use lib from build tree and install location
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
IF("${isSystemDir}" STREQUAL "-1")
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
ENDIF("${isSystemDir}" STREQUAL "-1")

IF(WIN32)
target_link_libraries(${OSUBaseName} ${OMSISolverName} ${CMAKE_DL_LIBS} wsock32 ws2_32 ${expat_lib})
target_link_libraries(${OSUBaseName} ${OMSISolverName} ${CMAKE_DL_LIBS} wsock32 ws2_32 ${expat_lib})
ELSE(WIN32)
target_link_libraries(${OSUBaseName} ${OMSISolverName} ${CMAKE_DL_LIBS} ${expat_lib})
target_link_libraries(${OSUBaseName} ${OMSISolverName} ${CMAKE_DL_LIBS} ${expat_lib})
ENDIF(WIN32)

set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_INSTALL_RPATH "${LIBINSTALLEXT}")

install(TARGETS ${OSUBaseName} DESTINATION ${LIBINSTALLEXT})

install(FILES ${CMAKE_SOURCE_DIR}/../../3rdParty/FMIL/build/ExpatEx/libexpat.a DESTINATION ${LIBINSTALLEXT})


install(FILES
${CMAKE_SOURCE_DIR}/base/include/omsi_event_helper.h
${CMAKE_SOURCE_DIR}/base/include/omsi_getters_and_setters.h
Expand All @@ -58,6 +65,3 @@ install(FILES
${CMAKE_SOURCE_DIR}/base/include/omsi_utils.h
${CMAKE_SOURCE_DIR}/base/include/uthash.h
DESTINATION include/omc/omsi/base)



202 changes: 128 additions & 74 deletions OMCompiler/SimulationRuntime/OMSI/solver/CMakeLists.txt
@@ -1,74 +1,128 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.9)
#OpenModelica Simulation Interface solver
PROJECT(OMSISolver)
SET(CMAKE_VERBOSE_MAKEFILE ON)

# Find blas and lapack
IF(IS_MINGW32)
SET(LAPACK_MINGW $ENV{OMDEV}/tools/msys/mingw32/bin/libopenblas.dll)
SET(LAPACK_LIBRARIES ${LAPACK_MINGW})
ELSEIF(IS_MINGW64)
SET(LAPACK_MINGW $ENV{OMDEV}/tools/msys/mingw64/bin/libopenblas.dll)
SET(LAPACK_LIBRARIES ${LAPACK_MINGW})
ELSE()
FIND_PACKAGE(BLAS)
FIND_PACKAGE(LAPACK)
ENDIF()

IF (BLAS_FOUND STREQUAL "NOTFOUND")
MESSAGE(FATAL_ERROR "Error: Blas Libraries not found!")
ENDIF()
IF (LAPACK_FOUND STREQUAL "NOTFOUND")
MESSAGE(FATAL_ERROR "Error: Lapack Libraries not found!")
ENDIF()
MESSAGE(STATUS "Lapack Libraries: ${LAPACK_LIBRARIES}")

IF(MSVC)
#workaround because cmake does not find the lapack libraries for Visual Studio 10
SET(LAPACK_MSVC_10 $ENV{OMDEV}/lib/3rdParty/Lapack/Lib/lapack_win32.lib )
SET(BLAS_MSVC_10 $ENV{OMDEV}/lib/3rdParty/Lapack/Lib/blas_win32.lib )
SET(LAPACK_LIBRARIES ${LAPACK_MSVC_10} ${BLAS_MSVC_10} )
MESSAGE(STATUS "Using manual set Lapack Libraries: ${LAPACK_LIBRARIES}")
ENDIF(MSVC)

# Find SUNDIALS KINSOL libraries
FIND_LIBRARY(KINSOL_LIBRARIE sundials_kinsol
PATHS ${CMAKE_INSTALL_PREFIX}/${LIB_OMC}
NO_DEFAULT_PATH)
IF (NOT KINSOL_LIBRARIE)
MESSAGE(FATAL_ERROR "Error: SUNDIALS KINSOL library not found!")
ENDIF()

FIND_LIBRARY(SUNDIALS_NVEC_LIBRARIE sundials_nvecserial
PATHS ${CMAKE_INSTALL_PREFIX}/${LIB_OMC}
NO_DEFAULT_PATH)
IF(NOT SUNDIALS_NVEC_LIBRARIE)
MESSAGE(FATAL_ERROR "Error: sundials_nvec_serial library not found!")
ENDIF()

include_directories ("${CMAKE_INSTALL_PREFIX}/include/omc/c/sundials")
MESSAGE(STATUS "Location of SUNDIALS headers: ${CMAKE_INSTALL_PREFIX}/include/omc/c/sundials")

SET(SUNDIALS_LIBRARIES ${KINSOL_LIBRARIE} ${SUNDIALS_NVEC_LIBRARIE})
MESSAGE(STATUS "KINSOL Libraries: ${SUNDIALS_LIBRARIES}")

# OMSISolver includes
include_directories ("${CMAKE_SOURCE_DIR}/solver/include")

add_library(${OMSISolverName}
src/solver_api.c
src/solver_helper.c
src/solver_kinsol.c
src/solver_lapack.c
)


target_link_libraries(${OMSISolverName} ${CMAKE_DL_LIBS} ${LAPACK_LIBRARIES} ${SUNDIALS_LIBRARIES})

install(TARGETS ${OMSISolverName} DESTINATION ${LIBINSTALLEXT})

install(FILES
${CMAKE_SOURCE_DIR}/solver/include/omsi_solver.h
${CMAKE_SOURCE_DIR}/solver/include/solver_api.h
${CMAKE_SOURCE_DIR}/solver/include/solver_helper.h
DESTINATION include/omc/omsi/solver)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.9)
#OpenModelica Simulation Interface solver
PROJECT(OMSISolver)
SET(CMAKE_VERBOSE_MAKEFILE ON)

# Global Variables
IF(NOT OMCTRUNCHOME)
SET(OMCTRUNCHOME ${CMAKE_CURRENT_SOURCE_DIR}/../../../..)
ENDIF (NOT OMCTRUNCHOME)

############################
# Find BLAS and LAPACK
############################
IF(IS_MINGW32)
SET(LAPACK_MINGW $ENV{OMDEV}/tools/msys/mingw32/bin/libopenblas.dll)
SET(LAPACK_LIBRARIES ${LAPACK_MINGW})
ELSEIF(IS_MINGW64)
SET(LAPACK_MINGW $ENV{OMDEV}/tools/msys/mingw64/bin/libopenblas.dll)
SET(LAPACK_LIBRARIES ${LAPACK_MINGW})
ELSE()
FIND_PACKAGE(BLAS)
FIND_PACKAGE(LAPACK)
ENDIF()

IF (BLAS_FOUND STREQUAL "NOTFOUND")
MESSAGE(FATAL_ERROR "Error: Blas Libraries not found!")
ENDIF()
IF (LAPACK_FOUND STREQUAL "NOTFOUND")
MESSAGE(FATAL_ERROR "Error: Lapack Libraries not found!")
ENDIF()
MESSAGE(STATUS "Lapack Libraries: ${LAPACK_LIBRARIES}")

IF(MSVC)
#workaround because cmake does not find the lapack libraries for Visual Studio 10
SET(LAPACK_MSVC_10 $ENV{OMDEV}/lib/3rdParty/Lapack/Lib/lapack_win32.lib )
SET(BLAS_MSVC_10 $ENV{OMDEV}/lib/3rdParty/Lapack/Lib/blas_win32.lib )
SET(LAPACK_LIBRARIES ${LAPACK_MSVC_10} ${BLAS_MSVC_10} )
MESSAGE(STATUS "Using manual set Lapack Libraries: ${LAPACK_LIBRARIES}")
ENDIF(MSVC)


############################
# Find SUNDIALS libraries #
############################
IF(MSVC)
SET(SUNDIALS_PATH "${OMCTRUNCHOME}/OMCompiler/3rdParty/sundials/build_msvc")
ELSE(MSVC)
SET(SUNDIALS_PATH "${OMCTRUNCHOME}/OMCompiler/3rdParty/sundials/build")
ENDIF(MSVC)

MESSAGE(STATUS "Sundials path:")
MESSAGE(STATUS "${SUNDIALS_PATH}")

# SUNDIALS Header
FIND_PATH(SUNDIALS_INCLUDE_DIR "sundials/sundials_config.h" ${SUNDIALS_PATH}/include NO_DEFAULT_PATH)
IF (NOT SUNDIALS_INCLUDE_DIR)
MESSAGE(FATAL_ERROR "Could not find Sundials; compile omc first")
ENDIF(NOT SUNDIALS_INCLUDE_DIR)

MESSAGE(STATUS "Sundials include:")
MESSAGE(STATUS "${SUNDIALS_INCLUDE_DIR}")
INCLUDE_DIRECTORIES(${SUNDIALS_INCLUDE_DIR})

# SUNDIALS Libraires
FIND_LIBRARY(SUNDIALS_LIBRARY_NVEC NAMES sundials_nvecserial PATHS ${SUNDIALS_PATH}/lib NO_DEFAULT_PATH)
FIND_LIBRARY(SUNDIALS_KINSOL NAMES sundials_kinsol PATHS ${SUNDIALS_PATH}/lib NO_DEFAULT_PATH)

# Check if all libraries found
IF(NOT SUNDIALS_LIBRARY_NVEC)
MESSAGE(FATAL_ERROR "Could not find libsundials_nvecserial!")
ENDIF()
IF(NOT SUNDIALS_KINSOL)
MESSAGE(FATAL_ERROR "Could not find libsundials_kinsol!")
ENDIF()

SET(SUNDIALS_LIBRARIES ${SUNDIALS_LIBRARY_NVEC} ${SUNDIALS_KINSOL})
MESSAGE(STATUS "Used Sundials libraries: ${SUNDIALS_LIBRARIES}")

# Extract the version number from sundials_config.h
FIND_PATH(SUNDIALS_CONFIG_FILE "sundials_config.h" "${SUNDIALS_INCLUDE_DIR}" "${SUNDIALS_INCLUDE_DIR}/sundials")
IF(NOT SUNDIALS_CONFIG_FILE)
MESSAGE(WARNING "Could not find sundials_config.h")
MESSAGE(WARNING "Could not determine sundials version")
ENDIF(NOT SUNDIALS_CONFIG_FILE)

SET(SUNDIALS_CONFIG_FILE "${SUNDIALS_CONFIG_FILE}/sundials_config.h")
FILE(READ "${SUNDIALS_CONFIG_FILE}" SUNDIALS_CONFIG_FILE_CONTENT)
STRING(REGEX MATCH "#define SUNDIALS_PACKAGE_VERSION .([0-9]+)\\.([0-9]+)\\.([0-9]+)." _ ${SUNDIALS_CONFIG_FILE_CONTENT})
IF(NOT CMAKE_MATCH_1)
# Newer versions have different define in header file
STRING(REGEX MATCH "#define SUNDIALS_VERSION .([0-9]+)\\.([0-9]+)\\.([0-9]+)." _ ${SUNDIALS_CONFIG_FILE_CONTENT})
ENDIF(NOT CMAKE_MATCH_1)

IF(CMAKE_MATCH_1 AND CMAKE_MATCH_2 AND CMAKE_MATCH_3)
SET(SUNDIALS_MAJOR_VERSION "${CMAKE_MATCH_1}")
SET(SUNDIALS_MINOR_VERSION "${CMAKE_MATCH_2}")
SET(SUNDIALS_PATCH_VERSION "${CMAKE_MATCH_3}")

ADD_DEFINITIONS("-DSUNDIALS_MAJOR_VERSION=${SUNDIALS_MAJOR_VERSION}")
ADD_DEFINITIONS("-DSUNDIALS_MINOR_VERSION=${SUNDIALS_MINOR_VERSION}")
ELSE()
MESSAGE(FATAL_ERROR "Could not determine sundials version")
ENDIF()
MESSAGE(STATUS "Using sundials ${SUNDIALS_MAJOR_VERSION}.${SUNDIALS_MINOR_VERSION}.${SUNDIALS_PATCH_VERSION}")


####################################
# OMSISolver includes
####################################
include_directories ("${CMAKE_SOURCE_DIR}/solver/include" ${SUNDIALS_INCLUDE_DIR})

add_library(${OMSISolverName}
src/solver_api.c
src/solver_helper.c
src/solver_kinsol.c
src/solver_lapack.c
)

set(CMAKE_MACOSX_RPATH 1) # Handle rpath on mac in makefiles
target_link_libraries(${OMSISolverName} ${CMAKE_DL_LIBS} ${LAPACK_LIBRARIES} ${SUNDIALS_LIBRARIES})

install(TARGETS ${OMSISolverName} DESTINATION ${LIBINSTALLEXT})

install(FILES
${CMAKE_SOURCE_DIR}/solver/include/omsi_solver.h
${CMAKE_SOURCE_DIR}/solver/include/solver_api.h
${CMAKE_SOURCE_DIR}/solver/include/solver_helper.h
DESTINATION include/omc/omsi/solver)

0 comments on commit 708c502

Please sign in to comment.