1*90c8c64dSAndroid Build Coastguard Worker#!/bin/bash -e 2*90c8c64dSAndroid Build Coastguard Worker 3*90c8c64dSAndroid Build Coastguard Worker# Copyright 2019 Google Inc. All rights reserved. 4*90c8c64dSAndroid Build Coastguard Worker# 5*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*90c8c64dSAndroid Build Coastguard Worker# 9*90c8c64dSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*90c8c64dSAndroid Build Coastguard Worker# 11*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*90c8c64dSAndroid Build Coastguard Worker# limitations under the License. 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Workerusage() { 18*90c8c64dSAndroid Build Coastguard Worker echo "Usage: $(basename "$0") [build_target]..." 19*90c8c64dSAndroid Build Coastguard Worker echo " Build all targets if build_target is not specified." 20*90c8c64dSAndroid Build Coastguard Worker echo " Supported build targets:" \ 21*90c8c64dSAndroid Build Coastguard Worker "${VALID_SOONG_BINARIES[@]}" "${VALID_SOONG_TESTS[@]}" 22*90c8c64dSAndroid Build Coastguard Worker} 23*90c8c64dSAndroid Build Coastguard Worker 24*90c8c64dSAndroid Build Coastguard Workerin_array () { 25*90c8c64dSAndroid Build Coastguard Worker value="$1" 26*90c8c64dSAndroid Build Coastguard Worker shift 27*90c8c64dSAndroid Build Coastguard Worker for i in "$@"; do 28*90c8c64dSAndroid Build Coastguard Worker [ "$i" = "${value}" ] && return 0 29*90c8c64dSAndroid Build Coastguard Worker done 30*90c8c64dSAndroid Build Coastguard Worker return 1 31*90c8c64dSAndroid Build Coastguard Worker} 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard WorkerVALID_SOONG_BINARIES=( 34*90c8c64dSAndroid Build Coastguard Worker "bindgen" 35*90c8c64dSAndroid Build Coastguard Worker "cxx_extractor" 36*90c8c64dSAndroid Build Coastguard Worker "header-abi-linker" 37*90c8c64dSAndroid Build Coastguard Worker "header-abi-dumper" 38*90c8c64dSAndroid Build Coastguard Worker "header-abi-diff" 39*90c8c64dSAndroid Build Coastguard Worker "ide_query_cc_analyzer" 40*90c8c64dSAndroid Build Coastguard Worker "proto_metadata_plugin" 41*90c8c64dSAndroid Build Coastguard Worker "protoc_extractor" 42*90c8c64dSAndroid Build Coastguard Worker) 43*90c8c64dSAndroid Build Coastguard Worker 44*90c8c64dSAndroid Build Coastguard WorkerVALID_SOONG_TESTS=( 45*90c8c64dSAndroid Build Coastguard Worker "header-checker-unittests" 46*90c8c64dSAndroid Build Coastguard Worker) 47*90c8c64dSAndroid Build Coastguard Worker 48*90c8c64dSAndroid Build Coastguard WorkerBUILD_TARGETS=() 49*90c8c64dSAndroid Build Coastguard Worker 50*90c8c64dSAndroid Build Coastguard Workerwhile [ $# -gt 0 ]; do 51*90c8c64dSAndroid Build Coastguard Worker case $1 in 52*90c8c64dSAndroid Build Coastguard Worker -*) # Display help. 53*90c8c64dSAndroid Build Coastguard Worker usage 54*90c8c64dSAndroid Build Coastguard Worker exit 0 55*90c8c64dSAndroid Build Coastguard Worker ;; 56*90c8c64dSAndroid Build Coastguard Worker *) # Add specified build targets into BUILD_TARGETS 57*90c8c64dSAndroid Build Coastguard Worker BUILD_TARGETS+=("$1") 58*90c8c64dSAndroid Build Coastguard Worker ;; 59*90c8c64dSAndroid Build Coastguard Worker esac 60*90c8c64dSAndroid Build Coastguard Worker shift 61*90c8c64dSAndroid Build Coastguard Workerdone 62*90c8c64dSAndroid Build Coastguard Worker 63*90c8c64dSAndroid Build Coastguard Workerset -ex 64*90c8c64dSAndroid Build Coastguard Worker 65*90c8c64dSAndroid Build Coastguard Workersource "$(dirname "$0")/envsetup.sh" 66*90c8c64dSAndroid Build Coastguard Worker 67*90c8c64dSAndroid Build Coastguard Workerif [ "$(uname)" != "Linux" ]; then 68*90c8c64dSAndroid Build Coastguard Worker echo "error: Unsupported uname: $(uname)" 69*90c8c64dSAndroid Build Coastguard Worker exit 1 70*90c8c64dSAndroid Build Coastguard Workerfi 71*90c8c64dSAndroid Build Coastguard Worker 72*90c8c64dSAndroid Build Coastguard Worker# Targets to be built 73*90c8c64dSAndroid Build Coastguard WorkerSOONG_BINARIES=() 74*90c8c64dSAndroid Build Coastguard WorkerSOONG_TESTS=() 75*90c8c64dSAndroid Build Coastguard Worker 76*90c8c64dSAndroid Build Coastguard Worker# Check if all specified targets are valid 77*90c8c64dSAndroid Build Coastguard Workerfor name in "${BUILD_TARGETS[@]}"; do 78*90c8c64dSAndroid Build Coastguard Worker if in_array "${name}" "${VALID_SOONG_BINARIES[@]}"; then 79*90c8c64dSAndroid Build Coastguard Worker SOONG_BINARIES+=("${name}") 80*90c8c64dSAndroid Build Coastguard Worker elif in_array "${name}" "${VALID_SOONG_TESTS[@]}"; then 81*90c8c64dSAndroid Build Coastguard Worker SOONG_TESTS+=("${name}") 82*90c8c64dSAndroid Build Coastguard Worker else 83*90c8c64dSAndroid Build Coastguard Worker echo "build_target ${name} is not one of the supported targets:" \ 84*90c8c64dSAndroid Build Coastguard Worker "${VALID_SOONG_BINARIES[@]}" "${VALID_SOONG_TESTS[@]}" 85*90c8c64dSAndroid Build Coastguard Worker exit 1 86*90c8c64dSAndroid Build Coastguard Worker fi 87*90c8c64dSAndroid Build Coastguard Workerdone 88*90c8c64dSAndroid Build Coastguard Worker 89*90c8c64dSAndroid Build Coastguard Workerif [ "${#BUILD_TARGETS[@]}" -eq 0 ]; then 90*90c8c64dSAndroid Build Coastguard Worker # Build everything by default. 91*90c8c64dSAndroid Build Coastguard Worker SOONG_BINARIES=("${VALID_SOONG_BINARIES[@]}") 92*90c8c64dSAndroid Build Coastguard Worker SOONG_TESTS=("${VALID_SOONG_TESTS[@]}") 93*90c8c64dSAndroid Build Coastguard Workerfi 94*90c8c64dSAndroid Build Coastguard Worker 95*90c8c64dSAndroid Build Coastguard Workerif [ -z "${OUT_DIR}" ]; then 96*90c8c64dSAndroid Build Coastguard Worker echo "error: Must set OUT_DIR" 97*90c8c64dSAndroid Build Coastguard Worker exit 1 98*90c8c64dSAndroid Build Coastguard Workerfi 99*90c8c64dSAndroid Build Coastguard Worker 100*90c8c64dSAndroid Build Coastguard WorkerTOP=$(pwd) 101*90c8c64dSAndroid Build Coastguard Worker 102*90c8c64dSAndroid Build Coastguard Worker# Setup Soong configuration 103*90c8c64dSAndroid Build Coastguard WorkerSOONG_OUT="${OUT_DIR}/soong" 104*90c8c64dSAndroid Build Coastguard WorkerSOONG_HOST_OUT="${OUT_DIR}/soong/host/linux-x86" 105*90c8c64dSAndroid Build Coastguard Workerrm -rf "${SOONG_OUT}" 106*90c8c64dSAndroid Build Coastguard Workermkdir -p "${SOONG_OUT}" 107*90c8c64dSAndroid Build Coastguard Workercat > "${SOONG_OUT}/soong.variables" << __EOF__ 108*90c8c64dSAndroid Build Coastguard Worker{ 109*90c8c64dSAndroid Build Coastguard Worker "Allow_missing_dependencies": true, 110*90c8c64dSAndroid Build Coastguard Worker "HostArch":"x86_64" 111*90c8c64dSAndroid Build Coastguard Worker} 112*90c8c64dSAndroid Build Coastguard Worker__EOF__ 113*90c8c64dSAndroid Build Coastguard Worker 114*90c8c64dSAndroid Build Coastguard Worker# Allow unknown warning options since this may lag behind platform's compiler 115*90c8c64dSAndroid Build Coastguard Worker# version. 116*90c8c64dSAndroid Build Coastguard Workerexport ALLOW_UNKNOWN_WARNING_OPTION=true 117*90c8c64dSAndroid Build Coastguard Worker 118*90c8c64dSAndroid Build Coastguard Workerbinaries=() 119*90c8c64dSAndroid Build Coastguard Workerfor name in "${SOONG_BINARIES[@]}"; do 120*90c8c64dSAndroid Build Coastguard Worker binaries+=("${SOONG_HOST_OUT}/bin/${name}") 121*90c8c64dSAndroid Build Coastguard Workerdone 122*90c8c64dSAndroid Build Coastguard Worker 123*90c8c64dSAndroid Build Coastguard Worker# Build binaries and shared libs 124*90c8c64dSAndroid Build Coastguard Workerbuild/soong/soong_ui.bash --make-mode --skip-config --soong-only \ 125*90c8c64dSAndroid Build Coastguard Worker "${binaries[@]}" "${SOONG_TESTS[@]}" 126*90c8c64dSAndroid Build Coastguard Worker 127*90c8c64dSAndroid Build Coastguard Worker# Copy binaries and shared libs 128*90c8c64dSAndroid Build Coastguard WorkerSOONG_DIST="${SOONG_OUT}/dist" 129*90c8c64dSAndroid Build Coastguard Workermkdir -p "${SOONG_DIST}/bin" 130*90c8c64dSAndroid Build Coastguard Workerif [ -n "${binaries}" ]; then 131*90c8c64dSAndroid Build Coastguard Worker cp "${binaries[@]}" "${SOONG_DIST}/bin" 132*90c8c64dSAndroid Build Coastguard Workerfi 133*90c8c64dSAndroid Build Coastguard Workercp -R "${SOONG_HOST_OUT}/lib64" "${SOONG_DIST}" 134*90c8c64dSAndroid Build Coastguard Worker# create symlink lib -> lib64 as toolchain libraries have a RUNPATH pointing to 135*90c8c64dSAndroid Build Coastguard Worker# $ORIGIN/../lib instead of lib64 136*90c8c64dSAndroid Build Coastguard Workerln -s "lib64" "${SOONG_DIST}/lib" 137*90c8c64dSAndroid Build Coastguard Worker 138*90c8c64dSAndroid Build Coastguard Worker# Copy clang header and share files 139*90c8c64dSAndroid Build Coastguard WorkerCLANG_DIR="prebuilts/clang/host/linux-x86/${LLVM_PREBUILTS_VERSION}" 140*90c8c64dSAndroid Build Coastguard WorkerCLANG_LIB_DIR="${CLANG_DIR}/lib/clang/${LLVM_RELEASE_VERSION}" 141*90c8c64dSAndroid Build Coastguard WorkerCLANG_LIB_DIR_OUT="${SOONG_DIST}/lib/clang/${LLVM_RELEASE_VERSION}" 142*90c8c64dSAndroid Build Coastguard Workermkdir -p "${CLANG_LIB_DIR_OUT}" 143*90c8c64dSAndroid Build Coastguard Workercp -R "${CLANG_LIB_DIR}/share" "${CLANG_LIB_DIR_OUT}/share" 144*90c8c64dSAndroid Build Coastguard Workercp -R "${CLANG_LIB_DIR}/include" "${CLANG_LIB_DIR_OUT}/include" 145*90c8c64dSAndroid Build Coastguard Workerln -s "lib/clang/${LLVM_RELEASE_VERSION}/include" "${SOONG_DIST}/clang-headers" 146*90c8c64dSAndroid Build Coastguard Worker 147*90c8c64dSAndroid Build Coastguard Worker# Normalize library file names. All library file names must match their soname. 148*90c8c64dSAndroid Build Coastguard Workerfunction extract_soname () { 149*90c8c64dSAndroid Build Coastguard Worker local file="$1" 150*90c8c64dSAndroid Build Coastguard Worker readelf -d "${file}" | \ 151*90c8c64dSAndroid Build Coastguard Worker grep '(SONAME)\s*Library soname: \[.*\]$' -o | \ 152*90c8c64dSAndroid Build Coastguard Worker sed 's/(SONAME)\s*Library soname: \[\(.*\)\]$/\1/g' 153*90c8c64dSAndroid Build Coastguard Worker} 154*90c8c64dSAndroid Build Coastguard Worker 155*90c8c64dSAndroid Build Coastguard Workerfor file in "${SOONG_OUT}/dist/lib"*"/"*; do 156*90c8c64dSAndroid Build Coastguard Worker soname="$(extract_soname "${file}")" 157*90c8c64dSAndroid Build Coastguard Worker if [ -n "${soname}" -a "$(basename "${file}")" != "${soname}" ]; then 158*90c8c64dSAndroid Build Coastguard Worker mv "${file}" "$(dirname "${file}")/${soname}" 159*90c8c64dSAndroid Build Coastguard Worker fi 160*90c8c64dSAndroid Build Coastguard Workerdone 161*90c8c64dSAndroid Build Coastguard Worker 162*90c8c64dSAndroid Build Coastguard Worker# Package binaries and shared libs 163*90c8c64dSAndroid Build Coastguard Workerif [ -z "${DIST_DIR}" ]; then 164*90c8c64dSAndroid Build Coastguard Worker echo "DIST_DIR is empty. Skip zipping binaries." 165*90c8c64dSAndroid Build Coastguard Workerelse 166*90c8c64dSAndroid Build Coastguard Worker pushd "${SOONG_OUT}/dist" 167*90c8c64dSAndroid Build Coastguard Worker zip -qryX build-prebuilts.zip * 168*90c8c64dSAndroid Build Coastguard Worker popd 169*90c8c64dSAndroid Build Coastguard Worker mkdir -p "${DIST_DIR}" || true 170*90c8c64dSAndroid Build Coastguard Worker cp "${SOONG_OUT}/dist/build-prebuilts.zip" "${DIST_DIR}/" 171*90c8c64dSAndroid Build Coastguard Workerfi 172