forked from kubevirt/kubevirt
-
Notifications
You must be signed in to change notification settings - Fork 2
/
build-go.sh
executable file
·148 lines (129 loc) · 4.88 KB
/
build-go.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/usr/bin/env bash
#
# This file is part of the KubeVirt project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Copyright 2017 Red Hat, Inc.
#
set -e
source hack/common.sh
source hack/config.sh
source hack/version.sh
source hack/go-build-functests.sh
if [ -z "$1" ]; then
target="install"
else
target=$1
shift
fi
if [ $# -eq 0 ]; then
args=$binaries
build_tests="true"
else
args=$@
fi
PLATFORM=$(uname -m)
case ${PLATFORM} in
x86_64* | i?86_64* | amd64*)
ARCH="amd64"
;;
aarch64* | arm64*)
ARCH="arm64"
;;
*)
echo "invalid Arch, only support x86_64 and aarch64"
exit 1
;;
esac
# forward all commands to all packages if no specific one was requested
# TODO finetune this a little bit more
if [ $# -eq 0 ]; then
if [ "${target}" = "test" ]; then
(
# Ignoring container-disk-v2alpha since it is written in C, not in go
go ${target} -v -tags "${KUBEVIRT_GO_BUILD_TAGS}" --ignore=container-disk-v2alpha ./cmd/...
)
(
go ${target} -v -tags "${KUBEVIRT_GO_BUILD_TAGS}" -race ./pkg/...
)
else
(
go $target -tags "${KUBEVIRT_GO_BUILD_TAGS}" ./pkg/...
GO111MODULE=off go $target -tags "${KUBEVIRT_GO_BUILD_TAGS}" ./staging/src/kubevirt.io/...
)
(
go $target -tags "${KUBEVIRT_GO_BUILD_TAGS}" ./tests/...
)
fi
fi
# Return a pkgdir parameter based on os and arch
function pkg_dir() {
if [ -n "${KUBEVIRT_GO_BASE_PKGDIR}" ]; then
echo "-pkgdir ${KUBEVIRT_GO_BASE_PKGDIR}/$1-$2"
fi
}
# handle binaries
if [ "${target}" = "install" ]; then
# Delete all binaries which are not present in the binaries variable to avoid branch inconsistencies
to_delete=$(comm -23 <(find ${CMD_OUT_DIR} -mindepth 1 -maxdepth 1 -type d | sort) <(echo $binaries | sed -e 's/cmd\///g' -e 's/ /\n/g' | sed -e "s#^#${CMD_OUT_DIR}/#" | sort))
rm -rf ${to_delete}
(
if [ -z "$BIN_NAME" ] || [[ $BIN_NAME == *"container-disk"* ]]; then
mkdir -p ${CMD_OUT_DIR}/container-disk-v2alpha
cd cmd/container-disk-v2alpha
# the containerdisk bianry needs to be static, as it runs in a scratch container
echo "building static binary container-disk"
gcc -static -o ${CMD_OUT_DIR}/container-disk-v2alpha/container-disk main.c
fi
)
fi
for arg in $args; do
if [ "${target}" = "test" ]; then
(
go ${target} -v -tags "${KUBEVIRT_GO_BUILD_TAGS}" ./$arg/...
)
elif [ "${target}" = "install" ]; then
eval "$(go env)"
BIN_NAME=$(basename $arg)
ARCH_BASENAME=${BIN_NAME}-${KUBEVIRT_VERSION}
mkdir -p ${CMD_OUT_DIR}/${BIN_NAME}
(
go vet ./$arg/...
cd $arg
# always build and link the binary based on CPU Architecture
LINUX_NAME=${ARCH_BASENAME}-linux-${ARCH}
echo "building dynamic binary $BIN_NAME"
GOOS=linux GOARCH=${ARCH} go_build -tags "${KUBEVIRT_GO_BUILD_TAGS}" -o ${CMD_OUT_DIR}/${BIN_NAME}/${LINUX_NAME} -ldflags "$(kubevirt::version::ldflags)" $(pkg_dir linux ${ARCH})
(cd ${CMD_OUT_DIR}/${BIN_NAME} && ln -sf ${LINUX_NAME} ${BIN_NAME})
kubevirt::version::get_version_vars
echo "$KUBEVIRT_GIT_VERSION" >${CMD_OUT_DIR}/${BIN_NAME}/.version
# build virtctl also for darwin and windows on amd64
if [ "${BIN_NAME}" = "virtctl" -a "${ARCH}" = "amd64" -a -z "${LINUX_ONLY}" ]; then
GOOS=darwin GOARCH=amd64 go_build -tags "${KUBEVIRT_GO_BUILD_TAGS}" -o ${CMD_OUT_DIR}/${BIN_NAME}/${ARCH_BASENAME}-darwin-amd64 -ldflags "$(kubevirt::version::ldflags)" $(pkg_dir darwin amd64)
GOOS=windows GOARCH=amd64 go_build -tags "${KUBEVIRT_GO_BUILD_TAGS}" -o ${CMD_OUT_DIR}/${BIN_NAME}/${ARCH_BASENAME}-windows-amd64.exe -ldflags "$(kubevirt::version::ldflags)" $(pkg_dir windows amd64)
# Create symlinks to the latest binary of each architecture
(cd ${CMD_OUT_DIR}/${BIN_NAME} && ln -sf ${ARCH_BASENAME}-darwin-amd64 ${BIN_NAME}-darwin)
(cd ${CMD_OUT_DIR}/${BIN_NAME} && ln -sf ${ARCH_BASENAME}-windows-amd64.exe ${BIN_NAME}-windows.exe)
fi
)
else
(
cd $arg
go $target ./...
)
fi
done
if [[ "${target}" == "install" && "${build_tests}" == "true" ]]; then
build_func_tests
fi