mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
By using a separate variable for this we can easily grep for where the build system depends on its own location, and also change the policy regarding this later. Note that there is no opm-macros module; this is a "psuedo"-module which links to an additional one (currently, the one we're in)
146 lines
4.6 KiB
CMake
146 lines
4.6 KiB
CMake
# - Helper routines for opm-core like projects
|
|
|
|
include (LibtoolArchives) # linker_cmdline
|
|
|
|
# convert a list back to a command-line string
|
|
function (unseparate_args var_name prefix value)
|
|
separate_arguments (value)
|
|
foreach (item IN LISTS value)
|
|
set (prefixed_item "${prefix}${item}")
|
|
if (${var_name})
|
|
set (${var_name} "${${var_name}} ${prefixed_item}")
|
|
else (${var_name})
|
|
set (${var_name} "${prefixed_item}")
|
|
endif (${var_name})
|
|
endforeach (item)
|
|
set (${var_name} "${${var_name}}" PARENT_SCOPE)
|
|
endfunction (unseparate_args var_name prefix value)
|
|
|
|
# wrapper to set variables in pkg-config file
|
|
function (configure_pc_file name source dest prefix libdir includedir)
|
|
# escape set of standard strings
|
|
unseparate_args (includes "-I" "${${name}_INCLUDE_DIRS}")
|
|
unseparate_args (defs "" "${${name}_DEFINITIONS}")
|
|
linker_cmdline (STRING INTO libs FROM ${${name}_LIBRARIES})
|
|
|
|
# necessary to make these variables visible to configure_file
|
|
set (name "${${name}_NAME}")
|
|
set (description "${${name}_DESCRIPTION}")
|
|
set (major "${${name}_VERSION_MAJOR}")
|
|
set (minor "${${name}_VERSION_MINOR}")
|
|
set (target "${${name}_LIBRARY}")
|
|
linker_cmdline (STRING INTO target from ${target})
|
|
|
|
configure_file (${source} ${dest} @ONLY)
|
|
endfunction (configure_pc_file name source dist prefix libdir includedir)
|
|
|
|
function (configure_cmake_file name variant version)
|
|
# declarative list of the variable names that are used in the template
|
|
# and that must be defined in the project to be exported
|
|
set (variable_suffices
|
|
DESCRIPTION
|
|
VERSION
|
|
DEFINITIONS
|
|
INCLUDE_DIRS
|
|
LIBRARY_DIRS
|
|
LINKER_FLAGS
|
|
CONFIG_VARS
|
|
LIBRARY
|
|
LIBRARIES
|
|
TARGET
|
|
)
|
|
|
|
# set these variables temporarily (this is in a function scope) so
|
|
# they are available to the template (only)
|
|
foreach (suffix IN LISTS variable_suffices)
|
|
set (opm-project_${suffix} "${${name}_${suffix}}")
|
|
endforeach (suffix)
|
|
set (opm-project_NAME "${${name}_NAME}")
|
|
|
|
# make the file substitutions
|
|
configure_file (
|
|
${template_dir}/opm-project-config${version}.cmake.in
|
|
${PROJECT_BINARY_DIR}/${${name}_NAME}-${variant}${version}.cmake
|
|
@ONLY
|
|
)
|
|
endfunction (configure_cmake_file name)
|
|
|
|
# installation of CMake modules to help user programs locate the library
|
|
function (opm_cmake_config name)
|
|
# assume that the template is located in cmake/Templates (cannot use
|
|
# the current directory since this is in a function and the directory
|
|
# at runtime not at definition will be used
|
|
set (template_dir "${OPM_MACROS_ROOT}/cmake/Templates")
|
|
|
|
# write configuration file to locate library
|
|
configure_cmake_file (${name} "config" "")
|
|
configure_cmake_file (${name} "config" "-version")
|
|
configure_vars (
|
|
FILE CMAKE "${PROJECT_BINARY_DIR}/${${name}_NAME}-config.cmake"
|
|
APPEND "${${name}_CONFIG_VARS}"
|
|
)
|
|
|
|
# config-mode .pc file; use this to find the build tree
|
|
configure_pc_file (
|
|
${name}
|
|
${template_dir}/opm-project.pc.in
|
|
${PROJECT_BINARY_DIR}/${${name}_NAME}.pc
|
|
${PROJECT_BINARY_DIR}
|
|
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
|
|
${PROJECT_SOURCE_DIR}
|
|
)
|
|
|
|
# replace the build directory with the target directory in the
|
|
# variables that contains build paths
|
|
string (REPLACE
|
|
"${PROJECT_SOURCE_DIR}"
|
|
"${CMAKE_INSTALL_PREFIX}/include"
|
|
${name}_INCLUDE_DIRS
|
|
"${${name}_INCLUDE_DIRS}"
|
|
)
|
|
string (REPLACE
|
|
"${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
|
|
"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}"
|
|
${name}_LIBRARY
|
|
"${${name}_LIBRARY}"
|
|
)
|
|
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY
|
|
"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}"
|
|
)
|
|
# create a config mode file which targets the install directory instead
|
|
# of the build directory (using the same input template)
|
|
configure_cmake_file (${name} "install" "")
|
|
configure_vars (
|
|
FILE CMAKE "${PROJECT_BINARY_DIR}/${${name}_NAME}-install.cmake"
|
|
APPEND "${${name}_CONFIG_VARS}"
|
|
)
|
|
# this file gets copied to the final installation directory
|
|
install (
|
|
FILES ${PROJECT_BINARY_DIR}/${${name}_NAME}-install.cmake
|
|
DESTINATION share/cmake/${${name}_NAME}
|
|
RENAME ${${name}_NAME}-config.cmake
|
|
)
|
|
# assume that there exists a version file already
|
|
install (
|
|
FILES ${PROJECT_BINARY_DIR}/${${name}_NAME}-config-version.cmake
|
|
DESTINATION share/cmake/${${name}_NAME}
|
|
)
|
|
|
|
# find-mode .pc file; use this to locate system installation
|
|
configure_pc_file (
|
|
${name}
|
|
${template_dir}/opm-project.pc.in
|
|
${PROJECT_BINARY_DIR}/${${name}_NAME}-install.pc
|
|
${CMAKE_INSTALL_PREFIX}
|
|
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
|
|
${CMAKE_INSTALL_PREFIX}/include
|
|
)
|
|
|
|
# put this in the right system location; assume that we have binaries
|
|
install (
|
|
FILES ${PROJECT_BINARY_DIR}/${${name}_NAME}-install.pc
|
|
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/pkgconfig/
|
|
RENAME ${${name}_NAME}.pc
|
|
)
|
|
endfunction (opm_cmake_config name)
|