ResInsight/OctavePlugin/CMakeLists.txt

265 lines
11 KiB
CMake

# Some of the functionality in this CMakeLists.txt might be easier to maintain if we use a CMake macro to find configuration info for Octave
# This file is currently (2.8.12) not part of default CMake installation
# See http://www.cmake.org/Wiki/CMakeUserFindOctave
set(CPP_SOURCES
riGetActiveCellProperty.cpp
riSetActiveCellProperty.cpp
riGetActiveCellInfo.cpp
riGetMainGridDimensions.cpp
riGetNNCConnections.cpp
riGetNNCPropertyNames.cpp
riGetCurrentCase.cpp
riGetCaseGroups.cpp
riGetDynamicNNCValues.cpp
riGetStaticNNCValues.cpp
riGetSelectedCases.cpp
riGetSelectedCells.cpp
riGetCases.cpp
riGetTimeStepDates.cpp
riGetTimeStepDays.cpp
riGetGridDimensions.cpp
riGetCoarseningInfo.cpp
riGetCellCenters.cpp
riGetActiveCellCenters.cpp
riGetCellCorners.cpp
riGetActiveCellCorners.cpp
riGetGridProperty.cpp
riSetGridProperty.cpp
riGetGridPropertyForSelectedCells.cpp
riGetPropertyNames.cpp
riGetWellNames.cpp
riGetWellStatus.cpp
riGetWellCells.cpp
riSetNNCProperty.cpp
)
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
# since the compiler passes the option to the linker, double quoting is necessary
set (RPATH_COMMAND "-Wl,-rpath,'\\$$ORIGIN'")
endif()
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set (QT_LIBRARY_POSTFIX 4)
if (CMAKE_CL_64)
option(RESINSIGHT_OCTAVE_PLUGIN_32_BIT "Windows Only: Set 32-bit MSVC compiler environment while running mkoctfile" OFF)
mark_as_advanced(FORCE RESINSIGHT_OCTAVE_PLUGIN_32_BIT)
endif()
endif()
# recreate the magic that CMake does for MacOS X frameworks in the
# include list when we call mkoctfile as a custom command
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set (QT_INCLUDES)
set (QT_FRAMEWORKS)
# QT_INCLUDE_DIR contains two items; the first is the directory
# containing header files, the second is the framework. This
# setup is specially processed in include_directories (); CMake
# will add -F before the frameworks. We will have to replicate
# that setup here when we want to pass it directly to a command
# see <http://www.cmake.org/Bug/print_bug_page.php?bug_id=10632>
foreach (item IN ITEMS ${QT_QTNETWORK_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR} ${QT_INCLUDE_DIR})
if ("${item}" MATCHES ".framework$")
get_filename_component (frmwrk_path ${item} PATH)
get_filename_component (frmwrk_name ${item} NAME_WE)
# mkoctfile doesn't support arbitrary compiler command,
# so we must wrap in -Wl, to pass to the linker
list (APPEND QT_FRAMEWORKS "-Wl,-F${frmwrk_path}")
list (APPEND QT_FRAMEWORKS "-Wl,-framework,${frmwrk_name}")
else ()
list (APPEND QT_INCLUDES "-I${item}")
endif ()
endforeach (item)
if (QT_INCLUDES)
list (REMOVE_DUPLICATES QT_INCLUDES)
endif ()
if (QT_FRAMEWORKS)
list (REMOVE_DUPLICATES QT_FRAMEWORKS)
endif ()
endif ()
# Find location of Octave based on mkoctfile
find_program(RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE mkoctfile)
if(RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE)
get_filename_component(RESINSIGHT_OCTAVE_BIN_DIR ${RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE} PATH)
STRING(REPLACE "/bin" "" OCTAVE_HOME ${RESINSIGHT_OCTAVE_BIN_DIR})
else()
message(WARNING "Failed to find mkoctfile, no Octave plugins will be compiled. Please specify RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE")
endif()
set(RESINSIGHT_OCTAVE_PLUGIN_QMAKE "" CACHE FILEPATH "Windows Only: Set this equal to RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE")
if(RESINSIGHT_OCTAVE_PLUGIN_QMAKE)
get_filename_component(OCTAVE_QMAKE_DIR ${RESINSIGHT_OCTAVE_PLUGIN_QMAKE} PATH)
STRING(REPLACE "/bin" "" OCTAVE_QT_ROOT ${OCTAVE_QMAKE_DIR})
message(STATUS "Compiling Octave plugins using custom Qt located at ${OCTAVE_QT_ROOT}")
SET(OCTAVE_QT_INCLUDE_DIR ${OCTAVE_QT_ROOT}/include)
SET(OCTAVE_QT_QTCORE_INCLUDE_DIR ${OCTAVE_QT_ROOT}/include/QtCore)
SET(OCTAVE_QT_QTNETWORK_INCLUDE_DIR ${OCTAVE_QT_ROOT}/include/QtNetwork)
SET(OCTAVE_QT_LIBRARY_DIR ${OCTAVE_QT_ROOT}/lib)
else()
set (RESINSIGHT_OCTAVE_PLUGIN_QMAKE ${QT_QMAKE_EXECUTABLE})
message(STATUS "Compiling Octave plugins using system Qt - include path located at ${RESINSIGHT_OCTAVE_PLUGIN_QMAKE}")
SET(OCTAVE_QT_INCLUDE_DIR ${QT_INCLUDE_DIR})
SET(OCTAVE_QT_QTCORE_INCLUDE_DIR ${QT_QTCORE_INCLUDE_DIR})
SET(OCTAVE_QT_QTNETWORK_INCLUDE_DIR ${QT_QTNETWORK_INCLUDE_DIR})
SET(OCTAVE_QT_LIBRARY_DIR ${QT_LIBRARY_DIR})
endif()
# Clear the list of binary oct files to be produced
set(OCTAVE_BINARY_OCT_FILES)
if (RESINSIGHT_OCTAVE_PLUGIN_QMAKE AND RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE)
foreach(srcFileName IN LISTS CPP_SOURCES)
if(NOT IS_ABSOLUTE "${srcFileName}")
set(srcFileName "${CMAKE_CURRENT_SOURCE_DIR}/${srcFileName}")
endif()
get_filename_component(baseFilename "${srcFileName}" NAME_WE)
set(octFileName "${CMAKE_CURRENT_BINARY_DIR}/${baseFilename}.oct")
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
if (CMAKE_CL_64 AND RESINSIGHT_OCTAVE_PLUGIN_32_BIT)
SET(RESINSIGHT_VCVARS_32BIT_CMD call "\"%VS100COMNTOOLS%../../VC/vcvarsall.bat\"" x86)
endif()
add_custom_command(
OUTPUT "${octFileName}"
COMMAND ${RESINSIGHT_VCVARS_32BIT_CMD}
COMMAND set "OCTAVE_HOME=${OCTAVE_HOME}"
COMMAND set "PATH=%OCTAVE_HOME%\\bin;%PATH%"
COMMAND mkoctfile -I${OCTAVE_QT_QTNETWORK_INCLUDE_DIR}
-I${OCTAVE_QT_QTCORE_INCLUDE_DIR}
-I${OCTAVE_QT_INCLUDE_DIR}
-I${ResInsight_SOURCE_DIR}/ApplicationCode/SocketInterface
${RPATH_COMMAND} -L${OCTAVE_QT_LIBRARY_DIR} -lQtCore${QT_LIBRARY_POSTFIX} -lQtNetwork${QT_LIBRARY_POSTFIX}
-o "${octFileName}" "${srcFileName}"
DEPENDS "${srcFileName}"
COMMENT "===> Generating ${octFileName}"
)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
add_custom_command(
OUTPUT "${octFileName}"
COMMAND ${RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE}
${QT_INCLUDES}
${QT_FRAMEWORKS}
-I${ResInsight_SOURCE_DIR}/ApplicationCode/SocketInterface
${RPATH_COMMAND}
-L${QT_LIBRARY_DIR} -Wl,-framework,QtCore -Wl,-framework,QtNetwork
-o "${octFileName}"
"${srcFileName}"
DEPENDS "${srcFileName}"
COMMENT "===> Generating ${octFileName}"
)
else()
add_custom_command(
OUTPUT "${octFileName}"
COMMAND OCTAVE_HOME=${OCTAVE_HOME} ${RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE}
-I${OCTAVE_QT_QTNETWORK_INCLUDE_DIR} -I${OCTAVE_QT_QTCORE_INCLUDE_DIR} -I${OCTAVE_QT_INCLUDE_DIR} -I${ResInsight_SOURCE_DIR}/ApplicationCode/SocketInterface ${RPATH_COMMAND}
-L${OCTAVE_QT_LIBRARY_DIR} -lQtCore -lQtNetwork -o "${octFileName}" "${srcFileName}"
DEPENDS "${srcFileName}"
COMMENT "===> Generating ${octFileName}"
)
endif()
list(APPEND OCTAVE_BINARY_OCT_FILES "${octFileName}")
endforeach()
add_custom_target(octave_plugins ALL DEPENDS
"${CMAKE_CURRENT_BINARY_DIR}/riGetActiveCellProperty.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riSetActiveCellProperty.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetActiveCellInfo.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetMainGridDimensions.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetNNCConnections.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetNNCPropertyNames.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetDynamicNNCValues.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetStaticNNCValues.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetCurrentCase.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetCaseGroups.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetSelectedCases.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetSelectedCells.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetCases.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetTimeStepDates.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetTimeStepDays.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetGridDimensions.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetCoarseningInfo.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetCellCenters.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetActiveCellCenters.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetCellCorners.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetActiveCellCorners.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetGridProperty.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riSetGridProperty.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetGridPropertyForSelectedCells.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetPropertyNames.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetWellNames.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetWellStatus.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riGetWellCells.oct"
"${CMAKE_CURRENT_BINARY_DIR}/riSetNNCProperty.oct"
SOURCES
${CPP_SOURCES}
riSettings.h
)
# Copy Octave generated *.oct files to application folder, will make it possible to use Octave functions
# directly from the location of the ResInsight binaries
if (true)
foreach (oct_bin ${OCTAVE_BINARY_OCT_FILES})
get_filename_component(Filename "${oct_bin}" NAME)
if(MSVC)
add_custom_command(TARGET octave_plugins POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${oct_bin}"
"${CMAKE_CURRENT_BINARY_DIR}/../ApplicationCode/$<CONFIGURATION>/${Filename}"
)
else()
add_custom_command(TARGET octave_plugins POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${oct_bin}"
"${CMAKE_CURRENT_BINARY_DIR}/../ApplicationCode/${Filename}"
)
endif()
endforeach( oct_bin )
endif()
# Make ResInsight dependant on Octave, makes it easiser to debug Octave functionality by compiling ResInsight
add_dependencies(ResInsight octave_plugins)
if (RESINSIGHT_PRIVATE_INSTALL)
install(FILES ${OCTAVE_BINARY_OCT_FILES} DESTINATION ${RESINSIGHT_INSTALL_FOLDER})
else (RESINSIGHT_PRIVATE_INSTALL)
# probe for site location of .oct files
if (NOT OCTAVE_SITE_OCT_DIR)
find_program (OCTAVE_CONFIG_COMMAND
octave-config
DOC "Path to Octave component and library information retrieval"
)
exec_program (${OCTAVE_CONFIG_COMMAND}
ARGS --oct-site-dir
OUTPUT_VARIABLE OCTAVE_SITE_OCT_DIR
)
set (OCTAVE_SITE_OCT_DIR "${OCTAVE_SITE_OCT_DIR}" CACHE LOCATION "Octave plugin directory")
endif (NOT OCTAVE_SITE_OCT_DIR)
install (FILES ${OCTAVE_BINARY_OCT_FILES}
DESTINATION ${OCTAVE_SITE_OCT_DIR}
)
endif (RESINSIGHT_PRIVATE_INSTALL)
endif (RESINSIGHT_OCTAVE_PLUGIN_QMAKE AND RESINSIGHT_OCTAVE_PLUGIN_MKOCTFILE)