diff --git a/.gitignore b/.gitignore index 2d1e4c5..1620c1e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,3 @@ -/libarcus-2.4.0.tar.gz -/libarcus-2.5.0.tar.gz -/libarcus-2.6.0.tar.gz -/libarcus-2.6.1.tar.gz -/libarcus-2.7.0.tar.gz -/libarcus-3.0.3.tar.gz -/libarcus-3.1.0.tar.gz -/libarcus-3.2.1.tar.gz +/libarcus-*.tar.gz +/pyArcus-5.2.2.tar.gz +/pyArcus-5.3.0.tar.gz diff --git a/0001-fix-protobuf-deprecated.patch b/0001-fix-protobuf-deprecated.patch new file mode 100644 index 0000000..a40da84 --- /dev/null +++ b/0001-fix-protobuf-deprecated.patch @@ -0,0 +1,13 @@ +diff --git a/src/Socket_p.h b/src/Socket_p.h +index 9c3c084..9ccabda 100644 +--- a/src/Socket_p.h ++++ b/src/Socket_p.h +@@ -548,7 +548,7 @@ namespace Arcus + + google::protobuf::io::ArrayInputStream array(wire_message->data, wire_message->size); + google::protobuf::io::CodedInputStream stream(&array); +- stream.SetTotalBytesLimit(message_size_maximum, message_size_warning); ++ stream.SetTotalBytesLimit(message_size_maximum); + if(!message->ParseFromCodedStream(&stream)) + { + error(ErrorCode::ParseFailedError, "Failed to parse message:" + std::string(wire_message->data)); diff --git a/160.patch b/160.patch new file mode 100644 index 0000000..26d18e2 --- /dev/null +++ b/160.patch @@ -0,0 +1,114 @@ +From 4826f0d567a6dc373ee8d378f2e40977d94f586b Mon Sep 17 00:00:00 2001 +From: Gregor Riepl +Date: Thu, 20 Feb 2025 20:27:10 +0100 +Subject: [PATCH] Add cstdint includes where needed + +--- + include/Arcus/MessageTypeStore.h | 1 + + include/Arcus/Types.h | 1 + + src/MessageTypeStore.cpp | 1 + + src/PlatformSocket.cpp | 2 ++ + src/PlatformSocket_p.h | 1 + + src/Socket_p.h | 1 + + src/WireMessage_p.h | 2 ++ + test_package/src/test.cpp | 1 + + 8 files changed, 10 insertions(+) + +diff --git a/include/Arcus/MessageTypeStore.h b/include/Arcus/MessageTypeStore.h +index 6cc7b5ee..416c6686 100644 +--- a/include/Arcus/MessageTypeStore.h ++++ b/include/Arcus/MessageTypeStore.h +@@ -5,6 +5,7 @@ + #define ARCUS_MESSAGE_TYPE_STORE_H + + #include ++#include + + #include "Arcus/Types.h" + +diff --git a/include/Arcus/Types.h b/include/Arcus/Types.h +index 9fdcc60a..58103de6 100644 +--- a/include/Arcus/Types.h ++++ b/include/Arcus/Types.h +@@ -6,6 +6,7 @@ + + #include + #include ++#include + + namespace google + { +diff --git a/src/MessageTypeStore.cpp b/src/MessageTypeStore.cpp +index 44c94ec7..5db03cdd 100644 +--- a/src/MessageTypeStore.cpp ++++ b/src/MessageTypeStore.cpp +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + + #include + #include +diff --git a/src/PlatformSocket.cpp b/src/PlatformSocket.cpp +index ab113e32..90c590da 100644 +--- a/src/PlatformSocket.cpp ++++ b/src/PlatformSocket.cpp +@@ -1,6 +1,8 @@ + // Copyright (c) 2022 Ultimaker B.V. + // libArcus is released under the terms of the LGPLv3 or higher. + ++#include ++ + #include "PlatformSocket_p.h" + + #ifdef _WIN32 +diff --git a/src/PlatformSocket_p.h b/src/PlatformSocket_p.h +index b1e9aa59..3f7e4249 100644 +--- a/src/PlatformSocket_p.h ++++ b/src/PlatformSocket_p.h +@@ -6,6 +6,7 @@ + + #include + #include ++#include + + namespace Arcus + { +diff --git a/src/Socket_p.h b/src/Socket_p.h +index 33f5873f..7711389c 100644 +--- a/src/Socket_p.h ++++ b/src/Socket_p.h +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + #ifdef _WIN32 + #include +diff --git a/src/WireMessage_p.h b/src/WireMessage_p.h +index 07f8dd13..757aa32e 100644 +--- a/src/WireMessage_p.h ++++ b/src/WireMessage_p.h +@@ -4,6 +4,8 @@ + #ifndef ARCUS_WIRE_MESSAGE_P_H + #define ARCUS_WIRE_MESSAGE_P_H + ++#include ++ + #include "Arcus/Types.h" + + namespace Arcus +diff --git a/test_package/src/test.cpp b/test_package/src/test.cpp +index 52ca8438..09f13a59 100644 +--- a/test_package/src/test.cpp ++++ b/test_package/src/test.cpp +@@ -4,6 +4,7 @@ + #include + #include + #include ++#include + + #include "test.h" + diff --git a/ArcusConfig.cmake.in b/ArcusConfig.cmake.in new file mode 100644 index 0000000..3208a69 --- /dev/null +++ b/ArcusConfig.cmake.in @@ -0,0 +1,10 @@ +@PACKAGE_INIT@ + +# We want to have access to protobuf_generate_cpp and other FindProtobuf features. +# However, if ProtobufConfig is used instead, there is a CMake option that controls +# this, which defaults to OFF. We need to force this option to ON instead. +set(protobuf_MODULE_COMPATIBLE ON CACHE "" INTERNAL FORCE) +find_package(Protobuf 3.0.0 REQUIRED) + +get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +include(${SELF_DIR}/Arcus-targets.cmake) diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a768927 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,163 @@ +project(arcus) +cmake_minimum_required(VERSION 3.8) + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) +include(GenerateExportHeader) + +option(BUILD_PYTHON "Build " ON) +option(BUILD_EXAMPLES "Build the example programs" ON) +option(BUILD_STATIC "Build as a static library" OFF) + +if(WIN32) + option(MSVC_STATIC_RUNTIME "Link the MSVC runtime statically" OFF) +endif() + +# We want to have access to protobuf_generate_cpp and other FindProtobuf features. +# However, if ProtobufConfig is used instead, there is a CMake option that controls +# this, which defaults to OFF. We need to force this option to ON instead. +set(protobuf_MODULE_COMPATIBLE ON CACHE INTERNAL "" FORCE) +find_package(Protobuf 3.0.0 REQUIRED) + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) #Required if a patch to libArcus needs to be made via templates. + +if(BUILD_PYTHON) + list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) + + # FIXME: Remove the code for CMake <3.12 once we have switched over completely. + # FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. + if(${CMAKE_VERSION} VERSION_LESS 3.12) + # FIXME: Use FindPython3 to find Python, new in CMake 3.12. + # However currently on our CI server it finds the wrong Python version and then doesn't find the headers. + find_package(PythonInterp 3.4 REQUIRED) + find_package(PythonLibs 3.4 REQUIRED) + + else() + # Use FindPython3 for CMake >=3.12 + find_package(Python3 3.4 REQUIRED COMPONENTS Interpreter Development) + endif() + + find_package(SIP REQUIRED) + if(NOT DEFINED LIB_SUFFIX) + set(LIB_SUFFIX "") + endif() + + include_directories(python/ include/pyArcus/ src/ ${SIP_INCLUDE_DIRS} ${Python3_INCLUDE_DIRS}) +endif() + +set(CMAKE_CXX_STANDARD 17) + +if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") +endif() + +set(arcus_SRCS + src/Socket.cpp + src/SocketListener.cpp + src/MessageTypeStore.cpp + src/PlatformSocket.cpp + src/Error.cpp +) + +set(arcus_HDRS + include/Arcus/Socket.h + include/Arcus/SocketListener.h + include/Arcus/Types.h + include/Arcus/MessageTypeStore.h + include/Arcus/Error.h + ${CMAKE_CURRENT_BINARY_DIR}/src/ArcusExport.h +) + +set(ARCUS_VERSION 1.1.0) +set(ARCUS_SOVERSION 3) + +set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}") + +if(BUILD_STATIC) + add_library(Arcus STATIC ${arcus_SRCS}) + if(NOT WIN32 OR CMAKE_COMPILER_IS_GNUCXX) + target_link_libraries(Arcus PRIVATE pthread) + set_target_properties(Arcus PROPERTIES COMPILE_FLAGS -fPIC) + endif() +else() + add_library(Arcus SHARED ${arcus_SRCS}) +endif() + +if(MSVC_STATIC_RUNTIME) + foreach(flag_var + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${flag_var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endif(${flag_var} MATCHES "/MD") + endforeach(flag_var) +endif() + +if(BUILD_PYTHON) + set(SIP_EXTRA_FILES_DEPEND python/SocketListener.sip python/Types.sip python/PythonMessage.sip python/Error.sip) + set(SIP_EXTRA_SOURCE_FILES python/PythonMessage.cpp) + set(SIP_EXTRA_OPTIONS -g -n PyQt5.sip) # -g means always release the GIL before calling C++ methods. -n PyQt5.sip is required to not get the PyCapsule error + add_sip_python_module(pyArcus python/pyArcus.sip Arcus) +endif() + +target_include_directories(Arcus PUBLIC + $ + $ + ${PROTOBUF_INCLUDE_DIR} +) +target_link_libraries(Arcus PUBLIC ${PROTOBUF_LIBRARIES}) + +if(WIN32) + add_definitions(-D_WIN32_WINNT=0x0600) # Declare we require Vista or higher, this allows us to use IPv6 functions. + target_link_libraries(Arcus PUBLIC Ws2_32) +endif() + +if(${CMAKE_BUILD_TYPE}) + if(${CMAKE_BUILD_TYPE} STREQUAL "Debug" OR ${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo") + add_definitions(-DARCUS_DEBUG) + endif() +endif() + +set_target_properties(Arcus PROPERTIES + FRAMEWORK FALSE + VERSION ${ARCUS_VERSION} + SOVERSION ${ARCUS_SOVERSION} + PUBLIC_HEADER "${arcus_HDRS}" + DEFINE_SYMBOL MAKE_ARCUS_LIB + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN 1 +) + +generate_export_header(Arcus + EXPORT_FILE_NAME src/ArcusExport.h +) +# This is required when building out-of-tree. +# The compiler won't find the generated header otherwise. +include_directories(${CMAKE_BINARY_DIR}/src include/) + +if(BUILD_EXAMPLES) + add_subdirectory(examples) +endif() + +install(TARGETS Arcus + EXPORT Arcus-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/Arcus +) + +install(EXPORT Arcus-targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Arcus +) + +configure_package_config_file(ArcusConfig.cmake.in ${CMAKE_BINARY_DIR}/ArcusConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Arcus) +write_basic_package_version_file(${CMAKE_BINARY_DIR}/ArcusConfigVersion.cmake VERSION ${ARCUS_VERSION} COMPATIBILITY SameMajorVersion) + +install(FILES + ${CMAKE_BINARY_DIR}/ArcusConfig.cmake + ${CMAKE_BINARY_DIR}/ArcusConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Arcus +) + +include(CPackConfig.cmake) diff --git a/COPYING-CMAKE-SCRIPTS b/COPYING-CMAKE-SCRIPTS new file mode 100644 index 0000000..4b41776 --- /dev/null +++ b/COPYING-CMAKE-SCRIPTS @@ -0,0 +1,22 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/CPackConfig.cmake b/CPackConfig.cmake new file mode 100644 index 0000000..bd1680e --- /dev/null +++ b/CPackConfig.cmake @@ -0,0 +1,24 @@ +set(CPACK_PACKAGE_VENDOR "Ultimaker") +set(CPACK_PACKAGE_CONTACT "Ruben Dulek ") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "libArcus Communication library") +if(NOT DEFINED CPACK_PACKAGE_VERSION) + set(CPACK_PACKAGE_VERSION "15.05.91") +endif() +set(CPACK_GENERATOR "DEB") +if(NOT DEFINED CPACK_DEBIAN_PACKAGE_ARCHITECTURE) + execute_process(COMMAND dpkg --print-architecture OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() +set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") + +set(DEB_DEPENDS + "python3 (>= 3.4.0)" + "libgcc1 (>= 4.9.0)" + "libstdc++6 (>= 4.9.0)" + "libc6 (>= 2.19)" + "zlib1g (>= 1.2.0)" + "protobuf (>= 3.0.0)" +) +string(REPLACE ";" ", " DEB_DEPENDS "${DEB_DEPENDS}") +set(CPACK_DEBIAN_PACKAGE_DEPENDS ${DEB_DEPENDS}) + +include(CPack) diff --git a/FindSIP.cmake b/FindSIP.cmake new file mode 100644 index 0000000..e15e2b4 --- /dev/null +++ b/FindSIP.cmake @@ -0,0 +1,92 @@ +# Find SIP +# ~~~~~~~~ +# +# SIP website: http://www.riverbankcomputing.co.uk/sip/index.php +# +# Find the installed version of SIP. FindSIP should be called after Python +# has been found. +# +# This file defines the following variables: +# +# SIP_VERSION - SIP version. +# +# SIP_EXECUTABLE - Path to the SIP executable. +# +# SIP_INCLUDE_DIRS - The SIP include directories. +# + +# Copyright (c) 2007, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +if(APPLE) + # Workaround for broken FindPythonLibs. It will always find Python 2.7 libs on OSX + set(CMAKE_FIND_FRAMEWORK LAST) +endif() + +# FIXME: Use FindPython3 to find Python, new in CMake 3.12. +# However currently on our CI server it finds the wrong Python version and then doesn't find the headers. +find_package(PythonInterp 3.5 REQUIRED) +find_package(PythonLibs 3.5 REQUIRED) + +# Define variables that are available in FindPython3, so there's no need to branch off in the later part. +set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) +set(Python3_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS}) +set(Python3_LIBRARIES ${PYTHON_LIBRARIES}) +set(Python3_VERSION_MINOR "${PYTHON_VERSION_MINOR}") + +execute_process( + COMMAND ${Python3_EXECUTABLE} -c + "import distutils.sysconfig; print(distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False))" + RESULT_VARIABLE _process_status + OUTPUT_VARIABLE _process_output + OUTPUT_STRIP_TRAILING_WHITESPACE +) +if(${_process_status} EQUAL 0) + string(STRIP ${_process_output} Python3_SITELIB) +else() + message(FATAL_ERROR "Failed to get Python3_SITELIB. Error: ${_process_output}") +endif() + +execute_process( + COMMAND ${Python3_EXECUTABLE} -c + "import distutils.sysconfig; print(distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=False))" + RESULT_VARIABLE _process_status + OUTPUT_VARIABLE _process_output + OUTPUT_STRIP_TRAILING_WHITESPACE +) +if(${_process_status} EQUAL 0) + string(STRIP ${_process_output} Python3_SITEARCH) +else() + message(FATAL_ERROR "Failed to get Python3_SITEARCH. Error: ${_process_output}") +endif() + +get_filename_component(_python_binary_path ${Python3_EXECUTABLE} DIRECTORY) + +find_program(SIP_EXECUTABLE sip + HINTS ${CMAKE_PREFIX_PATH}/bin ${CMAKE_INSTALL_PATH}/bin ${_python_binary_path} ${Python3_SITELIB}/PyQt5 +) + +find_path(SIP_INCLUDE_DIRS sip.h + HINTS ${CMAKE_PREFIX_PATH}/include ${CMAKE_INSTALL_PATH}/include ${Python3_INCLUDE_DIRS} ${Python3_SITELIB}/PyQt5 +) + +execute_process( + COMMAND ${Python3_EXECUTABLE} -c "import sip; print(sip.SIP_VERSION_STR)" + RESULT_VARIABLE _process_status + OUTPUT_VARIABLE _process_output + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +if(${_process_status} EQUAL 0) + string(STRIP ${_process_output} SIP_VERSION) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SIP REQUIRED_VARS SIP_EXECUTABLE SIP_INCLUDE_DIRS VERSION_VAR SIP_VERSION) + +if(SIP_FOUND) + include(${CMAKE_CURRENT_LIST_DIR}/SIPMacros.cmake) +endif() + +mark_as_advanced(SIP_EXECUTABLE SIP_INCLUDE_DIRS SIP_VERSION) diff --git a/SIPMacros.cmake b/SIPMacros.cmake new file mode 100644 index 0000000..50553e0 --- /dev/null +++ b/SIPMacros.cmake @@ -0,0 +1,128 @@ +# Macros for SIP +# ~~~~~~~~~~~~~~ +# Copyright (c) 2007, Simon Edwards +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# +# SIP website: http://www.riverbankcomputing.co.uk/sip/index.php +# +# This file defines the following macros: +# +# ADD_SIP_PYTHON_MODULE (MODULE_NAME MODULE_SIP [library1, libaray2, ...]) +# Specifies a SIP file to be built into a Python module and installed. +# MODULE_NAME is the name of Python module including any path name. (e.g. +# os.sys, Foo.bar etc). MODULE_SIP the path and filename of the .sip file +# to process and compile. libraryN are libraries that the Python module, +# which is typically a shared library, should be linked to. The built +# module will also be install into Python's site-packages directory. +# +# The behaviour of the ADD_SIP_PYTHON_MODULE macro can be controlled by a +# number of variables: +# +# SIP_INCLUDE_DIRS - List of directories which SIP will scan through when looking +# for included .sip files. (Corresponds to the -I option for SIP.) +# +# SIP_TAGS - List of tags to define when running SIP. (Corresponds to the -t +# option for SIP.) +# +# SIP_CONCAT_PARTS - An integer which defines the number of parts the C++ code +# of each module should be split into. Defaults to 8. (Corresponds to the +# -j option for SIP.) +# +# SIP_DISABLE_FEATURES - List of feature names which should be disabled +# running SIP. (Corresponds to the -x option for SIP.) +# +# SIP_EXTRA_OPTIONS - Extra command line options which should be passed on to +# SIP. + +SET(SIP_INCLUDE_DIRS) +SET(SIP_TAGS) +SET(SIP_CONCAT_PARTS 8) +SET(SIP_DISABLE_FEATURES) +SET(SIP_EXTRA_OPTIONS) + +MACRO(ADD_SIP_PYTHON_MODULE MODULE_NAME MODULE_SIP) + + SET(EXTRA_LINK_LIBRARIES ${ARGN}) + + STRING(REPLACE "." "/" _x ${MODULE_NAME}) + GET_FILENAME_COMPONENT(_parent_module_path ${_x} PATH) + GET_FILENAME_COMPONENT(_child_module_name ${_x} NAME) + + GET_FILENAME_COMPONENT(_module_path ${MODULE_SIP} PATH) + GET_FILENAME_COMPONENT(_abs_module_sip ${MODULE_SIP} ABSOLUTE) + + # We give this target a long logical target name. + # (This is to avoid having the library name clash with any already + # install library names. If that happens then cmake dependency + # tracking get confused.) + STRING(REPLACE "." "_" _logical_name ${MODULE_NAME}) + SET(_logical_name "python_module_${_logical_name}") + + FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${_module_path}) # Output goes in this dir. + + SET(_sip_includes) + FOREACH (_inc ${SIP_INCLUDES}) + GET_FILENAME_COMPONENT(_abs_inc ${_inc} ABSOLUTE) + LIST(APPEND _sip_includes -I ${_abs_inc}) + ENDFOREACH (_inc ) + + SET(_sip_tags) + FOREACH (_tag ${SIP_TAGS}) + LIST(APPEND _sip_tags -t ${_tag}) + ENDFOREACH (_tag) + + SET(_sip_x) + FOREACH (_x ${SIP_DISABLE_FEATURES}) + LIST(APPEND _sip_x -x ${_x}) + ENDFOREACH (_x ${SIP_DISABLE_FEATURES}) + + SET(_message "-DMESSAGE=Generating CPP code for module ${MODULE_NAME}") + SET(_sip_output_files) + FOREACH(CONCAT_NUM RANGE 0 ${SIP_CONCAT_PARTS} ) + IF( ${CONCAT_NUM} LESS ${SIP_CONCAT_PARTS} ) + SET(_sip_output_files ${_sip_output_files} ${CMAKE_CURRENT_BINARY_DIR}/${_module_path}/sip${_child_module_name}part${CONCAT_NUM}.cpp ) + ENDIF( ${CONCAT_NUM} LESS ${SIP_CONCAT_PARTS} ) + ENDFOREACH(CONCAT_NUM RANGE 0 ${SIP_CONCAT_PARTS} ) + + # Suppress warnings + IF(PEDANTIC) + IF(MSVC) + # 4996 deprecation warnings (bindings re-export deprecated methods) + # 4701 potentially uninitialized variable used (sip generated code) + # 4702 unreachable code (sip generated code) + ADD_DEFINITIONS( /wd4996 /wd4701 /wd4702 ) + ELSE(MSVC) + # disable all warnings + ADD_DEFINITIONS( -w ) + ENDIF(MSVC) + ENDIF(PEDANTIC) + + ADD_CUSTOM_COMMAND( + OUTPUT ${_sip_output_files} + COMMAND ${CMAKE_COMMAND} -E echo ${message} + COMMAND ${CMAKE_COMMAND} -E touch ${_sip_output_files} + COMMAND ${SIP_EXECUTABLE} ${_sip_tags} ${_sip_x} ${SIP_EXTRA_OPTIONS} -j ${SIP_CONCAT_PARTS} -c ${CMAKE_CURRENT_BINARY_DIR}/${_module_path} ${_sip_includes} ${_abs_module_sip} + DEPENDS ${_abs_module_sip} ${SIP_EXTRA_FILES_DEPEND} + ) + ADD_LIBRARY(${_logical_name} MODULE ${_sip_output_files} ${SIP_EXTRA_SOURCE_FILES}) + IF (NOT APPLE) + IF ("${Python3_VERSION_MINOR}" GREATER 7) + MESSAGE(STATUS "Python > 3.7 - not linking to libpython") + ELSE () + TARGET_LINK_LIBRARIES(${_logical_name} ${Python3_LIBRARIES}) + ENDIF () + ENDIF (NOT APPLE) + TARGET_LINK_LIBRARIES(${_logical_name} ${EXTRA_LINK_LIBRARIES}) + IF (APPLE) + SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") + ENDIF (APPLE) + SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES PREFIX "" OUTPUT_NAME ${_child_module_name}) + + IF (WIN32) + SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES SUFFIX ".pyd" IMPORT_PREFIX "_") + ENDIF (WIN32) + + INSTALL(TARGETS ${_logical_name} DESTINATION "${Python3_SITEARCH}/${_parent_module_path}") + +ENDMACRO(ADD_SIP_PYTHON_MODULE) diff --git a/changelog b/changelog new file mode 100644 index 0000000..673b8ed --- /dev/null +++ b/changelog @@ -0,0 +1,195 @@ +* Thu Jul 20 2023 Fedora Release Engineering - 5.2.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Thu Jun 15 2023 Python Maint - 5.2.2-2 +- Rebuilt for Python 3.12 + +* Tue Mar 7 2023 Tom Callaway - 5.2.2-1 +- update to 5.2.2 with the help of forward ported CMake bits + +* Thu Jan 19 2023 Fedora Release Engineering - 4.13.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Thu Jul 21 2022 Fedora Release Engineering - 4.13.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Fri Jun 17 2022 Python Maint - 4.13.1-3 +- Rebuilt for Python 3.11 + +* Mon Apr 11 2022 Tomáš Hrnčiar - 4.13.1-2 +- Fix build failure with cmake 3.23+ + +* Tue Feb 01 2022 Gabriel Féron - 4.13.1-1 +- Update to 4.13.1 + +* Thu Jan 20 2022 Gabriel Féron - 4.13.0-1 +- Update to 4.13.0 + +* Thu Jan 20 2022 Fedora Release Engineering - 4.12.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Mon Dec 13 2021 Gabriel Féron - 4.12.1-1 +- Update to 4.12.1 + +* Sat Nov 06 2021 Adrian Reber - 4.11.0-3 +- Rebuilt for protobuf 3.19.0 + +* Mon Oct 25 2021 Adrian Reber - 4.11.0-2 +- Rebuilt for protobuf 3.18.1 + +* Wed Sep 15 2021 Gabriel Féron - 4.11.0-1 +- Update to 4.11.0 + +* Mon Aug 16 2021 Gabriel Féron - 4.10.0-1 +- Update to 4.10.0 + +* Thu Jul 22 2021 Fedora Release Engineering - 4.9.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Thu Jun 10 2021 Gabriel Féron - 4.9.1-1 +- Update to 4.9.1 + +* Fri Jun 04 2021 Python Maint - 4.9.0-2 +- Rebuilt for Python 3.10 + +* Mon Apr 26 2021 Gabriel Féron - 4.9.0-1 +- Update to 4.9.0 + +* Tue Mar 30 2021 Jonathan Wakely - 4.8.0-4 +- Rebuilt for removed libstdc++ symbol (#1937698) + +* Tue Jan 26 2021 Fedora Release Engineering - 4.8.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Jan 13 09:45:36 CET 2021 Adrian Reber - 4.8.0-2 +- Rebuilt for protobuf 3.14 + +* Tue Dec 22 2020 Jan Pazdziora - 4.8.0-1 +- Update to 4.8.0 + +* Wed Sep 23 2020 Adrian Reber - 4.7.1-2 +- Rebuilt for protobuf 3.13 + +* Thu Sep 03 2020 Miro Hrončok - 4.7.1-1 +- Update to 4.7.1 + +* Tue Jul 28 2020 Fedora Release Engineering - 4.6.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Sun Jun 14 2020 Adrian Reber - 4.6.1-3 +- Rebuilt for protobuf 3.12 + +* Tue May 26 2020 Miro Hrončok - 4.6.1-2 +- Rebuilt for Python 3.9 + +* Tue May 5 2020 Gabriel Féron - 4.6.0-1 +- Update to 4.6.1 + +* Tue Apr 21 2020 Gabriel Féron - 4.6.0-1 +- Update to 4.6.0 + +* Wed Jan 29 2020 Fedora Release Engineering - 4.4.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Dec 19 2019 Orion Poplawski - 4.4.0-2 +- Rebuild for protobuf 3.11 + +* Thu Nov 21 2019 Gabriel Féron - 4.4.0-1 +- Update to 4.4.0 + +* Fri Nov 01 2019 Miro Hrončok - 4.1.0-5 +- Make the dependency of python3-arcus on libarcus strict (#1767762) + +* Mon Sep 16 2019 Rex Dieter - 4.1.0-4 +- use python3-pyqt5-sip (#1748527#c12) + +* Mon Aug 19 2019 Miro Hrončok - 4.1.0-3 +- Rebuilt for Python 3.8 + +* Thu Jul 25 2019 Fedora Release Engineering - 4.1.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Tue Jun 18 2019 Gabriel Féron - 4.1.0-1 +- Update to 4.1.0 + +* Wed Apr 03 2019 Gabriel Féron - 4.0.0-1 +- Update to 4.0.0 + +* Fri Feb 01 2019 Fedora Release Engineering - 3.6.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Sat Jan 26 2019 Gabriel Féron - 3.6.0-1 +- Update to 3.6.0 + +* Wed Nov 21 2018 Igor Gnatenko - 3.5.1-3 +- Rebuild for protobuf 3.6 + +* Mon Nov 12 2018 Miro Hrončok +- Use PyQt5.sip (#1601917) + +* Mon Nov 12 2018 Miro Hrončok - 3.5.1-1 +- Update to 3.5.1 (#1644323) + +* Tue Aug 28 2018 Rex Dieter - 3.4.1-2 +- use more robust upstreamable sip_flags.patch (#1601917) + +* Tue Aug 28 2018 Miro Hrončok - 3.4.1-1 +- Update to 3.4.1 (#1599716) + +* Thu Aug 23 2018 Rex Dieter - 3.3.0-4 +- Use PyQt5.sip (#1601917) + +* Fri Jul 13 2018 Fedora Release Engineering - 3.3.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Tue Jun 19 2018 Miro Hrončok - 3.3.0-2 +- Rebuilt for Python 3.7 + +* Wed May 02 2018 Miro Hrončok - 3.3.0-1 +- Update to 3.3.0 (#1571482) + +* Mon Mar 19 2018 Miro Hrončok - 3.2.1-1 +- Update to 3.2.1 (#1523891) + +* Wed Feb 07 2018 Fedora Release Engineering - 3.1.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Sat Dec 09 2017 Miro Hrončok - 3.1.0-1 +- Update to 3.1.0 (#1523891) +- Don't sed lib -> lib64 (not needed now) + +* Wed Nov 29 2017 Igor Gnatenko - 3.0.3-3 +- Rebuild for protobuf 3.5 + +* Mon Nov 13 2017 Igor Gnatenko - 3.0.3-2 +- Rebuild for protobuf 3.4 + +* Fri Oct 20 2017 Charalampos Statakis - 3.0.3-1 +- Update to 3.0.3 + +* Wed Aug 30 2017 Miro Hrončok - 2.7.0-1 +- Update to 2.7.0 + +* Thu Aug 03 2017 Fedora Release Engineering - 2.6.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 2.6.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Wed Jun 28 2017 Miro Hrončok - 2.6.1-1 +- Update to 2.6.1 + +* Tue Jun 27 2017 Miro Hrončok - 2.6.0-1 +- Update to 2.6.0 + +* Tue Jun 13 2017 Miro Hrončok - 2.5.0-3 +- Rebuilt for new protobuf 3.3.1 + +* Wed May 03 2017 Miro Hrončok - 2.5.0-2 +- Clarify licensing information on cmake files + +* Wed Apr 26 2017 Miro Hrončok - 2.5.0-1 +- Update to 2.5.0 + +* Sat Mar 25 2017 Miro Hrončok - 2.4.0-1 +- Initial package diff --git a/libArcus-3.10.0-PyQt5.sip.patch b/libArcus-3.10.0-PyQt5.sip.patch new file mode 100644 index 0000000..3474500 --- /dev/null +++ b/libArcus-3.10.0-PyQt5.sip.patch @@ -0,0 +1,12 @@ +diff -up libArcus-4.10.0/cmake/FindSIP.cmake.sip libArcus-4.10.0/cmake/FindSIP.cmake +--- libArcus-4.10.0/cmake/FindSIP.cmake.sip ++++ libArcus-4.10.0/cmake/FindSIP.cmake +@@ -70,7 +70,7 @@ find_path(SIP_INCLUDE_DIRS sip.h + ) + + execute_process( +- COMMAND ${Python3_EXECUTABLE} -c "import sip; print(sip.SIP_VERSION_STR)" ++ COMMAND ${Python3_EXECUTABLE} -c "import PyQt5.sip; print(PyQt5.sip.SIP_VERSION_STR)" + RESULT_VARIABLE _process_status + OUTPUT_VARIABLE _process_output + OUTPUT_STRIP_TRAILING_WHITESPACE diff --git a/libArcus-3.10.0-PyQt6.sip.patch b/libArcus-3.10.0-PyQt6.sip.patch new file mode 100644 index 0000000..ef4ad09 --- /dev/null +++ b/libArcus-3.10.0-PyQt6.sip.patch @@ -0,0 +1,12 @@ +diff -up libArcus-4.10.0/cmake/FindSIP.cmake.sip libArcus-4.10.0/cmake/FindSIP.cmake +--- libArcus-4.10.0/cmake/FindSIP.cmake.sip ++++ libArcus-4.10.0/cmake/FindSIP.cmake +@@ -70,7 +70,7 @@ find_path(SIP_INCLUDE_DIRS sip.h + ) + + execute_process( +- COMMAND ${Python3_EXECUTABLE} -c "import sip; print(sip.SIP_VERSION_STR)" ++ COMMAND ${Python3_EXECUTABLE} -c "import PyQt6.sip; print(PyQt6.sip.SIP_VERSION_STR)" + RESULT_VARIABLE _process_status + OUTPUT_VARIABLE _process_output + OUTPUT_STRIP_TRAILING_WHITESPACE diff --git a/libArcus-5.2.2-actually-export-symbols.patch b/libArcus-5.2.2-actually-export-symbols.patch new file mode 100644 index 0000000..30ba0b0 --- /dev/null +++ b/libArcus-5.2.2-actually-export-symbols.patch @@ -0,0 +1,90 @@ +diff -up libArcus-5.2.2/include/Arcus/Error.h.export libArcus-5.2.2/include/Arcus/Error.h +--- libArcus-5.2.2/include/Arcus/Error.h.export 2022-11-30 09:32:40.000000000 -0500 ++++ libArcus-5.2.2/include/Arcus/Error.h 2023-03-08 12:26:40.095859666 -0500 +@@ -5,6 +5,7 @@ + #define ARCUS_ERROR_H + + #include "Arcus/Types.h" ++#include "ArcusExport.h" + + namespace Arcus + { +@@ -32,7 +33,7 @@ enum class ErrorCode + /** + * A class representing an error with an error code and an error message. + */ +-class Error ++class ARCUS_EXPORT Error + { + public: + /** +diff -up libArcus-5.2.2/include/Arcus/MessageTypeStore.h.export libArcus-5.2.2/include/Arcus/MessageTypeStore.h +--- libArcus-5.2.2/include/Arcus/MessageTypeStore.h.export 2022-11-30 09:32:40.000000000 -0500 ++++ libArcus-5.2.2/include/Arcus/MessageTypeStore.h 2023-03-08 12:26:40.095859666 -0500 +@@ -8,12 +8,14 @@ + + #include "Arcus/Types.h" + ++#include "ArcusExport.h" ++ + namespace Arcus + { + /** + * A class to manage the different types of messages that are available. + */ +-class MessageTypeStore ++class ARCUS_EXPORT MessageTypeStore + { + public: + MessageTypeStore(); +@@ -87,7 +89,7 @@ public: + void dumpMessageTypes(); + + private: +- class Private; ++ class ARCUS_NO_EXPORT Private; + const std::unique_ptr d; + }; + } // namespace Arcus +diff -up libArcus-5.2.2/include/Arcus/Socket.h.export libArcus-5.2.2/include/Arcus/Socket.h +--- libArcus-5.2.2/include/Arcus/Socket.h.export 2022-11-30 09:32:40.000000000 -0500 ++++ libArcus-5.2.2/include/Arcus/Socket.h 2023-03-08 12:26:40.096859680 -0500 +@@ -9,6 +9,8 @@ + #include "Arcus/Error.h" + #include "Arcus/Types.h" + ++#include "ArcusExport.h" ++ + namespace Arcus + { + class SocketListener; +@@ -21,7 +23,7 @@ class SocketListener; + * + * Please see the README in libArcus for more details. + */ +-class Socket ++class ARCUS_EXPORT Socket + { + public: + Socket(); +diff -up libArcus-5.2.2/include/Arcus/SocketListener.h.export libArcus-5.2.2/include/Arcus/SocketListener.h +--- libArcus-5.2.2/include/Arcus/SocketListener.h.export 2023-03-08 12:27:19.364375316 -0500 ++++ libArcus-5.2.2/include/Arcus/SocketListener.h 2023-03-08 12:27:41.511666142 -0500 +@@ -6,6 +6,8 @@ + + #include "Arcus/Types.h" + ++#include "ArcusExport.h" ++ + namespace Arcus + { + class Socket; +@@ -24,7 +26,7 @@ class Error; + * signal from a subclass of this class, to make sure the actual event + * is handled on the main thread. + */ +-class SocketListener ++class ARCUS_EXPORT SocketListener + { + public: + SocketListener() : _socket(nullptr) diff --git a/libarcus.spec b/libarcus.spec index 9111efe..05368db 100644 --- a/libarcus.spec +++ b/libarcus.spec @@ -1,19 +1,46 @@ Name: libarcus -Version: 3.2.1 -Release: 1%{?dist} +Version: 5.3.0 +Release: %autorelease Summary: Communication library between internal components for Ultimaker software -License: LGPLv3+ +License: LGPL-3.0-or-later URL: https://github.com/Ultimaker/libArcus Source0: %{url}/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz +# Python bits +Source1: https://github.com/Ultimaker/pyArcus/archive/%{version}.tar.gz#/pyArcus-%{version}.tar.gz + +# Cmake bits taken from 4.13.1, before upstream went nuts with conan +Source2: FindSIP.cmake +Source3: SIPMacros.cmake +Source4: CMakeLists.txt +Source5: CPackConfig.cmake +Source6: ArcusConfig.cmake.in +Source7: COPYING-CMAKE-SCRIPTS + +# https://bugzilla.redhat.com/show_bug.cgi?id=1601917 +Patch: libArcus-3.10.0-PyQt6.sip.patch + +# Actually export symbols +Patch: libArcus-5.2.2-actually-export-symbols.patch + +# Add missing stdint includes +Patch: https://github.com/Ultimaker/libArcus/pull/160.patch BuildRequires: protobuf-devel BuildRequires: python3-devel BuildRequires: python3-protobuf +BuildRequires: python3-pyqt6-sip BuildRequires: python3-sip-devel BuildRequires: /usr/bin/sip BuildRequires: cmake BuildRequires: gcc-c++ -BuildRequires: git +BuildRequires: git-core + +# we add a dependency on setuptools to provide the distutils module +# upstream already removed the distutils usage in version 5+ +BuildRequires: (python3-setuptools if python3-devel >= 3.12) + +# https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval +ExcludeArch: %{ix86} %description Arcus library contains C++ code and Python 3 bindings for creating a socket in @@ -24,7 +51,7 @@ between Cura and its backend and similar code. %package devel # The cmake scripts are BSD -License: AGPLv3+ and BSD +License: LGPLv3+ and BSD Summary: Development files for libarcus Requires: %{name}%{?_isa} = %{version}-%{release} @@ -39,7 +66,8 @@ Development files. %package -n python3-arcus Summary: Python 3 libArcus bindings -%{?python_provide:%python_provide python3-arcus} +Requires: %{name}%{?_isa} = %{version}-%{release} +%{?_sip_api:Requires: python3-pyqt5-sip-api(%{_sip_api_major}) >= %{_sip_api}} %description -n python3-arcus Arcus Python 3 bindings for creating a socket in a thread and using this @@ -48,27 +76,32 @@ Protocol Buffers library. It is designed to facilitate the communication between Cura and its backend and similar code. %prep -%autosetup -n libArcus-%{version} -p1 -S git +%setup -q -n libArcus-%{version} -a 1 + +cp -a pyArcus-%{version}/python . +cp -a pyArcus-%{version}/include/pyArcus include +mkdir cmake +cp -a %{SOURCE2} %{SOURCE3} %{SOURCE7} cmake/ +rm -rf CMakeLists.txt +cp -a %{SOURCE4} %{SOURCE5} %{SOURCE6} . +cp -a pyArcus-%{version}/src/PythonMessage.cpp python/ + +%autopatch -p1 %build -%{cmake} -DBUILD_EXAMPLES:BOOL=OFF -DCMAKE_SKIP_RPATH:BOOL=ON . -make %{?_smp_mflags} +%cmake -DBUILD_EXAMPLES:BOOL=OFF -DCMAKE_SKIP_RPATH:BOOL=ON +%cmake_build %install -make install DESTDIR=%{buildroot} - -%post -p /sbin/ldconfig - -%postun -p /sbin/ldconfig +%cmake_install %files %license LICENSE -%doc README.md TODO.md +%doc README.md %{_libdir}/libArcus.so.* %files devel %license LICENSE cmake/COPYING-CMAKE-SCRIPTS -%doc examples/example.cpp examples/example.proto %{_libdir}/libArcus.so %{_includedir}/Arcus # Own the dir not to depend on cmake: @@ -76,53 +109,8 @@ make install DESTDIR=%{buildroot} %files -n python3-arcus %license LICENSE -%doc README.md TODO.md -%doc examples/example.py -%{python3_sitearch}/Arcus.so +%doc README.md +%{python3_sitearch}/pyArcus.so %changelog -* Mon Mar 19 2018 Miro Hrončok - 3.2.1-1 -- Update to 3.2.1 (#1523891) - -* Wed Feb 07 2018 Fedora Release Engineering - 3.1.0-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild - -* Sat Dec 09 2017 Miro Hrončok - 3.1.0-1 -- Update to 3.1.0 (#1523891) -- Don't sed lib -> lib64 (not needed now) - -* Wed Nov 29 2017 Igor Gnatenko - 3.0.3-3 -- Rebuild for protobuf 3.5 - -* Mon Nov 13 2017 Igor Gnatenko - 3.0.3-2 -- Rebuild for protobuf 3.4 - -* Fri Oct 20 2017 Charalampos Statakis - 3.0.3-1 -- Update to 3.0.3 - -* Wed Aug 30 2017 Miro Hrončok - 2.7.0-1 -- Update to 2.7.0 - -* Thu Aug 03 2017 Fedora Release Engineering - 2.6.1-3 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - -* Wed Jul 26 2017 Fedora Release Engineering - 2.6.1-2 -- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - -* Wed Jun 28 2017 Miro Hrončok - 2.6.1-1 -- Update to 2.6.1 - -* Tue Jun 27 2017 Miro Hrončok - 2.6.0-1 -- Update to 2.6.0 - -* Tue Jun 13 2017 Miro Hrončok - 2.5.0-3 -- Rebuilt for new protobuf 3.3.1 - -* Wed May 03 2017 Miro Hrončok - 2.5.0-2 -- Clarify licensing information on cmake files - -* Wed Apr 26 2017 Miro Hrončok - 2.5.0-1 -- Update to 2.5.0 - -* Sat Mar 25 2017 Miro Hrončok - 2.4.0-1 -- Initial package +%autochangelog diff --git a/sources b/sources index 393a281..889b3c4 100644 --- a/sources +++ b/sources @@ -1 +1,2 @@ -SHA512 (libarcus-3.2.1.tar.gz) = fc211aa3b917fd2dfaff86642c4a5e28a46cc9a977ad385dcba02795c536e055f50bacd3dced64dbe89dc507aca7894ea79169cc5e0b8e923528a4d4babce15e +SHA512 (libarcus-5.3.0.tar.gz) = 8106bbcd595921d56e39bf694fbee43c6146a9c661edf9fb1fe271bbcf199a202e399cfbda5b83711c9daad1c55d8242ba23ce4fb52c416ddd862fb6de2bcab3 +SHA512 (pyArcus-5.3.0.tar.gz) = d4a114994fa3e3156eae95dde58df13237b8bb0571a1219d6dee6b6338fd65f911f27887d6ab32b7a3cb32bc45ca6c25147e7c2d246cb0707326b88246abfbcd