#!/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 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-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-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_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' elif [ -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' 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} 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 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 "" windows/README-Windows.txt # 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 echo echo "Build completed successfully." echo