Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .ci/copy_headers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -Dall=On -Dtesting=On -Dx11=Off -Dalien
# We need to prebuild a minimal set of targets which are responsible for header copy
# or generation.
make -j4 move_headers intrinsics_gen clang-tablegen-targets ClangDriverOptions \
googletest Dictgen BaseTROOT
googletest Dictgen BaseTROOT BUILTIN_cppzmq
ln -s $PWD/compile_commands.json $PWD/../root/

51 changes: 51 additions & 0 deletions builtins/zeromq/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
include(ExternalProject)

set(ZeroMQ_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/BUILTIN_ZeroMQ-prefix)
set(ZeroMQ_LIBNAME ${CMAKE_STATIC_LIBRARY_PREFIX}zmq${CMAKE_STATIC_LIBRARY_SUFFIX})

set(ZeroMQ_LIBRARY ${ZeroMQ_PREFIX}/lib/${ZeroMQ_LIBNAME} CACHE INTERNAL "" FORCE)
set(ZeroMQ_LIBRARIES ${ZeroMQ_LIBRARY} CACHE INTERNAL "" FORCE)

ExternalProject_Add(BUILTIN_ZeroMQ
URL https://github.com/zeromq/libzmq/archive/refs/tags/v4.3.2.tar.gz
URL_HASH SHA256=02ecc88466ae38cf2c8d79f09cfd2675ba299a439680b64ade733e26a349edeb
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DWITH_PERF_TOOL=OFF
-DZMQ_BUILD_TESTS=OFF
-DPOLLER=select
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
# TODO: remove -w flag when updating to v4.3.5 or higher, current warnings should be gone by then
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}\ -w

@guitargeek guitargeek Jun 11, 2021

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}

Please also use the same compiler as for the rest of ROOT. Otherwise, the compilation can fail because of incompatibilities.

(A precedent is set in the davix and pcre builtins)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in c95ee93.

BUILD_BYPRODUCTS ${ZeroMQ_LIBRARIES}
)

ExternalProject_Get_Property(BUILTIN_ZeroMQ install_dir)

set(ZeroMQ_FOUND TRUE CACHE BOOL "" FORCE)

set(ZeroMQ_INCLUDE_DIR ${ZeroMQ_PREFIX}/include CACHE INTERNAL "" FORCE)
set(ZeroMQ_INCLUDE_DIRS ${ZeroMQ_PREFIX}/include CACHE INTERNAL "" FORCE)

add_library(ZeroMQ INTERFACE)
target_include_directories(ZeroMQ INTERFACE $<BUILD_INTERFACE:${ZeroMQ_INCLUDE_DIR}>)
target_link_libraries(ZeroMQ INTERFACE $<BUILD_INTERFACE:${ZeroMQ_LIBRARIES}>)
add_dependencies(ZeroMQ BUILTIN_ZeroMQ)

add_library(ZeroMQ::ZeroMQ ALIAS ZeroMQ)
add_library(libzmq ALIAS ZeroMQ)

set(ZeroMQ_DIR ${ZeroMQ_PREFIX}/share/cmake/ZeroMQ CACHE INTERNAL "" FORCE)

# also need source and build directories for ppoll in RooFitZMQ
set(ZeroMQ_SOURCE_DIR ${ZeroMQ_PREFIX}/src/BUILTIN_ZeroMQ/src CACHE INTERNAL "" FORCE)
set(ZeroMQ_BUILD_DIR ${ZeroMQ_PREFIX}/src/BUILTIN_ZeroMQ-build CACHE INTERNAL "" FORCE)

ExternalProject_Add(BUILTIN_cppzmq
URL https://github.com/zeromq/cppzmq/archive/refs/tags/v4.3.0.tar.gz
URL_HASH SHA256=27d1f56406ba94ee779e639203218820975cf68174f92fbeae0f645df0fcada4
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${install_dir}
-DCPPZMQ_BUILD_TESTS=OFF
DEPENDS BUILTIN_ZeroMQ
)
2 changes: 2 additions & 0 deletions cmake/modules/RootBuildOptions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ ROOT_BUILD_OPTION(builtin_vdt OFF "Build VDT internally (requires network)")
ROOT_BUILD_OPTION(builtin_veccore OFF "Build VecCore internally (requires network)")
ROOT_BUILD_OPTION(builtin_xrootd OFF "Build XRootD internally (requires network)")
ROOT_BUILD_OPTION(builtin_xxhash OFF "Build bundled copy of xxHash")
ROOT_BUILD_OPTION(builtin_zeromq ON "Build ZeroMQ internally (requires network)")
ROOT_BUILD_OPTION(builtin_zlib OFF "Build bundled copy of zlib")
ROOT_BUILD_OPTION(builtin_zstd OFF "Build included libzstd, or use system libzstd")
ROOT_BUILD_OPTION(ccache OFF "Enable ccache usage for speeding up builds")
Expand Down Expand Up @@ -299,6 +300,7 @@ if(builtin_all)
set(builtin_veccore_defvalue ON)
set(builtin_xrootd_defvalue ON)
set(builtin_xxhash_defvalue ON)
set(builtin_zeromq_defvalue ON)
set(builtin_zlib_defvalue ON)
set(builtin_zstd_defvalue ON)
endif()
Expand Down
7 changes: 7 additions & 0 deletions cmake/modules/SearchInstalledSoftware.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -1767,6 +1767,13 @@ if (mpi)
endif()
endif()

#---Check for ZeroMQ-----------------------------------------------------------

if(builtin_zeromq)
list(APPEND ROOT_BUILTINS ZeroMQ)
add_subdirectory(builtins/zeromq)
endif()

#---Download googletest--------------------------------------------------------------
if (testing)
# FIXME: Remove our version of gtest in roottest. We can reuse this one.
Expand Down
3 changes: 3 additions & 0 deletions roofit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
# For the list of contributors see $ROOTSYS/README/CREDITS.

add_subdirectory(batchcompute)
if (builtin_zeromq)
add_subdirectory(roofitZMQ)
endif(builtin_zeromq)
add_subdirectory(roofitcore)
add_subdirectory(roofit)
if(mathmore)
Expand Down
38 changes: 38 additions & 0 deletions roofit/roofitZMQ/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
############################################################################
# CMakeLists.txt file for building ROOT roofitcore/ZMQ package
# @author Patrick Bos, NL eScience Center
############################################################################

#if(NOT ZeroMQ_FOUND)
# find_package(ZeroMQ REQUIRED)
#endif()

ROOT_STANDARD_LIBRARY_PACKAGE(RooFitZMQ
HEADERS
RooFit_ZMQ/Utility.h
RooFit_ZMQ/ZeroMQSvc.h
RooFit_ZMQ/functions.h
RooFit_ZMQ/ZeroMQPoller.h
RooFit_ZMQ/ppoll.h
SOURCES
src/ZeroMQSvc.cpp
src/ZeroMQPoller.cpp
src/functions.cpp
src/ppoll.cpp
DICTIONARY_OPTIONS
-writeEmptyRootPCM
DEPENDENCIES
Core # TVersionCheck, RegisterModule, these are always called from G__RooFitZMQ.cxx.o
LIBRARIES
ZeroMQ
)


target_link_libraries(RooFitZMQ PRIVATE ZeroMQ)
target_include_directories(RooFitZMQ PUBLIC $<BUILD_INTERFACE:${ZeroMQ_INCLUDE_DIR}>)
target_include_directories(RooFitZMQ PUBLIC $<BUILD_INTERFACE:${ZeroMQ_SOURCE_DIR}>)
target_include_directories(RooFitZMQ PUBLIC $<BUILD_INTERFACE:${ZeroMQ_BUILD_DIR}>)

if(testing)
ROOT_ADD_TEST_SUBDIRECTORY(test)
endif()
1 change: 1 addition & 0 deletions roofit/roofitZMQ/inc/LinkDef.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// something
34 changes: 34 additions & 0 deletions roofit/roofitZMQ/inc/RooFit_ZMQ/Utility.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#ifndef SERIALIZE_UTILITY_H
#define SERIALIZE_UTILITY_H 1

#if defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 10))
#define HAVE_TRIVIALLY_COPYABLE 1
#elif defined(__GNUC__) && __GNUC__ >= 5
#define HAVE_TRIVIALLY_COPYABLE 1
#else
#undef HAVE_TRIVIALLY_COPYABLE
#endif

#include <type_traits>

namespace ZMQ {
namespace Detail {

#if defined(HAVE_TRIVIALLY_COPYABLE)
template <class T>
using simple_object = std::is_trivially_copyable<T>;
#else
template <class T>
using simple_object = std::is_pod<T>;
#endif

// is trivial
template <class T>
struct is_trivial
: std::conditional<simple_object<typename std::decay<T>::type>::value, std::true_type, std::false_type>::type {
};

} // namespace Detail
} // namespace ZMQ

#endif // SERIALIZE_UTILITY_H
46 changes: 46 additions & 0 deletions roofit/roofitZMQ/inc/RooFit_ZMQ/ZeroMQPoller.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#ifndef ZEROMQPOLLER_H
#define ZEROMQPOLLER_H 1
#include <vector>
#include <deque>
#include <exception>
#include <unordered_map>

#include "RooFit_ZMQ/ZeroMQSvc.h"
#include "RooFit_ZMQ/functions.h"

class ZeroMQPoller {
public:
using entry_t = std::tuple<size_t, zmq::PollType, const zmq::socket_t *>;
// The key is what zmq::socket_t stores inside, and what goes into
// pollitem_t through zmq::socket_t's conversion to void* operator
using sockets_t = std::unordered_map<void *, entry_t>;

using fd_entry_t = std::tuple<size_t, zmq::PollType>;
using fds_t = std::unordered_map<int, fd_entry_t>;

using free_t = std::deque<int>;

ZeroMQPoller() = default;

std::vector<std::pair<size_t, int>> poll(int timeo = -1);
std::vector<std::pair<size_t, int>> ppoll(int timeo, const sigset_t *sigmask_);

size_t size() const;

size_t register_socket(zmq::socket_t &socket, zmq::PollType type);
size_t register_socket(int fd, zmq::PollType type);

size_t unregister_socket(zmq::socket_t &socket);
size_t unregister_socket(int fd);

private:
// Vector of (socket, flags)
std::vector<zmq::pollitem_t> m_items;
sockets_t m_sockets;
fds_t m_fds;

// free slots in items
free_t m_free;
};

#endif // ZEROMQPOLLER_H
Loading