Commit 312181d4 authored by Utkarsh Ayachit's avatar Utkarsh Ayachit Committed by Ben Boeckel
Browse files

vtkIOADIOS: update to the new module system

parent 4e1a98b3
# - Find ADIOS library, routines for scientific, parallel IO
# - Find ADIOS 1.x library, routines for scientific, parallel IO
# https://www.olcf.ornl.gov/center-projects/adios/
#
# Use this module by invoking find_package with the form:
# find_package(ADIOS
# find_package(ADIOS1
# [version] [EXACT] # Minimum or EXACT version, e.g. 1.6.0
# [REQUIRED] # Fail with an error if ADIOS or a required
# # component is not found
......@@ -11,45 +11,46 @@
# sequential (all are case insentative)
# )
#
# Module that finds the includes and libraries for a working ADIOS install.
# Module that finds the includes and libraries for a working ADIOS 1.x install.
# This module invokes the `adios_config` script that should be installed with
# the other ADIOS tools.
#
# To provide a hint to the module where to find the ADIOS installation,
# set the ADIOS_ROOT environment variable.
# set the ADIOS1_ROOT environment variable.
#
# If this variable is not set, make sure that at least the according `bin/`
# directory of ADIOS is in your PATH environment variable.
# directory of ADIOS 1.x is in your PATH environment variable.
#
# Set the following CMake variables BEFORE calling find_packages to
# influence this module:
# ADIOS_USE_STATIC_LIBS - Set to ON to force the use of static
# ADIOS1_USE_STATIC_LIBS - Set to ON to force the use of static
# libraries. Default: OFF
#
# This module will define the following variables:
# ADIOS_INCLUDE_DIRS - Include directories for the ADIOS headers.
# ADIOS_LIBRARIES - ADIOS libraries.
# ADIOS_FOUND - TRUE if FindADIOS found a working install
# ADIOS_VERSION - Version in format Major.Minor.Patch
# ADIOS1_INCLUDE_DIRS - Include directories for the ADIOS 1.x headers.
# ADIOS1_LIBRARY_PATH - Full path of the libadios library (.a or .so file)
# ADIOS1_DEPENDENCY_LIBRARIES - ADIOS 1.x dependency libraries.
# ADIOS1_FOUND - TRUE if FindADIOS1 found a working install
# ADIOS1_VERSION - Version in format Major.Minor.Patch
#
# Not used for now:
# ADIOS_DEFINITIONS - Compiler definitions you should add with
# add_definitions(${ADIOS_DEFINITIONS})
# ADIOS1_DEFINITIONS - Compiler definitions you should add with
# add_definitions(${ADIOS1_DEFINITIONS})
#
# Example to find ADIOS (default)
# find_package(ADIOS)
# if(ADIOS_FOUND)
# include_directories(${ADIOS_INCLUDE_DIRS})
# Example to find ADIOS 1.x (default)
# find_package(ADIOS1)
# if(ADIOS1_FOUND)
# include_directories(${ADIOS1_INCLUDE_DIRS})
# add_executable(foo foo.c)
# target_link_libraries(foo ${ADIOS_LIBRARIES})
# target_link_libraries(foo ${ADIOS1_LIBRARY_PATH} ADIOS1_DEPENDENCY_LIBRARIES)
# endif()
# Example to find ADIOS using component
# find_package(ADIOS COMPONENTS fortran)
# if(ADIOS_FOUND)
# include_directories(${ADIOS_INCLUDE_DIRS})
# Example to find ADIOS 1.x using component
# find_package(ADIOS1 COMPONENTS fortran)
# if(ADIOS1_FOUND)
# include_directories(${ADIOS1_INCLUDE_DIRS})
# add_executable(foo foo.c)
# target_link_libraries(foo ${ADIOS_LIBRARIES})
# target_link_libraries(foo ${ADIOS1_LIBRARY_PATH} ${ADIOS1_DEPENDENCY_LIBRARIES})
# endif()
###############################################################################
#Copyright (c) 2014, Axel Huebl and Felix Schmitt from http://picongpu.hzdr.de
......@@ -82,168 +83,111 @@
###############################################################################
###############################################################################
# Required cmake version
###############################################################################
cmake_minimum_required(VERSION 2.8.5)
###############################################################################
# ADIOS
###############################################################################
# get flags for adios_config, -l is the default
#-f for fortran, -r for readonly, -s for sequential (nompi)
set(OPTLIST "-l")
if(ADIOS_FIND_COMPONENTS)
foreach(COMP ${ADIOS_FIND_COMPONENTS})
string(TOLOWER ${COMP} comp)
if(comp STREQUAL "fortran")
set(OPTLIST ${OPTLIST} f)
elseif(comp STREQUAL "readonly")
set(OPTLIST ${OPTLIST} r)
elseif(comp STREQUAL "sequential")
set(OPTLIST ${OPTLIST} s)
else()
message("ADIOS component ${COMP} is not supported. Please use fortran, readonly, or sequential")
endif()
endforeach()
if(ADIOS1_FIND_COMPONENTS)
foreach(comp IN LISTS ADIOS1_FIND_COMPONENTS)
string(TOLOWER "${comp}" comp)
if(comp STREQUAL "fortran")
set(adios1_config_opt "-f")
elseif(comp STREQUAL "readonly")
set(adios1_config_opt "-r")
elseif(comp STREQUAL "sequential")
set(adios1_config_opt "-s")
else()
message("ADIOS 1.x component ${comp} is not supported. Please use fortran, readonly, or sequential")
endif()
endforeach()
endif()
# we start by assuming we found ADIOS and falsify it if some
# dependencies are missing (or if we did not find ADIOS at all)
set(ADIOS_FOUND TRUE)
set(adios1_config_hints)
foreach(PREFIX_VAR IN ITEMS ADIOS1_ROOT INSTALL_PREFIX)
if(${PREFIX_VAR})
list(APPEND adios1_config_hints "${${PREFIX_VAR}}/bin")
elseif(NOT ("$ENV{${PREFIX_VAR}}" STREQUAL ""))
list(APPEND adios1_config_hints "$ENV{${PREFIX_VAR}}/bin")
endif()
endforeach()
# find `adios_config` program #################################################
# check the ADIOS_ROOT hint and the normal PATH
find_file(ADIOS_CONFIG
NAME adios_config
PATHS $ENV{ADIOS_ROOT}/bin $ENV{ADIOS_DIR}/bin $ENV{INSTALL_PREFIX}/bin $ENV{PATH})
if(ADIOS_CONFIG)
message(STATUS "Found 'adios_config': ${ADIOS_CONFIG}")
else(ADIOS_CONFIG)
set(ADIOS_FOUND FALSE)
message(STATUS "Can NOT find 'adios_config' - set ADIOS_ROOT, ADIOS_DIR or INSTALL_PREFIX, or check your PATH")
endif(ADIOS_CONFIG)
find_program(ADIOS1_CONFIG NAME adios_config HINTS ${adios1_config_hints})
# check `adios_config` program ################################################
if(ADIOS_FOUND)
execute_process(COMMAND ${ADIOS_CONFIG} ${OPTLIST}
OUTPUT_VARIABLE ADIOS_LINKFLAGS
RESULT_VARIABLE ADIOS_CONFIG_RETURN
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT ADIOS_CONFIG_RETURN EQUAL 0)
set(ADIOS_FOUND FALSE)
message(STATUS "Can NOT execute 'adios_config' - check file permissions")
endif()
# find ADIOS_ROOT_DIR
execute_process(COMMAND ${ADIOS_CONFIG} -d
OUTPUT_VARIABLE ADIOS_ROOT_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT IS_DIRECTORY "${ADIOS_ROOT_DIR}")
set(ADIOS_FOUND FALSE)
message(STATUS "The directory provided by 'adios_config -d' does not exist: ${ADIOS_ROOT_DIR}")
endif()
endif(ADIOS_FOUND)
# option: use only static libs ################################################
if(ADIOS_USE_STATIC_LIBS)
# carfully: we have to restore the original path in the end
set(_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
endif()
# we found something in ADIOS_ROOT_DIR and adios_config works #################
if(ADIOS_FOUND)
# ADIOS headers
list(APPEND ADIOS_INCLUDE_DIRS ${ADIOS_ROOT_DIR}/include)
# check for compiled in dependencies, recomve ";" in ADIOS_LINKFLAGS (from cmake build)
string(REGEX REPLACE ";" " " ADIOS_LINKFLAGS "${ADIOS_LINKFLAGS}")
message(STATUS "ADIOS linker flags (unparsed): ${ADIOS_LINKFLAGS}")
# find all library paths -L
# note: this can cause trouble if some libs are specified twice from
# different sources (quite unlikely)
# http://www.cmake.org/pipermail/cmake/2008-November/025128.html
set(ADIOS_LIBRARY_DIRS "")
string(REGEX MATCHALL "-L([A-Za-z_0-9/\\.-]+)" _ADIOS_LIBDIRS "${ADIOS_LINKFLAGS}")
foreach(_LIBDIR ${_ADIOS_LIBDIRS})
string(REPLACE "-L" "" _LIBDIR ${_LIBDIR})
list(APPEND ADIOS_LIBRARY_DIRS ${_LIBDIR})
if(ADIOS1_CONFIG)
execute_process(COMMAND ${ADIOS1_CONFIG} -c ${adios1_config_opt}
OUTPUT_VARIABLE adios1_config_out
RESULT_VARIABLE adios1_config_ret
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(adios1_config_ret EQUAL 0)
string(REPLACE " " ";" adios1_match "${adios1_config_out}")
set(adios1_include_hints)
set(ADIOS1_COMPILE_OPTIONS)
foreach(OPT IN LISTS adios1_match)
if(OPT MATCHES "^-I(.*)")
list(APPEND adios1_include_hints "${CMAKE_MATCH_1}")
else()
list(APPEND ADIOS1_COMPILE_OPTIONS ${OPT})
endif()
endforeach()
# we could append ${CMAKE_PREFIX_PATH} now but that is not really necessary
#message(STATUS "ADIOS DIRS to look for libs: ${ADIOS_LIBRARY_DIRS}")
# parse all -lname libraries and find an absolute path for them. we can't just
# look for "-l" because the following library /usr/lib/x86_64-linux-gnu/libm.a
# matches that but isn't what is looked for. First we look for " -l" and later
# look for "-l" at the beginning of a line.
string(REGEX MATCHALL " -l([A-Za-z_0-9\\.-]+)" _ADIOS_LIBS "${ADIOS_LINKFLAGS}")
foreach(_LIB ${_ADIOS_LIBS})
string(REPLACE " -l" "" _LIB ${_LIB})
# find static lib: absolute path in -L then default
find_library(_LIB_DIR NAMES ${_LIB} PATHS ${ADIOS_LIBRARY_DIRS})
# found?
if(_LIB_DIR)
message(STATUS "Found ${_LIB} in ${_LIB_DIR}")
list(APPEND ADIOS_LIBRARIES "${_LIB_DIR}")
else(_LIB_DIR)
set(ADIOS_FOUND FALSE)
message(STATUS "ADIOS: Could NOT find library '${_LIB}'")
endif(_LIB_DIR)
# clean cached var
unset(_LIB_DIR CACHE)
unset(_LIB_DIR)
endforeach()
string(REGEX MATCHALL "^-l([A-Za-z_0-9\\.-]+)" _ADIOS_LIBS "${ADIOS_LINKFLAGS}")
foreach(_LIB ${_ADIOS_LIBS})
string(REPLACE "-l" "" _LIB ${_LIB})
# find static lib: absolute path in -L then default
find_library(_LIB_DIR NAMES ${_LIB} PATHS ${ADIOS_LIBRARY_DIRS} CMAKE_FIND_ROOT_PATH_BOTH)
# found?
if(_LIB_DIR)
message(STATUS "Found ${_LIB} in ${_LIB_DIR}")
list(APPEND ADIOS_LIBRARIES "${_LIB_DIR}")
else(_LIB_DIR)
set(ADIOS_FOUND FALSE)
message(STATUS "ADIOS: Could NOT find library '${_LIB}'")
endif(_LIB_DIR)
# clean cached var
unset(_LIB_DIR CACHE)
unset(_LIB_DIR)
endif()
execute_process(COMMAND ${ADIOS1_CONFIG} -l ${adios1_config_opt}
OUTPUT_VARIABLE adios1_config_out
RESULT_VARIABLE adios1_config_ret
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(adios1_config_ret EQUAL 0)
string(REPLACE " " ";" adios1_match "${adios1_config_out}")
set(adios1_libs)
set(adios1_lib_hints)
set(adios1_lib_flags)
foreach(OPT IN LISTS adios1_match)
if(OPT MATCHES "^-L(.*)")
list(APPEND adios1_lib_hints "${CMAKE_MATCH_1}")
elseif(OPT MATCHES "^-l(.*)")
list(APPEND adios1_libs "${CMAKE_MATCH_1}")
else()
list(APPEND adios1_lib_flags "${OPT}")
endif()
endforeach()
endif()
# add the version string
execute_process(COMMAND ${ADIOS_CONFIG} -v
OUTPUT_VARIABLE ADIOS_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif(ADIOS_FOUND)
# unset checked variables if not found
if(NOT ADIOS_FOUND)
unset(ADIOS_INCLUDE_DIRS)
unset(ADIOS_LIBRARIES)
endif(NOT ADIOS_FOUND)
# add the version string
execute_process(COMMAND ${ADIOS1_CONFIG} -v
OUTPUT_VARIABLE ADIOS1_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
# restore CMAKE_FIND_LIBRARY_SUFFIXES if manipulated by this module ###########
if(ADIOS_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
# make suree at the very least we find libadios
if(NOT adios1_libs)
set(adios1_libs adios)
endif()
# Search for the actual libs and headers to ue based on hints from the config
find_path(ADIOS1_INCLUDE_DIR adios.h HINTS ${adios1_include_hints})
set(ADIOS1_LIBRARY)
set(ADIOS1_DEPENDENCIES)
foreach(lib IN LISTS adios1_libs)
find_library(ADIOS1_${lib}_LIBRARY NAME ${lib} HINTS ${adios1_lib_hints})
if(ADIOS1_${lib}_LIBRARY)
if(lib MATCHES "^adios")
set(ADIOS1_LIBRARY ${ADIOS1_${lib}_LIBRARY})
else()
list(APPEND ADIOS1_DEPENDENCIES ${ADIOS1_${lib}_LIBRARY})
endif()
else()
list(APPEND ADIOS1_DEPENDENCIES ${lib})
endif()
endforeach()
find_package(Threads REQUIRED)
list(APPEND ADIOS1_DEPENDENCIES ${adios1_lib_flags} ${CMAKE_THREAD_LIBS_INIT})
###############################################################################
# FindPackage Options
......@@ -251,7 +195,25 @@ endif()
# handles the REQUIRED, QUIET and version-related arguments for find_package
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ADIOS
REQUIRED_VARS ADIOS_LIBRARIES ADIOS_INCLUDE_DIRS
VERSION_VAR ADIOS_VERSION
find_package_handle_standard_args(ADIOS1
REQUIRED_VARS ADIOS1_LIBRARY ADIOS1_INCLUDE_DIR
VERSION_VAR ADIOS1_VERSION
)
if(ADIOS1_FOUND)
set(ADIOS1_INCLUDE_DIRS ${ADIOS1_INCLUDE_DIR})
set(ADIOS1_LIBRARIES ${ADIOS1_LIBRARY} ${ADIOS1_DEPENDENCIES})
##########################################################################
# Add target and dependencies to ADIOS2
##########################################################################
if(NOT TARGET adios1::adios)
add_library(adios1::adios UNKNOWN IMPORTED)
set_target_properties(adios1::adios PROPERTIES
IMPORTED_LOCATION "${ADIOS1_LIBRARY}"
INTERFACE_LINK_LIBRARIES "${ADIOS1_DEPENDENCIES}"
INTERFACE_INCLUDE_DIRECTORIES "${ADIOS1_INCLUDE_DIRS}"
INTERFACE_COMPILE_OPTIONS "${ADIOS1_COMPILE_OPTIONS}"
)
endif()
endif()
find_package(ADIOS 1.11 REQUIRED)
include_directories(SYSTEM ${ADIOS_INCLUDE_DIRS})
find_package(MPI REQUIRED)
include_directories(SYSTEM ${MPI_C_INCLUDE_PATH})
find_package (Threads)
set(Module_SOURCES
ADIOSDefs.cxx
ADIOSUtilities.cxx
ADIOSWriter.cxx
ADIOSAttribute.cxx
ADIOSVarInfo.cxx
ADIOSScalar.cxx
ADIOSReader.cxx
vtkADIOSUtilities.cxx
vtkADIOSWriter.cxx
vtkADIOSDirTree.cxx
vtkADIOSReader.cxx
)
vtk_module_library(vtkIOADIOS ${Module_SOURCES})
target_link_libraries(vtkIOADIOS
LINK_PRIVATE ${ADIOS_LIBRARIES} ${MPI_C_LIBRARIES} ${MPI_CXX_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}
)
vtk_module_find_package(
PACKAGE ADIOS1
VERSION 1.11)
vtk_module_find_package(
PACKAGE Threads)
set(classes
ADIOSAttribute
ADIOSDefs
ADIOSReader
ADIOSScalar
ADIOSUtilities
ADIOSVarInfo
ADIOSWriter
vtkADIOSDirTree
vtkADIOSReader
vtkADIOSUtilities
vtkADIOSWriter)
vtk_module_add_module(VTK::IOADIOS
CLASSES ${classes})
vtk_module_link(VTK::IOADIOS
PRIVATE
adios1::adios
Threads::Threads)
find_package(ADIOS REQUIRED)
include_directories(SYSTEM ${ADIOS_INCLUDE_DIRS})
find_package(ADIOS1 QUIET)
vtk_add_test_mpi(vtkIOADIOSCxx-MPI tests
NO_DATA NO_VALID NO_OUTPUT
......@@ -8,4 +7,7 @@ vtk_add_test_mpi(vtkIOADIOSCxx-MPI tests
TestADIOSSphereWR.cxx
)
vtk_test_mpi_executable(vtkIOADIOSCxx-MPI tests)
vtk_test_cxx_executable(vtkIOADIOSCxx-MPI tests)
target_link_libraries(vtkIOADIOSCxx-MPI
PRIVATE
adios1::adios)
vtk_module(vtkIOADIOS
TEST_DEPENDS
vtkTestingCore
vtkTestingRendering
EXCLUDE_FROM_ALL
DEPENDS
vtkCommonCore
vtkCommonExecutionModel
vtkParallelCore
PRIVATE_DEPENDS
vtkCommonDataModel
vtkParallelMPI
)
\ No newline at end of file
NAME
VTK::IOADIOS
LIBRARY_NAME
vtkIOADIOS
DEPENDS
VTK::CommonCore
VTK::CommonExecutionModel
VTK::ParallelCore
PRIVATE_DEPENDS
VTK::CommonDataModel
VTK::ParallelMPI
VTK::mpi
TEST_DEPENDS
VTK::FiltersSources
VTK::ParallelMPI
VTK::TestingCore
VTK::TestingRendering
VTK::mpi
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment