Merge pull request #530 from apernet/wip-build-script

ci: update build scripts to handle microarchitectures
This commit is contained in:
Toby 2022-12-10 00:40:30 -08:00 committed by GitHub
commit 4c8871070c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 141 additions and 33 deletions

View File

@ -5,6 +5,49 @@
# - HY_APP_COMMIT: App commit hash
# - HY_APP_PLATFORMS: Platforms to build for (e.g. "windows/amd64,linux/amd64,darwin/amd64")
function PlatformToEnv($os, $arch) {
$env:CGO_ENABLED = 0
$env:GOOS = $os
$env:GOARCH = $arch
switch -Regex ($arch) {
"arm" {
$env:GOARM = "7"
}
"armv5" {
$env:GOARM = "5"
$env:GOARCH = "arm"
}
"armv6" {
$env:GOARM = "6"
$env:GOARCH = "arm"
}
"armv7" {
$env:GOARM = "7"
$env:GOARCH = "arm"
}
"mips(le)?" {
$env:GOMIPS = ""
}
"mips-sf" {
$env:GOMIPS = "softfloat"
$env:GOARCH = "mips"
}
"mipsle-sf" {
$env:GOMIPS = "softfloat"
$env:GOARCH = "mipsle"
}
"amd64" {
$env:GOAMD64 = ""
$env:GOARCH = "amd64"
}
"amd64-avx" {
$env:GOAMD64 = "v3"
$env:GOARCH = "amd64"
}
}
}
if (!(Get-Command go -ErrorAction SilentlyContinue)) {
Write-Host "Error: go is not installed." -ForegroundColor Red
exit 1
@ -49,19 +92,18 @@ New-Item -ItemType Directory -Force -Path build
Write-Host "Starting build..." -ForegroundColor Green
$env:CGO_ENABLED = 0
foreach ($platform in $platforms) {
$env:GOOS = $platform.Split("/")[0]
$env:GOARCH = $platform.Split("/")[1]
Write-Host "Building $env:GOOS/$env:GOARCH" -ForegroundColor Green
$output = "build/hysteria-$env:GOOS-$env:GOARCH"
if ($env:GOOS -eq "windows") {
$os = $platform.Split("/")[0]
$arch = $platform.Split("/")[1]
PlatformToEnv $os $arch
Write-Host "Building $os/$arch" -ForegroundColor Green
$output = "build/hysteria-$os-$arch"
if ($os -eq "windows") {
$output = "$output.exe"
}
go build -o $output -tags=gpl -ldflags $ldflags -trimpath ./app/cmd/
if ($LastExitCode -ne 0) {
Write-Host "Error: failed to build $env:GOOS/$env:GOARCH" -ForegroundColor Red
Write-Host "Error: failed to build $os/$arch" -ForegroundColor Red
exit 1
}
}

116
build.sh
View File

@ -8,36 +8,113 @@ set -e
# - HY_APP_COMMIT: App commit hash
# - HY_APP_PLATFORMS: Platforms to build for (e.g. "windows/amd64,linux/amd64,darwin/amd64")
if ! [ -x "$(command -v go)" ]; then
export LC_ALL=C
export LC_DATE=C
has_command() {
local cmd="$1"
type -P "$cmd" > /dev/null 2>&1
}
if ! has_command go; then
echo 'Error: go is not installed.' >&2
exit 1
fi
if ! [ -x "$(command -v git)" ]; then
if ! has_command git; then
echo 'Error: git is not installed.' >&2
exit 1
fi
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo 'Error: not in a git repository.' >&2
exit 1
fi
ldflags="-s -w -X 'main.appDate=$(date -u '+%F %T')'"
if [ -n "$HY_APP_VERSION" ]; then
ldflags="$ldflags -X 'main.appVersion=$HY_APP_VERSION'"
else
ldflags="$ldflags -X 'main.appVersion=$(git describe --tags --always)'"
fi
if [ -n "$HY_APP_COMMIT" ]; then
ldflags="$ldflags -X 'main.appCommit=$HY_APP_COMMIT'"
else
ldflags="$ldflags -X 'main.appCommit=$(git rev-parse HEAD)'"
fi
platform_to_env() {
local os="$1"
local arch="$2"
local env="GOOS=$os GOARCH=$arch CGO_ENABLED=0"
case "$arch" in
arm)
env+=" GOARM= GOARCH=arm"
;;
armv5)
env+=" GOARM=5 GOARCH=arm"
;;
armv6)
env+=" GOARM=6 GOARCH=arm"
;;
armv7)
env+=" GOARM=7 GOARCH=arm"
;;
mips | mipsle)
env+=" GOMIPS="
;;
mips-sf)
env+=" GOMIPS=softfloat GOARCH=mips"
;;
mipsle-sf)
env+=" GOMIPS=softfloat GOARCH=mipsle"
;;
amd64)
env+=" GOAMD64= GOARCH=amd64"
;;
amd64-avx)
env+=" GOAMD64=v3 GOARCH=amd64"
;;
esac
echo "$env"
}
make_ldflags() {
local ldflags="-s -w -X 'main.appDate=$(date -u '+%F %T')'"
if [ -n "$HY_APP_VERSION" ]; then
ldflags="$ldflags -X 'main.appVersion=$HY_APP_VERSION'"
else
ldflags="$ldflags -X 'main.appVersion=$(git describe --tags --always --match 'v*')'"
fi
if [ -n "$HY_APP_COMMIT" ]; then
ldflags="$ldflags -X 'main.appCommit=$HY_APP_COMMIT'"
else
ldflags="$ldflags -X 'main.appCommit=$(git rev-parse HEAD)'"
fi
echo "$ldflags"
}
build_for_platform() {
local platform="$1"
local ldflags="$2"
local GOOS="${platform%/*}"
local GOARCH="${platform#*/}"
if [[ -z "$GOOS" || -z "$GOARCH" ]]; then
echo "Invalid platform $platform" >&2
return 1
fi
echo "Building $GOOS/$GOARCH"
local output="build/hysteria-$GOOS-$GOARCH"
if [[ "$GOOS" = "windows" ]]; then
output="$output.exe"
fi
local envs="$(platform_to_env "$GOOS" "$GOARCH")"
local exit_val=0
env $envs go build -o "$output" -tags=gpl -ldflags "$ldflags" -trimpath ./app/cmd/ || exit_val=$?
if [[ "$exit_val" -ne 0 ]]; then
echo "Error: failed to build $GOOS/$GOARCH" >&2
return $exit_val
fi
}
if [ -z "$HY_APP_PLATFORMS" ]; then
HY_APP_PLATFORMS="$(go env GOOS)/$(go env GOARCH)"
fi
platforms=(${HY_APP_PLATFORMS//,/ })
ldflags="$(make_ldflags)"
mkdir -p build
rm -rf build/*
@ -45,18 +122,7 @@ rm -rf build/*
echo "Starting build..."
for platform in "${platforms[@]}"; do
GOOS=${platform%/*}
GOARCH=${platform#*/}
echo "Building $GOOS/$GOARCH"
output="build/hysteria-$GOOS-$GOARCH"
if [ $GOOS = "windows" ]; then
output="$output.exe"
fi
env GOOS=$GOOS GOARCH=$GOARCH CGO_ENABLED=0 go build -o $output -tags=gpl -ldflags "$ldflags" -trimpath ./app/cmd/
if [ $? -ne 0 ]; then
echo "Error: failed to build $GOOS/$GOARCH"
exit 1
fi
build_for_platform "$platform" "$ldflags"
done
echo "Build complete."