6b44b4a775
Now liblzma only uses "mythread" functions and types which are defined in mythread.h matching the desired threading method. Before Windows Vista, there is no direct equivalent to pthread condition variables. Since this package doesn't use pthread_cond_broadcast(), pre-Vista threading can still be kept quite simple. The pre-Vista code doesn't use anything that wasn't already available in Windows 95, so the binaries should run even on Windows 95 if someone happens to care.
199 lines
6.0 KiB
Bash
199 lines
6.0 KiB
Bash
#!/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
|