diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a3968f..f82b72b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,20 @@ cmake_minimum_required(VERSION 3.9.0) cmake_policy(SET CMP0074 NEW) +# set a platform name variable, needed to create separate directories for storing dependent libraries +if(WIN32) + set(PLATFORM_NAME win64) +elseif(APPLE) + # run uname -m to determine whether arm64 or x86_64 + exec_program(uname ARGS -m OUTPUT_VARIABLE MAC_HOST_SYSTEM) + if(${MAC_HOST_SYSTEM} STREQUAL "arm64") + set(PLATFORM_NAME maca64) + elseif(${MAC_HOST_SYSTEM} STREQUAL "x86_64") + set(PLATFORM_NAME maci64) + endif() +else() # Linux + set(PLATFORM_NAME glnxa64) +endif() # ########################### # vcpkg @@ -54,8 +68,6 @@ endif() if(APPLE) # On Mac, there is a conflict between libcurl and the version in MATLAB, so # use libcurl as a shared library and load the MATLAB version at runtime - # run uname -m to determine whether arm64 or x86_64 - exec_program(uname ARGS -m OUTPUT_VARIABLE MAC_HOST_SYSTEM) if(${MAC_HOST_SYSTEM} STREQUAL "arm64") set(VCPKG_OTEL_TRIPLET "arm64-osx-otel-matlab") elseif(${MAC_HOST_SYSTEM} STREQUAL "x86_64") @@ -113,6 +125,7 @@ endif() project(${CLIENT_PROJECT_NAME} VERSION ${OTEL_MATLAB_VERSION} LANGUAGES CXX C) +# set RPATH to enable libraries to find their dependencies if(APPLE) set(CMAKE_INSTALL_RPATH @loader_path) elseif(UNIX) @@ -502,8 +515,6 @@ if(UNIX AND NOT APPLE AND NOT CYGWIN) "${OTEL_CPP_PREFIX}/lib/libopentelemetry_otlp_recordable.a" ${ABSL_LIBRARIES} -Wl,--no-whole-archive) target_link_options(${OPENTELEMETRY_PROXY_LIBRARY_NAME} PRIVATE ${OPENTELEMETRY_PROXY_LINK_OPTIONS}) -elseif(APPLE) - set_target_properties(${OPENTELEMETRY_PROXY_LIBRARY_NAME} PROPERTIES INSTALL_RPATH "@executable_path") endif() # Use C++17 @@ -560,6 +571,12 @@ libmexclass_client_add_mex_gateway( SOURCES ${OPENTELEMETRY_MEX_GATEWAY_SOURCES} ) +if(APPLE) + set_target_properties(${OPENTELEMETRY_MEX_GATEWAY_NAME} PROPERTIES INSTALL_RPATH "@loader_path;@loader_path/../../lib/${PLATFORM_NAME}") +elseif(UNIX) + set_target_properties(${OPENTELEMETRY_MEX_GATEWAY_NAME} PROPERTIES INSTALL_RPATH "$ORIGIN;$ORIGIN/../../lib/${PLATFORM_NAME}") +endif() + # ############################### # libmexclass Client Installation # ############################### @@ -633,14 +650,31 @@ endif() install(FILES ${OTLP_MISC_FILES} DESTINATION .) # Install dependent runtime libraries -set(LIBMEXCLASS_PROXY_INSTALLED_DIR +libmexclass/+proxy) -install(FILES ${OPENTELEMETRY_PROXY_RUNTIME_LIBRARIES} DESTINATION ${LIBMEXCLASS_PROXY_INSTALLED_DIR}) -if(UNIX AND WITH_OTLP_GRPC) - install(DIRECTORY ${GRPC_INSTALL_LIB_DIR}/ DESTINATION ${LIBMEXCLASS_PROXY_INSTALLED_DIR} +set(LIBMEXCLASS_PACKAGE_DIRECTORY +libmexclass/+proxy) +if(WIN32) + # On Windows, install all libraries in the same directory because of the lack of a settable rpath + set(DEPENDENT_RUNTIME_INSTALLED_DIR ${LIBMEXCLASS_PACKAGE_DIRECTORY}) +else() + # On non-Windows platform, install dependent libraries in a platform specific directory so that + # they won't get overwritten when packaged + set(DEPENDENT_RUNTIME_INSTALLED_DIR lib/${PLATFORM_NAME}) +endif() +install(FILES ${OPENTELEMETRY_PROXY_RUNTIME_LIBRARIES} DESTINATION ${DEPENDENT_RUNTIME_INSTALLED_DIR}) +if(UNIX) + if(WITH_OTLP_GRPC) + install(DIRECTORY ${GRPC_INSTALL_LIB_DIR}/ DESTINATION ${DEPENDENT_RUNTIME_INSTALLED_DIR} FILES_MATCHING PATTERN "*.*" PATTERN "cmake" EXCLUDE PATTERN "pkgconfig" EXCLUDE) + endif() + + # Move any shared libraries to platform specific directories, so that they won't overwrite each other + set(LIBMEXCLASS_LIBRARY_NAME mexclass) + set(LIBMEXCLASS_LIBRARY ${LIBMEXCLASS_LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}) + set(OPENTELEMETRY_PROXY_LIBRARY ${OPENTELEMETRY_PROXY_LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}) + install(CODE "file(RENAME \"${CMAKE_INSTALL_PREFIX}/${LIBMEXCLASS_PACKAGE_DIRECTORY}/lib${LIBMEXCLASS_LIBRARY}\" \"${CMAKE_INSTALL_PREFIX}/${DEPENDENT_RUNTIME_INSTALLED_DIR}/lib${LIBMEXCLASS_LIBRARY}\")") + install(CODE "file(RENAME \"${CMAKE_INSTALL_PREFIX}/${LIBMEXCLASS_PACKAGE_DIRECTORY}/lib${OPENTELEMETRY_PROXY_LIBRARY}\" \"${CMAKE_INSTALL_PREFIX}/${DEPENDENT_RUNTIME_INSTALLED_DIR}/lib${OPENTELEMETRY_PROXY_LIBRARY}\")") endif() # ############################## diff --git a/README.md b/README.md index 323c4fa..2f64db4 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,7 @@ MATLAB® interface to [OpenTelemetry™](https://opentelemetry.io/), base ### Status 1. Tracing, metrics, and logs are all fully supported and tested on Windows®, Linux®, and macOS. -2. On Linux, when running MATLAB R2025a or newer releases, the gRPC library used in the gRPC exporter in this package may conflict with the same library in MATLAB, causing MATLAB to crash. To avoid this issue, install otel-matlab-nogrpc.mltbx in [version 1.10.2](https://github.com/mathworks/OpenTelemetry-MATLAB/releases/tag/1.10.2), which excludes the gRPC exporter. -3. OpenTelemetry currently does not support non-ASCII characters. Defining names or attributes with non-ASCII characters will cause the telemetry data to become invalid and fail to export. +2. OpenTelemetry currently does not support non-ASCII characters. Defining names or attributes with non-ASCII characters will cause the telemetry data to become invalid and fail to export. ### MathWorks Products (https://www.mathworks.com) diff --git a/examples/context_propagation/CMakeLists.txt b/examples/context_propagation/CMakeLists.txt index 647698a..47ba88c 100644 --- a/examples/context_propagation/CMakeLists.txt +++ b/examples/context_propagation/CMakeLists.txt @@ -15,7 +15,7 @@ target_link_libraries(${CONTEXTPROP_EXAMPLE_CPP_TARGET} PRIVATE ${OPENTELEMETRY_ if(UNIX AND NOT APPLE AND NOT CYGWIN) target_link_options(${CONTEXTPROP_EXAMPLE_CPP_TARGET} PRIVATE ${OPENTELEMETRY_PROXY_LINK_OPTIONS}) elseif(APPLE) - set_target_properties(${CONTEXTPROP_EXAMPLE_CPP_TARGET} PROPERTIES BUILD_RPATH "${CMAKE_INSTALL_PREFIX}/${LIBMEXCLASS_PROXY_INSTALLED_DIR}") + set_target_properties(${CONTEXTPROP_EXAMPLE_CPP_TARGET} PROPERTIES BUILD_RPATH "${CMAKE_INSTALL_PREFIX}/${DEPENDENT_RUNTIME_INSTALLED_DIR}") endif() # use the same C++ standard as OpenTelemetry-cpp if known, otherwise just use the default C++14 if(NOT DEFINED OTEL_CPP_INSTALLED_DIR) diff --git a/examples/webread/CMakeLists.txt b/examples/webread/CMakeLists.txt index 9bec4a3..5a75056 100644 --- a/examples/webread/CMakeLists.txt +++ b/examples/webread/CMakeLists.txt @@ -12,7 +12,7 @@ target_link_libraries(${WEBREAD_EXAMPLE_TARGET} PRIVATE ${OPENTELEMETRY_PROXY_LI if(UNIX AND NOT APPLE AND NOT CYGWIN) target_link_options(${WEBREAD_EXAMPLE_TARGET} PRIVATE ${OPENTELEMETRY_PROXY_LINK_OPTIONS}) elseif(APPLE) - set_target_properties(${WEBREAD_EXAMPLE_TARGET} PROPERTIES BUILD_RPATH "${CMAKE_INSTALL_PREFIX}/${LIBMEXCLASS_PROXY_INSTALLED_DIR}") + set_target_properties(${WEBREAD_EXAMPLE_TARGET} PROPERTIES BUILD_RPATH "${CMAKE_INSTALL_PREFIX}/${DEPENDENT_RUNTIME_INSTALLED_DIR}") endif() # use the same C++ standard as OpenTelemetry-cpp if known, otherwise just use the default C++14 if(NOT DEFINED OTEL_CPP_INSTALLED_DIR) diff --git a/test/texamples.m b/test/texamples.m index 4a0f4cd..7f4fcbc 100644 --- a/test/texamples.m +++ b/test/texamples.m @@ -268,7 +268,7 @@ function testWebread(testCase) % start the C++ server testCase.applyFixture(CppServerFixture(server, testCase)); - pause(3); % wait a little for server to start up + pause(3); % wait for server to start up % run the example webread_example();