1
0
Fork 0
mirror of https://git.tukaani.org/xz.git synced 2024-04-04 12:36:23 +02:00
xz-archive/windows/build.bash
Lasse Collin 6b44b4a775 Add native threading support on Windows.
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.
2013-09-17 11:52:28 +03:00

198 lines
6 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