debian: Prepare for upload
[xz/debian.git] / windows / build.bash
blob4a6a28433097e5e32d08c07aad66447dda300114
1 #!/bin/bash
3 ###############################################################################
5 # Build a binary package on Windows with MinGW and MSYS
7 # Set the paths where MinGW, Mingw-w32, or MinGW-w64 are installed. If both
8 # MinGW and MinGW-w32 are specified, MinGW-w32 will be used. If there is no
9 # 32-bit or 64-bit compiler at all, it is simply skipped.
11 # Optionally, 7-Zip is used to create the final .zip and .7z packages.
12 # If you have installed it in the default directory, this script should
13 # find it automatically. Otherwise adjust the path manually.
15 # If you want to use a cross-compiler e.g. on GNU/Linux, this script won't
16 # work out of the box. You need to omit "make check" commands and replace
17 # u2d with some other tool to convert newlines from LF to CR+LF. You will
18 # also need to pass the --host option to configure.
20 ###############################################################################
22 # Author: Lasse Collin
24 # This file has been put into the public domain.
25 # You can do whatever you want with this file.
27 ###############################################################################
29 MINGW_DIR=/c/devel/tools/mingw
30 MINGW_W32_DIR=/c/devel/tools/mingw-w32
31 MINGW_W64_DIR=/c/devel/tools/mingw-w64
33 for SEVENZ_EXE in "$PROGRAMW6432/7-Zip/7z.exe" "$PROGRAMFILES/7-Zip/7z.exe" \
34 "/c/Program Files/7-Zip/7z.exe"
36 [ -x "$SEVENZ_EXE" ] && break
37 done
40 # Abort immediately if something goes wrong.
41 set -e
43 # White spaces in directory names may break things so catch them immediately.
44 case $(pwd) in
45 ' ' | ' ' | '
46 ') echo "Error: White space in the directory name" >&2; exit 1 ;;
47 esac
49 # This script can be run either at the top-level directory of the package
50 # or in the same directory containing this script.
51 if [ ! -f windows/build.bash ]; then
52 cd ..
53 if [ ! -f windows/build.bash ]; then
54 echo "You are in a wrong directory." >&2
55 exit 1
59 # Run configure and copy the binaries to the given directory.
61 # The first argument is the directory where to copy the binaries.
62 # The rest of the arguments are passed to configure.
63 buildit()
65 DESTDIR=$1
66 BUILD=$2
67 CFLAGS=$3
69 # Clean up if it was already configured.
70 [ -f Makefile ] && make distclean
72 # Build the size-optimized binaries. Providing size-optimized liblzma
73 # could be considered but I don't know if it should only use -Os or
74 # should it also use --enable-small and if it should support
75 # threading. So I don't include a size-optimized liblzma for now.
76 ./configure \
77 --prefix= \
78 --enable-silent-rules \
79 --disable-dependency-tracking \
80 --disable-nls \
81 --disable-scripts \
82 --disable-threads \
83 --disable-shared \
84 --enable-small \
85 --build="$BUILD" \
86 CFLAGS="$CFLAGS -Os"
87 make check
89 mkdir -pv "$DESTDIR"
90 cp -v src/xzdec/{xz,lzma}dec.exe src/lzmainfo/lzmainfo.exe "$DESTDIR"
92 make distclean
94 # Build the normal speed-optimized binaries. The type of threading
95 # (win95 vs. vista) will be autodetect from the target architecture.
96 ./configure \
97 --prefix= \
98 --enable-silent-rules \
99 --disable-dependency-tracking \
100 --disable-nls \
101 --disable-scripts \
102 --build="$BUILD" \
103 CFLAGS="$CFLAGS -O2"
104 make -C src/liblzma
105 make -C src/xz LDFLAGS=-static
106 make -C tests check
108 cp -v src/xz/xz.exe src/liblzma/.libs/liblzma.a "$DESTDIR"
109 cp -v src/liblzma/.libs/liblzma-*.dll "$DESTDIR/liblzma.dll"
111 strip -v "$DESTDIR/"*.{exe,dll}
112 strip -vg "$DESTDIR/"*.a
115 # Copy files and convert newlines from LF to CR+LF. Optinally add a suffix
116 # to the destination filename.
118 # The first argument is the destination directory. The second argument is
119 # the suffix to append to the filenames; use empty string if no extra suffix
120 # is wanted. The rest of the arguments are actual the filenames.
121 txtcp()
123 DESTDIR=$1
124 SUFFIX=$2
125 shift 2
126 for SRCFILE; do
127 DESTFILE="$DESTDIR/${SRCFILE##*/}$SUFFIX"
128 echo "Converting \`$SRCFILE' -> \`$DESTFILE'"
129 u2d < "$SRCFILE" > "$DESTFILE"
130 done
133 if [ -d "$MINGW_W32_DIR" ]; then
134 # 32-bit x86, Win95 or later, using MinGW-w32
135 PATH=$MINGW_W32_DIR/bin:$MINGW_W32_DIR/i686-w64-mingw32/bin:$PATH \
136 buildit \
137 pkg/bin_i686 \
138 i686-w64-mingw32 \
139 '-march=i686 -mtune=generic'
140 # 32-bit x86 with SSE2, Win98 or later, using MinGW-w32
141 PATH=$MINGW_W32_DIR/bin:$MINGW_W32_DIR/i686-w64-mingw32/bin:$PATH \
142 buildit \
143 pkg/bin_i686-sse2 \
144 i686-w64-mingw32 \
145 '-march=i686 -msse2 -mfpmath=sse -mtune=generic'
146 elif [ -d "$MINGW_DIR" ]; then
147 # 32-bit x86, Win95 or later, using MinGW
148 PATH=$MINGW_DIR/bin:$PATH \
149 buildit \
150 pkg/bin_i486 \
151 i486-pc-mingw32 \
152 '-march=i486 -mtune=generic'
155 if [ -d "$MINGW_W64_DIR" ]; then
156 # x86-64, Windows Vista or later, using MinGW-w64
157 PATH=$MINGW_W64_DIR/bin:$MINGW_W64_DIR/x86_64-w64-mingw32/bin:$PATH \
158 buildit \
159 pkg/bin_x86-64 \
160 x86_64-w64-mingw32 \
161 '-march=x86-64 -mtune=generic'
164 # Copy the headers, the .def file, and the docs.
165 # They are the same for all architectures and builds.
166 mkdir -pv pkg/{include/lzma,doc/{manuals,examples}}
167 txtcp pkg/include "" src/liblzma/api/lzma.h
168 txtcp pkg/include/lzma "" src/liblzma/api/lzma/*.h
169 txtcp pkg/doc "" src/liblzma/liblzma.def
170 txtcp pkg/doc .txt AUTHORS COPYING NEWS README THANKS TODO
171 txtcp pkg/doc "" doc/*.txt windows/README-Windows.txt
172 txtcp pkg/doc/manuals "" doc/man/txt/{xz,xzdec,lzmainfo}.txt
173 cp -v doc/man/pdf-*/{xz,xzdec,lzmainfo}-*.pdf pkg/doc/manuals
174 txtcp pkg/doc/examples "" doc/examples/*
176 if [ -f windows/COPYING-Windows.txt ]; then
177 txtcp pkg/doc "" windows/COPYING-Windows.txt
180 # Create the package. This requires 7z.exe from 7-Zip. If it wasn't found,
181 # this step is skipped and you have to zip it yourself.
182 VER=$(sh build-aux/version.sh)
183 cd pkg
184 if [ -x "$SEVENZ_EXE" ]; then
185 "$SEVENZ_EXE" a -tzip ../xz-$VER-windows.zip *
186 "$SEVENZ_EXE" a ../xz-$VER-windows.7z *
187 else
188 echo
189 echo "NOTE: 7z.exe was not found. xz-$VER-windows.zip"
190 echo " and xz-$VER-windows.7z were not created."
191 echo " You can create them yourself from the pkg directory."
194 if [ ! -f ../windows/COPYING-Windows.txt ]; then
195 echo
196 echo "NOTE: windows/COPYING-Windows.txt doesn't exists."
197 echo " MinGW(-w64) runtime copyright information"
198 echo " is not included in the package."
201 echo
202 echo "Build completed successfully."
203 echo