xref: /aosp_15_r20/build/blueprint/microfactory/microfactory.bash (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Worker# Copyright 2017 Google Inc. All rights reserved.
2*1fa6dee9SAndroid Build Coastguard Worker#
3*1fa6dee9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*1fa6dee9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*1fa6dee9SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*1fa6dee9SAndroid Build Coastguard Worker#
7*1fa6dee9SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*1fa6dee9SAndroid Build Coastguard Worker#
9*1fa6dee9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*1fa6dee9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*1fa6dee9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*1fa6dee9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*1fa6dee9SAndroid Build Coastguard Worker# limitations under the License.
14*1fa6dee9SAndroid Build Coastguard Worker
15*1fa6dee9SAndroid Build Coastguard Worker# Set of utility functions to build and run go code with microfactory
16*1fa6dee9SAndroid Build Coastguard Worker#
17*1fa6dee9SAndroid Build Coastguard Worker# Inputs:
18*1fa6dee9SAndroid Build Coastguard Worker#  ${GOROOT}
19*1fa6dee9SAndroid Build Coastguard Worker#  ${BUILDDIR}
20*1fa6dee9SAndroid Build Coastguard Worker#  ${BLUEPRINTDIR}
21*1fa6dee9SAndroid Build Coastguard Worker#  ${SRCDIR}
22*1fa6dee9SAndroid Build Coastguard Worker
23*1fa6dee9SAndroid Build Coastguard Worker# Bootstrap microfactory from source if necessary and use it to build the
24*1fa6dee9SAndroid Build Coastguard Worker# requested binary.
25*1fa6dee9SAndroid Build Coastguard Worker#
26*1fa6dee9SAndroid Build Coastguard Worker# Arguments:
27*1fa6dee9SAndroid Build Coastguard Worker#  $1: name of the requested binary
28*1fa6dee9SAndroid Build Coastguard Worker#  $2: package name
29*1fa6dee9SAndroid Build Coastguard Worker#  ${EXTRA_ARGS}: extra arguments to pass to microfactory (-pkg-path, etc)
30*1fa6dee9SAndroid Build Coastguard Workerfunction build_go
31*1fa6dee9SAndroid Build Coastguard Worker{
32*1fa6dee9SAndroid Build Coastguard Worker    # Increment when microfactory changes enough that it cannot rebuild itself.
33*1fa6dee9SAndroid Build Coastguard Worker    # For example, if we use a new command line argument that doesn't work on older versions.
34*1fa6dee9SAndroid Build Coastguard Worker    local mf_version=3
35*1fa6dee9SAndroid Build Coastguard Worker
36*1fa6dee9SAndroid Build Coastguard Worker    local mf_src="${BLUEPRINTDIR}/microfactory"
37*1fa6dee9SAndroid Build Coastguard Worker    local mf_bin="${BUILDDIR}/microfactory_$(uname)"
38*1fa6dee9SAndroid Build Coastguard Worker    local mf_version_file="${BUILDDIR}/.microfactory_$(uname)_version"
39*1fa6dee9SAndroid Build Coastguard Worker    local built_bin="${BUILDDIR}/$1"
40*1fa6dee9SAndroid Build Coastguard Worker    local from_src=1
41*1fa6dee9SAndroid Build Coastguard Worker
42*1fa6dee9SAndroid Build Coastguard Worker    if [ -f "${mf_bin}" ] && [ -f "${mf_version_file}" ]; then
43*1fa6dee9SAndroid Build Coastguard Worker        if [ "${mf_version}" -eq "$(cat "${mf_version_file}")" ]; then
44*1fa6dee9SAndroid Build Coastguard Worker            from_src=0
45*1fa6dee9SAndroid Build Coastguard Worker        fi
46*1fa6dee9SAndroid Build Coastguard Worker    fi
47*1fa6dee9SAndroid Build Coastguard Worker
48*1fa6dee9SAndroid Build Coastguard Worker    local mf_cmd
49*1fa6dee9SAndroid Build Coastguard Worker    if [ $from_src -eq 1 ]; then
50*1fa6dee9SAndroid Build Coastguard Worker        # `go run` requires a single main package, so create one
51*1fa6dee9SAndroid Build Coastguard Worker        local gen_src_dir="${BUILDDIR}/.microfactory_$(uname)_intermediates/src"
52*1fa6dee9SAndroid Build Coastguard Worker        mkdir -p "${gen_src_dir}"
53*1fa6dee9SAndroid Build Coastguard Worker        sed "s/^package microfactory/package main/" "${mf_src}/microfactory.go" >"${gen_src_dir}/microfactory.go"
54*1fa6dee9SAndroid Build Coastguard Worker        printf "\n//for use with go run\nfunc main() { Main() }\n" >>"${gen_src_dir}/microfactory.go"
55*1fa6dee9SAndroid Build Coastguard Worker
56*1fa6dee9SAndroid Build Coastguard Worker        mf_cmd="${GOROOT}/bin/go run ${gen_src_dir}/microfactory.go"
57*1fa6dee9SAndroid Build Coastguard Worker    else
58*1fa6dee9SAndroid Build Coastguard Worker        mf_cmd="${mf_bin}"
59*1fa6dee9SAndroid Build Coastguard Worker    fi
60*1fa6dee9SAndroid Build Coastguard Worker
61*1fa6dee9SAndroid Build Coastguard Worker    rm -f "${BUILDDIR}/.$1.trace"
62*1fa6dee9SAndroid Build Coastguard Worker    # GOROOT must be absolute because `go run` changes the local directory
63*1fa6dee9SAndroid Build Coastguard Worker    GOROOT=$(cd $GOROOT; pwd) ${mf_cmd} -b "${mf_bin}" \
64*1fa6dee9SAndroid Build Coastguard Worker            -pkg-path "github.com/google/blueprint=${BLUEPRINTDIR}" \
65*1fa6dee9SAndroid Build Coastguard Worker            -trimpath "${SRCDIR}" \
66*1fa6dee9SAndroid Build Coastguard Worker            ${EXTRA_ARGS} \
67*1fa6dee9SAndroid Build Coastguard Worker            -o "${built_bin}" $2
68*1fa6dee9SAndroid Build Coastguard Worker
69*1fa6dee9SAndroid Build Coastguard Worker    if [ $? -eq 0 ] && [ $from_src -eq 1 ]; then
70*1fa6dee9SAndroid Build Coastguard Worker        echo "${mf_version}" >"${mf_version_file}"
71*1fa6dee9SAndroid Build Coastguard Worker    fi
72*1fa6dee9SAndroid Build Coastguard Worker}
73