diff --git a/.github/workflows/build_wheels.yml b/.github/workflows/build_wheels.yml index cb7f0539e..5cc43789c 100644 --- a/.github/workflows/build_wheels.yml +++ b/.github/workflows/build_wheels.yml @@ -284,7 +284,7 @@ jobs: permissions: id-token: write steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v6 with: # unpacks all CIBW artifacts into dist/ pattern: cibw-* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 00ffb78cc..4ba5f3642 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -61,7 +61,6 @@ build_idl84: - cp -r install/lib/python${PYTHON_VERSION}/site-packages/*uda* dist - export PYTHONPATH=dist:$PYTHONPATH - # - export LD_LIBRARY_PATH=install/lib:$LD_LIBRARY_PATH - module use install/modulefiles - UDA_MODULE=`ls install/modulefiles | grep uda` - module load $UDA_MODULE @@ -76,6 +75,7 @@ build_idl84: - python3 -m pytest -v mastcodes/uda/python/tests/test_uda_meta.py - python3 -m pytest -v mastcodes/uda/python/tests/test_uda_signals.py - python3 -m pytest -v mastcodes/uda/python/tests/test_uda_xpad.py + - python3 mastcodes/uda/python/tests/test_put.py artifacts: paths: - dist diff --git a/CMakeLists.txt b/CMakeLists.txt index 665e89ca5..0facedc91 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ set( Boost_USE_MULTITHREADED OFF ) # Version and Machine information # Set VERSION and FULL_VERSION from `git describe` -# but use git export attribute for release tarballs +# but use git export attribute for release tarballs set( GIT_ARCHIVE_DESCRIBE [[$Format:%(describe)$]] ) include( DetermineVersion ) @@ -109,16 +109,16 @@ endif() if( NOT WIN32 ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -pthread -Wno-implicit-function-declaration" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -pthread" ) - + if( MINGW ) add_definitions( -DMINGW ) endif() - + if( GOPTION ) message( "Compiling with g option to generate and embed debug information" ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g" ) - endif() + endif() endif() if( WIN32 AND NOT MINGW ) @@ -136,12 +136,12 @@ if( WIN32 OR MINGW ) set( CMAKE_FIND_LIBRARY_PREFIXES "lib" "" ) set( CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a" ".dll.lib" ".a" ".lib" ) if( MINGW ) - set( IMPLIB_SUFFIX ".dll.a" ) + set( IMPLIB_SUFFIX ".a" ) else() - set( IMPLIB_SUFFIX ".dll.lib" ) + set( IMPLIB_SUFFIX ".lib" ) endif() find_package( XDR REQUIRED ) - + # "-Wl,-z,defs" is an ELF instruction, not supported by Windows string( REGEX REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}" ) endif() @@ -184,7 +184,7 @@ endif() if( SSLAUTHENTICATION ) message( "Including SSL/RTL X509 User Authentication" ) add_definitions( -DSSLAUTHENTICATION ) -endif() +endif() if( BUILD_SHARED_LIBS ) message( "Build shared libraries asked" ) @@ -256,7 +256,7 @@ if( WIN32 OR MINGW ) # otherwise it is not able to find files set( CPACK_NSIS_FULL_INSTALL "File /r \\\"\\\${INST_DIR_WIN}\\\\*.*\\\"" ) endif() - + set( CPACK_TEMPORARY_INSTALL_DIRECTORY "${CMAKE_BINARY_DIR}/cpack" ) set( CPACK_PACKAGE_DIRECTORY "${CMAKE_WIN_BINARY_DIR}" ) set( CPACK_TEMPORARY_DIRECTORY "${CMAKE_BINARY_DIR}/cpack" ) diff --git a/extlib/portablexdr-4.9.1/CMakeLists.txt b/extlib/portablexdr-4.9.1/CMakeLists.txt index 9b0d56f42..6e0dc3c97 100644 --- a/extlib/portablexdr-4.9.1/CMakeLists.txt +++ b/extlib/portablexdr-4.9.1/CMakeLists.txt @@ -51,7 +51,9 @@ install( ) install( - TARGETS ${PROJECT_NAME} - DESTINATION lib + TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) diff --git a/source/bin/CMakeLists.txt b/source/bin/CMakeLists.txt index 43e6031f5..4c15ea773 100644 --- a/source/bin/CMakeLists.txt +++ b/source/bin/CMakeLists.txt @@ -23,12 +23,12 @@ if( ENABLE_CAPNP ) target_link_libraries( uda_cli PRIVATE serialisation-static ) target_compile_definitions( uda_cli PRIVATE CAPNP_ENABLED=1 ) - + find_library( STDCXX_LIBRARY_FILE stdc++ HINTS ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES} ) get_filename_component(STDCXX_LIBRARY_DIR ${STDCXX_LIBRARY_FILE} DIRECTORY ) - + if ( "${STDCXX_LIBRARY_DIR}" STREQUAL "" ) - set ( STDCXX_RPATH "" ) + set ( STDCXX_RPATH "" ) else() set ( STDCXX_RPATH "-Wl,-rpath,${STDCXX_LIBRARY_DIR} -L${STDCXX_LIBRARY_DIR} -lstdc++" ) endif() @@ -41,13 +41,15 @@ if( ENABLE_CAPNP ) set_target_properties( uda_cli PROPERTIES - LINK_FLAGS "${CAPNP_RPATH} ${STDCXX_RPATH}" + LINK_FLAGS "${CAPNP_RPATH} ${STDCXX_RPATH}" ) endif() install( TARGETS uda_cli - DESTINATION bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ ) diff --git a/source/client/CMakeLists.txt b/source/client/CMakeLists.txt index 3a2858294..5b423af00 100755 --- a/source/client/CMakeLists.txt +++ b/source/client/CMakeLists.txt @@ -140,7 +140,7 @@ endif() if( NOT CLIENT_ONLY ) add_library( fatclient-static STATIC ${FATCLIENT_OBJS} ) target_link_libraries( fatclient-static PUBLIC plugins-static ${CLIENT_LINK_LIBS} ) - + if( BUILD_SHARED_LIBS ) add_library( fatclient-shared SHARED ${FATCLIENT_OBJS} ) target_link_libraries( fatclient-shared PUBLIC plugins-shared ${CLIENT_LINK_LIBS} ) @@ -149,11 +149,13 @@ endif() set_target_properties( client-static PROPERTIES - OUTPUT_NAME ${PROJECT_NAME}_client + OUTPUT_NAME ${PROJECT_NAME}_client_static ) install( TARGETS client-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) if( BUILD_SHARED_LIBS ) @@ -172,7 +174,9 @@ if( BUILD_SHARED_LIBS ) endif() install( TARGETS client-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() @@ -185,13 +189,15 @@ install( FILES ${HEADER_FILES} if( NOT CLIENT_ONLY ) set_target_properties( fatclient-static PROPERTIES - OUTPUT_NAME fat${PROJECT_NAME}_client + OUTPUT_NAME fat${PROJECT_NAME}_client_static ) install( TARGETS fatclient-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) - + if( BUILD_SHARED_LIBS ) set_target_properties( fatclient-shared PROPERTIES @@ -208,7 +214,9 @@ if( NOT CLIENT_ONLY ) endif() install( TARGETS fatclient-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() endif() diff --git a/source/client2/CMakeLists.txt b/source/client2/CMakeLists.txt index 18ac1ea41..5a4c03115 100755 --- a/source/client2/CMakeLists.txt +++ b/source/client2/CMakeLists.txt @@ -139,7 +139,7 @@ endif() if( NOT CLIENT_ONLY ) add_library( fatclient2-static STATIC ${FATCLIENT_OBJS} ) target_link_libraries( fatclient2-static PRIVATE plugins-static ${CLIENT_LINK_LIBS} ) - + if( BUILD_SHARED_LIBS ) add_library( fatclient2-shared SHARED ${FATCLIENT_OBJS} ) target_link_libraries( fatclient2-shared PRIVATE plugins-shared ${CLIENT_LINK_LIBS} ) @@ -148,11 +148,13 @@ endif() set_target_properties( client2-static PROPERTIES - OUTPUT_NAME ${PROJECT_NAME}_client2 + OUTPUT_NAME ${PROJECT_NAME}_client2_static ) install( TARGETS client2-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) if( BUILD_SHARED_LIBS ) @@ -171,7 +173,9 @@ if( BUILD_SHARED_LIBS ) endif() install( TARGETS client2-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() @@ -184,13 +188,15 @@ install( FILES ${HEADER_FILES} if( NOT CLIENT_ONLY ) set_target_properties( fatclient2-static PROPERTIES - OUTPUT_NAME fat${PROJECT_NAME}_client2 + OUTPUT_NAME fat${PROJECT_NAME}_client2_static ) install( TARGETS fatclient2-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) - + if( BUILD_SHARED_LIBS ) set_target_properties( fatclient2-shared PROPERTIES @@ -207,7 +213,9 @@ if( NOT CLIENT_ONLY ) endif() install( TARGETS fatclient2-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() endif() diff --git a/source/plugins/CMakeLists.txt b/source/plugins/CMakeLists.txt index 05e3de388..9eb40e143 100755 --- a/source/plugins/CMakeLists.txt +++ b/source/plugins/CMakeLists.txt @@ -119,12 +119,14 @@ endif() set_target_properties( plugins-static PROPERTIES - OUTPUT_NAME ${PROJECT_NAME}_plugins + OUTPUT_NAME ${PROJECT_NAME}_plugins_static ) install( TARGETS plugins-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) if( BUILD_SHARED_LIBS ) @@ -144,7 +146,9 @@ if( BUILD_SHARED_LIBS ) install( TARGETS plugins-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() diff --git a/source/plugins/bytes/bytesPlugin.cpp b/source/plugins/bytes/bytesPlugin.cpp index 618be3d23..ed9ea7548 100644 --- a/source/plugins/bytes/bytesPlugin.cpp +++ b/source/plugins/bytes/bytesPlugin.cpp @@ -3,7 +3,9 @@ #include #include #include +#include #include +#include #include #include "readBytesNonOptimally.h" @@ -62,6 +64,7 @@ class BytesPlugin return; } // Free Heap & reset counters + file_map_.clear(); init_ = false; } @@ -82,50 +85,57 @@ class BytesPlugin int bytesPlugin(IDAM_PLUGIN_INTERFACE* plugin_interface) { - static BytesPlugin plugin = {}; + try { + static BytesPlugin plugin = {}; - if (plugin_interface->interfaceVersion > THISPLUGIN_MAX_INTERFACE_VERSION) { - RAISE_PLUGIN_ERROR("Plugin Interface Version Unknown to this plugin: Unable to execute the request!"); - } + if (plugin_interface->interfaceVersion > THISPLUGIN_MAX_INTERFACE_VERSION) { + RAISE_PLUGIN_ERROR("Plugin Interface Version Unknown to this plugin: Unable to execute the request!"); + } - plugin_interface->pluginVersion = THISPLUGIN_VERSION; + plugin_interface->pluginVersion = THISPLUGIN_VERSION; - REQUEST_DATA* request = plugin_interface->request_data; + REQUEST_DATA* request = plugin_interface->request_data; - if (plugin_interface->housekeeping || STR_IEQUALS(request->function, "reset")) { - plugin.reset(plugin_interface); - return 0; - } + if (plugin_interface->housekeeping || STR_IEQUALS(request->function, "reset")) { + plugin.reset(plugin_interface); + return 0; + } - plugin.init(plugin_interface); - if (STR_IEQUALS(request->function, "init") - || STR_IEQUALS(request->function, "initialise")) { - return 0; - } + plugin.init(plugin_interface); + if (STR_IEQUALS(request->function, "init") + || STR_IEQUALS(request->function, "initialise")) { + return 0; + } - //---------------------------------------------------------------------------------------- - // Plugin Functions - //---------------------------------------------------------------------------------------- - - //---------------------------------------------------------------------------------------- - // Standard methods: version, builddate, defaultmethod, maxinterfaceversion - - if (STR_IEQUALS(request->function, "help")) { - return plugin.help(plugin_interface); - } else if (STR_IEQUALS(request->function, "version")) { - return plugin.version(plugin_interface); - } else if (STR_IEQUALS(request->function, "builddate")) { - return plugin.build_date(plugin_interface); - } else if (STR_IEQUALS(request->function, "defaultmethod")) { - return plugin.default_method(plugin_interface); - } else if (STR_IEQUALS(request->function, "maxinterfaceversion")) { - return plugin.max_interface_version(plugin_interface); - } else if (STR_IEQUALS(request->function, "read")) { - return plugin.read(plugin_interface); - } else if (STR_IEQUALS(request->function, "size")) { - return plugin.size(plugin_interface); - } else { - RAISE_PLUGIN_ERROR_AND_EXIT("Unknown function requested!", plugin_interface); + //---------------------------------------------------------------------------------------- + // Plugin Functions + //---------------------------------------------------------------------------------------- + + //---------------------------------------------------------------------------------------- + // Standard methods: version, builddate, defaultmethod, maxinterfaceversion + + if (STR_IEQUALS(request->function, "help")) { + return plugin.help(plugin_interface); + } else if (STR_IEQUALS(request->function, "version")) { + return plugin.version(plugin_interface); + } else if (STR_IEQUALS(request->function, "builddate")) { + return plugin.build_date(plugin_interface); + } else if (STR_IEQUALS(request->function, "defaultmethod")) { + return plugin.default_method(plugin_interface); + } else if (STR_IEQUALS(request->function, "maxinterfaceversion")) { + return plugin.max_interface_version(plugin_interface); + } else if (STR_IEQUALS(request->function, "read")) { + return plugin.read(plugin_interface); + } else if (STR_IEQUALS(request->function, "size")) { + return plugin.size(plugin_interface); + } else { + RAISE_PLUGIN_ERROR_AND_EXIT("Unknown function requested!", plugin_interface); + } + } catch (const std::exception& e) { + std::string err_msg = std::string("Excption raised in bytes plugin:") + e.what(); + RAISE_PLUGIN_ERROR_AND_EXIT(err_msg.c_str(), plugin_interface); + } catch (...) { + RAISE_PLUGIN_ERROR_AND_EXIT("Unknown exception raised by bytes plugin", plugin_interface); } } @@ -227,8 +237,12 @@ int BytesPlugin::read(IDAM_PLUGIN_INTERFACE* plugin_interface) int max_bytes = -1; FIND_INT_VALUE(plugin_interface->request_data->nameValueList, max_bytes); - int offset = -1; - FIND_INT_VALUE(plugin_interface->request_data->nameValueList, offset); + unsigned long offset = 0; + FIND_UNSIGNED_LONG_VALUE(plugin_interface->request_data->nameValueList, offset); + auto file_size = filesystem::file_size(path); + if (offset >= file_size) { + RAISE_PLUGIN_ERROR_AND_EXIT("Offset specified is out of bounds", plugin_interface); + } const char* checksum = nullptr; FIND_STRING_VALUE(plugin_interface->request_data->nameValueList, checksum); diff --git a/source/plugins/bytes/readBytesNonOptimally.cpp b/source/plugins/bytes/readBytesNonOptimally.cpp index 11ff9b901..3c5c9027c 100755 --- a/source/plugins/bytes/readBytesNonOptimally.cpp +++ b/source/plugins/bytes/readBytesNonOptimally.cpp @@ -63,7 +63,7 @@ int readBytes(FILE* fh, DATA_BLOCK* data_block, int offset, int max_bytes, const while (!feof(fh)) { char* newp = (char*)realloc(bp, (size_t)data_block->data_n); if (newp == nullptr) { - free(bp); + if (bp != nullptr) free(bp); err = BYTE_FILE_HEAP_ERROR; addIdamError(UDA_CODE_ERROR_TYPE, "readBytes", err, "Unable to Allocate Heap Memory for the File"); break; diff --git a/source/plugins/udaPlugin.cpp b/source/plugins/udaPlugin.cpp index 79f70bf4d..47de1d698 100644 --- a/source/plugins/udaPlugin.cpp +++ b/source/plugins/udaPlugin.cpp @@ -14,6 +14,7 @@ #include #include #include +#include IDAM_PLUGIN_INTERFACE* udaCreatePluginInterface(const char* request) { @@ -467,6 +468,52 @@ bool findIntValue(const NAMEVALUELIST* namevaluelist, int* value, const char* na return found; } +/** + * Look for an argument with the given name in the provided NAMEVALUELIST and return it's associate value as a long integer. + * + * If the argument is found the value associated with the argument is provided via the value parameter and the function + * returns 1. Otherwise value is not set and the function returns 0. + * @param namevaluelist + * @param value + * @param name + * @return + */ +bool findLongIntValue(const NAMEVALUELIST* namevaluelist, long* value, const char* name) +{ + const char* str; + bool found = findStringValue(namevaluelist, &str, name); + if (found) { + *value = atol(str); + } + return found; +} + +/** + * Look for an argument with the given name in the provided NAMEVALUELIST and return it's associate value as an + * unsigned long integer. + * + * If the argument is found the value associated with the argument is provided via the value parameter and the function + * returns 1. Otherwise value is not set and the function returns 0. + * @param namevaluelist + * @param value + * @param name + * @return + */ +bool findUnsignedLongValue(const NAMEVALUELIST* namevaluelist, unsigned long* value, const char* name) +{ + const char* str; + bool found = findStringValue(namevaluelist, &str, name); + if (found) { + if (std::strchr(str, '-') != nullptr) { + std::string err_msg = std::string("Negative value found when unsigned expected: ") + name + "=" + str; + RAISE_PLUGIN_ERROR(err_msg.c_str()); + return false; + } + *value = std::strtoul(str, nullptr, 10); + } + return found; +} + /** * Look for an argument with the given name in the provided NAMEVALUELIST and return it's associate value as a short. * diff --git a/source/plugins/udaPlugin.h b/source/plugins/udaPlugin.h index 8c23856c3..1490616ea 100755 --- a/source/plugins/udaPlugin.h +++ b/source/plugins/udaPlugin.h @@ -83,6 +83,8 @@ LIBRARY_API int setReturnData(DATA_BLOCK* data_block, void* value, size_t size, LIBRARY_API bool findStringValue(const NAMEVALUELIST* namevaluelist, const char** value, const char* name); LIBRARY_API bool findValue(const NAMEVALUELIST* namevaluelist, const char* name); LIBRARY_API bool findIntValue(const NAMEVALUELIST* namevaluelist, int* value, const char* name); +LIBRARY_API bool findLongIntValue(const NAMEVALUELIST* namevaluelist, long* value, const char* name); +LIBRARY_API bool findUnsignedLongValue(const NAMEVALUELIST* namevaluelist, unsigned long* value, const char* name); LIBRARY_API bool findShortValue(const NAMEVALUELIST* namevaluelist, short* value, const char* name); LIBRARY_API bool findCharValue(const NAMEVALUELIST* namevaluelist, char* value, const char* name); LIBRARY_API bool findFloatValue(const NAMEVALUELIST* namevaluelist, float* values, const char* name); @@ -142,6 +144,8 @@ if (!find##TYPE##Array(&NAME_VALUE_LIST, &VARIABLE, CONCAT(&n, VARIABLE), QUOTE( } #define FIND_REQUIRED_INT_VALUE(NAME_VALUE_LIST, VARIABLE) FIND_REQUIRED_VALUE(NAME_VALUE_LIST, VARIABLE, Int) +#define FIND_REQUIRED_LONG_VALUE(NAME_VALUE_LIST, VARIABLE) FIND_REQUIRED_VALUE(NAME_VALUE_LIST, VARIABLE, LongInt) +#define FIND_REQUIRED_UNSIGNED_LONG_VALUE(NAME_VALUE_LIST, VARIABLE) FIND_REQUIRED_VALUE(NAME_VALUE_LIST, VARIABLE, UnsignedLong) #define FIND_REQUIRED_SHORT_VALUE(NAME_VALUE_LIST, VARIABLE) FIND_REQUIRED_VALUE(NAME_VALUE_LIST, VARIABLE, Short) #define FIND_REQUIRED_CHAR_VALUE(NAME_VALUE_LIST, VARIABLE) FIND_REQUIRED_VALUE(NAME_VALUE_LIST, VARIABLE, Char) #define FIND_REQUIRED_FLOAT_VALUE(NAME_VALUE_LIST, VARIABLE) FIND_REQUIRED_VALUE(NAME_VALUE_LIST, VARIABLE, Float) @@ -152,6 +156,8 @@ if (!find##TYPE##Array(&NAME_VALUE_LIST, &VARIABLE, CONCAT(&n, VARIABLE), QUOTE( #define FIND_REQUIRED_DOUBLE_ARRAY(NAME_VALUE_LIST, VARIABLE) FIND_REQUIRED_ARRAY(NAME_VALUE_LIST, VARIABLE, Double) #define FIND_INT_VALUE(NAME_VALUE_LIST, VARIABLE) findIntValue(&NAME_VALUE_LIST, &VARIABLE, QUOTE(VARIABLE)) +#define FIND_LONG_VALUE(NAME_VALUE_LIST, VARIABLE) findLongIntValue(&NAME_VALUE_LIST, &VARIABLE, QUOTE(VARIABLE)) +#define FIND_UNSIGNED_LONG_VALUE(NAME_VALUE_LIST, VARIABLE) findUnsignedLongValue(&NAME_VALUE_LIST, &VARIABLE, QUOTE(VARIABLE)) #define FIND_SHORT_VALUE(NAME_VALUE_LIST, VARIABLE) findShortValue(&NAME_VALUE_LIST, &VARIABLE, QUOTE(VARIABLE)) #define FIND_CHAR_VALUE(NAME_VALUE_LIST, VARIABLE) findCharValue(&NAME_VALUE_LIST, &VARIABLE, QUOTE(VARIABLE)) #define FIND_FLOAT_VALUE(NAME_VALUE_LIST, VARIABLE) findFloatValue(&NAME_VALUE_LIST, &VARIABLE, QUOTE(VARIABLE)) diff --git a/source/serialisation/CMakeLists.txt b/source/serialisation/CMakeLists.txt index ddc9b27fa..c58cd7f6a 100644 --- a/source/serialisation/CMakeLists.txt +++ b/source/serialisation/CMakeLists.txt @@ -3,6 +3,11 @@ find_package( CapnProto REQUIRED ) +if( WIN32 ) + # Use variable-based auto-export so MSVC generates import libs without header annotations + set( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON ) +endif() + capnp_generate_cpp( CAPNP_SRCS CANPNP_HDRS schema.capnp ) add_library( serialisation-static STATIC capnp_serialisation.cpp ${CAPNP_SRCS} ) @@ -15,13 +20,48 @@ target_include_directories( set_target_properties( serialisation-static PROPERTIES - OUTPUT_NAME ${PROJECT_NAME}_serialisation + OUTPUT_NAME ${PROJECT_NAME}_serialisation_static ) +# Optionally build a shared library variant as well +if( BUILD_SHARED_LIBS ) + add_library( serialisation-shared SHARED capnp_serialisation.cpp ${CAPNP_SRCS} ) + target_link_libraries( serialisation-shared PRIVATE CapnProto::capnp ) + target_include_directories( + serialisation-shared + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/source ${CMAKE_SOURCE_DIR}/extlib/GSL-4.0.0/include + ) + + set_target_properties( serialisation-shared + PROPERTIES + OUTPUT_NAME ${PROJECT_NAME}_serialisation + VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} + SOVERSION ${PROJECT_VERSION_MAJOR} + ) + + if( WIN32 ) + set_target_properties( serialisation-shared + PROPERTIES + COMPILE_FLAGS -DLIBRARY_EXPORTS + IMPORT_SUFFIX ${IMPLIB_SUFFIX} + ) + endif() +endif() + install( TARGETS serialisation-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) +if( BUILD_SHARED_LIBS ) + install( TARGETS serialisation-shared + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) +endif() + file( GLOB HEADER_FILES "*.h" ) install( FILES ${HEADER_FILES} diff --git a/source/server/CMakeLists.txt b/source/server/CMakeLists.txt index 0980a087f..c730ac626 100755 --- a/source/server/CMakeLists.txt +++ b/source/server/CMakeLists.txt @@ -207,12 +207,14 @@ endif() set_target_properties( server-static PROPERTIES - OUTPUT_NAME ${PROJECT_NAME}_server + OUTPUT_NAME ${PROJECT_NAME}_server_static ) install( TARGETS server-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) if( BUILD_SHARED_LIBS ) @@ -232,7 +234,9 @@ if( BUILD_SHARED_LIBS ) install( TARGETS server-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() @@ -252,7 +256,9 @@ if( WIN32 ) endif() install( TARGETS server-exe - DESTINATION bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) ######################################################################################################################## diff --git a/source/server2/CMakeLists.txt b/source/server2/CMakeLists.txt index 42dd89eab..d834c1bd4 100755 --- a/source/server2/CMakeLists.txt +++ b/source/server2/CMakeLists.txt @@ -174,12 +174,14 @@ endif() set_target_properties( server2-static PROPERTIES - OUTPUT_NAME ${PROJECT_NAME}_server2 + OUTPUT_NAME ${PROJECT_NAME}_server2_static ) install( TARGETS server2-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) if( BUILD_SHARED_LIBS ) @@ -199,7 +201,9 @@ if( BUILD_SHARED_LIBS ) install( TARGETS server2-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() @@ -219,7 +223,9 @@ if( WIN32 ) endif() install( TARGETS server2-exe - DESTINATION bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) ######################################################################################################################## diff --git a/source/wrappers/c++/CMakeLists.txt b/source/wrappers/c++/CMakeLists.txt index 8bf3ebe11..4ba61446f 100755 --- a/source/wrappers/c++/CMakeLists.txt +++ b/source/wrappers/c++/CMakeLists.txt @@ -106,7 +106,7 @@ if( NOT CLIENT_ONLY ) add_library( fat${LIB_NAME}-static STATIC $ ${FATCLIENT_OBJS} ) target_link_libraries( fat${LIB_NAME}-static PRIVATE ${LINK_LIB} plugins-static ) - + if( BUILD_SHARED_LIBS ) add_library( fat${LIB_NAME}-shared SHARED $ ${FATCLIENT_OBJS} ) target_link_libraries( fat${LIB_NAME}-shared PRIVATE ${LINK_LIB} plugins-shared ) @@ -115,11 +115,13 @@ endif() set_target_properties( ${LIB_NAME}-static PROPERTIES - OUTPUT_NAME ${LIB_NAME} + OUTPUT_NAME ${LIB_NAME}_static ) install( TARGETS ${LIB_NAME}-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) if( BUILD_SHARED_LIBS ) @@ -138,7 +140,9 @@ if( BUILD_SHARED_LIBS ) endif() install( TARGETS ${LIB_NAME}-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() @@ -157,13 +161,15 @@ install( FILES ${CMAKE_BINARY_DIR}/etc/uda/uda-cpp.pc if( NOT CLIENT_ONLY ) set_target_properties( fat${LIB_NAME}-static PROPERTIES - OUTPUT_NAME fat${LIB_NAME} + OUTPUT_NAME fat${LIB_NAME}_static ) - + install( TARGETS fat${LIB_NAME}-static - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) - + if( BUILD_SHARED_LIBS ) set_target_properties( fat${LIB_NAME}-shared PROPERTIES @@ -180,17 +186,19 @@ if( NOT CLIENT_ONLY ) endif() install( TARGETS fat${LIB_NAME}-shared - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) endif() - + # pkg-config file configure_file( ${CMAKE_SOURCE_DIR}/source/etc/uda-fat-cpp.pc.in ${CMAKE_BINARY_DIR}/etc/uda/uda-fat-cpp.pc @ONLY ) - + install( FILES ${CMAKE_BINARY_DIR}/etc/uda/uda-fat-cpp.pc DESTINATION modulefiles/uda ) diff --git a/source/wrappers/java/CMakeLists.txt b/source/wrappers/java/CMakeLists.txt index d2903303c..6dd26e089 100755 --- a/source/wrappers/java/CMakeLists.txt +++ b/source/wrappers/java/CMakeLists.txt @@ -64,5 +64,7 @@ if( WIN32 ) endif() install( TARGETS ${LIB_NAME} - DESTINATION lib + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) diff --git a/source/wrappers/python/README.md b/source/wrappers/python/README.md index b581c2587..bcc974aa2 100644 --- a/source/wrappers/python/README.md +++ b/source/wrappers/python/README.md @@ -19,4 +19,4 @@ signal_object = client.get(signal, source) ``` ## Old release versions -Releases 2.7.6-2.8.1 were uploaded to the uda project on pypi [here](https://pypi.org/project/uda). The project moved here under the pyuda name for release 2.8.2. +Releases 2.7.6-2.8.1 were uploaded to the uda project on pypi [here](https://pypi.org/project/uda). The project moved here under the pyuda name for release 2.9.0. diff --git a/source/wrappers/python/pyuda/_client.py b/source/wrappers/python/pyuda/_client.py index 7ae3087e4..d5632f141 100644 --- a/source/wrappers/python/pyuda/_client.py +++ b/source/wrappers/python/pyuda/_client.py @@ -117,7 +117,7 @@ def get_file(self, source_file, output_file=None, chunk_size=1): chunk_size = 0 if chunk_size: - result = cpyuda.get_data("bytes::size(path={path})".format(path=source_file) % source_file, "") + result = cpyuda.get_data("bytes::size(path={path})".format(path=source_file), "") size = result.data() chunk_size = int(chunk_size * 1024 * 1024) count = 0 diff --git a/source/wrappers/python/setup.py.in b/source/wrappers/python/setup.py.in index 9505abdda..2a0a21de9 100644 --- a/source/wrappers/python/setup.py.in +++ b/source/wrappers/python/setup.py.in @@ -27,25 +27,38 @@ elif sys.platform.lower() == 'darwin': stalib_ext = 'a' dynlib_ext = 'dylib' # On Mac OS we have to force setting of rpath - extra_link_args.append('-Wl,-rpath,%s' % os.path.join(root, 'lib')) + extra_link_args.append('-Wl,-rpath,{}'.format(os.path.join(root, 'lib'))) uda_lib_names = '@UDA_LIBS@'.split(';') if '@UDA_LIBS@' else [] build_fat = os.environ.get('UDA_FAT_PYTHON', False) if build_fat: uda_libs = [ - 'libfat@PROJECT_NAME@_client.' + stalib_ext, - 'lib@PROJECT_NAME@_plugins.' + stalib_ext, - ] + ['lib@PROJECT_NAME@_' + name + '.' + stalib_ext for name in uda_lib_names] + 'fat@PROJECT_NAME@_client', + '@PROJECT_NAME@_plugins', + ] + ['@PROJECT_NAME@_' + name for name in uda_lib_names] extra_libs = ['xml2'] extra_libs.extend('@EXTRA_LIBS@'.split(';') if '@EXTRA_LIBS@' else []) extra_macros = [('FATCLIENT', None)] else: uda_libs = [ - 'lib@PROJECT_NAME@_client.' + stalib_ext, - ] + ['lib@PROJECT_NAME@_' + name + '.' + stalib_ext for name in uda_lib_names] + '@PROJECT_NAME@_client', + ] + ['@PROJECT_NAME@_' + name for name in uda_lib_names] extra_libs = '@EXTRA_LIBS@'.split(';') if '@EXTRA_LIBS@' else [] extra_macros = [] +uda_static_libs = [os.path.join(root, 'lib', 'lib' + lib + '_static.' + stalib_ext) for lib in uda_libs] +uda_shared_libs = uda_libs + +# Decide whether to build against shared or static UDA libraries +if os.environ.get('UDA_PYTHON_SHARED', False): + print("Building against shared UDA libraries") + libraries = ['ssl', 'crypto', 'xml2'] + extra_libs + uda_shared_libs + static_libs = None +else: + print("Building against static UDA libraries") + libraries = ['ssl', 'crypto', 'xml2'] + extra_libs + static_libs = uda_static_libs + ext = Extension( 'cpyuda', ['pyuda/cpyuda/cpyuda.pyx'], @@ -57,7 +70,7 @@ ext = Extension( numpy.get_include(), '@FMT_INCLUDE_DIR@' ])), - libraries=list(filter(None, ['ssl', 'crypto', 'xml2'] + extra_libs)), + libraries=libraries, library_dirs=list(filter(None, [ '@STDCXX_LIB_DIR@', '@OPENSSL_LIB_DIR@', @@ -72,9 +85,9 @@ ext = Extension( '@CAPNP_LIB_DIR@', '@FMT_LIB_DIR@' ])), - extra_objects=[os.path.join(root, 'lib', uda_lib) for uda_lib in uda_libs], extra_link_args=extra_link_args, extra_compile_args=extra_compile_args, + extra_objects=static_libs, language='c++', define_macros=extra_macros, ) diff --git a/source/wrappers/python/uda/README.md b/source/wrappers/python/uda/README.md index 51078d671..c49dcb2fc 100644 --- a/source/wrappers/python/uda/README.md +++ b/source/wrappers/python/uda/README.md @@ -7,7 +7,7 @@ Install the new package directly using: pip install pyuda ``` -Previous release versions (2.7.6-2.8.1) are still hosted here. The first release under the new pyuda name is 2.8.2. +Previous release versions (2.7.6-2.8.1) are still hosted here. The first release under the new pyuda name is 2.9.0. ## Pyuda package description diff --git a/source/wrappers/python/win.setup.py.in b/source/wrappers/python/win.setup.py.in index e5b08b36c..4deb1dfe5 100644 --- a/source/wrappers/python/win.setup.py.in +++ b/source/wrappers/python/win.setup.py.in @@ -30,6 +30,7 @@ elif sys.platform.lower() == 'darwin': extra_link_args.append('-Wl,-rpath,%s' % os.path.join(root, 'lib')) else: stalib_ext = 'lib' + implib_ext = 'lib' dynlib_ext = 'dll' extra_compile_args = ['/MD'] @@ -37,18 +38,31 @@ uda_lib_names = '@UDA_LIBS@'.split(';') if '@UDA_LIBS@' else [] build_fat = os.environ.get('UDA_FAT_PYTHON', False) if build_fat: uda_libs = [ - 'libfat@PROJECT_NAME@_client.' + stalib_ext, - 'lib@PROJECT_NAME@_plugins.' + stalib_ext, - ] + ['lib@PROJECT_NAME@_' + name + '.' + stalib_ext for name in uda_lib_names] + 'fat@PROJECT_NAME@_client', + '@PROJECT_NAME@_plugins', + ] + ['@PROJECT_NAME@_' + name for name in uda_lib_names] extra_libs = ['xml2', 'pq'] extra_macros = [('FATCLIENT', None)] else: uda_libs = [ - '@PROJECT_NAME@_client.dll.' + stalib_ext, - ] + ['@PROJECT_NAME@_' + name + '.' + stalib_ext for name in uda_lib_names] + '@PROJECT_NAME@_client', + ] + ['@PROJECT_NAME@_' + name for name in uda_lib_names] extra_libs = '@EXTRA_LIBS@'.split(';') if '@EXTRA_LIBS@' else [] extra_macros = [] +uda_static_libs = [os.path.join(root, 'lib', lib + '_static.' + stalib_ext) for lib in uda_libs] + +# Decide whether to build against shared or static UDA libraries +if os.environ.get('UDA_PYTHON_SHARED', False): + print("Building against shared UDA libraries") + libraries = extra_libs + uda_libs + static_libs = None +else: + print("Building against static UDA libraries") + libraries = extra_libs + static_libs = uda_static_libs + + ext = Extension( 'cpyuda', ['pyuda/cpyuda/cpyuda.pyx'], @@ -59,7 +73,7 @@ ext = Extension( numpy.get_include(), '@FMT_INCLUDE_DIR@' ])), - libraries=list(filter(None, extra_libs)), + libraries=list(filter(None, libraries)), library_dirs=list(filter(None, [ '@OPENSSL_LIB_DIR@', '@LIBXML_LIB_DIR@', @@ -67,7 +81,7 @@ ext = Extension( '@FMT_LIB_DIR@', os.path.join(root, 'lib') ])), - extra_objects=[os.path.join(root, 'lib', uda_lib) for uda_lib in uda_libs], + extra_objects=static_libs, extra_link_args=extra_link_args, extra_compile_args=extra_compile_args, language='c++',