Home | History | Annotate | Download | only in microfactory
      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