aboutsummaryrefslogtreecommitdiff
path: root/windows/build.bash
blob: e083fe7ce9ee8dc18a2c38dc3f05cd5147898630 (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
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
204
#!/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. Providing size-optimized liblzma
	# could be considered but I don't know if it should only use -Os or
	# should it also use --enable-small and if it should support
	# threading. So I don't include a size-optimized liblzma for now.
	./configure \
		--prefix= \
		--enable-silent-rules \
		--disable-dependency-tracking \
		--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. The type of threading
	# (win95 vs. vista) will be autodetect from the target architecture.
	./configure \
		--prefix= \
		--enable-silent-rules \
		--disable-dependency-tracking \
		--disable-nls \
		--disable-scripts \
		--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. Optionally 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
}

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_i686 \
			i686-w64-mingw32 \
			'-march=i686 -mtune=generic'
	# 32-bit x86 with SSE2, Win98 or later, using MinGW-w32
	PATH=$MINGW_W32_DIR/bin:$MINGW_W32_DIR/i686-w64-mingw32/bin:$PATH \
			buildit \
			pkg/bin_i686-sse2 \
			i686-w64-mingw32 \
			'-march=i686 -msse2 -mfpmath=sse -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
	# x86-64, Windows Vista 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/{api,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
cp -v doc/api/* pkg/doc/api
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