aboutsummaryrefslogtreecommitdiff
path: root/common/hooks/pre-pkg/05-prepare-32bit.sh
blob: 2056d7fa9e808c738ffc4fafaf469a91e46650c5 (plain) (blame)
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# This hook creates a new PKGDESTDIR with 32bit files for x86_64.
#
# Variables that can be used in templates:
#	- lib32depends: if set, 32bit pkg will use this rather than "depends".
#	- lib32disabled: if set, no 32bit pkg will be created.
#	- lib32files: additional files to add to the 32bit pkg (abs paths, separated by blanks).
#	- lib32symlinks: makes a symlink from lib32 to lib of the specified file (basename).
#	- lib32mode:
#		* if unset only files for libraries will be copied.
#		* if set to "full" all files will be copied.

hook() {
	local destdir32=${XBPS_DESTDIR}/${pkgname}-32bit-${version}

	# By default always enabled unless "lib32disabled" is set.
	if [ -n "$lib32disabled" ]; then
		return
	fi
	# This hook will only work when building for x86.
	if [ "$XBPS_TARGET_MACHINE" != "i686" ]; then
		return
	fi 
	# Ignore noarch pkgs.
	if [ "${archs// /}" = "noarch" ]; then
		return
	fi
	if [ -z "$lib32mode" ]; then
		# Library mode, copy only relevant files to new destdir.
		#
		# If /usr/lib does not exist don't continue...
		if [ ! -d ${PKGDESTDIR}/usr/lib ]; then
			return
		fi
		mkdir -p ${destdir32}/usr/lib32
		cp -a ${PKGDESTDIR}/usr/lib/* ${destdir32}/usr/lib32

		# Only keep shared libs, static libs, and pkg-config files.
		find "${destdir32}" -not \( \
			-name '*.pc' -or \
			-name '*.so' -or \
			-name '*.so.*' -or \
			-name '*.a' -or \
			-name '*.la' -or \
			-name '*.o' -or \
			-type d \
		\) -delete

		# Remove empty dirs.
		while IFS= read -r -d '' f; do
			_dir="${f##${destdir32}}"
			[ -z "${_dir}" ] && continue
			rmdir --ignore-fail-on-non-empty -p "$f" &>/dev/null
		done < <(find ${destdir32} -type d -empty -print0 | sort -uz)

		# Switch pkg-config files to lib32.
		if [ -d ${destdir32}/usr/lib32/pkgconfig ]; then
			sed -e 's,/usr/lib$,/usr/lib32,g' \
			    -e 's,${exec_prefix}/lib$,${exec_prefix}/lib32,g' \
			    -i ${destdir32}/usr/lib32/pkgconfig/*.pc
		fi
	elif [ "$lib32mode" = "full" ]; then
		# Full 32bit mode; copy everything to new destdir.
		mkdir -p ${destdir32}
		cp -a ${PKGDESTDIR}/* ${destdir32}/
		# remove symlink
		if [ -h ${destdir32}/usr/lib32 ]; then
			rm ${destdir32}/usr/lib32
		fi
		# if /usr/lib dir exists move it to lib32.
		if [ -d ${destdir32}/usr/lib ]; then
			mv ${destdir32}/usr/lib ${destdir32}/usr/lib32
		fi
	fi
	if [ ! -d ${destdir32} ]; then
		return
	fi

	# If the rdeps file exist (runtime deps), copy and then modify it for
	# 32bit dependencies.
	trap - ERR

	: > ${destdir32}/rdeps

	if [ -s "$PKGDESTDIR/rdeps" ]; then
		if [ -n "$lib32depends" ]; then
			_deps="${lib32depends}"
		else
			_deps="$(<${PKGDESTDIR}/rdeps)"
		fi
		for f in ${_deps}; do
			unset found pkgn pkgv _arch _shprovides

			pkgn="$($XBPS_UHELPER_CMD getpkgdepname $f)"
			if [ -z "${pkgn}" ]; then
				pkgn="$($XBPS_UHELPER_CMD getpkgname $f)"
				if [ -z "${pkgn}" ]; then
					msg_error "$pkgver: invalid dependency $f\n"
				fi
				pkgv="-$($XBPS_UHELPER_CMD getpkgversion ${f})"
			else
				pkgv="$($XBPS_UHELPER_CMD getpkgdepversion ${f})"
			fi
			# If dependency is a development pkg switch it to 32bit.
			if [[ $pkgn =~ '-devel' ]]; then
				echo "   RDEP: $f -> ${pkgn}-32bit${pkgv} (development)"
				printf "${pkgn}-32bit${pkgv} " >> ${destdir32}/rdeps
				continue
			fi
			# If dependency is noarch do not change it to 32bit.
			_arch=$($XBPS_QUERY_CMD -R --property=architecture "$f")
			if [ "${_arch}" = "noarch" ]; then
				echo "   RDEP: $f -> ${pkgn}${pkgv} (noarch)"
				printf "${pkgn}${pkgv} " >> ${destdir32}/rdeps
				continue
			fi
			# If dependency does not have "shlib-provides" do not
			# change it to 32bit.
			for x in ${subpackages}; do
				if [ "$x" = "$pkgn" ]; then
					found=1
					break
				fi
			done
			if [ -z "$found" ]; then
				# Dependency is not a subpkg, check shlib-provides
				# via binpkgs.
				_shprovides="$($XBPS_QUERY_CMD -R --property=shlib-provides "$pkgn")"
				if [ -n "${_shprovides}" ]; then
					echo "   RDEP: $f -> ${pkgn}-32bit${pkgv} (shlib-provides)"
					printf "${pkgn}-32bit${pkgv} " >> ${destdir32}/rdeps
				else
					echo "   RDEP: $f -> ${pkgn}${pkgv} (no shlib-provides)"
					printf "${pkgn}${pkgv} " >> ${destdir32}/rdeps
				fi
			else
				if [ -s ${XBPS_DESTDIR}/${pkgn}-${version}/shlib-provides ]; then
					# Dependency is a subpkg; check if it provides any shlib
					# and convert to 32bit if true.
					echo "   RDEP: $f -> ${pkgn}-32bit${pkgv} (subpkg, shlib-provides)"
					printf "${pkgn}-32bit${pkgv} " >> ${destdir32}/rdeps
				else
					echo "   RDEP: $f -> ${pkgn}${pkgv} (subpkg, no shlib-provides)"
					printf "${pkgn}${pkgv} " >> ${destdir32}/rdeps
				fi
			fi
		done
	fi

	# Also install additional files set via "lib32files".
	for f in ${lib32files}; do
		echo "$pkgver: installing additional files: $f ..."
		_targetdir=${destdir32}/${f%/*}/
		mkdir -p ${_targetdir/\/usr\/lib/\/usr\/lib32}
		cp -a ${PKGDESTDIR}/${f} ${_targetdir/\/usr\/lib/\/usr\/lib32}
	done
	# Additional symlinks to the native libdir.
	for f in ${lib32symlinks}; do
		echo "$pkgver: symlinking $f to the native libdir..."
		mkdir -p ${destdir32}/usr/lib{,32}/${f%/*}/
		ln -sfr ${destdir32}/usr/lib32/$f ${destdir32}/usr/lib/$f
	done
	# If it's a development pkg add a dependency to the 64bit pkg.
	if [[ $pkgname =~ '-devel' ]]; then
		echo "   RDEP: ${pkgver}"
		printf "${pkgver} " >> ${destdir32}/rdeps
	fi
	printf "\n" >> ${destdir32}/rdeps
}