sgilmore10 commented on code in PR #41677: URL: https://github.com/apache/arrow/pull/41677#discussion_r1618901949
########## dev/tasks/matlab/rename_macos_dynamic_libraries.sh: ########## @@ -0,0 +1,164 @@ +#!/usr/bin/env bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -ex + +# Issue Number 1: +# +# MATLAB's programmatic packaging interface does not properly package symbolic links. If the +# toolboxFolder argumented provided to the constructor of matlab.addons.toolbox.ToolboxOptions +# contains a symbolic link, the ToolboxOptions will resolve the symbolic link and include +# the symbolic link's target as one of the files to package instead of the link itself. +# +# Example: +# +# Suppose you had this folder structure +# +# $ tree /tmp/example +# /tmp/example +# |-- regular_file.txt +# |-- symbolic_link -> regular_file.txt +# +# Passing "/tmp/example" as the toolboxFolder argument to ToolboxOptions' constructor in MATLAB +# returns the following object: +# +# >> opts = matlab.addons.toolbox.ToolboxOptions("/tmp/example", "dummy-identifier"); +# >> opts.ToolboxFiles +# +# ans = +# +# "/private/tmp/example/regular_file.txt" +# +# Note that the ToolboxFiles property - the list of files to package - does not include the +# symbolic link. +# +# This is a known limitation with matlab.addons.toolbox.ToolboxOptions. +# +# Why is this a problem? +# +# On macOS, building the Arrow C++ bindings generates the following files: +# +# $ tree arrow/matlab/install/arrow_matlab/+libmexclass/+proxy/ +# . +# |-- libarrow.1700.0.0.dylib +# |-- libarrow.1700.dylib -> libarrow.1700.0.0.dylib +# |-- libarrow.dylib -> libarrow.1700.dylib +# +# When "arrow/matlab/install/arrow_matlab" is suppplied as the toolboxFolder argument +# to the constructor of ToolboxOptions, only the libarrow.1700.0.0.dylib is included as a file +# to package. This is a problem because building the MATLAB interface to Arrow creates a shared +# library called libarrowproxy.dylib, which is linked against libarrow.1700.dylib - not +# libarrow.1700.0.0.dyblib. +# +# This can be seen by calling otool with the -L flag on libarrowproxy.dylib: +# +# $ otool -L libarrowproxy.dylib | grep -E '@rpath/libarrow\.' +# @rpath/libarrow.1700.dylib +# +# To prevent a run-time linker error, we need to update the name of libarrowproxy.dylib's +# dependent shared library from @rpath/libarrow.1700.dylib to @rpath/libarrow.1700.0.0.dylib +# because only libarrow.1700.0.0.dylib is packaged. +# +# ============================================================================================== +# +# Issue Number 2: +# +# The platforms that the MATLAB Interface to Arrow supports Windows, Linux, +# Intel/AMD-based macOS and ARM-based macOS. Currently, we create one "monolithic" MLTBX file +# to package the interface that includes all shared libraries for all supported platforms. +# We do this because the File Exchange <-> GitHub Release integration does not support +# platform-specific MLTBX files. +# +# The problem with creating one MLTBX to package the interface for all platforms is that +# the names of the shared libraries built by the interface for Intel/AMD-based macOS +# and ARM-based macOS are identical.For example, building the interface generates the shared +# library libarrow.1700.0.0.dylib on both platforms. To avoid this duplicate name problem, +# we need to uniquify the names of the shared libraries generated for Intel/AMD-based +# macOS and ARM-based macOS. + +if [ "$#" -ne 2 ]; then + echo "Usage: $0 <dylib-dir> <arch>" + exit 1 +fi + +DYLIB_DIR=${1} +ARCH=${2} + +if [ "$ARCH" == "arm64" ]; then + IS_ARM64=1 +elif [ "$ARCH" == "x64" ]; then + IS_ARM64=0 +else + echo "<arch> must be arm64 or x64" + exit 1 +fi + +ORIG_DIR=$(pwd) + +cd ${DYLIB_DIR} + +LIBARROW_DYLIB="$(find . -name 'libarrow.dylib' | xargs basename)" +LIBARROW_MAJOR_DYLIB="$(find . -name 'libarrow.*.dylib' -type l | xargs basename)" +LIBARROW_MAJOR_MINOR_PATCH_DYLIB="$(echo libarrow.*.*.dylib)" +LIBMEXCLASS_DYLIB="$(find . -name 'libmexclass.dylib' | xargs basename)" +LIBARROWPROXY_DYLIB="$(find . -name 'libarrowproxy.dylib' | xargs basename)" +if [ $IS_ARM64 -eq 1 ]; then + MEX_GATEWAY="$(find . -name 'gateway.mexmaca64' | xargs basename)" +else + MEX_GATEWAY="$(find . -name 'gateway.mexmaci64' | xargs basename)" +fi + +MAJOR_MINOR_PATCH_VERSION=${LIBARROW_MAJOR_MINOR_PATCH_DYLIB#*.} +MAJOR_MINOR_PATCH_VERSION=${MAJOR_MINOR_PATCH_VERSION%.*} + +LIBARROW_ARCH_MAJOR_MINOR_PATCH_DYLIB="libarrow_${ARCH}.${MAJOR_MINOR_PATCH_VERSION}.dylib" +LIBARROWPROXY_ARCH_DYLIB="libarrowproxy_${ARCH}.dylib" +LIBMEXCLASS_ARCH_DYLIB="libmexclass_${ARCH}.dylib" + +# Delete the symbolic links. These files are not included in the packaged MLTBX file. +rm ${LIBARROW_MAJOR_DYLIB} +rm ${LIBARROW_DYLIB} + +# Rename libarrow.*.*.*.dylib to libarrow_(arm64|x64).*.*.*.dylib (e.g. libarrow.1700.0.0.dylib -> libarrow_(arm64|x64).1700.0.0.dylib) +mv ${LIBARROW_MAJOR_MINOR_PATCH_DYLIB} ${LIBARROW_ARCH_MAJOR_MINOR_PATCH_DYLIB} + +# Rename libarrowproxy.dylib to libarrowproxy_(arm64|x64).dylib +mv ${LIBARROWPROXY_DYLIB} ${LIBARROWPROXY_ARCH_DYLIB} + +# Rename libmexclass.dylib to libmexclass_(arm64|x64).dylib +mv ${LIBMEXCLASS_DYLIB} ${LIBMEXCLASS_ARCH_DYLIB} + +# Update the identificaton names of the renamed dynamic libraries +install_name_tool -id @rpath/${LIBMEXCLASS_ARCH_DYLIB} ${LIBMEXCLASS_ARCH_DYLIB} +install_name_tool -id @rpath/${LIBARROWPROXY_ARCH_DYLIB} ${LIBARROWPROXY_ARCH_DYLIB} +install_name_tool -id @rpath/${LIBARROW_ARCH_MAJOR_MINOR_PATCH_DYLIB} ${LIBARROW_ARCH_MAJOR_MINOR_PATCH_DYLIB} + +# Change install name of dependent shared library libarrow.*.*.*.dylib to libarrow_arm64.*.*.*.dylib in libarrowproxy_(arm64|x64).dylib +install_name_tool -change @rpath/${LIBARROW_MAJOR_DYLIB} @rpath/${LIBARROW_ARCH_MAJOR_MINOR_PATCH_DYLIB} ${LIBARROWPROXY_ARCH_DYLIB} + +# Change install name of dependent shared library libmexclass.dylib to libmexclass_(arm64|x64).*.*.*.dylib libarrowproxy_(arm64|x64).dylib +install_name_tool -change @rpath/${LIBMEXCLASS_DYLIB} @rpath/${LIBMEXCLASS_ARCH_DYLIB} ${LIBARROWPROXY_ARCH_DYLIB} + +# Change install name of dependent shared library libmexclass.dylib to libmexclass_(arm64|x64).dylib in gateway.(mexmaca64|mexmaci64) +install_name_tool -change @rpath/${LIBMEXCLASS_DYLIB} @rpath/${LIBMEXCLASS_ARCH_DYLIB} ${MEX_GATEWAY} + +# Change install name of dependent shared library libarrowproxy.dylib to libarrowproxy_(arm64|x64).dylib in gateway.(mexmaca64|mexmaci64) +install_name_tool -change @rpath/${LIBARROWPROXY_DYLIB} @rpath/${LIBARROWPROXY_ARCH_DYLIB} ${MEX_GATEWAY} + +cd ${ORIG_DIR} Review Comment: Done! -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
