mirror of https://github.com/bazelbuild/rules_cc
114 lines
4.0 KiB
Bash
Executable File
114 lines
4.0 KiB
Bash
Executable File
#!/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
|