diff --git a/CMakeLists.txt b/CMakeLists.txt index d97a54ebea76170261841a63fa885d588f0fef85..fda59429eec07dbc1c47d97474c651f877cb5f9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,9 @@ if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) ${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) endif() +# Let windows builds auto-export dll symbols +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + #------------------------------------------------------------------------------# # Top level options #------------------------------------------------------------------------------# @@ -64,14 +67,15 @@ if(ADIOS2_ENABLE_PIC) set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() -adios_option(BZip2 "Enable support for BZip2 transforms" AUTO) -adios_option(ZFP "Enable support for ZFP transforms" AUTO) -adios_option(MPI "Enable support for MPI" AUTO) -adios_option(DataMan "Enable support for DataMan" AUTO) -adios_option(ZeroMQ "Enable support for ZeroMQ" AUTO) -adios_option(HDF5 "Enable support for the HDF5 engine" AUTO) -adios_option(ADIOS1 "Enable support for the ADIOS 1 engine" AUTO) -adios_option(Python "Enable support for Python bindings" AUTO) +adios_option(BZip2 "Enable support for BZip2 transforms" AUTO) +adios_option(ZFP "Enable support for ZFP transforms" AUTO) +adios_option(MPI "Enable support for MPI" AUTO) +adios_option(DataMan "Enable support for DataMan" AUTO) +adios_option(ZeroMQ "Enable support for ZeroMQ" AUTO) +adios_option(HDF5 "Enable support for the HDF5 engine" AUTO) +adios_option(ADIOS1 "Enable support for the ADIOS 1 engine" AUTO) +adios_option(Python "Enable support for Python bindings" AUTO) +adios_option(SysVShMem "Enable support for SysV Shared Memory IPC on *NIX" AUTO) include(${ADIOS2_SOURCE_DIR}/cmake/DetectOptions.cmake) if(ADIOS2_HAVE_MPI) @@ -79,7 +83,7 @@ if(ADIOS2_HAVE_MPI) add_definitions(-DOMPI_SKIP_MPICXX) endif() -GenerateADIOSConfig(MPI ZFP BZip2 ADIOS1 HDF5 DataMan Python) +GenerateADIOSConfig(MPI ZFP BZip2 ADIOS1 HDF5 DataMan Python SysVShMem) install( FILES ${ADIOS2_BINARY_DIR}/adios2/ADIOSConfig.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/adios2 @@ -140,8 +144,8 @@ endif() message(" Build Type: ${CMAKE_BUILD_TYPE}") message(" Testing: ${BUILD_TESTING}") message(" Build Options:") -foreach(opt BZip2 ZFP MPI DataMan ZeroMQ HDF5 ADIOS1 Python) - message_pad(" ${opt}" 13 label) +foreach(opt BZip2 ZFP MPI DataMan ZeroMQ HDF5 ADIOS1 Python SysVShMem) + message_pad(" ${opt}" 15 label) if(${ADIOS2_HAVE_${opt}}) message("${label}: ON") else() diff --git a/cmake/DetectOptions.cmake b/cmake/DetectOptions.cmake index 562a6b30f4337e79e7ea3571d02ed40cb61b12b3..29237fcc40c2de892369101077f23c1b880161f3 100644 --- a/cmake/DetectOptions.cmake +++ b/cmake/DetectOptions.cmake @@ -106,3 +106,20 @@ if(ADIOS2_USE_Python STREQUAL AUTO) elseif(ADIOS2_USE_Python) set(ADIOS2_HAVE_Python TRUE) endif() + +#SysV IPC +if(ADIOS2_USE_SysVShMem STREQUAL AUTO) + if(UNIX) + include(CheckSymbolExists) + CHECK_SYMBOL_EXISTS(shmget "sys/ipc.h;sys/shm.h" HAVE_shmget) + if(HAVE_shmget) + set(ADIOS2_HAVE_SysVShMem ON) + else() + set(ADIOS2_HAVE_SysVShMem OFF) + endif() + else() + set(ADIOS2_HAVE_SysVShMem OFF) + endif() +elseif(ADIOS2_USE_SysVShMem) + set(ADIOS2_HAVE_SysVShMem) +endif() \ No newline at end of file diff --git a/source/adios2/ADIOSConfig.h.in b/source/adios2/ADIOSConfig.h.in index 046923c2c464f4397570acf086803232b9b58e89..c917b81a8b1a06b2b43b4844cd1715e70ebff69e 100644 --- a/source/adios2/ADIOSConfig.h.in +++ b/source/adios2/ADIOSConfig.h.in @@ -45,4 +45,7 @@ /* CMake Option: ADIOS_USE_Python=ON */ #cmakedefine ADIOS2_HAVE_PYTHON +/* CMake Option: ADIOS_USE_SysVShMem=ON */ +#cmakedefine ADIOS2_HAVE_SYSVSHMEM + #endif /* ADIOSCONFIG_H_ */ diff --git a/source/adios2/ADIOSTypes.h b/source/adios2/ADIOSTypes.h index 458193c719e81c8637f0a7f99a1bc87560fb7021..b689e840c3f55bbd4a309b67d69a6cda456913a1 100644 --- a/source/adios2/ADIOSTypes.h +++ b/source/adios2/ADIOSTypes.h @@ -141,7 +141,11 @@ enum class SelectionType }; // adios defaults +#ifdef _WIN32 +const std::string DefaultFileLibrary("stdio"); +#else const std::string DefaultFileLibrary("POSIX"); +#endif const std::string DefaultTimeUnit("Microseconds"); constexpr TimeUnit DefaultTimeUnitEnum(TimeUnit::Microseconds); diff --git a/source/adios2/CMakeLists.txt b/source/adios2/CMakeLists.txt index 7617d7b832cfb79353d1260f2d8c00bf7778e477..651b7bc5985d7417ced44eabca06e5a72f0b0c7a 100644 --- a/source/adios2/CMakeLists.txt +++ b/source/adios2/CMakeLists.txt @@ -27,8 +27,7 @@ add_library(adios2 toolkit/capsule/Capsule.cpp toolkit/capsule/heap/STLVector.cpp - toolkit/capsule/shmem/ShmSystemV.cpp - + toolkit/format/bp1/BP1Base.cpp toolkit/format/bp1/BP1Base.tcc toolkit/format/bp1/BP1Aggregator.cpp toolkit/format/bp1/BP1Writer.cpp toolkit/format/bp1/BP1Writer.tcc @@ -36,7 +35,6 @@ add_library(adios2 toolkit/profiling/iochrono/Timer.cpp toolkit/transport/Transport.cpp - toolkit/transport/file/FileDescriptor.cpp toolkit/transport/file/FilePointer.cpp toolkit/transport/file/FileStream.cpp @@ -50,10 +48,19 @@ target_include_directories(adios2 $<INSTALL_INTERFACE:include> PRIVATE ${ADIOS2_SOURCE_DIR}/source ) +target_link_libraries(adios2 PRIVATE adios2sys) find_package(Threads REQUIRED) target_link_libraries(adios2 PUBLIC ${CMAKE_THREAD_LIBS_INIT}) +if(UNIX) + target_sources(adios2 PRIVATE toolkit/transport/file/FileDescriptor.cpp) +endif() + +if(ADIOS2_HAVE_SysVShMem) + target_sources(adios2 PRIVATE toolkit/capsule/shmem/ShmSystemV.cpp) +endif() + if(ADIOS2_HAVE_DataMan) target_sources(adios2 PRIVATE engine/dataman/DataManReader.cpp diff --git a/source/adios2/engine/bp/BPFileWriter.cpp b/source/adios2/engine/bp/BPFileWriter.cpp index f6001622cd7df534bb1bf530e2f0c4c73e90f786..c8e6fcef4b5d0dffbd5e605e9fcca9544eefc0dd 100644 --- a/source/adios2/engine/bp/BPFileWriter.cpp +++ b/source/adios2/engine/bp/BPFileWriter.cpp @@ -14,8 +14,6 @@ #include "adios2/ADIOSMPI.h" #include "adios2/core/IO.h" #include "adios2/helper/adiosFunctions.h" //CheckIndexRange -#include "adios2/toolkit/transport/file/FileDescriptor.h" -#include "adios2/toolkit/transport/file/FilePointer.h" #include "adios2/toolkit/transport/file/FileStream.h" namespace adios2 diff --git a/source/adios2/helper/adiosSystem.cpp b/source/adios2/helper/adiosSystem.cpp index 24cda3d57021ade4815a96bf3ed38edb26d5cf88..8e0b967c5e0d07b8620c29dce7beadaf8693a2f6 100644 --- a/source/adios2/helper/adiosSystem.cpp +++ b/source/adios2/helper/adiosSystem.cpp @@ -9,12 +9,11 @@ */ #include "adiosSystem.h" -#include <sys/stat.h> //stat, mkdir -#include <sys/types.h> //CreateDirectory -#include <unistd.h> //CreateDirectory +#include <ctime> //std::ctime #include <chrono> //system_clock, now -#include <ctime> //std::ctime + +#include <adios2sys/SystemTools.hxx> #include "adios2/ADIOSMPI.h" #include "adios2/ADIOSTypes.h" @@ -25,44 +24,7 @@ namespace adios2 bool CreateDirectory(const std::string &fullPath) noexcept { - auto lf_Mkdir = [](const std::string directory, struct stat &st) -> bool { - if (stat(directory.c_str(), &st) == -1) // doesn't exist - { - mkdir(directory.c_str(), 0777); - if (stat(directory.c_str(), &st) == -1) // doesn't exist - { - return false; - } - } - return true; - }; - - bool directoryExists = false; - auto directoryPosition = fullPath.find("/"); - - if (fullPath[0] == '/' || fullPath[0] == '.') - { // find the second '/' - directoryPosition = fullPath.find("/", directoryPosition + 1); - } - - struct stat st = {0}; - if (directoryPosition == fullPath.npos) // no subdirectories - { - directoryExists = lf_Mkdir(fullPath.c_str(), st); - } - else - { - std::string directory(fullPath.substr(0, directoryPosition)); - lf_Mkdir(directory.c_str(), st); - - while (directoryPosition != fullPath.npos) - { - directoryPosition = fullPath.find("/", directoryPosition + 1); - directory = fullPath.substr(0, directoryPosition); - directoryExists = lf_Mkdir(directory.c_str(), st); - } - } - return directoryExists; + return adios2sys::SystemTools::MakeDirectory(fullPath); } bool IsLittleEndian() noexcept diff --git a/source/adios2/toolkit/transportman/TransportMan.cpp b/source/adios2/toolkit/transportman/TransportMan.cpp index fc7fedc28c5e157527c1d3acad39d8161484128f..efbd4f21dab25948c18477b01b30eeb776312370 100644 --- a/source/adios2/toolkit/transportman/TransportMan.cpp +++ b/source/adios2/toolkit/transportman/TransportMan.cpp @@ -15,10 +15,13 @@ /// \endcond #include "adios2/helper/adiosFunctions.h" //CreateDirectory -#include "adios2/toolkit/transport/file/FileDescriptor.h" #include "adios2/toolkit/transport/file/FilePointer.h" #include "adios2/toolkit/transport/file/FileStream.h" +#ifndef _WIN32 +#include "adios2/toolkit/transport/file/FileDescriptor.h" +#endif + namespace adios2 { namespace transportman @@ -204,12 +207,7 @@ void TransportMan::OpenFileTransport(const std::string &fileName, { auto lf_SetFileTransport = [&](const std::string library, std::shared_ptr<Transport> &transport) { - if (library == "POSIX") - { - transport = std::make_shared<transport::FileDescriptor>( - m_MPIComm, m_DebugMode); - } - else if (library == "stdio") + if (library == "stdio") { transport = std::make_shared<transport::FilePointer>(m_MPIComm, m_DebugMode); @@ -219,6 +217,13 @@ void TransportMan::OpenFileTransport(const std::string &fileName, transport = std::make_shared<transport::FileStream>(m_MPIComm, m_DebugMode); } +#ifndef _WIN32 + else if (library == "POSIX") + { + transport = std::make_shared<transport::FileDescriptor>( + m_MPIComm, m_DebugMode); + } +#endif else { if (m_DebugMode) diff --git a/thirdparty/KWSys/CMakeLists.txt b/thirdparty/KWSys/CMakeLists.txt index 6faf39f54be3613cb02169029931592dc407094b..62afcc1147e786f747b8918cb51e1692dedb8b99 100644 --- a/thirdparty/KWSys/CMakeLists.txt +++ b/thirdparty/KWSys/CMakeLists.txt @@ -1,5 +1,7 @@ set(KWSYS_NAMESPACE adios2sys) set(KWSYS_USE_DynamicLoader ON) +set(KWSYS_USE_RegularExpression ON) +set(KWSYS_USE_SystemTools ON) set(KWSYS_BUILD_SHARED OFF) if(NOT ADIOS2_BUILD_SHARED_LIBS) set(KWSYS_INSTALL_EXPORT_NAME adios2)