mirror of
https://git.tukaani.org/xz.git
synced 2025-12-23 22:08:45 +00:00
Support for the old MinGW was dropped. Only MinGW-w64 with GCC is supported now. The script now supports also cross-compilation from GNU/Linux (tests are not run). MSYS2 and also the old MSYS 1.0.11 work for building on Windows. The i686 and x86_64 toolchains must be in PATH to build both 32-bit and 64-bit versions. Parallel builds are done if "nproc" from GNU coreutils is available. MinGW-w64 runtime copyright information file was renamed from COPYING-Windows.txt to COPYING.MinGW-w64-runtime.txt which is the filename used by MinGW-w64 itself. Its existence is now mandatory, it's checked at the beginning of the script. The file TODO is no longer copied to the package.
236 lines
7.2 KiB
Bash
236 lines
7.2 KiB
Bash
#!/bin/bash
|
|
# SPDX-License-Identifier: 0BSD
|
|
|
|
###############################################################################
|
|
#
|
|
# This build a XZ Utils binary package using the GNU Autotools build system
|
|
#
|
|
# NOTE: This requires files that are generated as part of "make mydist".
|
|
# So if building from xz.git, create a distribution tarball first,
|
|
# extract it, and run this script from there.
|
|
#
|
|
# These were tested and known to work:
|
|
# - Cross-compilation with MinGW-w64 v10.0.0 and GCC 12.2.0 from
|
|
# GNU/Linux ("make check" will be skipped)
|
|
# - MSYS2 with MinGW-w64 and GCC
|
|
# - MSYS 1.0.11 (from 2009) with MinGW-w64 v11.0.0 and GCC 13.1.0
|
|
#
|
|
# Optionally, 7-Zip is used to create the final .zip and .7z packages.
|
|
# If the 7z tool is in PATH or if you have installed it in the default
|
|
# directory on Windows, this script should find it automatically.
|
|
#
|
|
# Before running this script, copy COPYING.MinGW-w64-runtime.txt to
|
|
# the 'windows' directory.
|
|
#
|
|
# NOTE: MinGW-w64 includes getopt_long(). The GNU getopt_long() (LGPLv2.1)
|
|
# included in XZ Utils isn't used when building with MinGW-w64.
|
|
#
|
|
###############################################################################
|
|
#
|
|
# Author: Lasse Collin
|
|
#
|
|
###############################################################################
|
|
|
|
# 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 "ERROR: You are in a wrong directory. This script" >&2
|
|
echo "can be run either at the top-level directory of" >&2
|
|
echo "the package or in the same directory containing" >&2
|
|
echo "this script." >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# COPYING.MinGW-w64-runtime.txt needs to be manually copied from MinGW-w64.
|
|
if [ ! -f windows/COPYING.MinGW-w64-runtime.txt ]; then
|
|
echo "ERROR: The file 'windows/COPYING.MinGW-w64-runtime.txt'" >&2
|
|
echo "doesn't exists. Copy it from MinGW-w64 so that the" >&2
|
|
echo "copyright and license notices of the MinGW-w64 runtime" >&2
|
|
echo "can be included in the package." >&2
|
|
echo "(Or create an empty file if only doing a test build.)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Number of jobs for "make":
|
|
MAKE_JOBS=$(nproc 2> /dev/null || echo 1)
|
|
|
|
# "make check" has to be skipped when cross-compiling.
|
|
if [ "x$(uname -o)" = xMsys ]; then
|
|
IS_NATIVE_BUILD=true
|
|
else
|
|
IS_NATIVE_BUILD=false
|
|
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
|
|
TRIPLET=$2
|
|
CFLAGS=$3
|
|
|
|
# In the MinGW-w64 + GCC toolchains running natively on Windows,
|
|
# $TRIPLET-windres and $TRIPLET-strip commands might not exist.
|
|
# Only the short names "windres" and "strip" might be available.
|
|
# If both i686 and x86_64 toolchains are in PATH, wrong windres.exe
|
|
# will be used for one of the builds, making the build fail. The
|
|
# workaround is to put the directory of $TRIPLET-gcc to the front
|
|
# of PATH if $TRIPLET-windres or $TRIPLET-strip is missing.
|
|
OLD_PATH=$PATH
|
|
if type -P "$TRIPLET-windres" > /dev/null \
|
|
&& type -P "$TRIPLET-strip" > /dev/null; then
|
|
STRIP=$TRIPLET-strip
|
|
else
|
|
STRIP=strip
|
|
GCC_DIR=$(type -P "$TRIPLET-gcc")
|
|
PATH=${GCC_DIR%/*}:$PATH
|
|
fi
|
|
|
|
# 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= \
|
|
--enable-silent-rules \
|
|
--disable-dependency-tracking \
|
|
--disable-nls \
|
|
--disable-scripts \
|
|
--disable-threads \
|
|
--disable-shared \
|
|
--enable-small \
|
|
--host="$TRIPLET" \
|
|
CFLAGS="$CFLAGS -Os"
|
|
make -j"$MAKE_JOBS"
|
|
|
|
if "$IS_NATIVE_BUILD"; then
|
|
make -j"$MAKE_JOBS" check
|
|
fi
|
|
|
|
mkdir -pv "$DESTDIR"
|
|
cp -v src/xzdec/{xz,lzma}dec.exe src/lzmainfo/lzmainfo.exe "$DESTDIR"
|
|
|
|
make distclean
|
|
|
|
# Build the normal speed-optimized binaries. The type of threading
|
|
# (win95 vs. vista) will be autodetect from the target architecture.
|
|
./configure \
|
|
--prefix= \
|
|
--enable-silent-rules \
|
|
--disable-dependency-tracking \
|
|
--disable-nls \
|
|
--disable-scripts \
|
|
--host="$TRIPLET" \
|
|
CFLAGS="$CFLAGS -O2"
|
|
make -j"$MAKE_JOBS" -C src/liblzma
|
|
make -j"$MAKE_JOBS" -C src/xz LDFLAGS=-static
|
|
|
|
if "$IS_NATIVE_BUILD"; then
|
|
make -j"$MAKE_JOBS" -C tests check
|
|
fi
|
|
|
|
cp -v src/xz/xz.exe "$DESTDIR"
|
|
cp -v src/liblzma/.libs/liblzma-5.dll "$DESTDIR/liblzma.dll"
|
|
"$STRIP" -v "$DESTDIR/"*.{exe,dll}
|
|
|
|
PATH=$OLD_PATH
|
|
}
|
|
|
|
# Copy files and convert newlines from LF to CR+LF. Optionally 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 the actual filenames.
|
|
txtcp()
|
|
{
|
|
DESTDIR=$1
|
|
SUFFIX=$2
|
|
shift 2
|
|
for SRCFILE; do
|
|
DESTFILE="$DESTDIR/${SRCFILE##*/}$SUFFIX"
|
|
echo "Converting '$SRCFILE' -> '$DESTFILE'"
|
|
sed s/\$/$'\r'/ < "$SRCFILE" > "$DESTFILE"
|
|
done
|
|
}
|
|
|
|
if type -P i686-w64-mingw32-gcc > /dev/null; then
|
|
# 32-bit x86, Win2k or later
|
|
buildit pkg/bin_i686 i686-w64-mingw32 \
|
|
'-march=i686 -mtune=generic'
|
|
|
|
# 32-bit x86 with SSE2, Win2k or later
|
|
buildit pkg/bin_i686-sse2 i686-w64-mingw32 \
|
|
'-march=i686 -msse2 -mtune=generic'
|
|
else
|
|
echo
|
|
echo "i686-w64-mingw32-gcc is not in PATH, skipping 32-bit x86 builds"
|
|
echo
|
|
fi
|
|
|
|
if type -P x86_64-w64-mingw32-gcc > /dev/null; then
|
|
# x86-64, Windows Vista or later
|
|
buildit pkg/bin_x86-64 x86_64-w64-mingw32 \
|
|
'-march=x86-64 -mtune=generic'
|
|
else
|
|
echo
|
|
echo "x86_64-w64-mingw32-gcc is not in PATH, skipping x86-64 build"
|
|
echo
|
|
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/{api,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
|
|
txtcp pkg/doc "" doc/*.txt windows/README-Windows.txt
|
|
txtcp pkg/doc "" windows/COPYING.MinGW-w64-runtime.txt
|
|
txtcp pkg/doc/manuals "" doc/man/txt/{xz,xzdec,lzmainfo}.txt
|
|
cp -v doc/man/pdf-*/{xz,xzdec,lzmainfo}-*.pdf pkg/doc/manuals
|
|
cp -v doc/api/* pkg/doc/api
|
|
txtcp pkg/doc/examples "" doc/examples/*
|
|
|
|
# Create the package. This requires 7z from 7-Zip.
|
|
# If it isn't found, this step is skipped.
|
|
for SEVENZ in "$(type -P 7z || true)" \
|
|
"$PROGRAMW6432/7-Zip/7z.exe" "$PROGRAMFILES/7-Zip/7z.exe" \
|
|
"/c/Program Files/7-Zip/7z.exe"
|
|
do
|
|
[ -x "$SEVENZ" ] && break
|
|
done
|
|
|
|
if [ -x "$SEVENZ" ]; then
|
|
VER=$(sh build-aux/version.sh)
|
|
cd pkg
|
|
"$SEVENZ" a -tzip ../xz-$VER-windows.zip *
|
|
"$SEVENZ" a ../xz-$VER-windows.7z *
|
|
else
|
|
echo
|
|
echo "NOTE: 7z 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
|