File: link_dynamic_library.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 (113 lines) | stat: -rwxr-xr-x 4,117 bytes parent folder | download | duplicates (5)
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
#!/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.

# This script handles interface library generation for dynamic library
# link action.
#
# Bazel can be configured to generate external interface library script
# to generate interface libraries in CppLinkAction for dynamic libraries.
# This is not needed on Windows (as the "interface" libraries are
# generated by default). This script therefore handles the cases when
# external script is provided, or when no script should be used.

set -eu

E_LINKER_COMMAND_NOT_FOUND=12
E_INTERFACE_BUILDER_NOT_FOUND=13


SUFFIX=".rewritten"

other_args=""

if [[ "$#" -eq 1 ]]; then
  if [[ "$1" != @* ]]; then
    echo "Parameter file must start with @" 1>&2;
    exit "$E_LINKER_COMMAND_NOT_FOUND"
  fi

  filename=$(echo "$1" | cut -c2-)
  first_five_lines=$(head -n 5 $filename)

  # Should generate interface library switch (<yes|no>); if the value is "no",
  # following 3 args are ignored (but must be present)
  GENERATE_INTERFACE_LIBRARY=$(echo "$first_five_lines" | head -n1 | tail -n1)
  # Tool which can generate interface library from dynamic library file
  INTERFACE_LIBRARY_BUILDER=$(echo "$first_five_lines" | head -n2 | tail -n1)
  # Dynamic library from which we want to generate interface library
  DYNAMIC_LIBRARY=$(echo "$first_five_lines" | head -n3 | tail -n1)
  # Resulting interface library
  INTERFACE_LIBRARY=$(echo "$first_five_lines" | head -n4 | tail -n1)
  # The command used to generate the dynamic library
  LINKER_COMMAND=$(echo "$first_five_lines" | head -n5 | tail -n1)

  rest_of_lines=$(tail -n +6 $filename)
  new_param_file="${filename}${SUFFIX}"
  echo "$rest_of_lines" > $new_param_file
  other_args="@$new_param_file"

  if [[ ! -e "$LINKER_COMMAND" ]]; then
    echo "Linker command ($LINKER_COMMAND) not found." 1>&2;
    exit "$E_LINKER_COMMAND_NOT_FOUND"
  fi

  if [[ "no" == "$GENERATE_INTERFACE_LIBRARY" ]]; then
      INTERFACE_GENERATION=:
  else
      if [[ ! -e "$INTERFACE_LIBRARY_BUILDER" ]]; then
        echo "Interface library builder ($INTERFACE_LIBRARY_BUILDER)
        not found." 1>&2;
        exit "$E_INTERFACE_BUILDER_NOT_FOUND"
      fi
      INTERFACE_GENERATION="${INTERFACE_LIBRARY_BUILDER} ${DYNAMIC_LIBRARY}
      ${INTERFACE_LIBRARY}"
  fi

  ${LINKER_COMMAND} "$other_args" && ${INTERFACE_GENERATION}
else
  # TODO(b/113358321): Remove this branch once projects are migrated to not
  #  splitting the linking command line.
  # Should generate interface library switch (<yes|no>); if the value is "no",
  # following 3 args are ignored (but must be present)
  GENERATE_INTERFACE_LIBRARY="$1"
  # Tool which can generate interface library from dynamic library file
  INTERFACE_LIBRARY_BUILDER="$2"
  # Dynamic library from which we want to generate interface library
  DYNAMIC_LIBRARY="$3"
  # Resulting interface library
  INTERFACE_LIBRARY="$4"
  # The command used to generate the dynamic library
  LINKER_COMMAND="$5"
  shift 5
  if [[ ! -e "$LINKER_COMMAND" ]]; then
    echo "Linker command ($LINKER_COMMAND) not found." 1>&2;
    exit "$E_LINKER_COMMAND_NOT_FOUND"
  fi

  if [[ "no" == "$GENERATE_INTERFACE_LIBRARY" ]]; then
      INTERFACE_GENERATION=:
  else
      if [[ ! -e "$INTERFACE_LIBRARY_BUILDER" ]]; then
        echo "Interface library builder ($INTERFACE_LIBRARY_BUILDER)
        not found." 1>&2;
        exit "$E_INTERFACE_BUILDER_NOT_FOUND"
      fi
      INTERFACE_GENERATION="${INTERFACE_LIBRARY_BUILDER} ${DYNAMIC_LIBRARY}
      ${INTERFACE_LIBRARY}"
  fi

  ${LINKER_COMMAND} "$@" && ${INTERFACE_GENERATION}
fi