diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2010-01-31 23:28:51 +0200 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2010-01-31 23:28:51 +0200 |
commit | 8884e16864ba53fb4b58623d7537d7ef30c28e11 (patch) | |
tree | 4b4b670641cfeb4eed71458fe743ef1d728c8677 /windows/build.sh | |
parent | Select the default integrity check type at runtime. (diff) | |
download | xz-8884e16864ba53fb4b58623d7537d7ef30c28e11.tar.xz |
Revise the Windows build files.
The old Makefile + config.h was deleted, because it
becomes outdated too easily and building with the
Autotools based build system works fine even on Windows.
windows/build.sh hasn't got much testing, but it should
work to build 32-bit x86 and x86-64 versions of XZ Utils
using MSYS, MinGW or MinGW-w32, and MinGW-w64.
windows/INSTALL-Windows.txt describes what packages are
needed and how to install them.
windows/README-Windows.txt is a readme file for the binary
package that build.sh hopefully builds.
There are no instructions about using Autotools for now,
so those using a git snapshot may want to run
"autoreconf -fi && ./configure && make mydist" on a UN*X
box and then copy the resulting .tar.gz to a Windows.
Diffstat (limited to '')
-rw-r--r-- | windows/build.sh | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/windows/build.sh b/windows/build.sh new file mode 100644 index 00000000..42ab85f2 --- /dev/null +++ b/windows/build.sh @@ -0,0 +1,189 @@ +#!/bin/sh +# +############################################################################### +# +# 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 immediatelly if something goes wrong. +set -e + +# White spaces in directory names may break things so catch them immediatelly. +case $(pwd) in + ' ' | ' ' | ' +') echo "Error: White space in the directory name" >&2; exit 1 ;; +esac + +# This sciprt can be run either at the top-level directory of the package +# or in the same directory containing this script. +if [ ! -f windows/build.sh ]; then + cd .. + if [ ! -f windows/build.sh ]; 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 \ + --enable-dynamic=no \ + --build="$BUILD" \ + CFLAGS="$CFLAGS -O2" + make 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/"* +} + +# 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 either 7z.exe from 7-Zip or zip.exe +# from Info-ZIP. If neither are found, this is skipped and you have to +# zip it yourself. 7-Zip tends to easily give the best compression ratio. +VER=$(sh 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 |