| #!/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= \ |
| --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. |
| ./configure \ |
| --prefix= \ |
| --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. 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. |
| # Or if we do, update the strings here to match the generated code. |
| # i686 has cmov which can help like maybe 1 % in performance but things |
| # like SSE don't help, so i486 isn't horrible for performance. |
| # |
| # 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 |
| # 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/{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 |