hadoop/dev-support/bin/dist-copynativelibs
2021-03-24 14:04:47 +08:00

181 lines
4.6 KiB
Bash
Executable File

#!/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 -o pipefail
# Bundle a native library if requested. Exit 1 in case error happens.
# Usage: bundle_native_lib bundleoption liboption libpattern libdir
function bundle_native_lib()
{
declare bundleoption="$1"
declare liboption="$2"
declare libpattern="$3"
declare libdir="$4"
echo "Checking to bundle with:"
echo "bundleoption=${bundleoption}, liboption=${liboption}, pattern=${libpattern} libdir=${libdir}"
if [[ "${bundleoption}" != "true" ]]; then
return
fi
if [[ -z "${libdir}" ]] || [[ ! -d "${libdir}" ]]; then
echo "The required option ${liboption} isn't given or invalid. Bundling the lib failed"
exit 1
fi
cd "${libdir}" || exit 1
${TAR} ./*"${libpattern}"* | (cd "${TARGET_DIR}"/ || exit 1; ${UNTAR})
if [[ $? -ne 0 ]]; then
echo "Bundling library with ${liboption} failed "
exit 1
fi
}
function bundle_native_bin
{
declare bundleoption="$1"
declare libbundle="$2"
declare binoption="$3"
declare binpattern="$4"
declare libdir="$5"
echo "Checking to bundle with:"
echo "bundleoption=${bundleoption}, libbundle=${libbundle}, binoption=${binoption}, libdir=${libdir}, binpattern=${binpattern}"
if [[ "${bundleoption}" != "true" ]]; then
return
fi
if [[ "${libbundle}" != "true" ]]; then
return
fi
if [[ -z "${libdir}" ]] || [[ ! -d "${libdir}" ]]; then
echo "The required option ${liboption} isn't given or invalid. Bundling the lib failed"
exit 1
fi
cd "${libdir}" || exit 1
${TAR} ./*"${binpattern}"* | (cd "${TARGET_BIN_DIR}"/ || exit 1 ; ${UNTAR})
if [[ $? -ne 0 ]]; then
echo "Bundling bin files for ${binoption} failed"
exit 1
fi
}
for i in "$@"; do
case "${i}" in
--version=*)
VERSION=${i#*=}
;;
--artifactid=*)
ARTIFACTID=${i#*=}
;;
--builddir=*)
BUILD_DIR=${i#*=}
;;
--isallib=*)
ISALLIB=${i#*=}
;;
--isalbundle=*)
ISALBUNDLE=${i#*=}
;;
--pmdklib=*)
PMDKLIB=${i#*=}
;;
--pmdkbundle=*)
PMDKBUNDLE=${i#*=}
;;
--opensslbinbundle=*)
OPENSSLBINBUNDLE=${i#*=}
;;
--openssllib=*)
OPENSSLLIB=${i#*=}
;;
--openssllibbundle=*)
OPENSSLLIBBUNDLE=${i#*=}
;;
--snappylib=*)
SNAPPYLIB=${i#*=}
;;
--snappylibbundle=*)
SNAPPYLIBBUNDLE=${i#*=}
;;
--zstdbinbundle=*)
ZSTDBINBUNDLE=${i#*=}
;;
--zstdlib=*)
ZSTDLIB=${i#*=}
;;
--zstdlibbundle=*)
ZSTDLIBBUNDLE=${i#*=}
;;
esac
done
TAR='tar cf -'
UNTAR='tar xfBp -'
LIB_DIR="${BUILD_DIR}/native/target/usr/local/lib"
BIN_DIR="${BUILD_DIR}/bin"
TARGET_DIR="${BUILD_DIR}/${ARTIFACTID}-${VERSION}/lib/native"
TARGET_BIN_DIR="${BUILD_DIR}/${ARTIFACTID}-${VERSION}/bin"
# Most systems
if [[ -d "${LIB_DIR}" ]]; then
mkdir -p "${TARGET_DIR}"
cd "${LIB_DIR}" || exit 1
${TAR} lib* | (cd "${TARGET_DIR}"/ || exit 1; ${UNTAR})
if [[ $? -ne 0 ]]; then
echo "Bundling lib files failed"
exit 1
fi
bundle_native_lib "${SNAPPYLIBBUNDLE}" "snappy.lib" "libsnappy." "${SNAPPYLIB}"
bundle_native_lib "${ZSTDLIBBUNDLE}" "zstd.lib" "libzstd." "${ZSTDLIB}"
bundle_native_lib "${OPENSSLLIBBUNDLE}" "openssl.lib" "libcrypto." "${OPENSSLLIB}"
bundle_native_lib "${ISALBUNDLE}" "isal.lib" "libisal." "${ISALLIB}"
bundle_native_lib "${PMDKBUNDLE}" "pmdk.lib" "pmdk" "${PMDKLIB}"
fi
# Windows
# Windows doesn't have a LIB_DIR, everything goes into bin
if [[ -d "${BIN_DIR}" && $(ls -A "${BIN_DIR}") ]] ; then
mkdir -p "${TARGET_BIN_DIR}"
cd "${BIN_DIR}" || exit 1
${TAR} ./* | (cd "${TARGET_BIN_DIR}"/ || exit 1; ${UNTAR})
if [[ $? -ne 0 ]]; then
echo "Bundling bin files failed"
exit 1
fi
bundle_native_bin "${ZSTDBINBUNDLE}" "${ZSTDLIBBUNDLE}" "zstd.lib" "zstd" "${ZSTDLIB}"
bundle_native_bin "${OPENSSLBINBUNDLE}" "${OPENSSLLIBBUNDLE}" "openssl.lib" "crypto" "${OPENSSLLIB}"
fi