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