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