From 95846211c968077b88ec90001c54cf51e98000b2 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 31 Mar 2017 12:57:34 -0500 Subject: [PATCH] build: find dependencies for Go executables To ensure that changing a dependency source file actually triggers a rebuild of the core binaries when you type 'make', find their dependencies and add them to the makefile's target dependencies. Signed-off-by: Dan Williams --- Makefile | 6 +++--- hack/find-godeps.sh | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100755 hack/find-godeps.sh diff --git a/Makefile b/Makefile index 5ea6d260..1936cc24 100644 --- a/Makefile +++ b/Makefile @@ -68,15 +68,15 @@ copyimg: .gopathok $(wildcard test/copyimg/*.go) checkseccomp: .gopathok $(wildcard test/checkseccomp/*.go) go build -o test/checkseccomp/$@ $(PROJECT)/test/checkseccomp -ocid: .gopathok +ocid: .gopathok $(shell hack/find-godeps.sh $(GOPKGDIR) cmd/ocid $(PROJECT)) $(GO) build -o $@ \ -tags "$(BUILDTAGS)" \ $(PROJECT)/cmd/ocid -ocic: .gopathok +ocic: .gopathok $(shell hack/find-godeps.sh $(GOPKGDIR) cmd/ocic $(PROJECT)) $(GO) build -o $@ $(PROJECT)/cmd/ocic -kpod: .gopathok +kpod: .gopathok $(shell hack/find-godeps.sh $(GOPKGDIR) cmd/kpod $(PROJECT)) $(GO) build -o $@ $(PROJECT)/cmd/kpod ocid.conf: ocid diff --git a/hack/find-godeps.sh b/hack/find-godeps.sh new file mode 100755 index 00000000..59689e6e --- /dev/null +++ b/hack/find-godeps.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# +# $1 - base path of the source tree +# $2 - subpath under $1 to find *.go dependencies for +# $3 - package name (eg, github.com/organization/project) + +set -o errexit +set -o nounset +set -o pipefail + +# might be called from makefile before basepath is set up; just return +# empty deps. The make target will then ensure that GOPATH is set up +# correctly, and go build will build everything the first time around +# anyway. Next time we get here everything will be fine. +if [ ! -d "$1/$2" ]; then + exit 0 +fi + +function find-deps() { + local basepath=$1 + local srcdir=$2 + local pkgname=$3 + local deps= + + # gather imports from cri-o + pkgs=$(cd ${basepath}/${srcdir} && go list -f "{{.Imports}}" . | tr ' ' '\n' | grep -v "/vendor/" | grep ${pkgname} | sed -e "s|${pkgname}/||g") + + # add each Go import's sources to the deps list, + # and recursively get that imports's imports too + for dep in ${pkgs}; do + deps+="$(ls ${basepath}/${dep}/*.go | sed -e "s|${basepath}/||g") " + # add deps of this package too + deps+="$(find-deps ${basepath} ${dep} ${pkgname}) " + done + + echo "${deps}" | sort | uniq +} + +# add Go sources from the current package at the end +echo "$(find-deps "$1" "$2" "$3" | xargs) $(cd $1 && ls $2/*.go | xargs)" +