File: libtool.sh

package info (click to toggle)
bazel-bootstrap 4.2.3%2Bds-9
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 85,476 kB
  • sloc: java: 721,710; sh: 55,859; cpp: 35,359; python: 12,139; xml: 295; objc: 269; makefile: 113; ansic: 106; ruby: 3
file content (131 lines) | stat: -rwxr-xr-x 4,011 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/bash
#
# Copyright 2016 The Bazel Authors. All rights reserved.
#
# Licensed 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.
#
# libtool.sh runs the command passed to it using "xcrunwrapper libtool".
#
# It creates symbolic links for all input files with a path-hash appended
# to their original name (foo.o becomes foo_{md5sum}.o). This is to circumvent
# a bug in the original libtool that arises when two input files have the same
# base name (even if they are in different directories).

set -eu

# A trick to allow invoking this script in multiple contexts.
if [ -z ${MY_LOCATION+x} ]; then
  if [ -d "$0.runfiles/" ]; then
    MY_LOCATION="$0.runfiles/bazel_tools/tools/objc"
  else
    MY_LOCATION="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  fi
fi

WRAPPER="${MY_LOCATION}/xcrunwrapper.sh"

# Ensure 0 timestamping for hermetic results.
export ZERO_AR_DATE=1

if [ ! -f "${MY_LOCATION}"/libtool_check_unique ] ; then
    echo "libtool_check_unique not found. Please file an issue at github.com/bazelbuild/bazel"
elif "${MY_LOCATION}"/libtool_check_unique "$@"; then
  # If there are no duplicate .o basenames,
  # libtool can be invoked with the original arguments.
  "${WRAPPER}" libtool "$@"
  exit
fi

TEMPDIR="$(mktemp -d "${TMPDIR:-/tmp}/libtool.XXXXXXXX")"
trap "rm -rf \"${TEMPDIR}\"" EXIT

# Creates a symbolic link to the input argument file and returns the symlink
# file path.
function hash_objfile() {
  ORIGINAL_NAME="$1"
  ORIGINAL_HASH="$(/sbin/md5 -qs "${ORIGINAL_NAME}")"
  SYMLINK_NAME="${TEMPDIR}/$(basename "${ORIGINAL_NAME%.o}_${ORIGINAL_HASH}.o")"
  if [[ ! -e "$SYMLINK_NAME" ]]; then
    case "${ORIGINAL_NAME}" in
      /*) ln -sf "$ORIGINAL_NAME" "$SYMLINK_NAME" ;;
      *) ln -sf "$(pwd)/$ORIGINAL_NAME" "$SYMLINK_NAME" ;;
    esac
  fi
  echo "$SYMLINK_NAME"
}

python_executable=/usr/bin/python2.7
if [[ ! -x "$python_executable" ]]; then
  python_executable=python
fi

ARGS=()

while [[ $# -gt 0 ]]; do
  ARG="$1"
  shift

  # Libtool artifact symlinking. Apple's libtool has a bug when there are two
  # input files with the same basename. We thus create symlinks that are named
  # with a hash suffix for each input, and pass them to libtool.
  # See b/28186497.
  case "${ARG}" in
    # Filelist flag, need to symlink each input in the contents of file and
    # pass a new filelist which contains the symlinks.
    -filelist)
      ARGS+=("${ARG}")
      ARG="$1"
      shift
      HASHED_FILELIST="${ARG%.objlist}_hashes.objlist"
      rm -f "${HASHED_FILELIST}"
      # Use python helper script for fast md5 calculation of many strings.
      "$python_executable" "${MY_LOCATION}/make_hashed_objlist.py" \
        "${ARG}" "${HASHED_FILELIST}" "${TEMPDIR}"
      ARGS+=("${HASHED_FILELIST}")
      ;;
   # Output flag
    -o)
     ARGS+=("${ARG}")
     ARG="$1"
     shift
     ARGS+=("${ARG}")
     OUTPUTFILE="${ARG}"
     ;;
   # Flags with no args
    -static|-s|-a|-c|-L|-T|-D|-no_warning_for_no_symbols)
      ARGS+=("${ARG}")
      ;;
   # Single-arg flags
   -arch_only|-syslibroot)
     ARGS+=("${ARG}")
     ARG="$1"
     shift
     ARGS+=("${ARG}")
     ;;
   # Any remaining flags are unexpected and may ruin flag parsing.
   -*)
     echo "Unrecognized libtool flag ${ARG}"
     exit 1
     ;;
   # Archive inputs can remain untouched, as they come from other targets.
   *.a)
     ARGS+=("${ARG}")
     ;;
   # Remaining args are input objects
   *)
     ARGS+=("$(echo "$(hash_objfile "${ARG}")")")
     ;;
   esac
done

"${WRAPPER}" libtool "${ARGS[@]}"