summaryrefslogtreecommitdiff
path: root/maint/reproducible_build
blob: cf3006714370f622485792d1021237b7e0440214 (plain)
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
#!/usr/bin/env bash
#
# This script is run inside a docker container as part of our
# reproducible build process.
#
set -xeuo pipefail
if [ ! -f /.dockerenv ]; then
    echo Not running inside Docker, build will probably not be reproducible
    echo Use docker_reproducible_build instead to get the right environment
fi
if [ $# -eq 0 ]; then
	echo usage : "$0" '<linux|windows|macos...>'
	exit 1
fi

: "${CARGO:=cargo}" # quotes are just to placate shellcheck

linux=""
windows=""
macos=""
while [ "$#" -ne 0 ]; do
	case "$1" in
	linux)   linux=1;;
	windows) windows=1;;
	macos)   macos=1;;
	*)
		echo "unknown target : $1" >&2
		exit 1;;
	esac
	shift
done

here=$(pwd)

## fix the target architecture to get reproducible builds
## the architecture was chosen as old enough that it should cover most usage
## while still supporting useful features like AES-NI. Older architectures
## won't be able to execute the resulting binary.
export CFLAGS="-march=westmere"
export RUSTFLAGS="-C target-cpu=westmere"

## force build to run in a fixed location. Necessary because the build path
## is somehow captured when compiling.
cp -a "$here" /arti
cd /arti

## FIXME: This is a workaround for:
## https://gitlab.torproject.org/tpo/core/arti/-/issues/1335
##
## Since 'native-tls' >= 0.2.14 only builds on rust >= 1.80,
## and we can't use newer rust versions due to arti#1335,
## we need to downgrade 'native-tls'.
## (And similar for other libs.)
$CARGO update -p native-tls --precise 0.2.13
$CARGO update -p zerofrom --precise 0.1.5
$CARGO update -p litemap --precise 0.7.4
$CARGO update -p tinystr:0.8.1 --precise 0.8.0
$CARGO update -p base64ct --precise 1.6.0

cargo_build () {
	$CARGO build --locked "$@"
}
cargo_build_arti () {
	cargo_build -p arti --release --features static "$@"
}

## add missing dependencies
apk add perl make git musl-dev
if [ -n "$linux" ]; then
	## no additional dependencies specifically for Linux

	## Build targeting x86_64-unknown-linux-musl to get a static binary
	## feature "static" enable compiling some C dependencies instead of linking
	## to system libraries. It is required to get a well behaving result.
	cargo_build_arti --target x86_64-unknown-linux-musl
	mv /arti/target/x86_64-unknown-linux-musl/release/arti "$here"/arti-linux
fi
if [ -n "$windows" ]; then
	apk add mingw-w64-gcc
	rustup target add x86_64-pc-windows-gnu

	## Same tweaks as for Linux, plus don't insert compilation timestamp into PE headers
	RUSTFLAGS="$RUSTFLAGS -C link-arg=-Wl,--no-insert-timestamp" \
		cargo_build_arti --target x86_64-pc-windows-gnu
	mv /arti/target/x86_64-pc-windows-gnu/release/arti.exe "$here"/arti-windows.exe
fi
if [ -n "$macos" ]; then
	apk add bash cmake patch clang libc-dev libxml2-dev openssl-dev musl-fts-dev build-base python3 bsd-compat-headers xz
	rustup target add x86_64-apple-darwin

	mkdir -p .cargo
	# (note: "ar" seems to be unused here. We could probably remove it?)
	cat > .cargo/config << EOF
[target.x86_64-apple-darwin]
linker = "x86_64-apple-darwin16-clang"
ar = "x86_64-apple-darwin16-ar"
EOF
	OSX_SDK_URL=https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX10.12.sdk.tar.xz
	OSX_SDK_VERSION=10.12
	OSX_SDK_SHA256=b314704d85934481c9927a0450db1768baf9af9efe649562fcb1a503bb44512f
	OSX_SDK="MacOSX${OSX_SDK_VERSION}.sdk.tar.xz"

	## don't compile clang if it's already here (CI cache?)
	if [ ! -x "/arti/osxcross/target/bin/o64-clang" ]; then
		git clone https://github.com/tpoechtrager/osxcross
		cd osxcross
		wget -nc "${OSX_SDK_URL}" -O tarballs/${OSX_SDK}
		echo "${OSX_SDK_SHA256}  tarballs/${OSX_SDK}" > ./sdk-checksum
		sha256sum -c ./sdk-checksum
		UNATTENDED=yes OSX_VERSION_MIN=10.7 ./build.sh
		# copy it to gitlab build-dir so it may get cached
		cp -r /arti/osxcross "$here"
		cd ..
	fi

	PATH="/arti/osxcross/target/bin:$PATH" \
		MACOSX_DEPLOYMENT_TARGET="10.7" \
		CC=o64-clang \
		CXX=o64-clang++ \
		cargo_build_arti --target x86_64-apple-darwin
	mv /arti/target/x86_64-apple-darwin/release/arti "$here"/arti-macos
fi

git config --global --add safe.directory /arti

set +x
echo "branch       :" "$(git rev-parse --abbrev-ref HEAD)"
echo "commit       :" "$(git rev-parse HEAD)"
[ -z "$linux" ]   || echo "Linux hash   :" "$(sha256sum "$here"/arti-linux       | cut -d " " -f 1)"
[ -z "$windows" ] || echo "Windows hash :" "$(sha256sum "$here"/arti-windows.exe | cut -d " " -f 1)"
[ -z "$macos" ]   || echo "MacOS hash   :" "$(sha256sum "$here"/arti-macos       | cut -d " " -f 1)"