diff --git a/CMakeLists.txt b/CMakeLists.txt index 89f45f79..28579be9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,7 @@ cmake_dependent_option(BUILD_TESTING "Build tests." OFF "BUILD_FAIRMQ" OFF) cmake_dependent_option(BUILD_NANOMSG_TRANSPORT "Build nanomsg transport." OFF "BUILD_FAIRMQ" OFF) cmake_dependent_option(BUILD_OFI_TRANSPORT "Build experimental OFI transport." OFF "BUILD_FAIRMQ" OFF) cmake_dependent_option(BUILD_DDS_PLUGIN "Build DDS plugin." OFF "BUILD_FAIRMQ" OFF) +cmake_dependent_option(BUILD_PMIX_PLUGIN "Build PMIx plugin." OFF "BUILD_FAIRMQ" OFF) cmake_dependent_option(BUILD_EXAMPLES "Build FairMQ examples." ON "BUILD_FAIRMQ" OFF) option(BUILD_DOCS "Build FairMQ documentation." OFF) option(FAST_BUILD "Fast production build. Not recommended for development." OFF) @@ -70,6 +71,10 @@ if(BUILD_DDS_PLUGIN) find_package2(PRIVATE DDS VERSION 2.2 REQUIRED) endif() +if(BUILD_PMIX_PLUGIN) + find_package2(PRIVATE PMIx VERSION 2.1.4 REQUIRED) +endif() + if(BUILD_TESTING) find_package2(PRIVATE GTest VERSION 1.7.0 REQUIRED) endif() @@ -120,6 +125,9 @@ endif() if(BUILD_DDS_PLUGIN) list(APPEND PROJECT_PACKAGE_COMPONENTS dds_plugin) endif() +if(BUILD_PMIX_PLUGIN) + list(APPEND PROJECT_PACKAGE_COMPONENTS pmix_plugin) +endif() if(BUILD_NANOMSG_TRANSPORT) list(APPEND PROJECT_PACKAGE_COMPONENTS nanomsg_transport) endif() @@ -268,6 +276,12 @@ else() set(dds_summary "${BRed} NO${CR} (default, enable with ${BMagenta}-DBUILD_DDS_PLUGIN=ON${CR})") endif() message(STATUS " ${BWhite}dds_plugin${CR} ${dds_summary}") +if(BUILD_PMIX_PLUGIN) + set(pmix_summary "${BGreen}YES${CR} (disable with ${BMagenta}-DBUILD_PMIX_PLUGIN=OFF${CR})") +else() + set(pmix_summary "${BRed} NO${CR} (default, enable with ${BMagenta}-DBUILD_PMIX_PLUGIN=ON${CR})") +endif() +message(STATUS " ${BWhite}pmix_plugin${CR} ${pmix_summary}") if(BUILD_EXAMPLES) set(examples_summary "${BGreen}YES${CR} (default, disable with ${BMagenta}-DBUILD_EXAMPLES=OFF${CR})") else() diff --git a/README.md b/README.md index f60dbcca..b7bde7ad 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,8 @@ a simulation, reconstruction and analysis framework. * PUBLIC: [**Boost**](https://www.boost.org/), [**FairLogger**](https://github.com/FairRootGroup/FairLogger) * BUILD: [CMake](https://cmake.org/), [GTest](https://github.com/google/googletest), [Doxygen](http://www.doxygen.org/) * PRIVATE: [ZeroMQ](http://zeromq.org/), [Msgpack](https://msgpack.org/index.html), [nanomsg](http://nanomsg.org/), -[OFI](https://ofiwg.github.io/libfabric/), [Protobuf](https://developers.google.com/protocol-buffers/), [DDS](http://dds.gsi.de) +[OFI](https://ofiwg.github.io/libfabric/), [Protobuf](https://developers.google.com/protocol-buffers/), [DDS](http://dds.gsi.de), +[PMIx](https://pmix.org/) Supported platforms: Linux and MacOS. @@ -104,6 +105,7 @@ On command line: * `-DBUILD_NANOMSG_TRANSPORT=ON` enables building of nanomsg transport. * `-DBUILD_OFI_TRANSPORT=ON` enables building of the experimental OFI transport. * `-DBUILD_DDS_PLUGIN=ON` enables building of the DDS plugin. + * `-DBUILD_PMIX_PLUGIN=ON` enables building of the PMIx plugin. * `-DBUILD_DOCS=ON` enables building of API docs. * You can hint non-system installations for dependent packages, see the #Installation section above diff --git a/cmake/FindPMIx.cmake b/cmake/FindPMIx.cmake new file mode 100644 index 00000000..02dd917a --- /dev/null +++ b/cmake/FindPMIx.cmake @@ -0,0 +1,67 @@ +################################################################################ +# Copyright (C) 2019 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +find_path(PMIx_INCLUDE_DIR + NAMES pmix.h + HINTS ${PMIX_ROOT} $ENV{PMIX_ROOT} + PATH_SUFFIXES include +) + +find_path(PMIx_LIBRARY_DIR + NAMES libpmix.dylib libpmix.so + HINTS ${PMIX_ROOT} $ENV{PMIX_ROOT} + PATH_SUFFIXES lib lib64 +) + +find_library(PMIx_LIBRARY_SHARED + NAMES libpmix.dylib libpmix.so + HINTS ${PMIX_ROOT} $ENV{PMIX_ROOT} + PATH_SUFFIXES lib lib64 +) + +find_file(PMIx_VERSION_FILE + NAMES pmix_version.h + HINTS ${PMIX_ROOT} $ENV{PMIX_ROOT} + PATH_SUFFIXES include +) + +file(READ "${PMIx_VERSION_FILE}" __version_raw) +string(REGEX MATCH "#define PMIX_VERSION_MAJOR ([0-9]?)L?" + __version_major_raw "${__version_raw}" +) +set(PMIx_VERSION_MAJOR "${CMAKE_MATCH_1}") + +string(REGEX MATCH "#define PMIX_VERSION_MINOR ([0-9]?)L?" + __version_minor_raw "${__version_raw}" +) +set(PMIx_VERSION_MINOR "${CMAKE_MATCH_1}") + +string(REGEX MATCH "#define PMIX_VERSION_RELEASE ([0-9]?)L?" + __version_patch_raw "${__version_raw}" +) +set(PMIx_VERSION_PATCH "${CMAKE_MATCH_1}") + +set(PMIx_VERSION "${PMIx_VERSION_MAJOR}.${PMIx_VERSION_MINOR}.${PMIx_VERSION_PATCH}") + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PMIx + REQUIRED_VARS + PMIx_INCLUDE_DIR + PMIx_LIBRARY_DIR + PMIx_LIBRARY_SHARED + + VERSION_VAR PMIx_VERSION +) + +if(NOT TARGET PMIx::libpmix AND PMIx_FOUND) + add_library(PMIx::libpmix SHARED IMPORTED) + set_target_properties(PMIx::libpmix PROPERTIES + IMPORTED_LOCATION ${PMIx_LIBRARY_SHARED} + INTERFACE_INCLUDE_DIRECTORIES ${PMIx_INCLUDE_DIR} + ) +endif() diff --git a/fairmq/CMakeLists.txt b/fairmq/CMakeLists.txt index 7368a557..9475da7b 100644 --- a/fairmq/CMakeLists.txt +++ b/fairmq/CMakeLists.txt @@ -12,6 +12,9 @@ if(BUILD_DDS_PLUGIN) add_subdirectory(plugins/DDS) endif() +if(BUILD_PMIX_PLUGIN) + add_subdirectory(plugins/PMIx) +endif() ############################ diff --git a/fairmq/plugins/PMIx/CMakeLists.txt b/fairmq/plugins/PMIx/CMakeLists.txt new file mode 100644 index 00000000..28b834b2 --- /dev/null +++ b/fairmq/plugins/PMIx/CMakeLists.txt @@ -0,0 +1,23 @@ +################################################################################ +# Copyright (C) 2019 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +set(plugin FairMQPlugin_pmix) +add_library(${plugin} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/PMIx.cxx ${CMAKE_CURRENT_SOURCE_DIR}/PMIx.h) +target_link_libraries(${plugin} FairMQ PMIx::libpmix) +target_include_directories(${plugin} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +set_target_properties(${plugin} PROPERTIES + CXX_VISIBILITY_PRESET hidden + VERSION ${PROJECT_GIT_VERSION} + SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" +) + +install(TARGETS ${plugin} + EXPORT ${PROJECT_EXPORT_SET} + LIBRARY DESTINATION ${PROJECT_INSTALL_LIBDIR} + RUNTIME DESTINATION ${PROJECT_INSTALL_BINDIR} +) diff --git a/fairmq/plugins/PMIx/PMIx.cxx b/fairmq/plugins/PMIx/PMIx.cxx new file mode 100644 index 00000000..2463772e --- /dev/null +++ b/fairmq/plugins/PMIx/PMIx.cxx @@ -0,0 +1,60 @@ +/******************************************************************************** + * Copyright (C) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ + +#include "PMIx.h" +#include +#include +#include + +namespace fair +{ +namespace mq +{ +namespace plugins +{ + +PMIx::PMIx(const std::string& name, + const Plugin::Version version, + const std::string& maintainer, + const std::string& homepage, + PluginServices* pluginServices) + : Plugin(name, version, maintainer, homepage, pluginServices) + , fPid(getpid()) +{ + auto rc = PMIx_Init(&fPMIxProc, NULL, 0); + if (rc != PMIX_SUCCESS) { + throw std::runtime_error(tools::ToString("Client ns ", fPMIxProc.nspace, + " rank ", fPMIxProc.rank, + " pid ", fPid, + ": PMIx_Init failed: ", rc)); + } + + LOG(info) << "Client ns " << fPMIxProc.nspace << " rank " << fPMIxProc.rank << " pid " << fPid + << ": Running"; +} + +PMIx::~PMIx() +{ + LOG(info) << "Client ns " << fPMIxProc.nspace << " rank " << fPMIxProc.rank << " pid " << fPid + << ": Finalizing"; + + auto rc = PMIx_Finalize(NULL, 0); + if (rc != PMIX_SUCCESS) { + throw std::runtime_error(tools::ToString("Client ns ", fPMIxProc.nspace, + " rank ", fPMIxProc.rank, + " pid ", fPid, + ": PMIx_Finalize failed: ", rc)); + } + + LOG(info) << "Client ns " << fPMIxProc.nspace << " rank " << fPMIxProc.rank << " pid " << fPid + << ": PMIx_Finalize successfully completed"; +} + +} /* namespace plugins */ +} /* namespace mq */ +} /* namespace fair */ diff --git a/fairmq/plugins/PMIx/PMIx.h b/fairmq/plugins/PMIx/PMIx.h new file mode 100644 index 00000000..cb1ab208 --- /dev/null +++ b/fairmq/plugins/PMIx/PMIx.h @@ -0,0 +1,64 @@ +/******************************************************************************** + * Copyright (C) 2019 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ + +#ifndef FAIR_MQ_PLUGINS_PMIX +#define FAIR_MQ_PLUGINS_PMIX + +#include +#include + +#include +#include +#include + +namespace fair +{ +namespace mq +{ +namespace plugins +{ + +class PMIx : public Plugin +{ + public: + PMIx(const std::string& name, + const Plugin::Version version, + const std::string& maintainer, + const std::string& homepage, + PluginServices* pluginServices); + ~PMIx(); + + private: + pmix_proc_t fPMIxProc; + pid_t fPid; +}; + +Plugin::ProgOptions PMIxProgramOptions() +{ + boost::program_options::options_description options{"PMIx Plugin"}; + options.add_options()( + "pmix-dummy", boost::program_options::value()->default_value(0), "Dummy."); + return options; +} + +REGISTER_FAIRMQ_PLUGIN( + PMIx, // Class name + pmix, // Plugin name (string, lower case chars only) + (Plugin::Version{FAIRMQ_VERSION_MAJOR, + FAIRMQ_VERSION_MINOR, + FAIRMQ_VERSION_PATCH}), // Version + "FairRootGroup ", // Maintainer + "https://github.com/FairRootGroup/FairMQ", // Homepage + PMIxProgramOptions // custom program options for the plugin +) + +} /* namespace plugins */ +} /* namespace mq */ +} /* namespace fair */ + +#endif /* FAIR_MQ_PLUGINS_DDS */