Skip to content

Commit 802216c

Browse files
committed
separate shared libraries into platform specific folders
1 parent 5f05114 commit 802216c

File tree

1 file changed

+38
-6
lines changed

1 file changed

+38
-6
lines changed

CMakeLists.txt

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@ cmake_minimum_required(VERSION 3.9.0)
22

33
cmake_policy(SET CMP0074 NEW)
44

5+
# set a platform name variable, needed to create separate directories for storing dependent libraries
6+
if(WIN32)
7+
set(PLATFORM_NAME win64)
8+
elseif(APPLE)
9+
# run uname -m to determine whether arm64 or x86_64
10+
exec_program(uname ARGS -m OUTPUT_VARIABLE MAC_HOST_SYSTEM)
11+
if(${MAC_HOST_SYSTEM} STREQUAL "arm64")
12+
set(PLATFORM_NAME maca64)
13+
elseif(${MAC_HOST_SYSTEM} STREQUAL "x86_64")
14+
set(PLATFORM_NAME maci64)
15+
endif()
16+
else() # Linux
17+
set(PLATFORM_NAME glnxa64)
18+
endif()
519

620
# ###########################
721
# vcpkg
@@ -54,8 +68,6 @@ endif()
5468
if(APPLE)
5569
# On Mac, there is a conflict between libcurl and the version in MATLAB, so
5670
# use libcurl as a shared library and load the MATLAB version at runtime
57-
# run uname -m to determine whether arm64 or x86_64
58-
exec_program(uname ARGS -m OUTPUT_VARIABLE MAC_HOST_SYSTEM)
5971
if(${MAC_HOST_SYSTEM} STREQUAL "arm64")
6072
set(VCPKG_OTEL_TRIPLET "arm64-osx-otel-matlab")
6173
elseif(${MAC_HOST_SYSTEM} STREQUAL "x86_64")
@@ -113,6 +125,7 @@ endif()
113125

114126
project(${CLIENT_PROJECT_NAME} VERSION ${OTEL_MATLAB_VERSION} LANGUAGES CXX C)
115127

128+
# set RPATH to enable libraries to find their dependencies
116129
if(APPLE)
117130
set(CMAKE_INSTALL_RPATH @loader_path)
118131
elseif(UNIX)
@@ -494,6 +507,7 @@ endif()
494507
target_link_libraries(${OPENTELEMETRY_PROXY_LIBRARY_NAME} PRIVATE ${OPENTELEMETRY_PROXY_LINK_LIBRARIES})
495508

496509
# On Linux, when linking with certain static libraries, need to force include entire archive to avoid the linker mistakenly leaving out symbols
510+
# Also, set INSTALLED_RPATH such that dependencies can be found in platform specific directories
497511
if(UNIX AND NOT APPLE AND NOT CYGWIN)
498512
set(OPENTELEMETRY_PROXY_LINK_OPTIONS -Wl,--whole-archive
499513
"${OTEL_CPP_PREFIX}/lib/libopentelemetry_trace.a"
@@ -502,8 +516,9 @@ if(UNIX AND NOT APPLE AND NOT CYGWIN)
502516
"${OTEL_CPP_PREFIX}/lib/libopentelemetry_otlp_recordable.a"
503517
${ABSL_LIBRARIES} -Wl,--no-whole-archive)
504518
target_link_options(${OPENTELEMETRY_PROXY_LIBRARY_NAME} PRIVATE ${OPENTELEMETRY_PROXY_LINK_OPTIONS})
519+
set_target_properties(${OPENTELEMETRY_PROXY_LIBRARY_NAME} PROPERTIES INSTALL_RPATH "$ORIGIN;$ORIGIN/../../lib/${PLATFORM_NAME}")
505520
elseif(APPLE)
506-
set_target_properties(${OPENTELEMETRY_PROXY_LIBRARY_NAME} PROPERTIES INSTALL_RPATH "@executable_path")
521+
set_target_properties(${OPENTELEMETRY_PROXY_LIBRARY_NAME} PROPERTIES INSTALL_RPATH "@loader_path;@loader_path/../../lib/${PLATFORM_NAME}")
507522
endif()
508523

509524
# Use C++17
@@ -560,6 +575,12 @@ libmexclass_client_add_mex_gateway(
560575
SOURCES ${OPENTELEMETRY_MEX_GATEWAY_SOURCES}
561576
)
562577

578+
if(APPLE)
579+
set_target_properties(${OPENTELEMETRY_MEX_GATEWAY_NAME} PROPERTIES INSTALL_RPATH "@loader_path;@loader_path/../../lib/${PLATFORM_NAME}")
580+
elseif(UNIX)
581+
set_target_properties(${OPENTELEMETRY_MEX_GATEWAY_NAME} PROPERTIES INSTALL_RPATH "$ORIGIN;$ORIGIN/../../lib/${PLATFORM_NAME}")
582+
endif()
583+
563584
# ###############################
564585
# libmexclass Client Installation
565586
# ###############################
@@ -633,16 +654,27 @@ endif()
633654
install(FILES ${OTLP_MISC_FILES} DESTINATION .)
634655

635656
# Install dependent runtime libraries
636-
set(LIBMEXCLASS_PROXY_INSTALLED_DIR +libmexclass/+proxy)
637-
install(FILES ${OPENTELEMETRY_PROXY_RUNTIME_LIBRARIES} DESTINATION ${LIBMEXCLASS_PROXY_INSTALLED_DIR})
657+
if(WIN32)
658+
# On Windows, install all libraries in the same directory because of the lack of a settable rpath
659+
set(DEPENDENT_RUNTIME_INSTALLED_DIR +libmexclass/+proxy)
660+
else()
661+
# On non-Windows platform, install dependent libraries in a platform specific directory so that
662+
# they won't get overwritten when packaged
663+
set(DEPENDENT_RUNTIME_INSTALLED_DIR lib/${PLATFORM_NAME})
664+
endif()
665+
install(FILES ${OPENTELEMETRY_PROXY_RUNTIME_LIBRARIES} DESTINATION ${DEPENDENT_RUNTIME_INSTALLED_DIR})
638666
if(UNIX AND WITH_OTLP_GRPC)
639-
install(DIRECTORY ${GRPC_INSTALL_LIB_DIR}/ DESTINATION ${LIBMEXCLASS_PROXY_INSTALLED_DIR}
667+
install(DIRECTORY ${GRPC_INSTALL_LIB_DIR}/ DESTINATION ${DEPENDENT_RUNTIME_INSTALLED_DIR}
640668
FILES_MATCHING
641669
PATTERN "*.*"
642670
PATTERN "cmake" EXCLUDE
643671
PATTERN "pkgconfig" EXCLUDE)
644672
endif()
645673

674+
if(UNIX)
675+
install(CODE "file(RENAME \"${CMAKE_INSTALL_PREFIX}/+libmexclass/+proxy/libmexclass${CMAKE_SHARED_LIBRARY_SUFFIX}\" \"${CMAKE_INSTALL_PREFIX}/lib/${PLATFORM_NAME}/libmexclass${CMAKE_SHARED_LIBRARY_SUFFIX}\")
676+
install(CODE "file(RENAME \"${CMAKE_INSTALL_PREFIX}/+libmexclass/+proxy/libOtelMatlabProxy${CMAKE_SHARED_LIBRARY_SUFFIX}\" \"${CMAKE_INSTALL_PREFIX}/lib/${PLATFORM_NAME}/libOtelMatlabProxy${CMAKE_SHARED_LIBRARY_SUFFIX}\")
677+
")
646678
# ##############################
647679
# Subdirectories
648680
# ##############################

0 commit comments

Comments
 (0)