aboutsummaryrefslogtreecommitdiff
path: root/msys2-configure.sh
blob: 53ccdc52403bef1f8733fbdfdf8759f7c1ba29fe (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
132
#!/bin/sh -e
# msys2-configure.sh: set up an MSYS2-based Meson build targeting x86-64.
# Dependencies: AWK, sed, sha256sum, cURL, bsdtar,
# wine64, Meson, mingw-w64-binutils, mingw-w64-gcc, pkg-config
repository=https://repo.msys2.org/mingw/mingw64/

# Support running directly from within MSYS2 on Windows.
if [ -n "$MSYSTEM" ]
then
	wine64() { "$@"; }
	awk() { command awk -v RS='\r?\n' "$@"; }
fi

status() {
	echo "$(tput bold)-- $*$(tput sgr0)"
}

dbsync() {
	status Fetching repository DB
	[ -f db.tsv ] || curl -# "$repository/mingw64.db" | bsdtar -xOf- | awk '
		function flush() { print f["%NAME%"] f["%FILENAME%"] f["%DEPENDS%"] }
		NR > 1 && $0 == "%FILENAME%" { flush(); for (i in f) delete f[i] }
		!/^[^%]/ { field = $0; next } { f[field] = f[field] $0 "\t" }
		field == "%SHA256SUM%" { path = "*packages/" f["%FILENAME%"]
			sub(/\t$/, "", path); print $0, path > "db.sums" } END { flush() }
	' > db.tsv
}

fetch() {
	status Resolving "$@"
	mkdir -p packages
	awk -F'\t' 'function get(name,    i, a) {
		if (visited[name]++ || !(name in filenames)) return
		print filenames[name]; split(deps[name], a); for (i in a) get(a[i])
	} BEGIN { while ((getline < "db.tsv") > 0) {
		filenames[$1] = $2; deps[$1] = ""; for (i = 3; i <= NF; i++) {
			gsub(/[<=>].*/, "", $i); deps[$1] = deps[$1] $i FS }
	} for (i = 0; i < ARGC; i++) get(ARGV[i]) }' "$@" | while IFS= read -r name
	do
		status Fetching "$name"
		[ -f "packages/$name" ] || curl -#o "packages/$name" "$repository/$name"
	done

	version=$(curl -# https://exiftool.org/ver.txt)
	name=exiftool-$version.tar.gz remotename=Image-ExifTool-$version.tar.gz
	status Fetching "$remotename"
	[ -f "$name" ] || curl -#o "$name" "https://exiftool.org/$remotename"
	ln -sf "$name" exiftool.tar.gz
}

verify() {
	status Verifying checksums
	sha256sum --ignore-missing --quiet -c db.sums
}

extract() {
	status Extracting packages
	for subdir in *
	do [ -d "$subdir" -a "$subdir" != packages ] && rm -rf -- "$subdir"
	done
	for i in packages/*
	do bsdtar -xf "$i" --strip-components 1 mingw64
	done

	bsdtar -xf exiftool.tar.gz
	mv Image-ExifTool-*/exiftool bin
	mv Image-ExifTool-*/lib/* lib/perl5/site_perl
	rm -rf Image-ExifTool-*
}

configure() {
	# Don't let GLib programs inherit wrong paths from the environment.
	export XDG_DATA_DIRS=$msys2_root/share

	status Configuring packages
	wine64 bin/update-mime-database.exe share/mime
	wine64 bin/glib-compile-schemas.exe share/glib-2.0/schemas
	wine64 bin/gdk-pixbuf-query-loaders.exe \
		> lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
}

setup() {
	status Setting up Meson
	[ -n "$MSYSTEM" ] && wrap=false || wrap=true

	cat >"$toolchain" <<-EOF
	[binaries]
	c = 'x86_64-w64-mingw32-gcc'
	cpp = 'x86_64-w64-mingw32-g++'
	ar = 'x86_64-w64-mingw32-gcc-ar'
	ranlib = 'x86_64-w64-mingw32-gcc-ranlib'
	strip = 'x86_64-w64-mingw32-strip'
	windres = 'x86_64-w64-mingw32-windres'
	pkgconfig = 'pkg-config'

	[properties]
	sys_root = '$builddir'
	msys2_root = '$msys2_root'
	pkg_config_libdir = '$msys2_root/share/pkgconfig:$msys2_root/lib/pkgconfig'
	needs_exe_wrapper = $wrap

	[host_machine]
	system = 'windows'
	cpu_family = 'x86_64'
	cpu = 'x86_64'
	endian = 'little'
	EOF

	meson setup --buildtype=debugoptimized --prefix="$packagedir" \
		--bindir . --libdir . --cross-file="$toolchain" "$builddir" "$sourcedir"
}

sourcedir=$(realpath "${2:-$(dirname "$0")}")
builddir=$(realpath "${1:-builddir}")
packagedir=$builddir/package
toolchain=$builddir/msys2-cross-toolchain.meson

# This directory name matches the prefix in .pc files, so we don't need to
# modify them (pkgconf has --prefix-variable, but Meson can't pass that option).
msys2_root=$builddir/mingw64

mkdir -p "$msys2_root"
cd "$msys2_root"
dbsync
fetch mingw-w64-x86_64-gtk3 mingw-w64-x86_64-lcms2 \
	mingw-w64-x86_64-libraw mingw-w64-x86_64-libheif \
	mingw-w64-x86_64-perl mingw-w64-x86_64-perl-win32-api \
	mingw-w64-x86_64-libwinpthread-git # Because we don't do "provides"?
verify
extract
configure
setup