| #!/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 |