|
@@ -46,6 +46,8 @@ Environment:
|
|
TOOLCHAIN_EXTERNAL_DOWNLOAD_INSTALL_DIR
|
|
TOOLCHAIN_EXTERNAL_DOWNLOAD_INSTALL_DIR
|
|
(default HOST_DIR/opt/ext-toolchain)
|
|
(default HOST_DIR/opt/ext-toolchain)
|
|
|
|
|
|
|
|
+ PARALLEL_JOBS number of parallel jobs to run
|
|
|
|
+
|
|
Returns: 0 if success or 1 in case of error
|
|
Returns: 0 if success or 1 in case of error
|
|
|
|
|
|
EOF
|
|
EOF
|
|
@@ -58,6 +60,38 @@ HOST_EXCLUDEPATHS="/share/terminfo"
|
|
STAGING_EXCLUDEPATHS="/usr/include /usr/share/terminfo"
|
|
STAGING_EXCLUDEPATHS="/usr/include /usr/share/terminfo"
|
|
TARGET_EXCLUDEPATHS="/lib/firmware"
|
|
TARGET_EXCLUDEPATHS="/lib/firmware"
|
|
|
|
|
|
|
|
+patch_file() {
|
|
|
|
+ PATCHELF="${1}"
|
|
|
|
+ rootdir="${2}"
|
|
|
|
+ sanitize_extra_args="${3}"
|
|
|
|
+ file="${4}"
|
|
|
|
+
|
|
|
|
+ # check if it's an ELF file
|
|
|
|
+ rpath=$(${PATCHELF} --print-rpath "${file}" 2>&1)
|
|
|
|
+ if test $? -ne 0 ; then
|
|
|
|
+ return 0
|
|
|
|
+ fi
|
|
|
|
+
|
|
|
|
+ # make files writable if necessary
|
|
|
|
+ changed=$(chmod -c u+w "${file}")
|
|
|
|
+
|
|
|
|
+ # With per-package directory support, most RPATH of host
|
|
|
|
+ # binaries will point to per-package directories. This won't
|
|
|
|
+ # work with the --make-rpath-relative ${rootdir} invocation as
|
|
|
|
+ # the per-package host directory is not within ${rootdir}. So,
|
|
|
|
+ # we rewrite all RPATHs pointing to per-package directories so
|
|
|
|
+ # that they point to the global host directry.
|
|
|
|
+ changed_rpath=$(echo ${rpath} | sed "s@${PER_PACKAGE_DIR}/[^/]\+/host@${HOST_DIR}@")
|
|
|
|
+ if test "${rpath}" != "${changed_rpath}" ; then
|
|
|
|
+ ${PATCHELF} --set-rpath ${changed_rpath} "${file}"
|
|
|
|
+ fi
|
|
|
|
+
|
|
|
|
+ # call patchelf to sanitize the rpath
|
|
|
|
+ ${PATCHELF} --make-rpath-relative "${rootdir}" ${sanitize_extra_args[@]} "${file}"
|
|
|
|
+ # restore the original permission
|
|
|
|
+ test "${changed}" != "" && chmod u-w "${file}"
|
|
|
|
+}
|
|
|
|
+
|
|
main() {
|
|
main() {
|
|
local rootdir
|
|
local rootdir
|
|
local tree="${1}"
|
|
local tree="${1}"
|
|
@@ -123,34 +157,11 @@ main() {
|
|
;;
|
|
;;
|
|
esac
|
|
esac
|
|
|
|
|
|
- find_args+=( "-type" "f" "-print" )
|
|
|
|
-
|
|
|
|
- while read file ; do
|
|
|
|
- # check if it's an ELF file
|
|
|
|
- rpath=$(${PATCHELF} --print-rpath "${file}" 2>&1)
|
|
|
|
- if test $? -ne 0 ; then
|
|
|
|
- continue
|
|
|
|
- fi
|
|
|
|
-
|
|
|
|
- # make files writable if necessary
|
|
|
|
- changed=$(chmod -c u+w "${file}")
|
|
|
|
-
|
|
|
|
- # With per-package directory support, most RPATH of host
|
|
|
|
- # binaries will point to per-package directories. This won't
|
|
|
|
- # work with the --make-rpath-relative ${rootdir} invocation as
|
|
|
|
- # the per-package host directory is not within ${rootdir}. So,
|
|
|
|
- # we rewrite all RPATHs pointing to per-package directories so
|
|
|
|
- # that they point to the global host directry.
|
|
|
|
- changed_rpath=$(echo ${rpath} | sed "s@${PER_PACKAGE_DIR}/[^/]\+/host@${HOST_DIR}@")
|
|
|
|
- if test "${rpath}" != "${changed_rpath}" ; then
|
|
|
|
- ${PATCHELF} --set-rpath ${changed_rpath} "${file}"
|
|
|
|
- fi
|
|
|
|
-
|
|
|
|
- # call patchelf to sanitize the rpath
|
|
|
|
- ${PATCHELF} --make-rpath-relative "${rootdir}" ${sanitize_extra_args[@]} "${file}"
|
|
|
|
- # restore the original permission
|
|
|
|
- test "${changed}" != "" && chmod u-w "${file}"
|
|
|
|
- done < <(find "${rootdir}" ${find_args[@]})
|
|
|
|
|
|
+ find_args+=( "-type" "f" "-print0" )
|
|
|
|
+
|
|
|
|
+ export -f patch_file
|
|
|
|
+ # Limit the number of cores used
|
|
|
|
+ find "${rootdir}" ${find_args[@]} | xargs -0 -r -P ${PARALLEL_JOBS} -I {} bash -c "patch_file '${PATCHELF}' '${rootdir}' '${sanitize_extra_args}' $@" _ {}
|
|
|
|
|
|
# Restore patched patchelf utility
|
|
# Restore patched patchelf utility
|
|
test "${tree}" = "host" && mv "${PATCHELF}.__to_be_patched" "${PATCHELF}"
|
|
test "${tree}" = "host" && mv "${PATCHELF}.__to_be_patched" "${PATCHELF}"
|