summaryrefslogtreecommitdiff
path: root/Build/source/extra/xz/windows/build.bash
blob: c5cf2b3124293d8b8f9e188916c0d02596d9baf5 (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
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#!/bin/bash
#
###############################################################################
#
# Build a binary package on Windows with MinGW and MSYS
#
# Set the paths where MinGW, Mingw-w32, or MinGW-w64 are installed. If both
# MinGW and MinGW-w32 are specified, MinGW-w32 will be used. If there is no
# 32-bit or 64-bit compiler at all, it is simply skipped.
#
# Optionally, 7-Zip is used to create the final .zip and .7z packages.
# If you have installed it in the default directory, this script should
# find it automatically. Otherwise adjust the path manually.
#
# If you want to use a cross-compiler e.g. on GNU/Linux, this script won't
# work out of the box. You need to omit "make check" commands and replace
# u2d with some other tool to convert newlines from LF to CR+LF. You will
# also need to pass the --host option to configure.
#
###############################################################################
#
# Author: Lasse Collin
#
# This file has been put into the public domain.
# You can do whatever you want with this file.
#
###############################################################################

MINGW_DIR=/c/devel/tools/mingw
MINGW_W32_DIR=/c/devel/tools/mingw-w32
MINGW_W64_DIR=/c/devel/tools/mingw-w64

for SEVENZ_EXE in "$PROGRAMW6432/7-Zip/7z.exe" "$PROGRAMFILES/7-Zip/7z.exe" \
		"/c/Program Files/7-Zip/7z.exe"
do
	[ -x "$SEVENZ_EXE" ] && break
done


# Abort immediately if something goes wrong.
set -e

# White spaces in directory names may break things so catch them immediately.
case $(pwd) in
	' ' | '	' | '
') echo "Error: White space in the directory name" >&2; exit 1 ;;
esac

# This script can be run either at the top-level directory of the package
# or in the same directory containing this script.
if [ ! -f windows/build.bash ]; then
	cd ..
	if [ ! -f windows/build.bash ]; then
		echo "You are in a wrong directory." >&2
		exit 1
	fi
fi

# Run configure and copy the binaries to the given directory.
#
# The first argument is the directory where to copy the binaries.
# The rest of the arguments are passed to configure.
buildit()
{
	DESTDIR=$1
	BUILD=$2
	CFLAGS=$3

	# Clean up if it was already configured.
	[ -f Makefile ] && make distclean

	# Build the size-optimized binaries. Note that I don't want to
	# provide size-optimized liblzma (shared nor static), because
	# that isn't thread-safe now, and depending on bunch of things,
	# maybe it will never be on Windows (pthreads-win32 helps but
	# static liblzma might bit a bit tricky with it).
	./configure \
		--prefix= \
		--disable-nls \
		--disable-scripts \
		--disable-threads \
		--disable-shared \
		--enable-small \
		--build="$BUILD" \
		CFLAGS="$CFLAGS -Os"
	make check

	mkdir -pv "$DESTDIR"
	cp -v src/xzdec/{xz,lzma}dec.exe src/lzmainfo/lzmainfo.exe "$DESTDIR"

	make distclean

	# Build the normal speed-optimized binaries. Note that while
	# --disable-threads has been documented to make some things
	# thread-unsafe, it's not actually true with this combination
	# of configure flags in XZ Utils 5.0.x. Things can (and probably
	# will) change after 5.0.x, and this script will be updated too.
	./configure \
		--prefix= \
		--disable-nls \
		--disable-scripts \
		--disable-threads \
		--build="$BUILD" \
		CFLAGS="$CFLAGS -O2"
	make -C src/liblzma
	make -C src/xz LDFLAGS=-static
	make -C tests check

	cp -v src/xz/xz.exe src/liblzma/.libs/liblzma.a "$DESTDIR"
	cp -v src/liblzma/.libs/liblzma-*.dll "$DESTDIR/liblzma.dll"

	strip -v "$DESTDIR/"*.{exe,dll}
	strip -vg "$DESTDIR/"*.a
}

# Copy files and convert newlines from LF to CR+LF. Optinally add a suffix
# to the destination filename.
#
# The first argument is the destination directory. The second argument is
# the suffix to append to the filenames; use empty string if no extra suffix
# is wanted. The rest of the arguments are actual the filenames.
txtcp()
{
	DESTDIR=$1
	SUFFIX=$2
	shift 2
	for SRCFILE; do
		DESTFILE="$DESTDIR/${SRCFILE##*/}$SUFFIX"
		echo "Converting \`$SRCFILE' -> \`$DESTFILE'"
		u2d < "$SRCFILE" > "$DESTFILE"
	done
}

# FIXME: Make sure that we don't get i686 or i586 code from the runtime.
# Actually i586 would be fine, but i686 probably not if the idea is to
# support even Win95.
#
# FIXME: Using i486 in the configure triplet may be wrong.
if [ -d "$MINGW_W32_DIR" ]; then
	# 32-bit x86, Win95 or later, using MinGW-w32
	PATH=$MINGW_W32_DIR/bin:$MINGW_W32_DIR/i686-w64-mingw32/bin:$PATH \
			buildit \
			pkg/bin_i486 \
			i486-w64-mingw32 \
			'-march=i486 -mtune=generic'
elif [ -d "$MINGW_DIR" ]; then
	# 32-bit x86, Win95 or later, using MinGW
	PATH=$MINGW_DIR/bin:$PATH \
			buildit \
			pkg/bin_i486 \
			i486-pc-mingw32 \
			'-march=i486 -mtune=generic'
fi

if [ -d "$MINGW_W64_DIR" ]; then
	# 64-bit x86, WinXP or later, using MinGW-w64
	PATH=$MINGW_W64_DIR/bin:$MINGW_W64_DIR/x86_64-w64-mingw32/bin:$PATH \
			buildit \
			pkg/bin_x86-64 \
			x86_64-w64-mingw32 \
			'-march=x86-64 -mtune=generic'
fi

# Copy the headers, the .def file, and the docs.
# They are the same for all architectures and builds.
mkdir -pv pkg/{include/lzma,doc/{manuals,examples}}
txtcp pkg/include "" src/liblzma/api/lzma.h
txtcp pkg/include/lzma "" src/liblzma/api/lzma/*.h
txtcp pkg/doc "" src/liblzma/liblzma.def
txtcp pkg/doc .txt AUTHORS COPYING NEWS README THANKS TODO
txtcp pkg/doc "" doc/*.txt windows/README-Windows.txt
txtcp pkg/doc/manuals "" doc/man/txt/{xz,xzdec,lzmainfo}.txt
cp -v doc/man/pdf-*/{xz,xzdec,lzmainfo}-*.pdf pkg/doc/manuals
txtcp pkg/doc/examples "" doc/examples/*

if [ -f windows/COPYING-Windows.txt ]; then
	txtcp pkg/doc "" windows/COPYING-Windows.txt
fi

# Create the package. This requires 7z.exe from 7-Zip. If it wasn't found,
# this step is skipped and you have to zip it yourself.
VER=$(sh build-aux/version.sh)
cd pkg
if [ -x "$SEVENZ_EXE" ]; then
	"$SEVENZ_EXE" a -tzip ../xz-$VER-windows.zip *
	"$SEVENZ_EXE" a ../xz-$VER-windows.7z *
else
	echo
	echo "NOTE: 7z.exe was not found. xz-$VER-windows.zip"
	echo "      and xz-$VER-windows.7z were not created."
	echo "      You can create them yourself from the pkg directory."
fi

if [ ! -f ../windows/COPYING-Windows.txt ]; then
	echo
	echo "NOTE: windows/COPYING-Windows.txt doesn't exists."
	echo "      MinGW(-w64) runtime copyright information"
	echo "      is not included in the package."
fi

echo
echo "Build completed successfully."
echo