mirror of
https://git.tukaani.org/xz.git
synced 2025-12-27 07:48:44 +00:00
Compare commits
No commits in common. "master" and "v4.999.5alpha" have entirely different histories.
master
...
v4.999.5al
30
.codespellrc
30
.codespellrc
@ -1,30 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
[codespell]
|
|
||||||
|
|
||||||
# Skip all translation files and a few other autogenerated files.
|
|
||||||
# The autotool files should have their typos fixed in the upstream, but
|
|
||||||
# until then we will blacklist them here.
|
|
||||||
# THANKS contains names, some do trigger codespell.
|
|
||||||
skip = *.po,*.pot,./po4a/man,./doc/api,./configure,./autom4te.cache,./m4/libtool.m4,./build-aux/depcomp,./build-aux/ltmain.sh,./build-aux/config.guess,./build-aux/config.rpath,./m4/po.m4,./build-aux/config.sub,THANKS
|
|
||||||
|
|
||||||
# Ignore false positive matching words. Ideally codespell would allow
|
|
||||||
# ignoring words for specific files, but that does not appear to be
|
|
||||||
# supported. Instead we need to hope we do not make these typos.
|
|
||||||
# Additionally, the ignored words must be specified lower-case even though
|
|
||||||
# some of the false positives only occurred upper-case.
|
|
||||||
# ANS - used as a variable name in xzmore.in.
|
|
||||||
# bu - groff syntax for creating a bullet list item, used in xz.1.
|
|
||||||
# te - groff syntax, used in xz.1.
|
|
||||||
# caf - command line options for tar example, used in xz.1.
|
|
||||||
ignore-words-list = ans,bu,te,caf
|
|
||||||
|
|
||||||
# Add extra dictionaries to help improvement comments, docs, etc.
|
|
||||||
builtin = clear,rare,informal,usage,names
|
|
||||||
|
|
||||||
# Always default to highest interactive level to avoid accidentally
|
|
||||||
# changing a false positive or picking the wrong replacement.
|
|
||||||
interactive = 3
|
|
||||||
|
|
||||||
# Ignore a URL with debbugs.
|
|
||||||
ignore-regex = \bhttps://debbugs\.gnu\.org\b
|
|
||||||
8
.gitattributes
vendored
8
.gitattributes
vendored
@ -1,8 +0,0 @@
|
|||||||
.gitattributes export-ignore
|
|
||||||
.gitignore export-ignore
|
|
||||||
|
|
||||||
/.codespellrc export-ignore
|
|
||||||
/.github export-ignore
|
|
||||||
|
|
||||||
/build-aux/ci_build.bash export-ignore
|
|
||||||
/doc/SHA256SUMS export-ignore
|
|
||||||
171
.github/workflows/ci.yml
vendored
171
.github/workflows/ci.yml
vendored
@ -1,171 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Author: Jia Tan
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
# Triggers the workflow on push or pull request events but only for the master branch
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
# Allows running workflow manually
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
POSIX:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest]
|
|
||||||
build_system: [autotools, cmake]
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
timeout-minutes: 20
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
########################
|
|
||||||
# Install Dependencies #
|
|
||||||
########################
|
|
||||||
|
|
||||||
# Install Autotools on Linux
|
|
||||||
- name: Install Dependencies
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') && matrix.build_system == 'autotools' }}
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y autoconf automake build-essential po4a autopoint doxygen musl-tools valgrind
|
|
||||||
|
|
||||||
- name: Install Dependencies
|
|
||||||
if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
|
|
||||||
run: |
|
|
||||||
sudo apt-get install -y gcc-multilib
|
|
||||||
|
|
||||||
# Install Autotools on Mac
|
|
||||||
- name: Install Dependencies
|
|
||||||
if: ${{ matrix.os == 'macos-latest' && matrix.build_system == 'autotools' }}
|
|
||||||
run: brew install autoconf automake libtool po4a doxygen
|
|
||||||
|
|
||||||
# Install CMake on Linux
|
|
||||||
- name: Install Dependencies
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') && matrix.build_system == 'cmake' }}
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y build-essential cmake gettext doxygen musl-tools
|
|
||||||
|
|
||||||
# Install CMake on Mac
|
|
||||||
- name: Install Dependencies
|
|
||||||
if: ${{ matrix.os == 'macos-latest' && matrix.build_system == 'cmake' }}
|
|
||||||
run: brew install cmake gettext doxygen
|
|
||||||
|
|
||||||
##################
|
|
||||||
# Build and Test #
|
|
||||||
##################
|
|
||||||
|
|
||||||
# -b specifies the build system to use.
|
|
||||||
# -p specifies the phase (build or test) to help narrow down an error
|
|
||||||
# if one occurs.
|
|
||||||
#
|
|
||||||
# The first two builds/tests are only run on Autotools Linux and
|
|
||||||
# affect the CFLAGS. Resetting the CFLAGS requires clearing the
|
|
||||||
# config cache between runs, so the tests that require CFLAGS are
|
|
||||||
# done first.
|
|
||||||
- name: Build 32-bit
|
|
||||||
if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
|
|
||||||
run: ./build-aux/ci_build.bash -b autotools -p build -m "gcc -m32"
|
|
||||||
- name: Test 32-bit
|
|
||||||
if: ${{ matrix.os == 'ubuntu-latest' && matrix.build_system == 'autotools' }}
|
|
||||||
run: |
|
|
||||||
./build-aux/ci_build.bash -b autotools -p test -m "gcc -m32" -n 32_bit
|
|
||||||
cd ../xz_build && make distclean
|
|
||||||
|
|
||||||
# The sandbox must be disabled because it will prevent access to
|
|
||||||
# the /proc/ filesystem on Linux, which is used by the sanitizer's
|
|
||||||
# instrumentation.
|
|
||||||
- name: Build with -fsanitize=address,undefined
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') && matrix.build_system == 'autotools' }}
|
|
||||||
run: ./build-aux/ci_build.bash -b autotools -p build -f "-fsanitize=address,undefined" -d sandbox
|
|
||||||
- name: Test with -fsanitize=address,undefined
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') && matrix.build_system == 'autotools' }}
|
|
||||||
run: |
|
|
||||||
export UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1
|
|
||||||
./build-aux/ci_build.bash -b autotools -p test -f "-fsanitize=address,undefined" -d sandbox
|
|
||||||
cd ../xz_build && make distclean
|
|
||||||
|
|
||||||
- name: Build with Valgrind
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') && matrix.build_system == 'autotools' }}
|
|
||||||
run: ./build-aux/ci_build.bash -b autotools -p build -d shared,sandbox
|
|
||||||
- name: Test with Valgrind
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') && matrix.build_system == 'autotools' }}
|
|
||||||
run: |
|
|
||||||
./build-aux/ci_build.bash -b autotools -p test -d sandbox -w "valgrind --quiet --trace-children=yes --trace-children-skip=*/cmp,*/cp,*/diff,*/grep,*/rm,*/sed --exit-on-first-error=yes --error-exitcode=1"
|
|
||||||
cd ../xz_build && make distclean
|
|
||||||
|
|
||||||
- name: Build with musl libc
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') }}
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -p build -m "/usr/bin/musl-gcc"
|
|
||||||
- name: Test with musl libc
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') }}
|
|
||||||
run: |
|
|
||||||
./build-aux/ci_build.bash -b ${{ matrix.build_system }} -p test -m "/usr/bin/musl-gcc"
|
|
||||||
- name: Clean up musl libc run
|
|
||||||
if: ${{ startsWith(matrix.os, 'ubuntu') && matrix.build_system == 'autotools' }}
|
|
||||||
run: cd ../xz_build && make distclean
|
|
||||||
|
|
||||||
- name: Build with full features
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -p build
|
|
||||||
- name: Test with full features
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -p test -n full_features
|
|
||||||
|
|
||||||
- name: Build without encoders
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d encoders,shared -p build
|
|
||||||
- name: Test without encoders
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d encoders,shared -p test -n no_encoders
|
|
||||||
|
|
||||||
- name: Build without decoders
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d decoders,shared -p build
|
|
||||||
- name: Test without decoders
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d decoders,shared -p test -n no_decoders
|
|
||||||
|
|
||||||
- name: Build without threads
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d threads,shared -p build
|
|
||||||
- name: Test without threads
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d threads,shared -p test -n no_threads
|
|
||||||
|
|
||||||
- name: Build without BCJ filters
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d bcj,shared,nls -p build
|
|
||||||
- name: Test without BCJ filters
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d bcj,shared,nls -p test -n no_bcj
|
|
||||||
|
|
||||||
- name: Build without Delta filters
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d delta,shared,nls -p build
|
|
||||||
- name: Test without Delta filters
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d delta,shared,nls -p test -n no_delta
|
|
||||||
|
|
||||||
- name: Build without sha256 check
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -c crc32,crc64 -d shared,nls -p build
|
|
||||||
- name: Test without sha256 check
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -c crc32,crc64 -d shared,nls -p test -n no_sha256
|
|
||||||
|
|
||||||
- name: Build without crc64 check
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -c crc32,sha256 -d shared,nls -p build
|
|
||||||
- name: Test without crc64 check
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -c crc32,sha256 -d shared,nls -p test -n no_crc64
|
|
||||||
|
|
||||||
- name: Build small
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d small -p build
|
|
||||||
- name: Test small
|
|
||||||
run: ./build-aux/ci_build.bash -b ${{ matrix.build_system }} -d small -p test -n small
|
|
||||||
|
|
||||||
# Attempt to upload the test logs as artifacts if any step has failed
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
if: ${{ failure() }}
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.os }} ${{ matrix.build_system }} Test Logs
|
|
||||||
path: build-aux/artifacts
|
|
||||||
55
.github/workflows/cifuzz.yml
vendored
55
.github/workflows/cifuzz.yml
vendored
@ -1,55 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
# Authors: Sam James
|
|
||||||
# Lasse Collin
|
|
||||||
#
|
|
||||||
# This was written based on the OSS-Fuzz docs:
|
|
||||||
# https://google.github.io/oss-fuzz/getting-started/continuous-integration/
|
|
||||||
|
|
||||||
name: CIFuzz
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
CIFuzz:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 30
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
sanitizer: [ address, undefined, memory ]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Build Fuzzers (${{ matrix.sanitizer }})
|
|
||||||
id: build
|
|
||||||
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
|
|
||||||
with:
|
|
||||||
oss-fuzz-project-name: 'xz'
|
|
||||||
# The language must match the one in project.yaml in OSS-Fuzz:
|
|
||||||
# https://github.com/google/oss-fuzz/blob/master/projects/xz/project.yaml
|
|
||||||
# Thus, use C++ even though there are no C++ files in XZ Utils.
|
|
||||||
language: c++
|
|
||||||
sanitizer: ${{ matrix.sanitizer }}
|
|
||||||
|
|
||||||
- name: Run Fuzzers (${{ matrix.sanitizer }})
|
|
||||||
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
|
|
||||||
with:
|
|
||||||
oss-fuzz-project-name: 'xz'
|
|
||||||
language: c++
|
|
||||||
sanitizer: ${{ matrix.sanitizer }}
|
|
||||||
fuzz-seconds: 600
|
|
||||||
report-timeouts: true
|
|
||||||
report-ooms: true
|
|
||||||
|
|
||||||
- name: Upload Crash
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
if: failure() && steps.build.outcome == 'success'
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.sanitizer }}-artifacts
|
|
||||||
path: ./out/artifacts
|
|
||||||
38
.github/workflows/coverity.yml
vendored
38
.github/workflows/coverity.yml
vendored
@ -1,38 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
name: Coverity Scan
|
|
||||||
|
|
||||||
# We only want to test a special branch, per
|
|
||||||
# https://docs.travis-ci.com/user/coverity-scan/#build-submission-frequency
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [coverity_scan]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
coverity:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -q
|
|
||||||
sudo apt-get install -qy autoconf automake build-essential autopoint gcc-multilib
|
|
||||||
|
|
||||||
- name: Run autogen.sh
|
|
||||||
run: ./autogen.sh --no-po4a
|
|
||||||
|
|
||||||
- name: Run configure
|
|
||||||
run: ./configure --enable-debug --disable-silent-rules
|
|
||||||
|
|
||||||
# Coverity doesn't understand what the inline asm does,
|
|
||||||
# which results in false positives.
|
|
||||||
- name: Disable complex inline assembly code
|
|
||||||
run: echo '#define LZMA_RANGE_DECODER_CONFIG 0' >> config.h
|
|
||||||
|
|
||||||
- name: Coverity Scan
|
|
||||||
uses: vapier/coverity-scan-action@2068473c7bdf8c2fb984a6a40ae76ee7facd7a85 # v1.8.0
|
|
||||||
with:
|
|
||||||
command: make -Oline -j$(nproc)
|
|
||||||
email: ${{ secrets.COVERITY_SCAN_EMAIL }}
|
|
||||||
token: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
|
||||||
40
.github/workflows/dragonflybsd.yml
vendored
40
.github/workflows/dragonflybsd.yml
vendored
@ -1,40 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
name: DragonFly BSD
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
DragonflyBSD:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 10
|
|
||||||
name: DragonFly BSD
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Test in DragonFly BSD
|
|
||||||
id: test
|
|
||||||
uses: vmactions/dragonflybsd-vm@4ffb90652b45abc8156f89ede453c85f7ea257bb #v1.1.4
|
|
||||||
with:
|
|
||||||
usesh: true
|
|
||||||
prepare: >
|
|
||||||
pkg install -y
|
|
||||||
autoconf
|
|
||||||
automake
|
|
||||||
gettext-tools
|
|
||||||
libtool
|
|
||||||
m4
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
uname -a
|
|
||||||
./autogen.sh --no-po4a
|
|
||||||
# Innocent putc() triggers strict-overflow warnings.
|
|
||||||
./configure --disable-static --enable-debug --enable-werror CFLAGS='-g -O2 -pipe -Wno-error=strict-overflow'
|
|
||||||
make -j4 check
|
|
||||||
58
.github/workflows/freebsd.yml
vendored
58
.github/workflows/freebsd.yml
vendored
@ -1,58 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
name: FreeBSD
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
FreeBSD:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- host: ubuntu-latest
|
|
||||||
version: 12.4
|
|
||||||
arch: x86_64
|
|
||||||
- host: ubuntu-latest
|
|
||||||
version: 15.0
|
|
||||||
arch: x86_64
|
|
||||||
# NOTE: Comment in the repo says that aarch64 VM is faster
|
|
||||||
# on x86_64 host compared to ubuntu-24.04-arm.
|
|
||||||
# - host: ubuntu-24.04-arm
|
|
||||||
# version: 15.0
|
|
||||||
# arch: aarch64
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.host }}
|
|
||||||
timeout-minutes: 10
|
|
||||||
|
|
||||||
name: FreeBSD
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Test in FreeBSD
|
|
||||||
uses: vmactions/freebsd-vm@670398e4236735b8b65805c3da44b7a511fb8b27 #v1.3.0
|
|
||||||
with:
|
|
||||||
release: ${{ matrix.release }}
|
|
||||||
arch: ${{ matrix.arch }}
|
|
||||||
usesh: true
|
|
||||||
prepare: >
|
|
||||||
pkg install -y
|
|
||||||
autoconf
|
|
||||||
automake
|
|
||||||
gettext-tools
|
|
||||||
libtool
|
|
||||||
m4
|
|
||||||
po4a
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
uname -a
|
|
||||||
./autogen.sh
|
|
||||||
./configure --disable-static --enable-debug --enable-werror
|
|
||||||
make -j4 check
|
|
||||||
138
.github/workflows/msvc.yml
vendored
138
.github/workflows/msvc.yml
vendored
@ -1,138 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
# Author: Lasse Collin
|
|
||||||
|
|
||||||
name: Windows-MSVC
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
MSVC:
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os: [ windows-latest ]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
timeout-minutes: 10
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure Win32
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
-A Win32
|
|
||||||
-B build-msvc-win32
|
|
||||||
|
|
||||||
- name: Build Win32 Debug
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
--build build-msvc-win32
|
|
||||||
--config Debug
|
|
||||||
|
|
||||||
- name: Test Win32 Debug
|
|
||||||
run: >
|
|
||||||
ctest
|
|
||||||
--test-dir build-msvc-win32
|
|
||||||
--build-config Debug
|
|
||||||
--output-on-failure
|
|
||||||
|
|
||||||
- name: Build Win32 Release
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
--build build-msvc-win32
|
|
||||||
--config Release
|
|
||||||
|
|
||||||
# This fails with VS 2019 without b5a5d9e3f702.
|
|
||||||
- name: Test Win32 Release
|
|
||||||
run: >
|
|
||||||
ctest
|
|
||||||
--test-dir build-msvc-win32
|
|
||||||
--build-config Release
|
|
||||||
--output-on-failure
|
|
||||||
|
|
||||||
- name: Configure x64
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
-A x64
|
|
||||||
-B build-msvc-x64
|
|
||||||
|
|
||||||
- name: Build x64 Debug
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
--build build-msvc-x64
|
|
||||||
--config Debug
|
|
||||||
|
|
||||||
- name: Test x64 Debug
|
|
||||||
run: >
|
|
||||||
ctest
|
|
||||||
--test-dir build-msvc-x64
|
|
||||||
--build-config Debug
|
|
||||||
--output-on-failure
|
|
||||||
|
|
||||||
- name: Build x64 Release
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
--build build-msvc-x64
|
|
||||||
--config Release
|
|
||||||
|
|
||||||
- name: Test x64 Release
|
|
||||||
run: >
|
|
||||||
ctest
|
|
||||||
--test-dir build-msvc-x64
|
|
||||||
--build-config Release
|
|
||||||
--output-on-failure
|
|
||||||
|
|
||||||
- name: Configure ClangCL x64
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
-T ClangCL
|
|
||||||
-A x64
|
|
||||||
-B build-clangcl-x64
|
|
||||||
-DCMAKE_C_FLAGS="
|
|
||||||
-Wno-cast-align
|
|
||||||
-Wno-cast-qual
|
|
||||||
-Wno-covered-switch-default
|
|
||||||
-Wno-declaration-after-statement
|
|
||||||
-Wno-deprecated-declarations
|
|
||||||
-Wno-disabled-macro-expansion
|
|
||||||
-Wno-nonportable-system-include-path
|
|
||||||
-Wno-overlength-strings
|
|
||||||
-Wno-pre-c11-compat
|
|
||||||
-Wno-reserved-identifier
|
|
||||||
-Wno-unsafe-buffer-usage
|
|
||||||
-Wno-used-but-marked-unused"
|
|
||||||
|
|
||||||
- name: Build ClangCL x64 Debug
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
--build build-clangcl-x64
|
|
||||||
--config Debug
|
|
||||||
|
|
||||||
- name: Test ClangCL x64 Debug
|
|
||||||
run: >
|
|
||||||
ctest
|
|
||||||
--test-dir build-clangcl-x64
|
|
||||||
--build-config Debug
|
|
||||||
--output-on-failure
|
|
||||||
|
|
||||||
- name: Build ClangCL x64 Release
|
|
||||||
run: >
|
|
||||||
cmake
|
|
||||||
--build build-clangcl-x64
|
|
||||||
--config Release
|
|
||||||
|
|
||||||
- name: Test ClangCL x64 Release
|
|
||||||
run: >
|
|
||||||
ctest
|
|
||||||
--test-dir build-clangcl-x64
|
|
||||||
--build-config Release
|
|
||||||
--output-on-failure
|
|
||||||
148
.github/workflows/msys2.yml
vendored
148
.github/workflows/msys2.yml
vendored
@ -1,148 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Authors: Jia Tan
|
|
||||||
# Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
name: Windows-MSYS2
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
MSYS2:
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
runner: [ windows-latest ]
|
|
||||||
sys: [ mingw32, ucrt64, clang64, msys ]
|
|
||||||
include:
|
|
||||||
- runner: windows-11-arm
|
|
||||||
sys: clangarm64
|
|
||||||
|
|
||||||
# Set the shell to be msys2 as a default to avoid setting it for
|
|
||||||
# every individual run command.
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: msys2 {0}
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
timeout-minutes: 20
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Setup MSYS2
|
|
||||||
if: ${{ matrix.sys == 'msys' }}
|
|
||||||
uses: msys2/setup-msys2@fb197b72ce45fb24f17bf3f807a388985654d1f2 # v2.29.0
|
|
||||||
with:
|
|
||||||
msystem: ${{ matrix.sys }}
|
|
||||||
update: true
|
|
||||||
install: >
|
|
||||||
make
|
|
||||||
ninja
|
|
||||||
autotools
|
|
||||||
cmake
|
|
||||||
base-devel
|
|
||||||
gettext-devel
|
|
||||||
gcc
|
|
||||||
|
|
||||||
- name: Setup MSYS2
|
|
||||||
if: ${{ matrix.sys != 'msys' }}
|
|
||||||
uses: msys2/setup-msys2@fb197b72ce45fb24f17bf3f807a388985654d1f2 # v2.29.0
|
|
||||||
with:
|
|
||||||
msystem: ${{ matrix.sys }}
|
|
||||||
update: true
|
|
||||||
pacboy: >
|
|
||||||
make:p
|
|
||||||
ninja:p
|
|
||||||
autotools:p
|
|
||||||
cmake:p
|
|
||||||
toolchain:p
|
|
||||||
gettext:p
|
|
||||||
|
|
||||||
- name: Git configuration
|
|
||||||
# Need to explicitly set the shell here since we set the default
|
|
||||||
# shell as msys2 earlier. This avoids an extra msys2 dependency on
|
|
||||||
# git.
|
|
||||||
shell: powershell
|
|
||||||
# Avoid Windows line endings. Otherwise test_scripts.sh will fail
|
|
||||||
# because the expected output is stored in the test framework as a
|
|
||||||
# text file and will not match the output from xzgrep.
|
|
||||||
run: git config --global core.autocrlf false
|
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: CMake (full, shared)
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
cmake -G Ninja -B b-cmake-full \
|
|
||||||
-DBUILD_SHARED_LIBS=ON \
|
|
||||||
-DCMAKE_C_FLAGS='-UNDEBUG -g -O2 -pipe' \
|
|
||||||
-DCMAKE_COMPILE_WARNING_AS_ERROR=ON \
|
|
||||||
${{ startsWith(matrix.sys, 'mingw') && '-DXZ_NLS=OFF' || '' }}
|
|
||||||
ninja -C b-cmake-full
|
|
||||||
ctest --test-dir b-cmake-full --output-on-failure
|
|
||||||
|
|
||||||
- name: CMake (small, static)
|
|
||||||
if: ${{ matrix.runner == 'windows-latest' }}
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
cmake -G Ninja -B b-cmake-small \
|
|
||||||
-DBUILD_SHARED_LIBS=OFF \
|
|
||||||
-DCMAKE_C_FLAGS='-UNDEBUG -g -Os -pipe' \
|
|
||||||
-DCMAKE_COMPILE_WARNING_AS_ERROR=ON \
|
|
||||||
-DXZ_SMALL=ON \
|
|
||||||
-DXZ_THREADS=no \
|
|
||||||
-DXZ_NLS=OFF
|
|
||||||
ninja -C b-cmake-small
|
|
||||||
ctest --test-dir b-cmake-small --output-on-failure
|
|
||||||
|
|
||||||
- name: autogen.sh
|
|
||||||
run: ./autogen.sh --no-po4a
|
|
||||||
|
|
||||||
- name: Autotools (full, shared)
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
mkdir b-autotools-full
|
|
||||||
cd b-autotools-full
|
|
||||||
../configure \
|
|
||||||
--enable-debug \
|
|
||||||
--enable-werror \
|
|
||||||
--disable-static \
|
|
||||||
${{ startsWith(matrix.sys, 'mingw') && '--disable-nls' || '' }}
|
|
||||||
make -j"$(nproc)" check
|
|
||||||
|
|
||||||
- name: Autotools (small, static)
|
|
||||||
if: ${{ matrix.runner == 'windows-latest' }}
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
mkdir b-autotools-small
|
|
||||||
cd b-autotools-small
|
|
||||||
../configure \
|
|
||||||
--enable-debug \
|
|
||||||
--enable-werror \
|
|
||||||
--disable-shared \
|
|
||||||
--enable-small \
|
|
||||||
--disable-threads \
|
|
||||||
--disable-nls \
|
|
||||||
CFLAGS='-g -Os'
|
|
||||||
make -j"$(nproc)" check
|
|
||||||
|
|
||||||
# Upload the test logs as artifacts if any step has failed.
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
if: failure()
|
|
||||||
with:
|
|
||||||
name: test-logs-${{ matrix.sys }}
|
|
||||||
path: |
|
|
||||||
b-cmake-*/Testing/Temporary/
|
|
||||||
b-cmake-*/test_*/
|
|
||||||
b-autotools-*/tests/*.log
|
|
||||||
b-autotools-*/tests/*output
|
|
||||||
40
.github/workflows/netbsd.yml
vendored
40
.github/workflows/netbsd.yml
vendored
@ -1,40 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
name: NetBSD
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
NetBSD:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 10
|
|
||||||
name: NetBSD
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Test in NetBSD
|
|
||||||
id: test
|
|
||||||
uses: vmactions/netbsd-vm@b24ed5f7a605362ab1226e73df291c8b01990c85 #v1.2.3
|
|
||||||
with:
|
|
||||||
usesh: true
|
|
||||||
prepare: >
|
|
||||||
/usr/sbin/pkg_add -v
|
|
||||||
cmake
|
|
||||||
gettext-tools
|
|
||||||
ninja-build
|
|
||||||
po4a
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
uname -a
|
|
||||||
./po4a/update-po
|
|
||||||
# Innocent putc() triggers strict-overflow warnings.
|
|
||||||
cmake -G Ninja -B build -DBUILD_SHARED_LIBS=ON -DCMAKE_C_FLAGS='-UNDEBUG -g -O2 -pipe -Wno-error=strict-overflow' -DCMAKE_COMPILE_WARNING_AS_ERROR=ON
|
|
||||||
ninja -C build
|
|
||||||
ctest --test-dir build --output-on-failure
|
|
||||||
40
.github/workflows/openbsd.yml
vendored
40
.github/workflows/openbsd.yml
vendored
@ -1,40 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
name: OpenBSD
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
OpenBSD:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 10
|
|
||||||
name: OpenBSD
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Test in OpenBSD
|
|
||||||
uses: vmactions/openbsd-vm@2e29de1eb150dfe1c9c97b84ff2b7896f14ca690 #v1.2.5
|
|
||||||
with:
|
|
||||||
usesh: true
|
|
||||||
prepare: >
|
|
||||||
/usr/sbin/pkg_add -I -v
|
|
||||||
autoconf-2.72p0
|
|
||||||
automake-1.17
|
|
||||||
gettext-tools
|
|
||||||
libtool
|
|
||||||
m4
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
export AUTOCONF_VERSION=2.72
|
|
||||||
export AUTOMAKE_VERSION=1.17
|
|
||||||
uname -a
|
|
||||||
./autogen.sh --no-po4a
|
|
||||||
./configure --disable-static --enable-debug --enable-werror --disable-nls --enable-external-sha256
|
|
||||||
make -j4 check
|
|
||||||
34
.github/workflows/solaris.yml
vendored
34
.github/workflows/solaris.yml
vendored
@ -1,34 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
name: Solaris
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
Solaris:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 10
|
|
||||||
name: Solaris
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Test in Solaris
|
|
||||||
uses: vmactions/solaris-vm@47bea106d03acaf91084e52548ee460556011602 #v1.1.8
|
|
||||||
with:
|
|
||||||
release: 11.4-gcc
|
|
||||||
usesh: true
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
uname -a
|
|
||||||
# /usr/xpg4/bin isn't in PATH by default.
|
|
||||||
echo "Environment variable PATH: $PATH"
|
|
||||||
./autogen.sh --no-po4a
|
|
||||||
./configure --disable-static --enable-debug --enable-werror
|
|
||||||
make check
|
|
||||||
113
.gitignore
vendored
113
.gitignore
vendored
@ -1,113 +0,0 @@
|
|||||||
*~
|
|
||||||
*.bak
|
|
||||||
*.bak[0-9]
|
|
||||||
.gdb_history
|
|
||||||
|
|
||||||
.deps
|
|
||||||
.libs
|
|
||||||
*.a
|
|
||||||
*.gcda
|
|
||||||
*.gcno
|
|
||||||
*.la
|
|
||||||
*.lo
|
|
||||||
*.o
|
|
||||||
Makefile.in
|
|
||||||
|
|
||||||
/ABOUT-NLS
|
|
||||||
/autom4te.cache
|
|
||||||
/aclocal.m4
|
|
||||||
/config.h
|
|
||||||
/config.h.in
|
|
||||||
/config.log
|
|
||||||
/config.status
|
|
||||||
/configure
|
|
||||||
/libtool
|
|
||||||
/stamp-h1
|
|
||||||
|
|
||||||
build-aux/artifacts
|
|
||||||
build-aux/compile
|
|
||||||
build-aux/config.guess
|
|
||||||
build-aux/config.rpath
|
|
||||||
build-aux/config.sub
|
|
||||||
build-aux/depcomp
|
|
||||||
build-aux/install-sh
|
|
||||||
build-aux/ltmain.sh
|
|
||||||
build-aux/missing
|
|
||||||
build-aux/test-driver
|
|
||||||
|
|
||||||
coverage
|
|
||||||
|
|
||||||
/doc/internal
|
|
||||||
/doc/api
|
|
||||||
|
|
||||||
/po4a/man
|
|
||||||
/po4a/xz-man.pot
|
|
||||||
/po4a/*.po.authors
|
|
||||||
|
|
||||||
/src/liblzma/liblzma.pc
|
|
||||||
/src/lzmainfo/lzmainfo
|
|
||||||
/src/xz/xz
|
|
||||||
/src/xzdec/lzmadec
|
|
||||||
/src/xzdec/xzdec
|
|
||||||
|
|
||||||
/src/scripts/xzdiff
|
|
||||||
/src/scripts/xzgrep
|
|
||||||
/src/scripts/xzless
|
|
||||||
/src/scripts/xzmore
|
|
||||||
|
|
||||||
/tests/*.log
|
|
||||||
/tests/*.trs
|
|
||||||
/tests/compress_generated_abc
|
|
||||||
/tests/compress_generated_random
|
|
||||||
/tests/compress_generated_text
|
|
||||||
/tests/create_compress_files
|
|
||||||
/tests/test_bcj_exact_size
|
|
||||||
/tests/test_block_header
|
|
||||||
/tests/test_check
|
|
||||||
/tests/test_filter_flags
|
|
||||||
/tests/test_filter_str
|
|
||||||
/tests/test_hardware
|
|
||||||
/tests/test_index
|
|
||||||
/tests/test_index_hash
|
|
||||||
/tests/test_lzip_decoder
|
|
||||||
/tests/test_microlzma
|
|
||||||
/tests/test_memlimit
|
|
||||||
/tests/test_stream_flags
|
|
||||||
/tests/test_vli
|
|
||||||
/tests/xzgrep_test_1.xz
|
|
||||||
/tests/xzgrep_test_2.xz
|
|
||||||
/tests/xzgrep_test_output
|
|
||||||
|
|
||||||
/lib/Makefile
|
|
||||||
/tests/Makefile
|
|
||||||
/Makefile
|
|
||||||
/debug/Makefile
|
|
||||||
/src/scripts/Makefile
|
|
||||||
/src/xz/Makefile
|
|
||||||
/src/Makefile
|
|
||||||
/src/liblzma/Makefile
|
|
||||||
/src/liblzma/api/Makefile
|
|
||||||
/src/lzmainfo/Makefile
|
|
||||||
/src/xzdec/Makefile
|
|
||||||
|
|
||||||
/CMakeCache.txt
|
|
||||||
/CMakeFiles
|
|
||||||
/CTestTestfile.cmake
|
|
||||||
/cmake_install.cmake
|
|
||||||
/DartConfiguration.tcl
|
|
||||||
/liblzma-config-version.cmake
|
|
||||||
/liblzma-config.cmake
|
|
||||||
/Testing
|
|
||||||
/tests_bin/
|
|
||||||
/xz
|
|
||||||
/xzdec
|
|
||||||
/lzmadec
|
|
||||||
/lzmainfo
|
|
||||||
/xzdiff
|
|
||||||
/xzgrep
|
|
||||||
/xzless
|
|
||||||
/xzmore
|
|
||||||
/liblzma.pc
|
|
||||||
/*.gmo
|
|
||||||
|
|
||||||
/.vscode/
|
|
||||||
66
AUTHORS
66
AUTHORS
@ -1,58 +1,18 @@
|
|||||||
|
|
||||||
Authors of XZ Utils
|
Authors of LZMA Utils
|
||||||
===================
|
---------------------
|
||||||
|
|
||||||
XZ Utils is developed and maintained by
|
Igor Pavlov
|
||||||
Lasse Collin <lasse.collin@tukaani.org>.
|
* designed LZMA as an algorithm;
|
||||||
|
* wrote an implementation known as LZMA SDK, which is part of
|
||||||
|
the bigger 7-Zip project.
|
||||||
|
|
||||||
Major parts of liblzma are based on code written by Igor Pavlov,
|
Ville Koskinen
|
||||||
specifically the LZMA SDK <https://7-zip.org/sdk.html>. Without
|
* wrote the first version of the gzip-like lzma command line
|
||||||
this code, XZ Utils wouldn't exist.
|
utility (C++)
|
||||||
|
* helped a lot with the documentation.
|
||||||
|
|
||||||
The SHA-256 implementation in liblzma is based on code written by
|
Lasse Collin
|
||||||
Wei Dai in Crypto++ Library <https://www.cryptopp.com/>.
|
* ported LZMA SDK to C and zlib-like API (liblzma);
|
||||||
|
* rewrote the command line tool again to use liblzma and pthreads.
|
||||||
A few scripts have been adapted from GNU gzip. The original
|
|
||||||
versions were written by Jean-loup Gailly, Charles Levert, and
|
|
||||||
Paul Eggert. Andrew Dudman helped adapting the scripts and their
|
|
||||||
man pages for XZ Utils.
|
|
||||||
|
|
||||||
The initial version of the threaded .xz decompressor was written
|
|
||||||
by Sebastian Andrzej Siewior.
|
|
||||||
|
|
||||||
The initial version of the .lz (lzip) decoder was written
|
|
||||||
by Michał Górny.
|
|
||||||
|
|
||||||
Architecture-specific CRC optimizations were contributed by
|
|
||||||
Ilya Kurdyukov, Chenxi Mao, and Xi Ruoyao.
|
|
||||||
|
|
||||||
Other authors:
|
|
||||||
- Jonathan Nieder
|
|
||||||
- Joachim Henke
|
|
||||||
|
|
||||||
Special author: Jia Tan was a co-maintainer in 2022-2024. He and
|
|
||||||
the team behind him inserted a backdoor (CVE-2024-3094) into
|
|
||||||
XZ Utils 5.6.0 and 5.6.1 releases. He suddenly disappeared when
|
|
||||||
this was discovered.
|
|
||||||
|
|
||||||
Many people have contributed improvements or reported bugs.
|
|
||||||
Most of these people are mentioned in the file THANKS.
|
|
||||||
|
|
||||||
The translations of the command line tools and man pages have been
|
|
||||||
contributed by many people via the Translation Project:
|
|
||||||
|
|
||||||
- https://translationproject.org/domain/xz.html
|
|
||||||
- https://translationproject.org/domain/xz-man.html
|
|
||||||
|
|
||||||
The authors of the translated man pages are in the header comments
|
|
||||||
of the man page files. In the source package, the authors of the
|
|
||||||
translations are in po/*.po and po4a/*.po files.
|
|
||||||
|
|
||||||
Third-party code whose authors aren't listed here:
|
|
||||||
|
|
||||||
- GNU getopt_long() in the 'lib' directory is included for
|
|
||||||
platforms that don't have a usable getopt_long().
|
|
||||||
|
|
||||||
- The build system files from GNU Autoconf, GNU Automake,
|
|
||||||
GNU Libtool, GNU Gettext, Autoconf Archive, and related files.
|
|
||||||
|
|
||||||
|
|||||||
2520
CMakeLists.txt
2520
CMakeLists.txt
File diff suppressed because it is too large
Load Diff
77
COPYING
77
COPYING
@ -1,70 +1,25 @@
|
|||||||
|
|
||||||
XZ Utils Licensing
|
LZMA Utils Licenses
|
||||||
==================
|
-------------------
|
||||||
|
|
||||||
Different licenses apply to different files in this package. Here
|
Different licenses apply to different files in this package. Here
|
||||||
is a summary of which licenses apply to which parts of this package:
|
is a rough summary of which license apply to which parts of this
|
||||||
|
package (but check the individual files to be sure!):
|
||||||
|
- Everything under src/liblzma/check and tests/files is public
|
||||||
|
domain.
|
||||||
|
- Everything else under the src directory is under the GNU LGPL
|
||||||
|
2.1 or (at your opinion) any later version.
|
||||||
|
- Outside the src directory, there are some files that are under
|
||||||
|
the GNU GPL 2 or (at your opinion) any later version, or under
|
||||||
|
the GNU GPL 3 or (at your opinion) any later version.
|
||||||
|
- Most documentation files are under an all-permissive license.
|
||||||
|
|
||||||
- liblzma is under the BSD Zero Clause License (0BSD).
|
The following license texts are included in the following files
|
||||||
|
in this package:
|
||||||
- The command line tools xz, xzdec, lzmadec, and lzmainfo are
|
|
||||||
under 0BSD except that, on systems that don't have a usable
|
|
||||||
getopt_long, GNU getopt_long is compiled and linked in from the
|
|
||||||
'lib' directory. The getopt_long code is under GNU LGPLv2.1+.
|
|
||||||
|
|
||||||
- The scripts to grep, diff, and view compressed files have been
|
|
||||||
adapted from GNU gzip. These scripts (xzgrep, xzdiff, xzless,
|
|
||||||
and xzmore) are under GNU GPLv2+. The man pages of the scripts
|
|
||||||
are under 0BSD; they aren't based on the man pages of GNU gzip.
|
|
||||||
|
|
||||||
- Most of the XZ Utils specific documentation that is in
|
|
||||||
plain text files (like README, INSTALL, PACKAGERS, NEWS,
|
|
||||||
and ChangeLog) are under 0BSD unless stated otherwise in
|
|
||||||
the file itself. The files xz-file-format.txt and
|
|
||||||
lzma-file-format.xt are in the public domain but may
|
|
||||||
be distributed under the terms of 0BSD too.
|
|
||||||
|
|
||||||
- Translated messages and man pages are under 0BSD except that
|
|
||||||
some old translations are in the public domain.
|
|
||||||
|
|
||||||
- Test files and test code in the 'tests' directory, and
|
|
||||||
debugging utilities in the 'debug' directory are under
|
|
||||||
the BSD Zero Clause License (0BSD).
|
|
||||||
|
|
||||||
- The GNU Autotools based build system contains files that are
|
|
||||||
under GNU GPLv2+, GNU GPLv3+, and a few permissive licenses.
|
|
||||||
These files don't affect the licensing of the binaries being
|
|
||||||
built.
|
|
||||||
|
|
||||||
- The 'extra' directory contains files that are under various
|
|
||||||
free software licenses. These aren't built or installed as
|
|
||||||
part of XZ Utils.
|
|
||||||
|
|
||||||
The following command may be helpful in finding per-file license
|
|
||||||
information. It works on xz.git and on a clean file tree extracted
|
|
||||||
from a release tarball.
|
|
||||||
|
|
||||||
sh build-aux/license-check.sh -v
|
|
||||||
|
|
||||||
For the files under the BSD Zero Clause License (0BSD), if
|
|
||||||
a copyright notice is needed, the following is sufficient:
|
|
||||||
|
|
||||||
Copyright (C) The XZ Utils authors and contributors
|
|
||||||
|
|
||||||
If you copy significant amounts of 0BSD-licensed code from XZ Utils
|
|
||||||
into your project, acknowledging this somewhere in your software is
|
|
||||||
polite (especially if it is proprietary, non-free software), but
|
|
||||||
it is not legally required by the license terms. Here is an example
|
|
||||||
of a good notice to put into "about box" or into documentation:
|
|
||||||
|
|
||||||
This software includes code from XZ Utils <https://tukaani.org/xz/>.
|
|
||||||
|
|
||||||
The following license texts are included in the following files:
|
|
||||||
- COPYING.0BSD: BSD Zero Clause License
|
|
||||||
- COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1
|
- COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1
|
||||||
- COPYING.GPLv2: GNU General Public License version 2
|
- COPYING.GPLv2: GNU General Public License version 2
|
||||||
- COPYING.GPLv3: GNU General Public License version 3
|
- COPYING.GPLv3: GNU General Public License version 3
|
||||||
|
|
||||||
If you have questions, don't hesitate to ask for more information.
|
If you have questions, don't hesitate to ask the copyright holder(s)
|
||||||
The contact information is in the README file.
|
for more information.
|
||||||
|
|
||||||
|
|||||||
11
COPYING.0BSD
11
COPYING.0BSD
@ -1,11 +0,0 @@
|
|||||||
Permission to use, copy, modify, and/or distribute this
|
|
||||||
software for any purpose with or without fee is hereby granted.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
|
||||||
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
|
||||||
THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
|
|
||||||
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
||||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
||||||
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
@ -2,7 +2,7 @@
|
|||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
<https://fsf.org/>
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
@ -304,7 +304,8 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, see <https://www.gnu.org/licenses/>.
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
@ -328,8 +329,8 @@ necessary. Here is a sample; alter the names:
|
|||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
<signature of Moe Ghoul>, 1 April 1989
|
<signature of Ty Coon>, 1 April 1989
|
||||||
Moe Ghoul, President of Vice
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
|
|||||||
You should also get your employer (if you work as a programmer) or school,
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
<https://www.gnu.org/licenses/>.
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
The GNU General Public License does not permit incorporating your program
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
may consider it more useful to permit linking proprietary applications with
|
may consider it more useful to permit linking proprietary applications with
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License. But first, please read
|
Public License instead of this License. But first, please read
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
Version 2.1, February 1999
|
Version 2.1, February 1999
|
||||||
|
|
||||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||||
<https://fsf.org/>
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
@ -484,7 +484,8 @@ convey the exclusion of warranty; and each file should have at least the
|
|||||||
Lesser General Public License for more details.
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
You should have received a copy of the GNU Lesser General Public
|
||||||
License along with this library; if not, see <https://www.gnu.org/licenses/>.
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
@ -495,7 +496,9 @@ necessary. Here is a sample; alter the names:
|
|||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||||
|
|
||||||
<signature of Moe Ghoul>, 1 April 1990
|
<signature of Ty Coon>, 1 April 1990
|
||||||
Moe Ghoul, President of Vice
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
That's all there is to it!
|
That's all there is to it!
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,2 @@
|
|||||||
See the commit log in the git repository:
|
See the commit log in the git repository:
|
||||||
|
git://ctrl.tukaani.org/lzma-utils.git
|
||||||
git clone https://github.com/tukaani-project/xz
|
|
||||||
|
|
||||||
Note that "make dist" doesn't put this tiny file into the package.
|
|
||||||
Instead, the git commit log is used as ChangeLog. See dist-hook in
|
|
||||||
Makefile.am for details.
|
|
||||||
|
|||||||
1229
Doxyfile.in
Normal file
1229
Doxyfile.in
Normal file
File diff suppressed because it is too large
Load Diff
976
INSTALL
976
INSTALL
@ -1,976 +0,0 @@
|
|||||||
|
|
||||||
XZ Utils Installation
|
|
||||||
=====================
|
|
||||||
|
|
||||||
0. Preface
|
|
||||||
1. Supported platforms
|
|
||||||
1.1. Compilers
|
|
||||||
1.2. Platform-specific notes
|
|
||||||
1.2.1. AIX
|
|
||||||
1.2.2. IRIX
|
|
||||||
1.2.3. MINIX 3
|
|
||||||
1.2.4. OpenVMS
|
|
||||||
1.2.5. Solaris, OpenSolaris, and derivatives
|
|
||||||
1.2.6. Tru64
|
|
||||||
1.2.7. Windows
|
|
||||||
1.2.8. DOS
|
|
||||||
1.2.9. z/OS
|
|
||||||
1.3. Adding support for new platforms
|
|
||||||
2. configure and CMake options
|
|
||||||
2.1. Static vs. dynamic linking of liblzma
|
|
||||||
2.2. Optimizing xzdec and lzmadec
|
|
||||||
3. xzgrep and other scripts
|
|
||||||
3.1. Dependencies
|
|
||||||
3.2. PATH
|
|
||||||
4. Tests
|
|
||||||
4.1 Testing in parallel
|
|
||||||
4.2 Cross compiling
|
|
||||||
5. Troubleshooting
|
|
||||||
5.1. "No C99 compiler was found."
|
|
||||||
5.2. "No POSIX conforming shell (sh) was found."
|
|
||||||
5.3. configure works but build fails at crc32_x86.S
|
|
||||||
5.4. Lots of warnings about symbol visibility
|
|
||||||
5.5. "make check" fails
|
|
||||||
5.6. liblzma.so (or similar) not found when running xz
|
|
||||||
|
|
||||||
|
|
||||||
0. Preface
|
|
||||||
----------
|
|
||||||
|
|
||||||
If you aren't familiar with building packages that use GNU Autotools,
|
|
||||||
see the file INSTALL.generic for generic instructions before reading
|
|
||||||
further.
|
|
||||||
|
|
||||||
If you are going to build a package for distribution, see also the
|
|
||||||
file PACKAGERS. It contains information that should help making the
|
|
||||||
binary packages as good as possible, but the information isn't very
|
|
||||||
interesting to those making local builds for private use or for use
|
|
||||||
in special situations like embedded systems.
|
|
||||||
|
|
||||||
|
|
||||||
1. Supported platforms
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
XZ Utils are developed on GNU/Linux, but they should work on many
|
|
||||||
POSIX-like operating systems like *BSDs and Solaris, and even on
|
|
||||||
a few non-POSIX operating systems.
|
|
||||||
|
|
||||||
|
|
||||||
1.1. Compilers
|
|
||||||
|
|
||||||
A C99 compiler is required to compile XZ Utils. If you use GCC, you
|
|
||||||
need at least version 3.x.x. GCC version 2.xx.x doesn't support some
|
|
||||||
C99 features used in XZ Utils source code, thus GCC 2 won't compile
|
|
||||||
XZ Utils.
|
|
||||||
|
|
||||||
XZ Utils takes advantage of some GNU C extensions when building
|
|
||||||
with GCC. Because these extensions are used only when building
|
|
||||||
with GCC, it should be possible to use any C99 compiler.
|
|
||||||
|
|
||||||
|
|
||||||
1.2. Platform-specific notes
|
|
||||||
|
|
||||||
1.2.1. AIX
|
|
||||||
|
|
||||||
If you use IBM XL C compiler, pass CC=xlc_r to configure. If
|
|
||||||
you use CC=xlc instead, you must disable threading support
|
|
||||||
with --disable-threads (usually not recommended).
|
|
||||||
|
|
||||||
If building a 32-bit executable, the address space available to xz
|
|
||||||
might be limited to 256 MiB by default. To increase the address
|
|
||||||
space to 2 GiB, pass LDFLAGS=-Wl,-bmaxdata:0x80000000 as an argument
|
|
||||||
to configure.
|
|
||||||
|
|
||||||
|
|
||||||
1.2.2. IRIX
|
|
||||||
|
|
||||||
MIPSpro 7.4.4m has been reported to produce broken code if using
|
|
||||||
the -O2 optimization flag ("make check" fails). Using -O1 should
|
|
||||||
work.
|
|
||||||
|
|
||||||
A problem has been reported when using shared liblzma. Passing
|
|
||||||
--disable-shared to configure works around this. Alternatively,
|
|
||||||
putting "-64" to CFLAGS to build a 64-bit version might help too.
|
|
||||||
|
|
||||||
|
|
||||||
1.2.3. MINIX 3
|
|
||||||
|
|
||||||
Version 3.3.0 and later are supported.
|
|
||||||
|
|
||||||
Multithreading isn't supported because MINIX 3 doesn't have
|
|
||||||
pthreads. The option --disable-threads must be passed to configure
|
|
||||||
as this isn't autodetected.
|
|
||||||
|
|
||||||
Note that disabling threads causes "make check" to show a few tests
|
|
||||||
as skipped ("SKIP"). It's only due to a few threading-dependent
|
|
||||||
subtests are skipped. See the matching tests/test_*.log files.
|
|
||||||
|
|
||||||
|
|
||||||
1.2.4. OpenVMS
|
|
||||||
|
|
||||||
XZ Utils can be built for OpenVMS, but the build system files
|
|
||||||
are not included in the XZ Utils source package. The required
|
|
||||||
OpenVMS-specific files are maintained by Jouk Jansen and can be
|
|
||||||
downloaded here:
|
|
||||||
|
|
||||||
http://nchrem.tnw.tudelft.nl/openvms/software2.html#xzutils
|
|
||||||
|
|
||||||
|
|
||||||
1.2.5. Solaris, OpenSolaris, and derivatives
|
|
||||||
|
|
||||||
The following linker error has been reported on some x86 systems:
|
|
||||||
|
|
||||||
ld: fatal: relocation error: R_386_GOTOFF: ...
|
|
||||||
|
|
||||||
This can be worked around by passing gl_cv_cc_visibility=no
|
|
||||||
as an argument to the configure script.
|
|
||||||
|
|
||||||
test_scripts.sh in "make check" may fail if good enough tools are
|
|
||||||
missing from PATH (/usr/xpg4/bin or /usr/xpg6/bin). Nowadays
|
|
||||||
/usr/xpg4/bin is added to the script PATH by default on Solaris
|
|
||||||
(see --enable-path-for-scripts=PREFIX in section 2), but old xz
|
|
||||||
releases needed extra steps. See sections 5.5 and 3.2 for more
|
|
||||||
information.
|
|
||||||
|
|
||||||
|
|
||||||
1.2.6. Tru64
|
|
||||||
|
|
||||||
If you try to use the native C compiler on Tru64 (passing CC=cc to
|
|
||||||
configure), you may need the workaround mention in section 5.1 in
|
|
||||||
this file (pass also ac_cv_prog_cc_c99= to configure).
|
|
||||||
|
|
||||||
|
|
||||||
1.2.7. Windows
|
|
||||||
|
|
||||||
The "windows" directory contains instructions for a few types
|
|
||||||
of builds:
|
|
||||||
|
|
||||||
- INSTALL-MinGW-w64_with_CMake.txt
|
|
||||||
Simple instructions how to build XZ Utils natively on
|
|
||||||
Windows using only CMake and a prebuilt toolchain
|
|
||||||
(GCC + MinGW-w64 or Clang/LLVM + MinGW-w64).
|
|
||||||
|
|
||||||
- INSTALL-MinGW-w64_with_Autotools.txt
|
|
||||||
Native build under MSYS2 or cross-compilation from
|
|
||||||
GNU/Linux using a bash script that creates a .zip
|
|
||||||
and .7z archives of the binaries and documentation.
|
|
||||||
The related file README-Windows.txt is for the
|
|
||||||
resulting binary package.
|
|
||||||
|
|
||||||
- INSTALL-MSVC.txt
|
|
||||||
Building with MSVC / Visual Studio and CMake.
|
|
||||||
|
|
||||||
- liblzma-crt-mixing.txt
|
|
||||||
Documentation what to take into account as a programmer
|
|
||||||
if liblzma.dll and the application don't use the same
|
|
||||||
CRT (MSVCRT or UCRT).
|
|
||||||
|
|
||||||
Other choices:
|
|
||||||
|
|
||||||
- Cygwin: https://cygwin.com/
|
|
||||||
Building on Cygwin can be done like on many POSIX operating
|
|
||||||
systems. XZ Utils >= 5.2.0 isn't compatible with Cygwin older
|
|
||||||
than 1.7.35 (data loss!). 1.7.35 was released on 2015-03-04.
|
|
||||||
|
|
||||||
- MSYS2: https://www.msys2.org/
|
|
||||||
|
|
||||||
|
|
||||||
1.2.8. DOS
|
|
||||||
|
|
||||||
There is a Makefile in the "dos" directory to build XZ Utils on
|
|
||||||
DOS using DJGPP. Support for long file names (LFN) is needed at
|
|
||||||
build time but the resulting xz.exe works without LFN support too.
|
|
||||||
See dos/INSTALL.txt and dos/README.txt for more information.
|
|
||||||
|
|
||||||
|
|
||||||
1.2.9. z/OS
|
|
||||||
|
|
||||||
To build XZ Utils on z/OS UNIX System Services using xlc, pass
|
|
||||||
these options to the configure script: CC='xlc -qhaltonmsg=CCN3296'
|
|
||||||
CPPFLAS='-D_UNIX03_THREADS -D_XOPEN_SOURCE=600'. The first makes
|
|
||||||
xlc throw an error if a header file is missing, which is required
|
|
||||||
to make the tests in configure work. The CPPFLAGS are needed to
|
|
||||||
get pthread support (some other CPPFLAGS may work too; if there
|
|
||||||
are problems, try -D_UNIX95_THREADS instead of -D_UNIX03_THREADS).
|
|
||||||
|
|
||||||
test_scripts.sh in "make check" will fail even if the scripts
|
|
||||||
actually work because the test data includes compressed files
|
|
||||||
with US-ASCII text.
|
|
||||||
|
|
||||||
No other tests should fail. If test_files.sh fails, check that
|
|
||||||
the included .xz test files weren't affected by EBCDIC conversion.
|
|
||||||
|
|
||||||
XZ Utils doesn't have code to detect the amount of physical RAM and
|
|
||||||
number of CPU cores on z/OS.
|
|
||||||
|
|
||||||
|
|
||||||
1.3. Adding support for new platforms
|
|
||||||
|
|
||||||
If you have written patches to make XZ Utils to work on previously
|
|
||||||
unsupported platform, please send the patches to me! I will consider
|
|
||||||
including them to the official version. It's nice to minimize the
|
|
||||||
need of third-party patching.
|
|
||||||
|
|
||||||
One exception: Don't request or send patches to change the whole
|
|
||||||
source package to C89. I find C99 substantially nicer to write and
|
|
||||||
maintain. However, the public library headers must be in C89 to
|
|
||||||
avoid frustrating those who maintain programs, which are strictly
|
|
||||||
in C89 or C++.
|
|
||||||
|
|
||||||
|
|
||||||
2. configure and CMake options
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
In most cases, the defaults are what you want. Many of the options
|
|
||||||
below are useful only when building a size-optimized version of
|
|
||||||
liblzma or command line tools.
|
|
||||||
|
|
||||||
configure options are those that begin with two dashes "--"
|
|
||||||
or "gl_".
|
|
||||||
|
|
||||||
CMake options begin with "XZ_", "TUKLIB_", or "CMAKE_". To use
|
|
||||||
them on the command line, prefix them with "-D", for example,
|
|
||||||
"cmake -DCMAKE_COMPILE_WARNING_AS_ERROR=ON".
|
|
||||||
|
|
||||||
CMAKE_BUILD_TYPE=TYPE
|
|
||||||
CMake only:
|
|
||||||
|
|
||||||
For release builds, CMAKE_BUILD_TYPE=Release is fine.
|
|
||||||
On targets where CMake defaults to -O3, the default
|
|
||||||
value is overridden to -O2.
|
|
||||||
|
|
||||||
Empty value (CMAKE_BUILD_TYPE=) is fine if using custom
|
|
||||||
optimization options. *In this package* the empty build
|
|
||||||
type also disables debugging code just like "Release"
|
|
||||||
does. To enable debugging code with empty build type,
|
|
||||||
use -UNDEBUG in the CFLAGS environment variable or in
|
|
||||||
the CMAKE_C_FLAGS CMake variable to override -DNDEBUG.
|
|
||||||
|
|
||||||
Non-standard build types like "None" do NOT disable
|
|
||||||
debugging code! Such non-standard build types should
|
|
||||||
be avoided for production builds!
|
|
||||||
|
|
||||||
--enable-encoders=LIST
|
|
||||||
--disable-encoders
|
|
||||||
XZ_ENCODERS=LIST
|
|
||||||
Specify a LIST of filter encoders to build. In the
|
|
||||||
configure option the list is comma separated.
|
|
||||||
CMake lists are semicolon separated.
|
|
||||||
|
|
||||||
To see the exact list of available filter encoders:
|
|
||||||
|
|
||||||
- Autotools: ./configure --help
|
|
||||||
|
|
||||||
- CMake: Configure the tree normally first, then use
|
|
||||||
"cmake -LH ." to list the cache variables.
|
|
||||||
|
|
||||||
The default is to build all supported encoders.
|
|
||||||
|
|
||||||
If LIST is empty or --disable-encoders is used, no filter
|
|
||||||
encoders will be built and also the code shared between
|
|
||||||
encoders will be omitted.
|
|
||||||
|
|
||||||
Disabling encoders will remove some symbols from the
|
|
||||||
liblzma ABI, so this option should be used only when it
|
|
||||||
is known to not cause problems.
|
|
||||||
|
|
||||||
--enable-decoders=LIST
|
|
||||||
--disable-decoders
|
|
||||||
XZ_DECODERS=LIST
|
|
||||||
This is like --enable-encoders but for decoders. The
|
|
||||||
default is to build all supported decoders.
|
|
||||||
|
|
||||||
--enable-match-finders=LIST
|
|
||||||
XZ_MATCH_FINDERS=LIST
|
|
||||||
liblzma includes two categories of match finders:
|
|
||||||
hash chains and binary trees. Hash chains (hc3 and hc4)
|
|
||||||
are quite fast but they don't provide the best compression
|
|
||||||
ratio. Binary trees (bt2, bt3 and bt4) give excellent
|
|
||||||
compression ratio, but they are slower and need more
|
|
||||||
memory than hash chains.
|
|
||||||
|
|
||||||
You need to enable at least one match finder to build the
|
|
||||||
LZMA1 or LZMA2 filter encoders. Usually hash chains are
|
|
||||||
used only in the fast mode, while binary trees are used to
|
|
||||||
when the best compression ratio is wanted.
|
|
||||||
|
|
||||||
The default is to build all the match finders if LZMA1
|
|
||||||
or LZMA2 filter encoders are being built.
|
|
||||||
|
|
||||||
--enable-checks=LIST
|
|
||||||
XZ_CHECKS=LIST
|
|
||||||
liblzma support multiple integrity checks. CRC32 is
|
|
||||||
mandatory, and cannot be omitted. Supported check
|
|
||||||
types are "crc32", "crc64", and "sha256". By default
|
|
||||||
all supported check types are enabled.
|
|
||||||
|
|
||||||
liblzma and the command line tools can decompress files
|
|
||||||
which use unsupported integrity check type, but naturally
|
|
||||||
the file integrity cannot be verified in that case.
|
|
||||||
|
|
||||||
Disabling integrity checks may remove some symbols from
|
|
||||||
the liblzma ABI, so this option should be used only when
|
|
||||||
it is known to not cause problems.
|
|
||||||
|
|
||||||
--enable-external-sha256
|
|
||||||
XZ_EXTERNAL_SHA256=ON
|
|
||||||
Try to use SHA-256 code from the operating system libc
|
|
||||||
or similar base system libraries. This doesn't try to
|
|
||||||
use OpenSSL or libgcrypt or such libraries.
|
|
||||||
|
|
||||||
The reasons to use this option:
|
|
||||||
|
|
||||||
- It makes liblzma slightly smaller.
|
|
||||||
|
|
||||||
- It might improve SHA-256 speed if the implementation
|
|
||||||
in the operating is very good (but see below).
|
|
||||||
|
|
||||||
External SHA-256 is disabled by default for two reasons:
|
|
||||||
|
|
||||||
- On some operating systems the symbol names of the
|
|
||||||
SHA-256 functions conflict with OpenSSL's libcrypto.
|
|
||||||
This causes weird problems such as decompression
|
|
||||||
errors if an application is linked against both
|
|
||||||
liblzma and libcrypto. This problem affects at least
|
|
||||||
FreeBSD 10 and older and MINIX 3.3.0 and older, but
|
|
||||||
other OSes that provide a function "SHA256_Init" might
|
|
||||||
also be affected. FreeBSD 11 has the problem fixed.
|
|
||||||
NetBSD had the problem but it was fixed it in 2009
|
|
||||||
already. OpenBSD uses "SHA256Init" and thus never had
|
|
||||||
a conflict with libcrypto.
|
|
||||||
|
|
||||||
- The SHA-256 code in liblzma is faster than the SHA-256
|
|
||||||
code provided by some operating systems. If you are
|
|
||||||
curious, build two copies of xz (internal and external
|
|
||||||
SHA-256) and compare the decompression (xz --test)
|
|
||||||
times:
|
|
||||||
|
|
||||||
dd if=/dev/zero bs=1024k count=1024 \
|
|
||||||
| xz -v -0 -Csha256 > foo.xz
|
|
||||||
time xz --test foo.xz
|
|
||||||
|
|
||||||
--disable-microlzma
|
|
||||||
XZ_MICROLZMA_ENCODER=OFF
|
|
||||||
XZ_MICROLZMA_DECODER=OFF
|
|
||||||
Don't build MicroLZMA encoder and decoder. This omits
|
|
||||||
lzma_microlzma_encoder() and lzma_microlzma_decoder()
|
|
||||||
API functions from liblzma. These functions are needed
|
|
||||||
by specific applications only. They were written for
|
|
||||||
erofs-utils but they may be used by others too.
|
|
||||||
|
|
||||||
--disable-lzip-decoder
|
|
||||||
XZ_LZIP_DECODER=OFF
|
|
||||||
Disable decompression support for .lz (lzip) files.
|
|
||||||
This omits the API function lzma_lzip_decoder() from
|
|
||||||
liblzma and .lz support from the xz tool.
|
|
||||||
|
|
||||||
--disable-xz
|
|
||||||
--disable-xzdec
|
|
||||||
--disable-lzmadec
|
|
||||||
--disable-lzmainfo
|
|
||||||
XZ_TOOL_XZ=OFF
|
|
||||||
XZ_TOOL_XZDEC=OFF
|
|
||||||
XZ_TOOL_LZMADEC=OFF
|
|
||||||
XZ_TOOL_LZMAINFO=OFF
|
|
||||||
Don't build and install the command line tool mentioned
|
|
||||||
in the option name.
|
|
||||||
|
|
||||||
NOTE: Disabling xz will skip some tests in "make check".
|
|
||||||
|
|
||||||
NOTE: If xzdec is disabled and lzmadec is left enabled,
|
|
||||||
a dangling man page symlink lzmadec.1 -> xzdec.1 is
|
|
||||||
created.
|
|
||||||
|
|
||||||
XZ_TOOL_SYMLINKS=OFF
|
|
||||||
Don't create the unxz and xzcat symlinks. (There is
|
|
||||||
no "configure" option to disable these symlinks.)
|
|
||||||
|
|
||||||
--disable-lzma-links
|
|
||||||
XZ_TOOL_SYMLINKS_LZMA=OFF
|
|
||||||
Don't create symlinks for LZMA Utils compatibility.
|
|
||||||
This includes lzma, unlzma, and lzcat. If scripts are
|
|
||||||
installed, also lzdiff, lzcmp, lzgrep, lzegrep, lzfgrep,
|
|
||||||
lzmore, and lzless will be omitted if this option is used.
|
|
||||||
|
|
||||||
--disable-scripts
|
|
||||||
XZ_TOOL_SCRIPTS=OFF
|
|
||||||
Don't install the scripts xzdiff, xzgrep, xzmore, xzless,
|
|
||||||
and their symlinks.
|
|
||||||
|
|
||||||
--disable-doc
|
|
||||||
XZ_DOC=OFF
|
|
||||||
Don't install the documentation files to $docdir
|
|
||||||
(often /usr/doc/xz or /usr/local/doc/xz). Man pages
|
|
||||||
will still be installed. The $docdir can be changed
|
|
||||||
with --docdir=DIR.
|
|
||||||
|
|
||||||
--enable-doxygen
|
|
||||||
XZ_DOXYGEN=ON
|
|
||||||
Enable generation of the HTML version of the liblzma API
|
|
||||||
documentation using Doxygen. The resulting files are
|
|
||||||
installed to $docdir/api. This option assumes that
|
|
||||||
the 'doxygen' tool is available.
|
|
||||||
|
|
||||||
NOTE: --disable-doc or XZ_DOC=OFF don't affect this.
|
|
||||||
|
|
||||||
--disable-assembler
|
|
||||||
XZ_ASM_I386=OFF
|
|
||||||
This disables CRC32 and CRC64 assembly code on
|
|
||||||
32-bit x86. This option currently does nothing
|
|
||||||
on other architectures (not even on x86-64).
|
|
||||||
|
|
||||||
The 32-bit x86 assembly is position-independent code
|
|
||||||
which is suitable for use in shared libraries and
|
|
||||||
position-independent executables. It uses only i386
|
|
||||||
instructions but the code is optimized for i686 class
|
|
||||||
CPUs. If you are compiling liblzma exclusively for
|
|
||||||
pre-i686 systems, you may want to disable the assembler
|
|
||||||
code.
|
|
||||||
|
|
||||||
The assembly code is compatible with only certain OSes
|
|
||||||
and toolchains (it's not compatible with MSVC).
|
|
||||||
|
|
||||||
Since XZ Utils 5.7.1alpha, the 32-bit x86 assembly code
|
|
||||||
co-exists with the modern CLMUL code: CLMUL is used if
|
|
||||||
support for it is detected at runtime. On old processors
|
|
||||||
the assembly code is used.
|
|
||||||
|
|
||||||
--disable-clmul-crc
|
|
||||||
XZ_CLMUL_CRC=OFF
|
|
||||||
Disable the use of carryless multiplication for CRC
|
|
||||||
calculation even if compiler support for it is detected.
|
|
||||||
The code uses runtime detection of SSSE3, SSE4.1, and
|
|
||||||
CLMUL instructions on x86. On 32-bit x86 this currently
|
|
||||||
is used only if --disable-assembler is used (this might
|
|
||||||
be fixed in the future). The code works on E2K too.
|
|
||||||
|
|
||||||
If using compiler options that unconditionally allow the
|
|
||||||
required extensions (-msse4.1 -mpclmul) then runtime
|
|
||||||
detection isn't used and the generic code is omitted.
|
|
||||||
|
|
||||||
--disable-arm64-crc32
|
|
||||||
XZ_ARM64_CRC32=OFF
|
|
||||||
Disable the use of the ARM64 CRC32 instruction extension
|
|
||||||
even if compiler support for it is detected. The code will
|
|
||||||
detect support for the instruction at runtime.
|
|
||||||
|
|
||||||
If using compiler options that unconditionally allow the
|
|
||||||
required extensions (-march=armv8-a+crc or -march=armv8.1-a
|
|
||||||
and later) then runtime detection isn't used and the
|
|
||||||
generic code is omitted.
|
|
||||||
|
|
||||||
--disable-loongarch-crc32
|
|
||||||
XZ_LOONGARCH_CRC32=OFF
|
|
||||||
Disable the use of the 64-bit LoongArch CRC32
|
|
||||||
instruction extension even if compiler support for
|
|
||||||
it is detected. There is no runtime detection because
|
|
||||||
all 64-bit LoongArch processors should support
|
|
||||||
the CRC32 instructions.
|
|
||||||
|
|
||||||
--enable-unaligned-access
|
|
||||||
TUKLIB_FAST_UNALIGNED_ACCESS=ON
|
|
||||||
Allow liblzma to use unaligned memory access for 16-bit,
|
|
||||||
32-bit, and 64-bit loads and stores. This should be
|
|
||||||
enabled only when the hardware supports this, that is,
|
|
||||||
when unaligned access is fast. Some operating system
|
|
||||||
kernels emulate unaligned access, which is extremely
|
|
||||||
slow. This option shouldn't be used on systems that
|
|
||||||
rely on such emulation.
|
|
||||||
|
|
||||||
Unaligned access is enabled by default on these:
|
|
||||||
- 32-bit x86
|
|
||||||
- 64-bit x86-64
|
|
||||||
- 32-bit big endian PowerPC
|
|
||||||
- 64-bit big endian PowerPC
|
|
||||||
- 64-bit little endian PowerPC
|
|
||||||
- some RISC-V [1]
|
|
||||||
- some 32-bit ARM [2]
|
|
||||||
- some 64-bit ARM64 [2] (NOTE: Autodetection bug
|
|
||||||
if using GCC -mstrict-align, see below.)
|
|
||||||
|
|
||||||
[1] Unaligned access is enabled by default if
|
|
||||||
configure sees that the C compiler
|
|
||||||
#defines __riscv_misaligned_fast.
|
|
||||||
|
|
||||||
[2] Unaligned access is enabled by default if
|
|
||||||
configure sees that the C compiler
|
|
||||||
#defines __ARM_FEATURE_UNALIGNED:
|
|
||||||
|
|
||||||
- ARMv7 + GCC or Clang: It works. The options
|
|
||||||
-munaligned-access and -mno-unaligned-access
|
|
||||||
affect this macro correctly.
|
|
||||||
|
|
||||||
- ARM64 + Clang: It works. The options
|
|
||||||
-munaligned-access, -mno-unaligned-access,
|
|
||||||
and -mstrict-align affect this macro correctly.
|
|
||||||
Clang >= 17 supports -mno-strict-align too.
|
|
||||||
|
|
||||||
- ARM64 + GCC: It partially works. The macro
|
|
||||||
is always #defined by GCC versions at least
|
|
||||||
up to 13.2, even when using -mstrict-align.
|
|
||||||
If building for strict-align ARM64, the
|
|
||||||
configure option --disable-unaligned-access
|
|
||||||
should be used if using a GCC version that has
|
|
||||||
this issue because otherwise the performance
|
|
||||||
may be degraded. It likely won't crash due to
|
|
||||||
how unaligned access is done in the C code.
|
|
||||||
|
|
||||||
--enable-unsafe-type-punning
|
|
||||||
TUKLIB_USE_UNSAFE_TYPE_PUNNING=ON
|
|
||||||
This enables use of code like
|
|
||||||
|
|
||||||
uint8_t *buf8 = ...;
|
|
||||||
*(uint32_t *)buf8 = ...;
|
|
||||||
|
|
||||||
which violates strict aliasing rules and may result
|
|
||||||
in broken code. There should be no need to use this
|
|
||||||
option with recent GCC or Clang versions on any
|
|
||||||
arch as just as fast code can be generated in a safe
|
|
||||||
way too (using __builtin_assume_aligned + memcpy).
|
|
||||||
|
|
||||||
However, this option might improve performance in some
|
|
||||||
other cases, especially with old compilers (for example,
|
|
||||||
GCC 3 and early 4.x on x86, GCC < 6 on ARMv6 and ARMv7).
|
|
||||||
|
|
||||||
--enable-small
|
|
||||||
XZ_SMALL=ON
|
|
||||||
Reduce the size of liblzma by selecting smaller but
|
|
||||||
semantically equivalent version of some functions, and
|
|
||||||
omit precomputed lookup tables. This option tends to
|
|
||||||
make liblzma slightly slower.
|
|
||||||
|
|
||||||
Note that while omitting the precomputed tables makes
|
|
||||||
liblzma smaller on disk, the tables are still needed at
|
|
||||||
run time, and need to be computed at startup. This also
|
|
||||||
means that the RAM holding the tables won't be shared
|
|
||||||
between applications linked against shared liblzma.
|
|
||||||
|
|
||||||
This option doesn't modify CFLAGS to tell the compiler
|
|
||||||
to optimize for size. You need to add -Os or equivalent
|
|
||||||
flag(s) to CFLAGS manually.
|
|
||||||
|
|
||||||
--enable-assume-ram=SIZE
|
|
||||||
XZ_ASSUME_RAM=SIZE
|
|
||||||
On the most common operating systems, XZ Utils is able to
|
|
||||||
detect the amount of physical memory on the system. This
|
|
||||||
information is used by the options --memlimit-compress,
|
|
||||||
--memlimit-decompress, and --memlimit when setting the
|
|
||||||
limit to a percentage of total RAM.
|
|
||||||
|
|
||||||
On some systems, there is no code to detect the amount of
|
|
||||||
RAM though. Using --enable-assume-ram one can set how much
|
|
||||||
memory to assume on these systems. SIZE is given as MiB.
|
|
||||||
The default is 128 MiB.
|
|
||||||
|
|
||||||
Feel free to send patches to add support for detecting
|
|
||||||
the amount of RAM on the operating system you use. See
|
|
||||||
src/common/tuklib_physmem.c for details.
|
|
||||||
|
|
||||||
--enable-threads=METHOD
|
|
||||||
XZ_THREADS=METHOD
|
|
||||||
Threading support is enabled by default so normally there
|
|
||||||
is no need to specify this option.
|
|
||||||
|
|
||||||
Supported values for METHOD:
|
|
||||||
|
|
||||||
yes Autodetect the threading method. If none
|
|
||||||
is found, configure will give an error.
|
|
||||||
|
|
||||||
posix Use POSIX pthreads. This is the default
|
|
||||||
except on Windows outside Cygwin.
|
|
||||||
|
|
||||||
win95 Use Windows 95 compatible threads. This
|
|
||||||
is compatible with Windows XP and later
|
|
||||||
too. This is the default for 32-bit x86
|
|
||||||
Windows builds. Unless the compiler
|
|
||||||
supports __attribute__((__constructor__)),
|
|
||||||
the 'win95' threading is incompatible with
|
|
||||||
--enable-small.
|
|
||||||
|
|
||||||
vista Use Windows Vista compatible threads. The
|
|
||||||
resulting binaries won't run on Windows XP
|
|
||||||
or older. This is the default for Windows
|
|
||||||
excluding 32-bit x86 builds (that is, on
|
|
||||||
x86-64 the default is 'vista').
|
|
||||||
|
|
||||||
no Disable threading support. This is the
|
|
||||||
same as using --disable-threads.
|
|
||||||
NOTE: If combined with --enable-small
|
|
||||||
and the compiler doesn't support
|
|
||||||
__attribute__((__constructor__)), the
|
|
||||||
resulting liblzma won't be thread safe,
|
|
||||||
that is, if a multi-threaded application
|
|
||||||
calls any liblzma functions from more than
|
|
||||||
one thread, something bad may happen.
|
|
||||||
|
|
||||||
--enable-sandbox=METHOD
|
|
||||||
XZ_SANDBOX=METHOD
|
|
||||||
There is limited sandboxing support in the xz and xzdec
|
|
||||||
tools. If built with sandbox support, xz uses it
|
|
||||||
automatically when (de)compressing exactly one file to
|
|
||||||
standard output when the options --files or --files0 aren't
|
|
||||||
used. This is a common use case, for example,
|
|
||||||
(de)compressing .tar.xz files via GNU tar. The sandbox is
|
|
||||||
also used for single-file 'xz --test' or 'xz --list'.
|
|
||||||
xzdec always uses the sandbox, except when more than one
|
|
||||||
file are decompressed. In this case it will enable the
|
|
||||||
sandbox for the last file that is decompressed.
|
|
||||||
|
|
||||||
Supported METHODs:
|
|
||||||
|
|
||||||
auto Look for a supported sandboxing method
|
|
||||||
and use it if found. If no method is
|
|
||||||
found, then sandboxing isn't used.
|
|
||||||
This is the default.
|
|
||||||
|
|
||||||
no Disable sandboxing support.
|
|
||||||
|
|
||||||
capsicum
|
|
||||||
Use Capsicum (FreeBSD >= 10.2) for
|
|
||||||
sandboxing. If no Capsicum support
|
|
||||||
is found, configure will give an error.
|
|
||||||
|
|
||||||
pledge Use pledge(2) (OpenBSD >= 5.9) for
|
|
||||||
sandboxing. If pledge(2) isn't found,
|
|
||||||
configure will give an error.
|
|
||||||
|
|
||||||
landlock
|
|
||||||
Use Landlock (Linux >= 5.13) for
|
|
||||||
sandboxing. If no Landlock support
|
|
||||||
is found, configure will give an error.
|
|
||||||
|
|
||||||
--enable-symbol-versions[=VARIANT]
|
|
||||||
XZ_SYMBOL_VERSIONING=VARIANT
|
|
||||||
Use symbol versioning for liblzma shared library.
|
|
||||||
This is enabled by default on GNU/Linux (glibc only),
|
|
||||||
other GNU-based systems, and FreeBSD.
|
|
||||||
|
|
||||||
Symbol versioning is never used for static liblzma. This
|
|
||||||
option is ignored when not building a shared library.
|
|
||||||
|
|
||||||
Supported VARIANTs:
|
|
||||||
|
|
||||||
no Disable symbol versioning. This is the
|
|
||||||
same as using --disable-symbol-versions.
|
|
||||||
|
|
||||||
auto Autodetect between "no", "linux",
|
|
||||||
and "generic".
|
|
||||||
|
|
||||||
yes Autodetect between "linux" and
|
|
||||||
"generic". This forces symbol
|
|
||||||
versioning to be used when
|
|
||||||
building a shared library.
|
|
||||||
|
|
||||||
generic Generic version is the default for
|
|
||||||
FreeBSD and GNU/Linux on MicroBlaze.
|
|
||||||
|
|
||||||
This is also used on GNU/Linux when
|
|
||||||
building with NVIDIA HPC Compiler
|
|
||||||
because the compiler doesn't support
|
|
||||||
the features required for the "linux"
|
|
||||||
variant below.
|
|
||||||
|
|
||||||
linux Special version for GNU/Linux (glibc
|
|
||||||
only). This adds a few extra symbol
|
|
||||||
versions for compatibility with binaries
|
|
||||||
that have been linked against a liblzma
|
|
||||||
version that has been patched with
|
|
||||||
"xz-5.2.2-compat-libs.patch" from
|
|
||||||
RHEL/CentOS 7. That patch was used
|
|
||||||
by some build tools outside of
|
|
||||||
RHEL/CentOS 7 too.
|
|
||||||
|
|
||||||
--enable-debug
|
|
||||||
This enables the assert() macro and possibly some other
|
|
||||||
run-time consistency checks. It makes the code slower, so
|
|
||||||
you normally don't want to have this enabled.
|
|
||||||
|
|
||||||
In CMake, the build type (CMAKE_BUILD_TYPE) controls if
|
|
||||||
-DNDEBUG is passed to the compiler. *In this package*,
|
|
||||||
an empty build type disables debugging code too.
|
|
||||||
Non-standard build types like "None" do NOT disable
|
|
||||||
debugging code!
|
|
||||||
|
|
||||||
To enable debugging code with empty build type in CMake,
|
|
||||||
use -UNDEBUG in the CFLAGS environment variable or in
|
|
||||||
the CMAKE_C_FLAGS CMake variable to override -DNDEBUG.
|
|
||||||
|
|
||||||
--enable-werror
|
|
||||||
CMAKE_COMPILE_WARNING_AS_ERROR=ON (CMake >= 3.24)
|
|
||||||
If building with GCC, make all compiler warnings an error,
|
|
||||||
that abort the compilation. This may help catching bugs,
|
|
||||||
and should work on most systems. This has no effect on the
|
|
||||||
resulting binaries.
|
|
||||||
|
|
||||||
--enable-path-for-scripts=PREFIX
|
|
||||||
(CMake determines this from the path of XZ_POSIX_SHELL)
|
|
||||||
If PREFIX isn't empty, PATH=PREFIX:$PATH will be set in
|
|
||||||
the beginning of the scripts (xzgrep and others).
|
|
||||||
The default is empty except on Solaris the default is
|
|
||||||
/usr/xpg4/bin.
|
|
||||||
|
|
||||||
This can be useful if the default PATH doesn't contain
|
|
||||||
modern POSIX tools (as can be the case on Solaris) or if
|
|
||||||
one wants to ensure that the correct xz binary is in the
|
|
||||||
PATH for the scripts. Note that the latter use can break
|
|
||||||
"make check" if the prefixed PATH causes a wrong xz binary
|
|
||||||
(other than the one that was just built) to be used.
|
|
||||||
|
|
||||||
Older xz releases support a different method for setting
|
|
||||||
the PATH for the scripts. It is described in section 3.2
|
|
||||||
and is supported in this xz version too.
|
|
||||||
|
|
||||||
gl_cv_posix_shell=/path/to/bin/sh
|
|
||||||
XZ_POSIX_SHELL=/path/to/bin/sh
|
|
||||||
POSIX shell to use for xzgrep and other scripts.
|
|
||||||
|
|
||||||
- configure should autodetect this well enough.
|
|
||||||
Typically it's /bin/sh but in some cases, like
|
|
||||||
Solaris, something else is used.
|
|
||||||
|
|
||||||
- CMake build uses /bin/sh except on Solaris the
|
|
||||||
default is /usr/xpg4/bin/sh.
|
|
||||||
|
|
||||||
CMAKE_DLL_NAME_WITH_SOVERSION=ON
|
|
||||||
CMake on native Windows (not Cygwin) only:
|
|
||||||
|
|
||||||
This changes the filename liblzma.dll to liblzma-5.dll.
|
|
||||||
|
|
||||||
The unversioned filename liblzma.dll has been used
|
|
||||||
since XZ Utils 5.0.0 when creating binary packages
|
|
||||||
using the included windows/build.bash. The same
|
|
||||||
unversioned filename is the default with CMake.
|
|
||||||
However, there are popular builds that, very
|
|
||||||
understandably and reasonably, use the versioned
|
|
||||||
filename produced by GNU Libtool.
|
|
||||||
|
|
||||||
This option should usually be left to its default value
|
|
||||||
(OFF). It can be set to ON if the liblzma DLL filename
|
|
||||||
must be compatible with the versioned filename
|
|
||||||
produced by GNU Libtool. For example, binaries
|
|
||||||
distributed in MSYS2 use a versioned DLL filename.
|
|
||||||
|
|
||||||
|
|
||||||
2.1. Static vs. dynamic linking of liblzma
|
|
||||||
|
|
||||||
On 32-bit x86, linking against static liblzma can give a minor
|
|
||||||
speed improvement. Static libraries on x86 are usually compiled as
|
|
||||||
position-dependent code (non-PIC) and shared libraries are built as
|
|
||||||
position-independent code (PIC). PIC wastes one register, which can
|
|
||||||
make the code slightly slower compared to a non-PIC version. (Note
|
|
||||||
that this doesn't apply to x86-64.)
|
|
||||||
|
|
||||||
If you want to link xz against static liblzma, the simplest way
|
|
||||||
is to pass --disable-shared to configure. If you want also shared
|
|
||||||
liblzma, run configure again and run "make install" only for
|
|
||||||
src/liblzma.
|
|
||||||
|
|
||||||
|
|
||||||
2.2. Optimizing xzdec and lzmadec
|
|
||||||
|
|
||||||
xzdec and lzmadec are intended to be relatively small instead of
|
|
||||||
optimizing for the best speed. Thus, it is a good idea to build
|
|
||||||
xzdec and lzmadec separately:
|
|
||||||
|
|
||||||
- To link the tools against static liblzma, pass --disable-shared
|
|
||||||
to configure.
|
|
||||||
|
|
||||||
- To select somewhat size-optimized variant of some things in
|
|
||||||
liblzma, pass --enable-small to configure.
|
|
||||||
|
|
||||||
- Tell the compiler to optimize for size instead of speed.
|
|
||||||
For example, with GCC, put -Os into CFLAGS.
|
|
||||||
|
|
||||||
- xzdec and lzmadec will never use multithreading capabilities of
|
|
||||||
liblzma. You can avoid dependency on libpthread by passing
|
|
||||||
--disable-threads to configure.
|
|
||||||
|
|
||||||
- There are and will be no translated messages for xzdec and
|
|
||||||
lzmadec, so it is fine to pass also --disable-nls to configure.
|
|
||||||
|
|
||||||
- Only decoder code is needed, so you can speed up the build
|
|
||||||
slightly by passing --disable-encoders to configure. This
|
|
||||||
shouldn't affect the final size of the executables though,
|
|
||||||
because the linker is able to omit the encoder code anyway.
|
|
||||||
|
|
||||||
If you have no use for xzdec or lzmadec, you can disable them with
|
|
||||||
--disable-xzdec and --disable-lzmadec.
|
|
||||||
|
|
||||||
|
|
||||||
3. xzgrep and other scripts
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
3.1. Dependencies
|
|
||||||
|
|
||||||
POSIX shell (sh) and bunch of other standard POSIX tools are required
|
|
||||||
to run the scripts. The configure script tries to find a POSIX
|
|
||||||
compliant sh, but if it fails, you can force the shell by passing
|
|
||||||
gl_cv_posix_shell=/path/to/posix-sh as an argument to the configure
|
|
||||||
script.
|
|
||||||
|
|
||||||
xzdiff (xzcmp/lzdiff/lzcmp) may use mktemp if it is available. As
|
|
||||||
a fallback xzdiff will use mkdir to securely create a temporary
|
|
||||||
directory. Having mktemp available is still recommended since the
|
|
||||||
mkdir fallback method isn't as robust as mktemp is. The original
|
|
||||||
mktemp can be found from <https://www.mktemp.org/>. On GNU, most will
|
|
||||||
use the mktemp program from GNU coreutils instead of the original
|
|
||||||
implementation. Both mktemp versions are fine.
|
|
||||||
|
|
||||||
In addition to using xz to decompress .xz files, xzgrep and xzdiff
|
|
||||||
use gzip, bzip2, and lzop to support .gz, bz2, and .lzo files.
|
|
||||||
|
|
||||||
|
|
||||||
3.2. PATH
|
|
||||||
|
|
||||||
The method described below is supported by older xz releases.
|
|
||||||
It is supported by the current version too, but the newer
|
|
||||||
--enable-path-for-scripts=PREFIX described in section 2 may be
|
|
||||||
more convenient.
|
|
||||||
|
|
||||||
The scripts assume that the required tools (standard POSIX utilities,
|
|
||||||
mktemp, and xz) are in PATH; the scripts don't set the PATH themselves
|
|
||||||
(except as described for --enable-path-for-scripts=PREFIX). Some
|
|
||||||
people like this while some think this is a bug. Those in the latter
|
|
||||||
group can easily patch the scripts before running the configure script
|
|
||||||
by taking advantage of a placeholder line in the scripts.
|
|
||||||
|
|
||||||
For example, to make the scripts prefix /usr/bin:/bin to PATH:
|
|
||||||
|
|
||||||
perl -pi -e 's|^#SET_PATH.*$|PATH=/usr/bin:/bin:\$PATH|' \
|
|
||||||
src/scripts/xz*.in
|
|
||||||
|
|
||||||
|
|
||||||
4. Tests
|
|
||||||
--------
|
|
||||||
|
|
||||||
The test framework can be built and run by executing "make check" in
|
|
||||||
the build directory. The tests are a mix of executables and POSIX
|
|
||||||
shell scripts (sh). All tests should pass if the default configuration
|
|
||||||
is used. Disabling features through the configure options may cause
|
|
||||||
some tests to be skipped. If any tests do not pass, see section 5.5.
|
|
||||||
|
|
||||||
|
|
||||||
4.1. Testing in parallel
|
|
||||||
|
|
||||||
The tests can be run in parallel using the "-j" make option on systems
|
|
||||||
that support it. For instance, "make -j4 check" will run up to four
|
|
||||||
tests simultaneously.
|
|
||||||
|
|
||||||
|
|
||||||
4.2. Cross compiling
|
|
||||||
|
|
||||||
The tests can be built without running them:
|
|
||||||
|
|
||||||
make check TESTS=
|
|
||||||
|
|
||||||
The TESTS variable is the list of tests you wish to run. Leaving it
|
|
||||||
empty will compile the tests without running any.
|
|
||||||
|
|
||||||
If the tests are copied to a target machine to execute, the test data
|
|
||||||
files in the directory tests/files must also be copied. The tests
|
|
||||||
search for the data files using the environment variable $srcdir,
|
|
||||||
expecting to find the data files under $srcdir/files/. If $srcdir
|
|
||||||
isn't set then it defaults to the current directory.
|
|
||||||
|
|
||||||
The shell script tests can be copied from the source directory to the
|
|
||||||
target machine to execute. In addition to the test files, these tests
|
|
||||||
will expect the following relative file paths to execute properly:
|
|
||||||
|
|
||||||
./create_compress_files
|
|
||||||
../config.h
|
|
||||||
../src/xz/xz
|
|
||||||
../src/xzdec/xzdec
|
|
||||||
../src/scripts/xzdiff
|
|
||||||
../src/scripts/xzgrep
|
|
||||||
|
|
||||||
|
|
||||||
5. Troubleshooting
|
|
||||||
------------------
|
|
||||||
|
|
||||||
5.1. "No C99 compiler was found."
|
|
||||||
|
|
||||||
You need a C99 compiler to build XZ Utils. If the configure script
|
|
||||||
cannot find a C99 compiler and you think you have such a compiler
|
|
||||||
installed, set the compiler command by passing CC=/path/to/c99 as
|
|
||||||
an argument to the configure script.
|
|
||||||
|
|
||||||
If you get this error even when you think your compiler supports C99,
|
|
||||||
you can override the test by passing ac_cv_prog_cc_c99= as an argument
|
|
||||||
to the configure script. The test for C99 compiler is not perfect (and
|
|
||||||
it is not as easy to make it perfect as it sounds), so sometimes this
|
|
||||||
may be needed. You will get a compile error if your compiler doesn't
|
|
||||||
support enough C99.
|
|
||||||
|
|
||||||
|
|
||||||
5.2. "No POSIX conforming shell (sh) was found."
|
|
||||||
|
|
||||||
xzgrep and other scripts need a shell that (roughly) conforms
|
|
||||||
to POSIX. The configure script tries to find such a shell. If
|
|
||||||
it fails, you can force the shell to be used by passing
|
|
||||||
gl_cv_posix_shell=/path/to/posix-sh as an argument to the configure
|
|
||||||
script. Alternatively you can omit the installation of scripts and
|
|
||||||
this error by passing --disable-scripts to configure.
|
|
||||||
|
|
||||||
|
|
||||||
5.3. configure works but build fails at crc32_x86.S
|
|
||||||
|
|
||||||
The easy fix is to pass --disable-assembler to the configure script.
|
|
||||||
|
|
||||||
The configure script determines if assembler code can be used by
|
|
||||||
looking at the configure triplet; there is currently no check if
|
|
||||||
the assembler code can actually be built. The x86 assembler
|
|
||||||
code should work on x86 GNU/Linux, *BSDs, Solaris, Darwin, MinGW,
|
|
||||||
Cygwin, and DJGPP. On other x86 systems, there may be problems and
|
|
||||||
the assembler code may need to be disabled with the configure option.
|
|
||||||
|
|
||||||
If you get this error when building for x86-64, you have specified or
|
|
||||||
the configure script has misguessed your architecture. Pass the
|
|
||||||
correct configure triplet using the --build=CPU-COMPANY-SYSTEM option
|
|
||||||
(see INSTALL.generic).
|
|
||||||
|
|
||||||
|
|
||||||
5.4. Lots of warnings about symbol visibility
|
|
||||||
|
|
||||||
On some systems where symbol visibility isn't supported, GCC may
|
|
||||||
still accept the visibility options and attributes, which will make
|
|
||||||
configure think that visibility is supported. This will result in
|
|
||||||
many compiler warnings. You can avoid the warnings by forcing the
|
|
||||||
visibility support off by passing gl_cv_cc_visibility=no as an
|
|
||||||
argument to the configure script. This has no effect on the
|
|
||||||
resulting binaries, but fewer warnings looks nicer and may allow
|
|
||||||
using --enable-werror.
|
|
||||||
|
|
||||||
|
|
||||||
5.5. "make check" fails
|
|
||||||
|
|
||||||
If the other tests pass but test_scripts.sh fails, then the problem
|
|
||||||
is in the scripts in src/scripts. Comparing the contents of
|
|
||||||
tests/xzgrep_test_output to tests/xzgrep_expected_output might
|
|
||||||
give a good idea about problems in xzgrep. One possibility is that
|
|
||||||
some tools are missing from the current PATH or the tools lack
|
|
||||||
support for some POSIX features. This can happen at least on
|
|
||||||
Solaris where the tools in /bin may be ancient but good enough
|
|
||||||
tools are available in /usr/xpg4/bin or /usr/xpg6/bin. For possible
|
|
||||||
fixes, see --enable-path-for-scripts=PREFIX in section 2 and the
|
|
||||||
older alternative method described in section 3.2 of this file.
|
|
||||||
|
|
||||||
If tests other than test_scripts.sh fail, a likely reason is that
|
|
||||||
libtool links the test programs against an installed version of
|
|
||||||
liblzma instead of the version that was just built. This is
|
|
||||||
obviously a bug which seems to happen on some platforms.
|
|
||||||
A workaround is to uninstall the old liblzma versions first.
|
|
||||||
|
|
||||||
If the problem isn't any of those described above, then it's likely
|
|
||||||
a bug in XZ Utils or in the compiler. See the platform-specific
|
|
||||||
notes in this file for possible known problems. Please report
|
|
||||||
a bug if you cannot solve the problem. See README for contact
|
|
||||||
information.
|
|
||||||
|
|
||||||
|
|
||||||
5.6. liblzma.so (or similar) not found when running xz
|
|
||||||
|
|
||||||
If you installed the package with "make install" and get an error
|
|
||||||
about liblzma.so (or a similarly named file) being missing, try
|
|
||||||
running "ldconfig" to update the run-time linker cache (if your
|
|
||||||
operating system has such a command).
|
|
||||||
|
|
||||||
368
INSTALL.generic
368
INSTALL.generic
@ -1,368 +0,0 @@
|
|||||||
Installation Instructions
|
|
||||||
*************************
|
|
||||||
|
|
||||||
Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
|
|
||||||
Foundation, Inc.
|
|
||||||
|
|
||||||
Copying and distribution of this file, with or without modification,
|
|
||||||
are permitted in any medium without royalty provided the copyright
|
|
||||||
notice and this notice are preserved. This file is offered as-is,
|
|
||||||
without warranty of any kind.
|
|
||||||
|
|
||||||
Basic Installation
|
|
||||||
==================
|
|
||||||
|
|
||||||
Briefly, the shell command './configure && make && make install'
|
|
||||||
should configure, build, and install this package. The following
|
|
||||||
more-detailed instructions are generic; see the 'README' file for
|
|
||||||
instructions specific to this package. Some packages provide this
|
|
||||||
'INSTALL' file but do not implement all of the features documented
|
|
||||||
below. The lack of an optional feature in a given package is not
|
|
||||||
necessarily a bug. More recommendations for GNU packages can be found
|
|
||||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
|
||||||
|
|
||||||
The 'configure' shell script attempts to guess correct values for
|
|
||||||
various system-dependent variables used during compilation. It uses
|
|
||||||
those values to create a 'Makefile' in each directory of the package.
|
|
||||||
It may also create one or more '.h' files containing system-dependent
|
|
||||||
definitions. Finally, it creates a shell script 'config.status' that
|
|
||||||
you can run in the future to recreate the current configuration, and a
|
|
||||||
file 'config.log' containing compiler output (useful mainly for
|
|
||||||
debugging 'configure').
|
|
||||||
|
|
||||||
It can also use an optional file (typically called 'config.cache' and
|
|
||||||
enabled with '--cache-file=config.cache' or simply '-C') that saves the
|
|
||||||
results of its tests to speed up reconfiguring. Caching is disabled by
|
|
||||||
default to prevent problems with accidental use of stale cache files.
|
|
||||||
|
|
||||||
If you need to do unusual things to compile the package, please try
|
|
||||||
to figure out how 'configure' could check whether to do them, and mail
|
|
||||||
diffs or instructions to the address given in the 'README' so they can
|
|
||||||
be considered for the next release. If you are using the cache, and at
|
|
||||||
some point 'config.cache' contains results you don't want to keep, you
|
|
||||||
may remove or edit it.
|
|
||||||
|
|
||||||
The file 'configure.ac' (or 'configure.in') is used to create
|
|
||||||
'configure' by a program called 'autoconf'. You need 'configure.ac' if
|
|
||||||
you want to change it or regenerate 'configure' using a newer version of
|
|
||||||
'autoconf'.
|
|
||||||
|
|
||||||
The simplest way to compile this package is:
|
|
||||||
|
|
||||||
1. 'cd' to the directory containing the package's source code and type
|
|
||||||
'./configure' to configure the package for your system.
|
|
||||||
|
|
||||||
Running 'configure' might take a while. While running, it prints
|
|
||||||
some messages telling which features it is checking for.
|
|
||||||
|
|
||||||
2. Type 'make' to compile the package.
|
|
||||||
|
|
||||||
3. Optionally, type 'make check' to run any self-tests that come with
|
|
||||||
the package, generally using the just-built uninstalled binaries.
|
|
||||||
|
|
||||||
4. Type 'make install' to install the programs and any data files and
|
|
||||||
documentation. When installing into a prefix owned by root, it is
|
|
||||||
recommended that the package be configured and built as a regular
|
|
||||||
user, and only the 'make install' phase executed with root
|
|
||||||
privileges.
|
|
||||||
|
|
||||||
5. Optionally, type 'make installcheck' to repeat any self-tests, but
|
|
||||||
this time using the binaries in their final installed location.
|
|
||||||
This target does not install anything. Running this target as a
|
|
||||||
regular user, particularly if the prior 'make install' required
|
|
||||||
root privileges, verifies that the installation completed
|
|
||||||
correctly.
|
|
||||||
|
|
||||||
6. You can remove the program binaries and object files from the
|
|
||||||
source code directory by typing 'make clean'. To also remove the
|
|
||||||
files that 'configure' created (so you can compile the package for
|
|
||||||
a different kind of computer), type 'make distclean'. There is
|
|
||||||
also a 'make maintainer-clean' target, but that is intended mainly
|
|
||||||
for the package's developers. If you use it, you may have to get
|
|
||||||
all sorts of other programs in order to regenerate files that came
|
|
||||||
with the distribution.
|
|
||||||
|
|
||||||
7. Often, you can also type 'make uninstall' to remove the installed
|
|
||||||
files again. In practice, not all packages have tested that
|
|
||||||
uninstallation works correctly, even though it is required by the
|
|
||||||
GNU Coding Standards.
|
|
||||||
|
|
||||||
8. Some packages, particularly those that use Automake, provide 'make
|
|
||||||
distcheck', which can by used by developers to test that all other
|
|
||||||
targets like 'make install' and 'make uninstall' work correctly.
|
|
||||||
This target is generally not run by end users.
|
|
||||||
|
|
||||||
Compilers and Options
|
|
||||||
=====================
|
|
||||||
|
|
||||||
Some systems require unusual options for compilation or linking that
|
|
||||||
the 'configure' script does not know about. Run './configure --help'
|
|
||||||
for details on some of the pertinent environment variables.
|
|
||||||
|
|
||||||
You can give 'configure' initial values for configuration parameters
|
|
||||||
by setting variables in the command line or in the environment. Here is
|
|
||||||
an example:
|
|
||||||
|
|
||||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
|
||||||
|
|
||||||
*Note Defining Variables::, for more details.
|
|
||||||
|
|
||||||
Compiling For Multiple Architectures
|
|
||||||
====================================
|
|
||||||
|
|
||||||
You can compile the package for more than one kind of computer at the
|
|
||||||
same time, by placing the object files for each architecture in their
|
|
||||||
own directory. To do this, you can use GNU 'make'. 'cd' to the
|
|
||||||
directory where you want the object files and executables to go and run
|
|
||||||
the 'configure' script. 'configure' automatically checks for the source
|
|
||||||
code in the directory that 'configure' is in and in '..'. This is known
|
|
||||||
as a "VPATH" build.
|
|
||||||
|
|
||||||
With a non-GNU 'make', it is safer to compile the package for one
|
|
||||||
architecture at a time in the source code directory. After you have
|
|
||||||
installed the package for one architecture, use 'make distclean' before
|
|
||||||
reconfiguring for another architecture.
|
|
||||||
|
|
||||||
On MacOS X 10.5 and later systems, you can create libraries and
|
|
||||||
executables that work on multiple system types--known as "fat" or
|
|
||||||
"universal" binaries--by specifying multiple '-arch' options to the
|
|
||||||
compiler but only a single '-arch' option to the preprocessor. Like
|
|
||||||
this:
|
|
||||||
|
|
||||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
|
||||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
|
||||||
CPP="gcc -E" CXXCPP="g++ -E"
|
|
||||||
|
|
||||||
This is not guaranteed to produce working output in all cases, you
|
|
||||||
may have to build one architecture at a time and combine the results
|
|
||||||
using the 'lipo' tool if you have problems.
|
|
||||||
|
|
||||||
Installation Names
|
|
||||||
==================
|
|
||||||
|
|
||||||
By default, 'make install' installs the package's commands under
|
|
||||||
'/usr/local/bin', include files under '/usr/local/include', etc. You
|
|
||||||
can specify an installation prefix other than '/usr/local' by giving
|
|
||||||
'configure' the option '--prefix=PREFIX', where PREFIX must be an
|
|
||||||
absolute file name.
|
|
||||||
|
|
||||||
You can specify separate installation prefixes for
|
|
||||||
architecture-specific files and architecture-independent files. If you
|
|
||||||
pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
|
|
||||||
PREFIX as the prefix for installing programs and libraries.
|
|
||||||
Documentation and other data files still use the regular prefix.
|
|
||||||
|
|
||||||
In addition, if you use an unusual directory layout you can give
|
|
||||||
options like '--bindir=DIR' to specify different values for particular
|
|
||||||
kinds of files. Run 'configure --help' for a list of the directories
|
|
||||||
you can set and what kinds of files go in them. In general, the default
|
|
||||||
for these options is expressed in terms of '${prefix}', so that
|
|
||||||
specifying just '--prefix' will affect all of the other directory
|
|
||||||
specifications that were not explicitly provided.
|
|
||||||
|
|
||||||
The most portable way to affect installation locations is to pass the
|
|
||||||
correct locations to 'configure'; however, many packages provide one or
|
|
||||||
both of the following shortcuts of passing variable assignments to the
|
|
||||||
'make install' command line to change installation locations without
|
|
||||||
having to reconfigure or recompile.
|
|
||||||
|
|
||||||
The first method involves providing an override variable for each
|
|
||||||
affected directory. For example, 'make install
|
|
||||||
prefix=/alternate/directory' will choose an alternate location for all
|
|
||||||
directory configuration variables that were expressed in terms of
|
|
||||||
'${prefix}'. Any directories that were specified during 'configure',
|
|
||||||
but not in terms of '${prefix}', must each be overridden at install time
|
|
||||||
for the entire installation to be relocated. The approach of makefile
|
|
||||||
variable overrides for each directory variable is required by the GNU
|
|
||||||
Coding Standards, and ideally causes no recompilation. However, some
|
|
||||||
platforms have known limitations with the semantics of shared libraries
|
|
||||||
that end up requiring recompilation when using this method, particularly
|
|
||||||
noticeable in packages that use GNU Libtool.
|
|
||||||
|
|
||||||
The second method involves providing the 'DESTDIR' variable. For
|
|
||||||
example, 'make install DESTDIR=/alternate/directory' will prepend
|
|
||||||
'/alternate/directory' before all installation names. The approach of
|
|
||||||
'DESTDIR' overrides is not required by the GNU Coding Standards, and
|
|
||||||
does not work on platforms that have drive letters. On the other hand,
|
|
||||||
it does better at avoiding recompilation issues, and works well even
|
|
||||||
when some directory options were not specified in terms of '${prefix}'
|
|
||||||
at 'configure' time.
|
|
||||||
|
|
||||||
Optional Features
|
|
||||||
=================
|
|
||||||
|
|
||||||
If the package supports it, you can cause programs to be installed
|
|
||||||
with an extra prefix or suffix on their names by giving 'configure' the
|
|
||||||
option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
|
|
||||||
|
|
||||||
Some packages pay attention to '--enable-FEATURE' options to
|
|
||||||
'configure', where FEATURE indicates an optional part of the package.
|
|
||||||
They may also pay attention to '--with-PACKAGE' options, where PACKAGE
|
|
||||||
is something like 'gnu-as' or 'x' (for the X Window System). The
|
|
||||||
'README' should mention any '--enable-' and '--with-' options that the
|
|
||||||
package recognizes.
|
|
||||||
|
|
||||||
For packages that use the X Window System, 'configure' can usually
|
|
||||||
find the X include and library files automatically, but if it doesn't,
|
|
||||||
you can use the 'configure' options '--x-includes=DIR' and
|
|
||||||
'--x-libraries=DIR' to specify their locations.
|
|
||||||
|
|
||||||
Some packages offer the ability to configure how verbose the
|
|
||||||
execution of 'make' will be. For these packages, running './configure
|
|
||||||
--enable-silent-rules' sets the default to minimal output, which can be
|
|
||||||
overridden with 'make V=1'; while running './configure
|
|
||||||
--disable-silent-rules' sets the default to verbose, which can be
|
|
||||||
overridden with 'make V=0'.
|
|
||||||
|
|
||||||
Particular systems
|
|
||||||
==================
|
|
||||||
|
|
||||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC
|
|
||||||
is not installed, it is recommended to use the following options in
|
|
||||||
order to use an ANSI C compiler:
|
|
||||||
|
|
||||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
|
||||||
|
|
||||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
|
||||||
|
|
||||||
HP-UX 'make' updates targets which have the same time stamps as their
|
|
||||||
prerequisites, which makes it generally unusable when shipped generated
|
|
||||||
files such as 'configure' are involved. Use GNU 'make' instead.
|
|
||||||
|
|
||||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
|
||||||
parse its '<wchar.h>' header file. The option '-nodtk' can be used as a
|
|
||||||
workaround. If GNU CC is not installed, it is therefore recommended to
|
|
||||||
try
|
|
||||||
|
|
||||||
./configure CC="cc"
|
|
||||||
|
|
||||||
and if that doesn't work, try
|
|
||||||
|
|
||||||
./configure CC="cc -nodtk"
|
|
||||||
|
|
||||||
On Solaris, don't put '/usr/ucb' early in your 'PATH'. This
|
|
||||||
directory contains several dysfunctional programs; working variants of
|
|
||||||
these programs are available in '/usr/bin'. So, if you need '/usr/ucb'
|
|
||||||
in your 'PATH', put it _after_ '/usr/bin'.
|
|
||||||
|
|
||||||
On Haiku, software installed for all users goes in '/boot/common',
|
|
||||||
not '/usr/local'. It is recommended to use the following options:
|
|
||||||
|
|
||||||
./configure --prefix=/boot/common
|
|
||||||
|
|
||||||
Specifying the System Type
|
|
||||||
==========================
|
|
||||||
|
|
||||||
There may be some features 'configure' cannot figure out
|
|
||||||
automatically, but needs to determine by the type of machine the package
|
|
||||||
will run on. Usually, assuming the package is built to be run on the
|
|
||||||
_same_ architectures, 'configure' can figure that out, but if it prints
|
|
||||||
a message saying it cannot guess the machine type, give it the
|
|
||||||
'--build=TYPE' option. TYPE can either be a short name for the system
|
|
||||||
type, such as 'sun4', or a canonical name which has the form:
|
|
||||||
|
|
||||||
CPU-COMPANY-SYSTEM
|
|
||||||
|
|
||||||
where SYSTEM can have one of these forms:
|
|
||||||
|
|
||||||
OS
|
|
||||||
KERNEL-OS
|
|
||||||
|
|
||||||
See the file 'config.sub' for the possible values of each field. If
|
|
||||||
'config.sub' isn't included in this package, then this package doesn't
|
|
||||||
need to know the machine type.
|
|
||||||
|
|
||||||
If you are _building_ compiler tools for cross-compiling, you should
|
|
||||||
use the option '--target=TYPE' to select the type of system they will
|
|
||||||
produce code for.
|
|
||||||
|
|
||||||
If you want to _use_ a cross compiler, that generates code for a
|
|
||||||
platform different from the build platform, you should specify the
|
|
||||||
"host" platform (i.e., that on which the generated programs will
|
|
||||||
eventually be run) with '--host=TYPE'.
|
|
||||||
|
|
||||||
Sharing Defaults
|
|
||||||
================
|
|
||||||
|
|
||||||
If you want to set default values for 'configure' scripts to share,
|
|
||||||
you can create a site shell script called 'config.site' that gives
|
|
||||||
default values for variables like 'CC', 'cache_file', and 'prefix'.
|
|
||||||
'configure' looks for 'PREFIX/share/config.site' if it exists, then
|
|
||||||
'PREFIX/etc/config.site' if it exists. Or, you can set the
|
|
||||||
'CONFIG_SITE' environment variable to the location of the site script.
|
|
||||||
A warning: not all 'configure' scripts look for a site script.
|
|
||||||
|
|
||||||
Defining Variables
|
|
||||||
==================
|
|
||||||
|
|
||||||
Variables not defined in a site shell script can be set in the
|
|
||||||
environment passed to 'configure'. However, some packages may run
|
|
||||||
configure again during the build, and the customized values of these
|
|
||||||
variables may be lost. In order to avoid this problem, you should set
|
|
||||||
them in the 'configure' command line, using 'VAR=value'. For example:
|
|
||||||
|
|
||||||
./configure CC=/usr/local2/bin/gcc
|
|
||||||
|
|
||||||
causes the specified 'gcc' to be used as the C compiler (unless it is
|
|
||||||
overridden in the site shell script).
|
|
||||||
|
|
||||||
Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
|
|
||||||
Autoconf limitation. Until the limitation is lifted, you can use this
|
|
||||||
workaround:
|
|
||||||
|
|
||||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
|
||||||
|
|
||||||
'configure' Invocation
|
|
||||||
======================
|
|
||||||
|
|
||||||
'configure' recognizes the following options to control how it
|
|
||||||
operates.
|
|
||||||
|
|
||||||
'--help'
|
|
||||||
'-h'
|
|
||||||
Print a summary of all of the options to 'configure', and exit.
|
|
||||||
|
|
||||||
'--help=short'
|
|
||||||
'--help=recursive'
|
|
||||||
Print a summary of the options unique to this package's
|
|
||||||
'configure', and exit. The 'short' variant lists options used only
|
|
||||||
in the top level, while the 'recursive' variant lists options also
|
|
||||||
present in any nested packages.
|
|
||||||
|
|
||||||
'--version'
|
|
||||||
'-V'
|
|
||||||
Print the version of Autoconf used to generate the 'configure'
|
|
||||||
script, and exit.
|
|
||||||
|
|
||||||
'--cache-file=FILE'
|
|
||||||
Enable the cache: use and save the results of the tests in FILE,
|
|
||||||
traditionally 'config.cache'. FILE defaults to '/dev/null' to
|
|
||||||
disable caching.
|
|
||||||
|
|
||||||
'--config-cache'
|
|
||||||
'-C'
|
|
||||||
Alias for '--cache-file=config.cache'.
|
|
||||||
|
|
||||||
'--quiet'
|
|
||||||
'--silent'
|
|
||||||
'-q'
|
|
||||||
Do not print messages saying which checks are being made. To
|
|
||||||
suppress all normal output, redirect it to '/dev/null' (any error
|
|
||||||
messages will still be shown).
|
|
||||||
|
|
||||||
'--srcdir=DIR'
|
|
||||||
Look for the package's source code in directory DIR. Usually
|
|
||||||
'configure' can determine that directory automatically.
|
|
||||||
|
|
||||||
'--prefix=DIR'
|
|
||||||
Use DIR as the installation prefix. *note Installation Names:: for
|
|
||||||
more details, including other options available for fine-tuning the
|
|
||||||
installation locations.
|
|
||||||
|
|
||||||
'--no-create'
|
|
||||||
'-n'
|
|
||||||
Run the configure checks, but stop before creating any output
|
|
||||||
files.
|
|
||||||
|
|
||||||
'configure' also accepts some other, not widely useful, options. Run
|
|
||||||
'configure --help' for more details.
|
|
||||||
124
Makefile.am
124
Makefile.am
@ -1,8 +1,16 @@
|
|||||||
## SPDX-License-Identifier: 0BSD
|
##
|
||||||
## Author: Lasse Collin
|
## Copyright (C) 2007 Lasse Collin
|
||||||
|
##
|
||||||
# Use -n to prevent gzip from adding a timestamp to the .gz headers.
|
## This library is free software; you can redistribute it and/or
|
||||||
GZIP_ENV = -9n
|
## modify it under the terms of the GNU Lesser General Public
|
||||||
|
## License as published by the Free Software Foundation; either
|
||||||
|
## version 2.1 of the License, or (at your option) any later version.
|
||||||
|
##
|
||||||
|
## This library is distributed in the hope that it will be useful,
|
||||||
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
## Lesser General Public License for more details.
|
||||||
|
##
|
||||||
|
|
||||||
DIST_SUBDIRS = lib src po tests debug
|
DIST_SUBDIRS = lib src po tests debug
|
||||||
SUBDIRS =
|
SUBDIRS =
|
||||||
@ -13,111 +21,19 @@ endif
|
|||||||
|
|
||||||
SUBDIRS += src po tests
|
SUBDIRS += src po tests
|
||||||
|
|
||||||
if COND_DOC
|
|
||||||
dist_doc_DATA = \
|
|
||||||
AUTHORS \
|
|
||||||
COPYING \
|
|
||||||
COPYING.0BSD \
|
|
||||||
COPYING.GPLv2 \
|
|
||||||
NEWS \
|
|
||||||
README \
|
|
||||||
THANKS \
|
|
||||||
doc/faq.txt \
|
|
||||||
doc/history.txt \
|
|
||||||
doc/xz-file-format.txt \
|
|
||||||
doc/lzma-file-format.txt
|
|
||||||
|
|
||||||
examplesdir = $(docdir)/examples
|
|
||||||
dist_examples_DATA = \
|
|
||||||
doc/examples/00_README.txt \
|
|
||||||
doc/examples/01_compress_easy.c \
|
|
||||||
doc/examples/02_decompress.c \
|
|
||||||
doc/examples/03_compress_custom.c \
|
|
||||||
doc/examples/04_compress_easy_mt.c \
|
|
||||||
doc/examples/11_file_info.c \
|
|
||||||
doc/examples/Makefile
|
|
||||||
endif
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
cmake \
|
m4 \
|
||||||
dos \
|
config.rpath \
|
||||||
doxygen \
|
Doxyfile.in \
|
||||||
extra \
|
extra \
|
||||||
po4a \
|
doc \
|
||||||
windows \
|
|
||||||
CMakeLists.txt \
|
|
||||||
COPYING.GPLv2 \
|
COPYING.GPLv2 \
|
||||||
COPYING.GPLv3 \
|
COPYING.GPLv3 \
|
||||||
COPYING.LGPLv2.1 \
|
COPYING.LGPLv2.1
|
||||||
INSTALL.generic \
|
|
||||||
PACKAGERS \
|
|
||||||
TODO \
|
|
||||||
autogen.sh \
|
|
||||||
build-aux/license-check.sh \
|
|
||||||
build-aux/manconv.sh \
|
|
||||||
build-aux/version.sh \
|
|
||||||
po/xz.pot-header
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
# List of man pages to convert to plain text in the dist-hook target
|
|
||||||
# or to PDF in the pdf-local target.
|
|
||||||
manfiles = \
|
|
||||||
src/xz/xz.1 \
|
|
||||||
src/xzdec/xzdec.1 \
|
|
||||||
src/lzmainfo/lzmainfo.1 \
|
|
||||||
src/scripts/xzdiff.1 \
|
|
||||||
src/scripts/xzgrep.1 \
|
|
||||||
src/scripts/xzless.1 \
|
|
||||||
src/scripts/xzmore.1
|
|
||||||
|
|
||||||
# Create ChangeLog using "git log".
|
|
||||||
# Convert the man pages to plain text (ASCII only) format.
|
|
||||||
dist-hook:
|
|
||||||
if test -d "$(srcdir)/.git" && type git > /dev/null 2>&1; then \
|
|
||||||
( cd "$(srcdir)" && git log --pretty=medium --date=iso --stat \
|
|
||||||
b69da6d4bb6bb11fc0cf066920791990d2b22a06^..HEAD ) \
|
|
||||||
> "$(distdir)/ChangeLog"; \
|
|
||||||
fi
|
|
||||||
if type groff > /dev/null 2>&1; then \
|
|
||||||
dest="$(distdir)/doc/man" && \
|
|
||||||
$(MKDIR_P) "$$dest/txt" && \
|
|
||||||
for FILE in $(manfiles); do \
|
|
||||||
BASE=`basename $$FILE .1` && \
|
|
||||||
$(SHELL) "$(srcdir)/build-aux/manconv.sh" ascii \
|
|
||||||
< "$(srcdir)/$$FILE" \
|
|
||||||
> "$$dest/txt/$$BASE.txt"; \
|
|
||||||
done; \
|
|
||||||
fi
|
|
||||||
cd "$(distdir)" && $(SHELL) "build-aux/license-check.sh"
|
|
||||||
|
|
||||||
# This works with GNU tar and gives cleaner package than normal 'make dist'.
|
# This works with GNU tar and gives cleaner package than normal 'make dist'.
|
||||||
# This also ensures that the translations are up to date (dist-hook
|
|
||||||
# would be too late for that).
|
|
||||||
mydist:
|
mydist:
|
||||||
$(SHELL) "$(srcdir)/src/liblzma/validate_map.sh"
|
TAR_OPTIONS='--owner=0 --group=0 --numeric-owner --mode=u+rw,go+r-w' \
|
||||||
cd po && $(MAKE) xz.pot-update
|
$(MAKE) dist-gzip
|
||||||
cd "$(srcdir)/po4a" && $(SHELL) update-po
|
|
||||||
VERSION=$(VERSION); \
|
|
||||||
if test -d "$(srcdir)/.git" && type git > /dev/null 2>&1; then \
|
|
||||||
$(SHELL) "$(srcdir)/build-aux/license-check.sh" || exit 1; \
|
|
||||||
SNAPSHOT=`cd "$(srcdir)" && git describe --abbrev=8 | cut -b2-`; \
|
|
||||||
test -n "$$SNAPSHOT" && VERSION=$$SNAPSHOT; \
|
|
||||||
fi; \
|
|
||||||
TAR_OPTIONS='--owner=0 --group=0 --numeric-owner --mode=u+rw,go+r-w --sort=name' \
|
|
||||||
LC_COLLATE=C \
|
|
||||||
$(MAKE) VERSION="$$VERSION" dist-gzip
|
|
||||||
|
|
||||||
# NOTE: This only creates the PDFs. The install rules are missing.
|
|
||||||
pdf-local:
|
|
||||||
dest="doc/man" && \
|
|
||||||
$(MKDIR_P) "$$dest/pdf-a4" "$$dest/pdf-letter" && \
|
|
||||||
for FILE in $(manfiles); do \
|
|
||||||
BASE=`basename $$FILE .1` && \
|
|
||||||
$(SHELL) "$(srcdir)/build-aux/manconv.sh" pdf a4 \
|
|
||||||
< "$(srcdir)/$$FILE" \
|
|
||||||
> "$$dest/pdf-a4/$$BASE-a4.pdf" && \
|
|
||||||
$(SHELL) "$(srcdir)/build-aux/manconv.sh" pdf letter \
|
|
||||||
< "$(srcdir)/$$FILE" \
|
|
||||||
> "$$dest/pdf-letter/$$BASE-letter.pdf"; \
|
|
||||||
done
|
|
||||||
|
|||||||
245
PACKAGERS
245
PACKAGERS
@ -1,245 +0,0 @@
|
|||||||
|
|
||||||
Information to packagers of XZ Utils
|
|
||||||
====================================
|
|
||||||
|
|
||||||
0. Preface
|
|
||||||
1. Package naming
|
|
||||||
2. Package description
|
|
||||||
3. License
|
|
||||||
4. configure options
|
|
||||||
5. Additional documentation
|
|
||||||
6. Extra files
|
|
||||||
7. Installing XZ Utils and LZMA Utils in parallel
|
|
||||||
8. Example
|
|
||||||
|
|
||||||
|
|
||||||
0. Preface
|
|
||||||
----------
|
|
||||||
|
|
||||||
This document is meant for people who create and maintain XZ Utils
|
|
||||||
packages for operating system distributions. The focus is on GNU/Linux
|
|
||||||
systems, but most things apply to other systems too.
|
|
||||||
|
|
||||||
While the standard "configure && make DESTDIR=$PKG install" should
|
|
||||||
give a pretty good package, there are some details which packagers
|
|
||||||
may want to tweak.
|
|
||||||
|
|
||||||
Packagers should also read the INSTALL file.
|
|
||||||
|
|
||||||
|
|
||||||
1. Package naming
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
The preferred name for the XZ Utils package is "xz", because that's
|
|
||||||
the name of the upstream tarball. Naturally you may have good reasons
|
|
||||||
to use some other name; I won't get angry about it. ;-) It's just nice
|
|
||||||
to be able to point people to the correct package name without asking
|
|
||||||
what distro they have.
|
|
||||||
|
|
||||||
If your distro policy is to split things into small pieces, here is
|
|
||||||
one suggestion:
|
|
||||||
|
|
||||||
xz xz, xzdec, scripts (xzdiff, xzgrep, etc.), docs
|
|
||||||
xz-lzma lzma, unlzma, lzcat, lzgrep etc. symlinks and
|
|
||||||
lzmadec binary for compatibility with LZMA Utils
|
|
||||||
liblzma liblzma.so.*
|
|
||||||
liblzma-devel liblzma.so, liblzma.a, API headers
|
|
||||||
liblzma-doc Example programs and, if enabled at build time,
|
|
||||||
Doxygen-generated liblzma API docs (HTML)
|
|
||||||
|
|
||||||
|
|
||||||
2. Package description
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Here is a suggestion which you may use as the package description.
|
|
||||||
If you can use only one-line description, pick only the first line.
|
|
||||||
Naturally, feel free to use some other description if you find it
|
|
||||||
better, and maybe send it to me too.
|
|
||||||
|
|
||||||
Library and command line tools for XZ and LZMA compressed files
|
|
||||||
|
|
||||||
XZ Utils provide a general purpose data compression library
|
|
||||||
and command line tools. The native file format is the .xz
|
|
||||||
format, but also the legacy .lzma format is supported. The .xz
|
|
||||||
format supports multiple compression algorithms, of which LZMA2
|
|
||||||
is currently the primary algorithm. With typical files, XZ Utils
|
|
||||||
create about 30 % smaller files than gzip.
|
|
||||||
|
|
||||||
If you are splitting XZ Utils into multiple packages, here are some
|
|
||||||
suggestions for package descriptions:
|
|
||||||
|
|
||||||
xz:
|
|
||||||
|
|
||||||
Command line tools for XZ and LZMA compressed files
|
|
||||||
|
|
||||||
This package includes the xz compression tool and other command
|
|
||||||
line tools from XZ Utils. xz has command line syntax similar to
|
|
||||||
that of gzip. The native file format is the .xz format, but also
|
|
||||||
the legacy .lzma format is supported. The .xz format supports
|
|
||||||
multiple compression algorithms, of which LZMA2 is currently the
|
|
||||||
primary algorithm. With typical files, XZ Utils create about 30 %
|
|
||||||
smaller files than gzip.
|
|
||||||
|
|
||||||
Note that this package doesn't include the files needed for
|
|
||||||
LZMA Utils 4.32.x compatibility. Install also the xz-lzma
|
|
||||||
package to make XZ Utils emulate LZMA Utils 4.32.x.
|
|
||||||
|
|
||||||
xz-lzma:
|
|
||||||
|
|
||||||
LZMA Utils emulation with XZ Utils
|
|
||||||
|
|
||||||
This package includes executables and symlinks to make
|
|
||||||
XZ Utils emulate lzma, unlzma, lzcat, and other command
|
|
||||||
line tools found from the legacy LZMA Utils 4.32.x package.
|
|
||||||
|
|
||||||
liblzma:
|
|
||||||
|
|
||||||
Library for XZ and LZMA compressed files
|
|
||||||
|
|
||||||
liblzma is a general purpose data compression library with
|
|
||||||
an API similar to that of zlib. liblzma supports multiple
|
|
||||||
algorithms, of which LZMA2 is currently the primary algorithm.
|
|
||||||
The native file format is .xz, but also the legacy .lzma
|
|
||||||
format and raw streams (no headers at all) are supported.
|
|
||||||
|
|
||||||
This package includes the shared library.
|
|
||||||
|
|
||||||
liblzma-devel:
|
|
||||||
|
|
||||||
Library for XZ and LZMA compressed files
|
|
||||||
|
|
||||||
This package includes the API headers, static library, and
|
|
||||||
other development files related to liblzma.
|
|
||||||
|
|
||||||
liblzma-doc:
|
|
||||||
|
|
||||||
liblzma API documentation in HTML and example usage
|
|
||||||
|
|
||||||
This package includes the Doxygen-generated liblzma API
|
|
||||||
HTML docs and example programs showing how to use liblzma.
|
|
||||||
|
|
||||||
|
|
||||||
3. License
|
|
||||||
----------
|
|
||||||
|
|
||||||
If the package manager supports a license field, you probably should
|
|
||||||
put GPLv2+ there (GNU GPL v2 or later). The interesting parts of
|
|
||||||
XZ Utils are under the BSD Zero Clause License (0BSD), but some less
|
|
||||||
important files ending up into the binary package are under GPLv2+.
|
|
||||||
So it is simplest to just say GPLv2+ if you cannot specify
|
|
||||||
"BSD0 and GPLv2+".
|
|
||||||
|
|
||||||
If you split XZ Utils into multiple packages as described earlier
|
|
||||||
in this file, liblzma and liblzma-dev packages will contain only
|
|
||||||
0BSD-licensed code from XZ Utils (compiler or linker may add some
|
|
||||||
third-party code which may have other licenses).
|
|
||||||
|
|
||||||
|
|
||||||
4. configure options
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Unless you are building a package for a distribution that is meant
|
|
||||||
only for embedded systems, don't use the following configure options:
|
|
||||||
|
|
||||||
--enable-debug
|
|
||||||
--enable-encoders (*)
|
|
||||||
--enable-decoders
|
|
||||||
--enable-match-finders
|
|
||||||
--enable-checks
|
|
||||||
--enable-small (*)
|
|
||||||
--disable-threads (*)
|
|
||||||
--disable-microlzma (*)
|
|
||||||
--disable-lzip-decoder (*)
|
|
||||||
|
|
||||||
(*) These are OK when building xzdec and lzmadec as described
|
|
||||||
in INSTALL.
|
|
||||||
|
|
||||||
xzdec and lzmadec don't provide any functionality that isn't already
|
|
||||||
available in the xz tool. Shipping xzdec and lzmadec without size
|
|
||||||
optimization and statically-linked liblzma isn't very useful. Doing
|
|
||||||
that would give users the xzdec man page, which may make it easier
|
|
||||||
for people to find out that such tools exists, but the executables
|
|
||||||
wouldn't have any advantage over the full-featured xz.
|
|
||||||
|
|
||||||
|
|
||||||
5. Additional documentation
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
"make install" copies some additional documentation to $docdir
|
|
||||||
(--docdir in configure). There is a copy of the GNU GPL v2, which
|
|
||||||
can be replaced with a symlink if your distro ships with shared
|
|
||||||
copies of the common license texts.
|
|
||||||
|
|
||||||
The Doxygen-generated liblzma API documentation (HTML) is built and
|
|
||||||
installed if the configure option --enable-doxygen is used (it's
|
|
||||||
disabled by default). This requires that Doxygen is available. The
|
|
||||||
API documentation is installed by "make install" to $docdir/api.
|
|
||||||
|
|
||||||
NOTE: The files generated by Doxygen include content from
|
|
||||||
Doxygen itself. Check the license info before distributing
|
|
||||||
the Doxygen-generated files.
|
|
||||||
|
|
||||||
|
|
||||||
6. Extra files
|
|
||||||
--------------
|
|
||||||
|
|
||||||
The "extra" directory contains some small extra tools or other files.
|
|
||||||
The exact set of extra files can vary between XZ Utils releases. The
|
|
||||||
extra files have only limited use or they are too dangerous to be
|
|
||||||
put directly to $bindir (7z2lzma.sh is a good example, since it can
|
|
||||||
silently create corrupt output if certain conditions are not met).
|
|
||||||
|
|
||||||
If you feel like it, you may copy the extra directory under the doc
|
|
||||||
directory (e.g. /usr/share/doc/xz/extra). Maybe some people will find
|
|
||||||
them useful. However, most people needing these tools probably are
|
|
||||||
able to find them from the source package too.
|
|
||||||
|
|
||||||
The "debug" directory contains some tools that are useful only when
|
|
||||||
hacking on XZ Utils. Don't package these tools.
|
|
||||||
|
|
||||||
|
|
||||||
7. Installing XZ Utils and LZMA Utils in parallel
|
|
||||||
-------------------------------------------------
|
|
||||||
|
|
||||||
XZ Utils and LZMA Utils 4.32.x can be installed in parallel by
|
|
||||||
omitting the compatibility symlinks (lzma, unlzma, lzcat, lzgrep etc.)
|
|
||||||
from the XZ Utils package. It's probably a good idea to still package
|
|
||||||
the symlinks into a separate package so that users may choose if they
|
|
||||||
want to use XZ Utils or LZMA Utils for handling .lzma files.
|
|
||||||
|
|
||||||
|
|
||||||
8. Example
|
|
||||||
----------
|
|
||||||
|
|
||||||
Here is an example for i686 GNU/Linux that
|
|
||||||
- links xz and lzmainfo against shared liblzma;
|
|
||||||
- links size-optimized xzdec and lzmadec against static liblzma
|
|
||||||
while avoiding libpthread dependency;
|
|
||||||
- includes only shared liblzma in the final package; and
|
|
||||||
- copies also the "extra" directory to the package.
|
|
||||||
|
|
||||||
PKG=/tmp/xz-pkg
|
|
||||||
tar xf xz-x.y.z.tar.gz
|
|
||||||
cd xz-x.y.z
|
|
||||||
./configure \
|
|
||||||
--prefix=/usr \
|
|
||||||
--disable-static \
|
|
||||||
--disable-xzdec \
|
|
||||||
--disable-lzmadec \
|
|
||||||
CFLAGS='-march=i686 -mtune=generic -O2'
|
|
||||||
make
|
|
||||||
make DESTDIR=$PKG install-strip
|
|
||||||
make clean
|
|
||||||
./configure \
|
|
||||||
--prefix=/usr \
|
|
||||||
--disable-shared \
|
|
||||||
--disable-nls \
|
|
||||||
--disable-encoders \
|
|
||||||
--enable-small \
|
|
||||||
--disable-threads \
|
|
||||||
CFLAGS='-march=i686 -mtune=generic -Os'
|
|
||||||
make -C src/liblzma
|
|
||||||
make -C src/xzdec
|
|
||||||
make -C src/xzdec DESTDIR=$PKG install-strip
|
|
||||||
cp -a extra $PKG/usr/share/doc/xz
|
|
||||||
|
|
||||||
377
README
377
README
@ -1,281 +1,184 @@
|
|||||||
|
|
||||||
XZ Utils
|
LZMA Utils
|
||||||
========
|
----------
|
||||||
|
|
||||||
0. Overview
|
Warning
|
||||||
1. Documentation
|
|
||||||
1.1. Overall documentation
|
This is an early alpha version. Don't trust the files produced by
|
||||||
1.2. Documentation for command-line tools
|
this version of the software - not even if the software can
|
||||||
1.3. Documentation for liblzma
|
uncompress the files properly! This is because the file format
|
||||||
2. Version numbering
|
isn't completely frozen yet.
|
||||||
3. Reporting bugs
|
|
||||||
4. Translations
|
So please test a lot, but don't use for anything serious yet.
|
||||||
4.1. Testing translations
|
|
||||||
5. Other implementations of the .xz format
|
|
||||||
6. Contact information
|
|
||||||
|
|
||||||
|
|
||||||
0. Overview
|
Overview
|
||||||
-----------
|
|
||||||
|
|
||||||
XZ Utils provide a general-purpose data-compression library plus
|
LZMA is a general purporse compression algorithm designed by
|
||||||
command-line tools. The native file format is the .xz format, but
|
Igor Pavlov as part of 7-Zip. It provides high compression ratio
|
||||||
also the legacy .lzma format is supported. The .xz format supports
|
while keeping the decompression speed fast.
|
||||||
multiple compression algorithms, which are called "filters" in the
|
|
||||||
context of XZ Utils. The primary filter is currently LZMA2. With
|
|
||||||
typical files, XZ Utils create about 30 % smaller files than gzip.
|
|
||||||
|
|
||||||
To ease adapting support for the .xz format into existing applications
|
LZMA Utils are an attempt to make LZMA compression easy to use
|
||||||
and scripts, the API of liblzma is somewhat similar to the API of the
|
on free (as in freedom) operating systems. This is achieved by
|
||||||
popular zlib library. For the same reason, the command-line tool xz
|
providing tools and libraries which are similar to use than the
|
||||||
has a command-line syntax similar to that of gzip.
|
equivalents of the most popular existing compression algorithms.
|
||||||
|
|
||||||
When aiming for the highest compression ratio, the LZMA2 encoder uses
|
LZMA Utils consist of a few relatively separate parts:
|
||||||
a lot of CPU time and may use, depending on the settings, even
|
* liblzma is an encoder/decoder library with support for several
|
||||||
hundreds of megabytes of RAM. However, in fast modes, the LZMA2 encoder
|
filters (algorithm implementations). The primary filter is LZMA.
|
||||||
competes with bzip2 in compression speed, RAM usage, and compression
|
* libzfile enables reading from and writing to gzip, bzip2 and
|
||||||
ratio.
|
LZMA compressed and uncompressed files with an API similar to
|
||||||
|
the standard ANSI-C file I/O.
|
||||||
LZMA2 is reasonably fast to decompress. It is a little slower than
|
[ NOTE: libzfile is not implemented yet. ]
|
||||||
gzip, but a lot faster than bzip2. Being fast to decompress means
|
* lzma command line tool has almost identical syntax than gzip
|
||||||
that the .xz format is especially nice when the same file will be
|
and bzip2. It makes LZMA easy for average users, but also
|
||||||
decompressed very many times (usually on different computers), which
|
provides advanced options to finetune the compression settings.
|
||||||
is the case e.g. when distributing software packages. In such
|
* A few shell scripts make diffing and grepping LZMA compressed
|
||||||
situations, it's not too bad if the compression takes some time,
|
files easy. The scripts were adapted from gzip and bzip2.
|
||||||
since that needs to be done only once to benefit many people.
|
|
||||||
|
|
||||||
With some file types, combining (or "chaining") LZMA2 with an
|
|
||||||
additional filter can improve the compression ratio. A filter chain may
|
|
||||||
contain up to four filters, although usually only one or two are used.
|
|
||||||
For example, putting a BCJ (Branch/Call/Jump) filter before LZMA2
|
|
||||||
in the filter chain can improve compression ratio of executable files.
|
|
||||||
|
|
||||||
Since the .xz format allows adding new filter IDs, it is possible that
|
|
||||||
some day there will be a filter that is, for example, much faster to
|
|
||||||
compress than LZMA2 (but probably with worse compression ratio).
|
|
||||||
Similarly, it is possible that some day there is a filter that will
|
|
||||||
compress better than LZMA2.
|
|
||||||
|
|
||||||
XZ Utils supports multithreaded compression. XZ Utils doesn't support
|
|
||||||
multithreaded decompression yet. It has been planned though and taken
|
|
||||||
into account when designing the .xz file format. In the future, files
|
|
||||||
that were created in threaded mode can be decompressed in threaded
|
|
||||||
mode too.
|
|
||||||
|
|
||||||
|
|
||||||
1. Documentation
|
Supported platforms
|
||||||
----------------
|
|
||||||
|
|
||||||
1.1. Overall documentation
|
LZMA Utils are developed on GNU+Linux, but they should work at
|
||||||
|
least on *BSDs and Solaris. They probably work on some other
|
||||||
|
POSIX-like operating systems too.
|
||||||
|
|
||||||
README This file
|
If you use GCC to compile LZMA Utils, you need at least version
|
||||||
|
3.x.x. GCC version 2.xx.x doesn't support some C99 features used
|
||||||
|
in LZMA Utils source code, thus GCC 2 won't compile LZMA Utils.
|
||||||
|
|
||||||
INSTALL.generic Generic install instructions for those not
|
If you have written patches to make LZMA Utils to work on previously
|
||||||
familiar with packages using GNU Autotools
|
unsupported platform, please send the patches to me! I will consider
|
||||||
INSTALL Installation instructions specific to XZ Utils
|
including them to the official version. It's nice to minimize the
|
||||||
PACKAGERS Information to packagers of XZ Utils
|
need of third-party patching.
|
||||||
|
|
||||||
COPYING XZ Utils copyright and license information
|
One exception: Don't request or send patches to change the whole
|
||||||
COPYING.0BSD BSD Zero Clause License
|
source package to C89. I find C99 substantially nicer to write and
|
||||||
COPYING.GPLv2 GNU General Public License version 2
|
maintain. However, the public library headers must be in C89 to
|
||||||
COPYING.GPLv3 GNU General Public License version 3
|
avoid frustrating those who maintain programs, which are strictly
|
||||||
COPYING.LGPLv2.1 GNU Lesser General Public License version 2.1
|
in C89 or C++.
|
||||||
|
|
||||||
AUTHORS The main authors of XZ Utils
|
|
||||||
THANKS Incomplete list of people who have helped making
|
|
||||||
this software
|
|
||||||
NEWS User-visible changes between XZ Utils releases
|
|
||||||
ChangeLog Detailed list of changes (commit log)
|
|
||||||
TODO Known bugs and some sort of to-do list
|
|
||||||
|
|
||||||
Note that only some of the above files are included in binary
|
|
||||||
packages.
|
|
||||||
|
|
||||||
|
|
||||||
1.2. Documentation for command-line tools
|
Version numbering
|
||||||
|
|
||||||
The command-line tools are documented as man pages. In source code
|
Starting from LZMA Utils 5, the version number of LZMA Utils has
|
||||||
releases (and possibly also in some binary packages), the man pages
|
absolutely nothing to do with the version number of LZMA SDK or
|
||||||
are also provided in plain text (ASCII only) format in the directory
|
7-Zip. The new version number format of LZMA Utils is X.Y.ZS:
|
||||||
"doc/man" to make the man pages more accessible to those whose
|
|
||||||
operating system doesn't provide an easy way to view man pages.
|
|
||||||
|
|
||||||
|
|
||||||
1.3. Documentation for liblzma
|
|
||||||
|
|
||||||
The liblzma API headers include short docs about each function
|
|
||||||
and data type as Doxygen tags. These docs should be quite OK as
|
|
||||||
a quick reference.
|
|
||||||
|
|
||||||
There are a few example/tutorial programs that should help in
|
|
||||||
getting started with liblzma. In the source package the examples
|
|
||||||
are in "doc/examples" and in binary packages they may be under
|
|
||||||
"examples" in the same directory as this README.
|
|
||||||
|
|
||||||
Since the liblzma API has similarities to the zlib API, some people
|
|
||||||
may find it useful to read the zlib docs and tutorial too:
|
|
||||||
|
|
||||||
https://zlib.net/manual.html
|
|
||||||
https://zlib.net/zlib_how.html
|
|
||||||
|
|
||||||
|
|
||||||
2. Version numbering
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The version number format of XZ Utils is X.Y.ZS:
|
|
||||||
|
|
||||||
- X is the major version. When this is incremented, the library
|
- X is the major version. When this is incremented, the library
|
||||||
API and ABI break.
|
API and ABI break.
|
||||||
|
|
||||||
- Y is the minor version. It is incremented when new features
|
- Y is the minor version. It is incremented when new features are
|
||||||
are added without breaking the existing API or ABI. An even Y
|
added without breaking existing API or ABI. Even Y indicates
|
||||||
indicates a stable release and an odd Y indicates unstable
|
stable release and odd Y indicates unstable (alpha or beta
|
||||||
(alpha or beta version).
|
version).
|
||||||
|
|
||||||
- Z is the revision. This has a different meaning for stable and
|
- Z is the revision. This has different meaning for stable and
|
||||||
unstable releases:
|
unstable releases:
|
||||||
|
|
||||||
* Stable: Z is incremented when bugs get fixed without adding
|
* Stable: Z is incremented when bugs get fixed without adding
|
||||||
any new features. This is intended to be convenient for
|
any new features.
|
||||||
downstream distributors that want bug fixes but don't want
|
|
||||||
any new features to minimize the risk of introducing new bugs.
|
|
||||||
|
|
||||||
* Unstable: Z is just a counter. API or ABI of features added
|
* Unstable: Z is just a counter. API or ABI of features added
|
||||||
in earlier unstable releases having the same X.Y may break.
|
in earlier unstable releases having the same X.Y may break.
|
||||||
|
|
||||||
- S indicates stability of the release. It is missing from the
|
- S indicates stability of the release. It is missing from the
|
||||||
stable releases, where Y is an even number. When Y is odd, S
|
stable releases where Y is an even number. When Y is odd, S
|
||||||
is either "alpha" or "beta" to make it very clear that such
|
is either "alpha" or "beta" to make it very clear that such
|
||||||
versions are not stable releases. The same X.Y.Z combination is
|
versions are not stable releases. The same X.Y.Z combination is
|
||||||
not used for more than one stability level, i.e. after X.Y.Zalpha,
|
not used for more than one stability level i.e. after X.Y.Zalpha,
|
||||||
the next version can be X.Y.(Z+1)beta but not X.Y.Zbeta.
|
the next version can be X.Y.(Z+1)beta but not X.Y.Zbeta.
|
||||||
|
|
||||||
|
|
||||||
3. Reporting bugs
|
configure options
|
||||||
-----------------
|
|
||||||
|
|
||||||
Naturally it is easiest for me if you already know what causes the
|
If you are not familiar with `configure' scripts, read the file
|
||||||
unexpected behavior. Even better if you have a patch to propose.
|
INSTALL first.
|
||||||
However, quite often the reason for unexpected behavior is unknown,
|
|
||||||
so here are a few things to do before sending a bug report:
|
|
||||||
|
|
||||||
1. Try to create a small example how to reproduce the issue.
|
In most cases, the default --enable/--disable/--with/--without options
|
||||||
|
are what you want. Don't touch them if you are unsure.
|
||||||
|
|
||||||
2. Compile XZ Utils with debugging code using configure switches
|
--disable-encoder
|
||||||
--enable-debug and, if possible, --disable-shared. If you are
|
Do not compile the encoder component of liblzma. This
|
||||||
using GCC, use CFLAGS='-O0 -ggdb3'. Don't strip the resulting
|
implies --disable-match-finders. If you need only
|
||||||
|
the decoder, you can decrease the library size
|
||||||
|
dramatically with this option.
|
||||||
|
|
||||||
|
The default is to build the encoder.
|
||||||
|
|
||||||
|
--disable-decoder
|
||||||
|
Do not compile the decoder component of liblzma.
|
||||||
|
|
||||||
|
The default is to build the decoder.
|
||||||
|
|
||||||
|
--enable-filters=
|
||||||
|
liblzma supports several filters. See liblzma-intro.txt
|
||||||
|
for a little more information about these.
|
||||||
|
|
||||||
|
The default is to build all the filters.
|
||||||
|
|
||||||
|
--enable-match-finders=
|
||||||
|
liblzma includes two categories of match finders:
|
||||||
|
hash chains and binary trees. Hash chains (hc3 and hc4)
|
||||||
|
are quite fast but they don't provide the best compression
|
||||||
|
ratio. Binary trees (bt2, bt3 and bt4) give excellent
|
||||||
|
compression ratio, but they are slower and need more
|
||||||
|
memory than hash chains.
|
||||||
|
|
||||||
|
You need to enable at least one match finder to build the
|
||||||
|
LZMA filter encoder. Usually hash chains are used only in
|
||||||
|
the fast mode, while binary trees are used to when the best
|
||||||
|
compression ratio is wanted.
|
||||||
|
|
||||||
|
The default is to build all the match finders.
|
||||||
|
|
||||||
|
--enable-checks=
|
||||||
|
liblzma support multiple integrity checks. CRC32 is
|
||||||
|
mandatory, and cannot be omitted. See liblzma-intro.txt
|
||||||
|
for more information about usage of the integrity checks.
|
||||||
|
|
||||||
|
--disable-assembler
|
||||||
|
liblzma includes some assembler optimizations. Currently
|
||||||
|
there is only assembler code for CRC32 and CRC64 for
|
||||||
|
32-bit x86.
|
||||||
|
|
||||||
|
All the assembler code in liblzma is position-independent
|
||||||
|
code, which is suitable for use in shared libraries and
|
||||||
|
position-independent executables. So far only i386
|
||||||
|
instructions are used, but the code is optimized for i686
|
||||||
|
class CPUs. If you are compiling liblzma exclusively for
|
||||||
|
pre-i686 systems, you may want to disable the assembler
|
||||||
|
code.
|
||||||
|
|
||||||
|
--enable-small
|
||||||
|
Omits precomputed tables. This makes liblzma a few KiB
|
||||||
|
smaller. Startup time increases, because the tables need
|
||||||
|
to be computed first.
|
||||||
|
|
||||||
|
--enable-debug
|
||||||
|
This enables the assert() macro and possibly some other
|
||||||
|
run-time consistency checks. It slows down things somewhat,
|
||||||
|
so you normally don't want to have this enabled.
|
||||||
|
|
||||||
|
--enable-werror
|
||||||
|
Makes all compiler warnings an error, that abort the
|
||||||
|
compilation. This may help catching bugs, and should work
|
||||||
|
on most systems. This has no effect on the resulting
|
||||||
binaries.
|
binaries.
|
||||||
|
|
||||||
3. Turn on core dumps. The exact command depends on your shell;
|
|
||||||
for example in GNU bash it is done with "ulimit -c unlimited",
|
|
||||||
and in tcsh with "limit coredumpsize unlimited".
|
|
||||||
|
|
||||||
4. Try to reproduce the suspected bug. If you get "assertion failed"
|
Static vs. dynamic linking of the command line tools
|
||||||
message, be sure to include the complete message in your bug
|
|
||||||
report. If the application leaves a coredump, get a backtrace
|
|
||||||
using gdb:
|
|
||||||
$ gdb /path/to/app-binary # Load the app to the debugger.
|
|
||||||
(gdb) core core # Open the coredump.
|
|
||||||
(gdb) bt # Print the backtrace. Copy & paste to bug report.
|
|
||||||
(gdb) quit # Quit gdb.
|
|
||||||
|
|
||||||
Report your bug via email or IRC (see Contact information below).
|
By default, the command line tools are linked statically against
|
||||||
Don't send core dump files or any executables. If you have a small
|
liblzma. There a are a few reasons:
|
||||||
example file(s) (total size less than 256 KiB), please include
|
|
||||||
it/them as an attachment. If you have bigger test files, put them
|
|
||||||
online somewhere and include a URL to the file(s) in the bug report.
|
|
||||||
|
|
||||||
Always include the exact version number of XZ Utils in the bug report.
|
- The executable(s) can be in /bin while the shared liblzma can still
|
||||||
If you are using a snapshot from the git repository, use "git describe"
|
be in /usr/lib (if the distro uses such file system hierachy).
|
||||||
to get the exact snapshot version. If you are using XZ Utils shipped
|
|
||||||
in an operating system distribution, mention the distribution name,
|
|
||||||
distribution version, and exact xz package version; if you cannot
|
|
||||||
repeat the bug with the code compiled from unpatched source code,
|
|
||||||
you probably need to report a bug to your distribution's bug tracking
|
|
||||||
system.
|
|
||||||
|
|
||||||
|
- It's easier to copy the executables to other systems, since they
|
||||||
|
depend only on libc.
|
||||||
|
|
||||||
4. Translations
|
- It's slightly faster on some architectures like x86.
|
||||||
---------------
|
|
||||||
|
|
||||||
The xz command line tool and all man pages can be translated.
|
If you don't like this, you can get the command line tools linked
|
||||||
The translations are handled via the Translation Project. If you
|
against the shared liblzma by specifying --disable-static to configure.
|
||||||
wish to help translating xz, please join the Translation Project:
|
This disables building static liblzma completely.
|
||||||
|
|
||||||
https://translationproject.org/html/translators.html
|
|
||||||
|
|
||||||
Updates to translations won't be accepted by methods that bypass
|
|
||||||
the Translation Project because there is a risk of duplicate work:
|
|
||||||
translation updates made in the xz repository aren't seen by the
|
|
||||||
translators in the Translation Project. If you have found bugs in
|
|
||||||
a translation, please report them to the Language-Team address
|
|
||||||
which can be found near the beginning of the PO file.
|
|
||||||
|
|
||||||
If you find language problems in the original English strings,
|
|
||||||
feel free to suggest improvements. Ask if something is unclear.
|
|
||||||
|
|
||||||
|
|
||||||
4.1. Testing translations
|
|
||||||
|
|
||||||
Testing can be done by installing xz into a temporary directory.
|
|
||||||
|
|
||||||
If building from Git repository (not tarball), generate the
|
|
||||||
Autotools files:
|
|
||||||
|
|
||||||
./autogen.sh
|
|
||||||
|
|
||||||
Create a subdirectory for the build files. The tmp-build directory
|
|
||||||
can be deleted after testing.
|
|
||||||
|
|
||||||
mkdir tmp-build
|
|
||||||
cd tmp-build
|
|
||||||
../configure --disable-shared --enable-debug --prefix=$PWD/inst
|
|
||||||
|
|
||||||
Edit the .po file in the po directory. Then build and install to
|
|
||||||
the "tmp-build/inst" directory, and use translations.bash to see
|
|
||||||
how some of the messages look. Repeat these steps if needed:
|
|
||||||
|
|
||||||
make -C po update-po
|
|
||||||
make -j"$(nproc)" install
|
|
||||||
bash ../debug/translation.bash | less
|
|
||||||
bash ../debug/translation.bash | less -S # For --list outputs
|
|
||||||
|
|
||||||
To test other languages, set the LANGUAGE environment variable
|
|
||||||
before running translations.bash. The value should match the PO file
|
|
||||||
name without the .po suffix. Example:
|
|
||||||
|
|
||||||
export LANGUAGE=fi
|
|
||||||
|
|
||||||
|
|
||||||
5. Other implementations of the .xz format
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
7-Zip and the p7zip port of 7-Zip support the .xz format starting
|
|
||||||
from the version 9.00alpha.
|
|
||||||
|
|
||||||
https://7-zip.org/
|
|
||||||
https://p7zip.sourceforge.net/
|
|
||||||
|
|
||||||
XZ Embedded is a limited implementation written for use in the Linux
|
|
||||||
kernel, but it is also suitable for other embedded use.
|
|
||||||
|
|
||||||
https://tukaani.org/xz/embedded.html
|
|
||||||
|
|
||||||
XZ for Java is a complete implementation written in pure Java.
|
|
||||||
|
|
||||||
https://tukaani.org/xz/java.html
|
|
||||||
|
|
||||||
|
|
||||||
6. Contact information
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
XZ Utils in general:
|
|
||||||
- Home page: https://tukaani.org/xz/
|
|
||||||
- Email to maintainer(s): xz@tukaani.org
|
|
||||||
- IRC: #tukaani on Libera Chat
|
|
||||||
- GitHub: https://github.com/tukaani-project/xz
|
|
||||||
|
|
||||||
Lead maintainer:
|
|
||||||
- Email: Lasse Collin <lasse.collin@tukaani.org>
|
|
||||||
- IRC: Larhzu on Libera Chat
|
|
||||||
|
|
||||||
|
|||||||
266
THANKS
266
THANKS
@ -1,257 +1,27 @@
|
|||||||
|
|
||||||
Thanks
|
Thanks
|
||||||
======
|
------
|
||||||
|
|
||||||
Some people have helped more, some less, but nevertheless everyone's help
|
Some people have helped more, some less, some don't even know they have
|
||||||
has been important. :-)
|
been helpful, but nevertheless everyone's help has been important. :-)
|
||||||
- Adam Borowski
|
In alphabetical order:
|
||||||
- Adam Walling
|
|
||||||
- Adrien Nader
|
|
||||||
- Agostino Sarubbo
|
|
||||||
- Alexander Bluhm
|
|
||||||
- Alexander M. Greenham
|
|
||||||
- Alexander Neumann
|
|
||||||
- Alexandre Sauvé
|
|
||||||
- Alexey Tourbin
|
|
||||||
- Anders F. Björklund
|
|
||||||
- Andraž 'ruskie' Levstik
|
|
||||||
- Andre Noll
|
|
||||||
- Andreas K. Hüttel
|
|
||||||
- Andreas Müller
|
|
||||||
- Andreas Schwab
|
|
||||||
- Andreas Zieringer
|
|
||||||
- Andrej Skenderija
|
|
||||||
- Andres Freund
|
|
||||||
- Andrew Dudman
|
|
||||||
- Andrew Murray
|
|
||||||
- Antoine Cœur
|
|
||||||
- Anton Kochkov
|
|
||||||
- Antonio Diaz Diaz
|
|
||||||
- Arkadiusz Miskiewicz
|
|
||||||
- Asgeir Storesund Nilsen
|
|
||||||
- Aziz Chaudhry
|
|
||||||
- Bela Lubkin
|
|
||||||
- Ben Boeckel
|
|
||||||
- Benjamin Buch
|
|
||||||
- Benno Schulenberg
|
|
||||||
- Bernhard Reutner-Fischer
|
|
||||||
- Bert Wesarg
|
|
||||||
- Bhargava Shastry
|
|
||||||
- Bill Glessner
|
|
||||||
- Bjarni Ingi Gislason
|
|
||||||
- Boud Roukema
|
|
||||||
- Brad Smith
|
|
||||||
- Bruce Stark
|
|
||||||
- Cary Lewis
|
|
||||||
- Charles Wilson
|
|
||||||
- Chenxi Mao
|
|
||||||
- Chien Wong
|
|
||||||
- Chris Donawa
|
|
||||||
- Chris McCrohan
|
|
||||||
- Christian Hesse
|
|
||||||
- Christian Kujau
|
|
||||||
- Christian von Roques
|
|
||||||
- Christian Weisgerber
|
|
||||||
- Christoph Junghans
|
|
||||||
- Collin Funk
|
|
||||||
- Conley Moorhous
|
|
||||||
- Cristian Rodríguez
|
|
||||||
- Cristiano Ceglia
|
|
||||||
- Dan Shechter
|
|
||||||
- Dan Stromberg
|
|
||||||
- Dan Weiss
|
|
||||||
- Daniel Leonard
|
|
||||||
- Daniel Mealha Cabrita
|
|
||||||
- Daniel Packard
|
|
||||||
- Daniel Richard G.
|
|
||||||
- David Burklund
|
|
||||||
- Denis Excoffier
|
|
||||||
- Derwin McGeary
|
|
||||||
- Dexter Castor Döpping
|
|
||||||
- Diederik de Haas
|
|
||||||
- Diego Elio Pettenò
|
|
||||||
- Dimitri Papadopoulos Orfanos
|
|
||||||
- Dirk Müller
|
|
||||||
- Douglas Thor
|
|
||||||
- Ed Maste
|
|
||||||
- Elbert Pol
|
|
||||||
- Eli Schwartz
|
|
||||||
- Elijah Almeida Coimbra
|
|
||||||
- Émilie Labbé
|
|
||||||
- Emmanuel Blot
|
|
||||||
- Eric Lindblad
|
|
||||||
- Eric S. Raymond
|
|
||||||
- Étienne Mollier
|
|
||||||
- Evan Nemerson
|
|
||||||
- Fangrui Song
|
|
||||||
- Felix Collin
|
|
||||||
- Filip Palian
|
|
||||||
- Firas Khalil Khana
|
|
||||||
- François Etcheverry
|
|
||||||
- Frank Busse
|
|
||||||
- Frank Prochnow
|
|
||||||
- Fredrik Wikstrom
|
|
||||||
- Gabi Davar
|
|
||||||
- Gabriela Gutierrez
|
|
||||||
- Gilles Espinasse
|
|
||||||
- Gregory Margo
|
|
||||||
- Guillaume Outters
|
|
||||||
- Guiorgy Potskhishvili
|
|
||||||
- H. Peter Anvin
|
|
||||||
- Hajin Jang
|
|
||||||
- Hans Jansen
|
|
||||||
- Harri K. Koskinen
|
|
||||||
- Hin-Tak Leung
|
|
||||||
- H.J. Lu
|
|
||||||
- Hongbo Ni
|
|
||||||
- Igor Pavlov
|
|
||||||
- İhsan Doğan
|
|
||||||
- Ilya Kurdyukov
|
|
||||||
- Iouri Kharon
|
|
||||||
- İsmail Dönmez
|
|
||||||
- Ivan A. Melnikov
|
|
||||||
- Jakub Bogusz
|
|
||||||
- James Buren
|
|
||||||
- James M Leddy
|
|
||||||
- Jan Kratochvil
|
|
||||||
- Jan Terje Hansen
|
|
||||||
- Jason Gorski
|
|
||||||
- Jeff Bastian
|
|
||||||
- Jeffrey Walton
|
|
||||||
- Jeroen Roovers
|
|
||||||
- Jim Meyering
|
|
||||||
- Jim Wilcoxson
|
|
||||||
- Joachim Henke
|
|
||||||
- John Paul Adrian Glaubitz
|
|
||||||
- Jonathan Nieder
|
|
||||||
- Jonathan Stott
|
|
||||||
- Joona Kannisto
|
|
||||||
- Jouk Jansen
|
|
||||||
- Juan Manuel Guerrero
|
|
||||||
- Jukka Salmi
|
|
||||||
- Julien Marrec
|
|
||||||
- Jun I Jin
|
|
||||||
- Kai Pastor
|
|
||||||
- Karl Beldan
|
|
||||||
- Karl Berry
|
|
||||||
- Keith Patton
|
|
||||||
- Kelvin Lee
|
|
||||||
- Kevin R. Bulgrien
|
|
||||||
- Kian-Meng Ang
|
|
||||||
- Kim Jinyeong
|
|
||||||
- Kirill A. Korinsky
|
|
||||||
- Kiyoshi Kanazawa
|
|
||||||
- Lars Wirzenius
|
|
||||||
- Li Chenggang
|
|
||||||
- Lizandro Heredia
|
|
||||||
- Loganaden Velvindron
|
|
||||||
- Lorenzo De Liso
|
|
||||||
- Lukas Braune
|
|
||||||
- Maarten Bosmans
|
|
||||||
- Maksym Vatsyk
|
|
||||||
- Marcin Kowalczyk
|
|
||||||
- Marcus Comstedt
|
|
||||||
- Marcus Tillmanns
|
|
||||||
- Marek Černocký
|
|
||||||
- Mark Adler
|
- Mark Adler
|
||||||
- Mark Wielaard
|
|
||||||
- Markus Duft
|
|
||||||
- Markus Rickert
|
|
||||||
- Martin Blumenstingl
|
|
||||||
- Martin Matuška
|
|
||||||
- Martin Storsjö
|
|
||||||
- Martin Väth
|
|
||||||
- Mathieu Vachon
|
|
||||||
- Matthew Good
|
|
||||||
- Matthieu Rakotojaona
|
|
||||||
- Melanie Blower
|
|
||||||
- Michael Felt
|
|
||||||
- Michael Fox
|
|
||||||
- Michał Górny
|
|
||||||
- Mike Frysinger
|
|
||||||
- Mikko Pouru
|
|
||||||
- Milo Casagrande
|
|
||||||
- Mohammed Adnène Trojette
|
|
||||||
- Nathan Moinvaziri
|
|
||||||
- Nelson H. F. Beebe
|
- Nelson H. F. Beebe
|
||||||
- Nicholas Jackson
|
- Anders F. Björklund
|
||||||
- Ole André Vadla Ravnås
|
- İsmail Dönmez
|
||||||
- Orange Tsai
|
- Jean-loup Gailly
|
||||||
- Orgad Shaneh
|
|
||||||
- Patrick J. Volkerding
|
|
||||||
- Paul Eggert
|
|
||||||
- Paul Townsend
|
|
||||||
- Pavel Raiskup
|
|
||||||
- Per Øyvind Karlsen
|
- Per Øyvind Karlsen
|
||||||
- Peter Ivanov
|
|
||||||
- Peter Lawler
|
|
||||||
- Peter O'Gorman
|
|
||||||
- Peter Pallinger
|
|
||||||
- Peter Seiderer
|
|
||||||
- Pierre-Yves Martin
|
|
||||||
- Pilorz Wojciech
|
|
||||||
- Pippijn van Steenhoven
|
|
||||||
- Rafał Mużyło
|
|
||||||
- Rainer Müller
|
|
||||||
- Ralf Wildenhues
|
|
||||||
- Rich Prohaska
|
|
||||||
- Richard Koch
|
|
||||||
- Richard W.M. Jones
|
|
||||||
- Robert Elz
|
|
||||||
- Robert Readman
|
|
||||||
- Roel Bouckaert
|
|
||||||
- Ron Desmond
|
|
||||||
- Ruarí Ødegaard
|
|
||||||
- Rui Paulo
|
|
||||||
- Ryan Colyer
|
|
||||||
- Ryan Young
|
|
||||||
- Sam James
|
|
||||||
- Scott McAllister
|
|
||||||
- Sean Fenian
|
|
||||||
- Sebastian Andrzej Siewior
|
|
||||||
- Sergey Kosukhin
|
|
||||||
- Simon Josefsson
|
|
||||||
- Siteshwar Vashisht
|
|
||||||
- Steffen Nurpmeso
|
|
||||||
- Stephan Kulow
|
|
||||||
- Stephen Sachs
|
|
||||||
- Stuart Shelton
|
|
||||||
- Taiki Tsunekawa
|
|
||||||
- Thomas Klausner
|
|
||||||
- Tobias Lahrmann Hansen
|
|
||||||
- Tobias Stoeckmann
|
|
||||||
- Tomasz Gajc
|
|
||||||
- Tomer Chachamu
|
|
||||||
- Torsten Rupp
|
|
||||||
- Trần Ngọc Quân
|
|
||||||
- Trent W. Buck
|
|
||||||
- Victoria Alexia
|
|
||||||
- Vijay Sarvepalli
|
|
||||||
- Ville Koskinen
|
- Ville Koskinen
|
||||||
- Ville Skyttä
|
- Stephan Kulow
|
||||||
- Vincent Cruz
|
- Jim Meyering
|
||||||
- Vincent Fazio
|
- Igor Pavlov
|
||||||
- Vincent Lefevre
|
- Mikko Pouru
|
||||||
- Vincent Torri
|
- Alexandre Sauvé
|
||||||
- Vincent Wixsom
|
- Julian Seward
|
||||||
- Vincenzo Innocente
|
- Paul Townsend
|
||||||
- Vitaly Chikunov
|
- Mohammed Adnène Trojette
|
||||||
- Wim Lewis
|
- Andreas Zieringer
|
||||||
- Xi Ruoyao
|
|
||||||
- Xin Li
|
|
||||||
- Yifeng Li
|
|
||||||
- 榆柳松 (ZhengSen Wang)
|
|
||||||
|
|
||||||
Companies:
|
Also thanks to all the people who have participated the Tukaani project
|
||||||
- Google
|
and others who I have forgot.
|
||||||
- Sandfly Security
|
|
||||||
|
|
||||||
Other credits:
|
|
||||||
- cleemy desu wayo working with Trend Micro Zero Day Initiative
|
|
||||||
- Orange Tsai and splitline from DEVCORE Research Team
|
|
||||||
|
|
||||||
Also thanks to all the people who have participated in the Tukaani project.
|
|
||||||
|
|
||||||
I have probably forgot to add some names to the above list. Sorry about
|
|
||||||
that and thanks for your help.
|
|
||||||
|
|
||||||
|
|||||||
141
TODO
141
TODO
@ -1,88 +1,109 @@
|
|||||||
|
|
||||||
XZ Utils To-Do List
|
LZMA Utils TODO List
|
||||||
===================
|
--------------------
|
||||||
|
|
||||||
Known bugs
|
Major missing features
|
||||||
----------
|
|
||||||
|
|
||||||
The test suite is incomplete.
|
Memory limits in the command line tool apply only to compression.
|
||||||
|
|
||||||
XZ Utils compress some files significantly worse than LZMA Utils.
|
Threading support in the lzma command line tool is still primitive.
|
||||||
This is due to faster compression presets used by XZ Utils, and
|
It cannot split a file in pieces yet.
|
||||||
can often be worked around by using "xz --extreme". With some files
|
|
||||||
--extreme isn't enough though: it's most likely with files that
|
|
||||||
compress extremely well, so going from compression ratio of 0.003
|
|
||||||
to 0.004 means big relative increase in the compressed file size.
|
|
||||||
|
|
||||||
tuklib_exit() doesn't block signals => EINTR is possible.
|
The --list mode isn't implemented in the command line tool.
|
||||||
|
|
||||||
If liblzma has created threads and fork() gets called, liblzma
|
Handling of Multi-Block Stream information should be separated
|
||||||
code will break in the child process unless it calls exec() and
|
from Stream encoder and decoder. Those would be useful to implement
|
||||||
doesn't touch liblzma.
|
multi-threaded coding in applications.
|
||||||
|
|
||||||
|
Buffer to buffer coding is not implemented in liblzma. Probably
|
||||||
|
a naive version should be written first, which would simply wrap
|
||||||
|
things around lzma_stream. Later, there should be separate buffer
|
||||||
|
coding functions, that are slightly faster (less memcpy()) and
|
||||||
|
have smaller memory usage than the functions using lzma_stream.
|
||||||
|
|
||||||
|
libzfile is not implemented.
|
||||||
|
|
||||||
|
LZMA filter doesn't support predefined history buffer.
|
||||||
|
|
||||||
|
|
||||||
Missing features
|
Security
|
||||||
----------------
|
|
||||||
|
|
||||||
Add support for storing metadata in .xz files. A preliminary
|
Search for bugs, especially security related issues. Security is
|
||||||
idea is to create a new Stream type for metadata. When both
|
important in every piece of code in LZMA Utils, but it is extremely
|
||||||
metadata and data are wanted in the same .xz file, two or more
|
important in the decoder part of liblzma.
|
||||||
Streams would be concatenated.
|
|
||||||
|
|
||||||
The state stored in lzma_stream should be cloneable, which would
|
Subblock: If there is LZMA as a Subfilter but without EOPM, can it
|
||||||
be mostly useful when using a preset dictionary in LZMA2, but
|
trigger infinite loop when Subblock's "Unset Subfilter" flag is hit?
|
||||||
it may have other uses too. Compare to deflateCopy() in zlib.
|
|
||||||
|
|
||||||
Adjust dictionary size when the input file size is known.
|
Similarly, can LZ decoder get stuck in infinite loop if the next
|
||||||
Maybe do this only if an option is given.
|
filter in the chain returns LZMA_STREAM_END but the decoded data
|
||||||
|
doesn't allow finishing the LZ decoding?
|
||||||
|
|
||||||
xz doesn't support copying extended attributes, access control
|
|
||||||
lists etc. from source to target file.
|
|
||||||
|
|
||||||
Multithreaded compression:
|
Reliability
|
||||||
- Reduce memory usage of the current method.
|
|
||||||
- Implement threaded match finders.
|
|
||||||
- Implement pigz-style threading in LZMA2.
|
|
||||||
|
|
||||||
Buffer-to-buffer coding could use less RAM (especially when
|
Create a test suite to be run with "make check".
|
||||||
decompressing LZMA1 or LZMA2).
|
|
||||||
|
|
||||||
I/O library is not implemented (similar to gzopen() in zlib).
|
Should we use strlimit() and getrlimit() for memory usage limitting?
|
||||||
It will be a separate library that supports uncompressed, .gz,
|
|
||||||
.bz2, .lzma, and .xz files.
|
|
||||||
|
|
||||||
Support changing lzma_options_lzma.mode with lzma_filters_update().
|
|
||||||
|
|
||||||
Support LZMA_FULL_FLUSH for lzma_stream_decoder() to stop at
|
Performance
|
||||||
Block and Stream boundaries.
|
|
||||||
|
|
||||||
Error codes from lzma_code() aren't very specific. A more detailed
|
Benchmark the CRC code on non-x86 CPUs. Won't have huge effect on
|
||||||
error message (string) could be provided too. It could be returned
|
overall speed, but it would still be nice to know what algorithm
|
||||||
by a new function or use a currently-reserved member of lzma_stream.
|
variant is the best on different CPUs.
|
||||||
|
|
||||||
Make it possible to adjust LZMA2 options in the middle of a Block
|
|
||||||
so that the encoding speed vs. compression ratio can be optimized
|
|
||||||
when the compressed data is streamed over network.
|
|
||||||
|
|
||||||
Improved BCJ filters. The current filters are small but they aren't
|
Third party support
|
||||||
so great when compressing binary packages that contain various file
|
|
||||||
types. Specifically, they make things worse if there are static
|
|
||||||
libraries or Linux kernel modules. The filtering could also be
|
|
||||||
more effective (without getting overly complex), for example,
|
|
||||||
streamable variant BCJ2 from 7-Zip could be implemented.
|
|
||||||
|
|
||||||
Filter that autodetects specific data types in the input stream
|
Add support for LZMA to various applications. This naturally requires
|
||||||
and applies appropriate filters for the corrects parts of the input.
|
cooperating with the authors of the specific applications.
|
||||||
Perhaps combine this with the BCJ filter improvement point above.
|
* GNU grep and GNU diffutils: BSD grep already uses zlib directly
|
||||||
|
instead of ugly shell scripts. It would be nice to get similar
|
||||||
|
feature into relevant GNU tools. With libzfile, multiple
|
||||||
|
compression formats would be easy to support.
|
||||||
|
* kioslave for KDE
|
||||||
|
* Magic for the `file' command
|
||||||
|
* GNU Midnight Commander
|
||||||
|
* GNU Texinfo
|
||||||
|
* The `man' command
|
||||||
|
* Package managers
|
||||||
|
|
||||||
Long-range LZ77 method as a separate filter or as a new LZMA2
|
Test the patches already written. The patches should be sent to
|
||||||
match finder.
|
upstream developers _once_ LZMA Utils APIs are stable enough (so
|
||||||
|
people don't need to fix those patches all the time).
|
||||||
|
|
||||||
|
Mandriva has quite a few patches. Some of them are OK, some need
|
||||||
|
adapting for new LZMA Utils.
|
||||||
|
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
|
||||||
|
|
||||||
More tutorial programs are needed for liblzma.
|
Revise the man page of lzma command line tool.
|
||||||
|
|
||||||
Document the LZMA1 and LZMA2 algorithms.
|
If the Doxygen docs aren't enough, write good Texinfo manual for
|
||||||
|
liblzma. It's been a long time I've even tried to build the Doxygen
|
||||||
|
docs, so they may look quite bad at the moment.
|
||||||
|
|
||||||
|
Document LZMA as an algorithm. It would be great to have detailed
|
||||||
|
description of the algorithm in English. Many people think, that
|
||||||
|
reading the source code is not the optimal way to learn how LZMA
|
||||||
|
works.
|
||||||
|
|
||||||
|
|
||||||
|
Other
|
||||||
|
|
||||||
|
Some things return LZMA_PROG_ERROR with invalid options, some
|
||||||
|
LZMA_HEADER_ERROR. These must be checked carefully and made so
|
||||||
|
that LZMA_HEADER_ERROR is used only when the given option could
|
||||||
|
make sense in future version of libzma.
|
||||||
|
|
||||||
|
lzma_restrict vs. restrict
|
||||||
|
|
||||||
|
Usage of LZMA_RUN vs. LZMA_FINISH with Metadata coders.
|
||||||
|
|
||||||
|
Port the Deflate implementation from 7-Zip into liblzma. 7-Zip's
|
||||||
|
Deflate compresses better than zlib, gzip or Info-ZIP. I don't
|
||||||
|
know if Deflate will be included in .lzma format (probably not),
|
||||||
|
but it's still useful once we also add support for .gz file format.
|
||||||
|
|
||||||
|
|||||||
70
autogen.sh
70
autogen.sh
@ -1,42 +1,38 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
set -e -x
|
set -e -x
|
||||||
|
|
||||||
# The following six lines are almost identical to "autoreconf -fi" but faster.
|
# autooint copies all kinds of crap even though we have told in
|
||||||
${AUTOPOINT:-autopoint} -f
|
# configure.ac that we don't want the intl directory. It is able
|
||||||
${LIBTOOLIZE:-libtoolize} -c -f || glibtoolize -c -f
|
# to omit the intl directory but still copies the m4 files needed
|
||||||
${ACLOCAL:-aclocal} -I m4
|
# only by the stuff in the non-existing intl directory.
|
||||||
${AUTOCONF:-autoconf}
|
autopoint -f
|
||||||
${AUTOHEADER:-autoheader}
|
rm -f \
|
||||||
${AUTOMAKE:-automake} -acf --foreign
|
codeset.m4 \
|
||||||
|
glibc2.m4 \
|
||||||
|
glibc21.m4 \
|
||||||
|
intdiv0.m4 \
|
||||||
|
intl.m4 \
|
||||||
|
intldir.m4 \
|
||||||
|
intmax.m4 \
|
||||||
|
inttypes-pri.m4 \
|
||||||
|
inttypes_h.m4 \
|
||||||
|
lcmessage.m4 \
|
||||||
|
lock.m4 \
|
||||||
|
longdouble.m4 \
|
||||||
|
longlong.m4 \
|
||||||
|
printf-posix.m4 \
|
||||||
|
size_max.m4 \
|
||||||
|
stdint_h.m4 \
|
||||||
|
uintmax_t.m4 \
|
||||||
|
ulonglong.m4 \
|
||||||
|
visibility.m4 \
|
||||||
|
wchar_t.m4 \
|
||||||
|
wint_t.m4 \
|
||||||
|
xsize.m4
|
||||||
|
|
||||||
# Generate the translated man pages if the "po4a" tool is available.
|
libtoolize -c -f || glibtoolize -c -f
|
||||||
# This is *NOT* done by "autoreconf -fi" or when "make" is run.
|
aclocal -I m4
|
||||||
# Pass --no-po4a to this script to skip this step.
|
autoconf
|
||||||
# It can be useful when you know that po4a isn't available and
|
autoheader
|
||||||
# don't want autogen.sh to exit with non-zero exit status.
|
automake -acf --foreign
|
||||||
generate_po4a="y"
|
|
||||||
|
|
||||||
for arg in "$@"
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
"--no-po4a")
|
|
||||||
generate_po4a="n"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if test "$generate_po4a" != "n"; then
|
|
||||||
cd po4a
|
|
||||||
sh update-po
|
|
||||||
cd ..
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|||||||
@ -1,295 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Script meant to be used for Continuous Integration automation for POSIX
|
|
||||||
# systems. On GitHub, this is used by Ubuntu and MacOS builds.
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Author: Jia Tan
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
USAGE="Usage: $0
|
|
||||||
-a [autogen flags]
|
|
||||||
-b [autotools|cmake]
|
|
||||||
-c [crc32|crc64|sha256]
|
|
||||||
-d [encoders|decoders|bcj|delta|threads|shared|nls|small|clmul|sandbox]
|
|
||||||
-f [CFLAGS]
|
|
||||||
-l [destdir]
|
|
||||||
-m [compiler]
|
|
||||||
-n [ARTIFACTS_DIR_NAME]
|
|
||||||
-p [all|build|test]
|
|
||||||
-s [srcdir]"
|
|
||||||
|
|
||||||
# Absolute path of script directory
|
|
||||||
ABS_DIR=$(cd -- "$(dirname -- "$0")" && pwd)
|
|
||||||
|
|
||||||
# Default CLI option values
|
|
||||||
AUTOGEN_FLAGS=""
|
|
||||||
BUILD_SYSTEM="autotools"
|
|
||||||
CHECK_TYPE="crc32,crc64,sha256"
|
|
||||||
BCJ="y"
|
|
||||||
DELTA="y"
|
|
||||||
ENCODERS="y"
|
|
||||||
DECODERS="y"
|
|
||||||
THREADS="y"
|
|
||||||
SHARED="y"
|
|
||||||
NATIVE_LANG_SUPPORT="y"
|
|
||||||
SMALL="n"
|
|
||||||
CLMUL="y"
|
|
||||||
SANDBOX="y"
|
|
||||||
DOXYGEN="y"
|
|
||||||
SRC_DIR="$ABS_DIR/../"
|
|
||||||
DEST_DIR="$SRC_DIR/../xz_build"
|
|
||||||
PHASE="all"
|
|
||||||
ARTIFACTS_DIR_NAME="output"
|
|
||||||
|
|
||||||
[[ -z ${CPU_COUNT} ]] && { CPU_COUNT=$(nproc 2>/dev/null || sysctl -n hw.activecpu); }
|
|
||||||
[[ -z ${MAKEFLAGS} ]] && export MAKEFLAGS="-j${CPU_COUNT} -l${CPU_COUNT}"
|
|
||||||
[[ -z ${CFLAGS} ]] && export CFLAGS="-O2"
|
|
||||||
|
|
||||||
###################
|
|
||||||
# Parse arguments #
|
|
||||||
###################
|
|
||||||
|
|
||||||
while getopts a:b:c:d:l:m:n:s:p:f:w:h opt; do
|
|
||||||
# b option can have either value "autotools" OR "cmake"
|
|
||||||
case ${opt} in
|
|
||||||
h)
|
|
||||||
echo "$USAGE"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
a)
|
|
||||||
AUTOGEN_FLAGS="$OPTARG"
|
|
||||||
;;
|
|
||||||
b)
|
|
||||||
case "$OPTARG" in
|
|
||||||
autotools) ;;
|
|
||||||
cmake) ;;
|
|
||||||
*) echo "Invalid build system: $OPTARG"; exit 1;;
|
|
||||||
esac
|
|
||||||
BUILD_SYSTEM="$OPTARG"
|
|
||||||
;;
|
|
||||||
c) CHECK_TYPE="$OPTARG"
|
|
||||||
;;
|
|
||||||
# d options can be a comma separated list of things to disable at
|
|
||||||
# configure time
|
|
||||||
d)
|
|
||||||
for disable_arg in $(echo "$OPTARG" | sed "s/,/ /g"); do
|
|
||||||
case "$disable_arg" in
|
|
||||||
encoders) ENCODERS="n" ;;
|
|
||||||
decoders) DECODERS="n" ;;
|
|
||||||
bcj) BCJ="n" ;;
|
|
||||||
delta) DELTA="n" ;;
|
|
||||||
threads) THREADS="n" ;;
|
|
||||||
shared) SHARED="n";;
|
|
||||||
nls) NATIVE_LANG_SUPPORT="n";;
|
|
||||||
small) SMALL="y";;
|
|
||||||
clmul) CLMUL="n";;
|
|
||||||
sandbox) SANDBOX="n";;
|
|
||||||
doxygen) DOXYGEN="n";;
|
|
||||||
*) echo "Invalid disable value: $disable_arg"; exit 1 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
l) DEST_DIR="$OPTARG"
|
|
||||||
;;
|
|
||||||
m)
|
|
||||||
CC="$OPTARG"
|
|
||||||
export CC
|
|
||||||
;;
|
|
||||||
n) ARTIFACTS_DIR_NAME="$OPTARG"
|
|
||||||
;;
|
|
||||||
s) SRC_DIR="$OPTARG"
|
|
||||||
;;
|
|
||||||
p) PHASE="$OPTARG"
|
|
||||||
;;
|
|
||||||
f)
|
|
||||||
CFLAGS+=" $OPTARG"
|
|
||||||
export CFLAGS
|
|
||||||
;;
|
|
||||||
w) WRAPPER="$OPTARG"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unsupported option: $opt"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
####################
|
|
||||||
# Helper Functions #
|
|
||||||
####################
|
|
||||||
|
|
||||||
# These two functions essentially implement the ternary "?" operator.
|
|
||||||
add_extra_option() {
|
|
||||||
# First argument is option value ("y" or "n")
|
|
||||||
# Second argument is option to set if "y"
|
|
||||||
# Third argument is option to set if "n"
|
|
||||||
if [ "$1" = "y" ]
|
|
||||||
then
|
|
||||||
EXTRA_OPTIONS="$EXTRA_OPTIONS $2"
|
|
||||||
else
|
|
||||||
EXTRA_OPTIONS="$EXTRA_OPTIONS $3"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
add_to_filter_list() {
|
|
||||||
# First argument is option value ("y" or "n")
|
|
||||||
# Second argument is option to set if "y"
|
|
||||||
if [ "$1" = "y" ]
|
|
||||||
then
|
|
||||||
FILTER_LIST="$FILTER_LIST$2"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
###############
|
|
||||||
# Build Phase #
|
|
||||||
###############
|
|
||||||
|
|
||||||
if [ "$PHASE" = "all" ] || [ "$PHASE" = "build" ]
|
|
||||||
then
|
|
||||||
# Checksum options should be specified differently based on the
|
|
||||||
# build system. It must be calculated here since we won't know
|
|
||||||
# the build system used until all args have been parsed.
|
|
||||||
# Autotools - comma separated
|
|
||||||
# CMake - semi-colon separated
|
|
||||||
if [ "$BUILD_SYSTEM" = "autotools" ]
|
|
||||||
then
|
|
||||||
SEP=","
|
|
||||||
else
|
|
||||||
SEP=";"
|
|
||||||
fi
|
|
||||||
|
|
||||||
CHECK_TYPE_TEMP=""
|
|
||||||
for crc in $(echo "$CHECK_TYPE" | sed "s/,/ /g"); do
|
|
||||||
case "$crc" in
|
|
||||||
crc32 | crc64 | sha256) ;;
|
|
||||||
*) echo "Invalid check type: $crc"; exit 1 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
CHECK_TYPE_TEMP="$CHECK_TYPE_TEMP$SEP$crc"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Remove the first character from $CHECK_TYPE_TEMP since it will
|
|
||||||
# always be the delimiter.
|
|
||||||
CHECK_TYPE="${CHECK_TYPE_TEMP:1}"
|
|
||||||
|
|
||||||
FILTER_LIST="lzma1$SEP"lzma2
|
|
||||||
|
|
||||||
# Build based on arguments
|
|
||||||
mkdir -p "$DEST_DIR"
|
|
||||||
|
|
||||||
# Generate configure option values
|
|
||||||
EXTRA_OPTIONS=""
|
|
||||||
|
|
||||||
case $BUILD_SYSTEM in
|
|
||||||
autotools)
|
|
||||||
cd "$SRC_DIR"
|
|
||||||
|
|
||||||
# Run autogen.sh script if not already run
|
|
||||||
if [ ! -f configure ]
|
|
||||||
then
|
|
||||||
./autogen.sh "$AUTOGEN_FLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd "$DEST_DIR"
|
|
||||||
|
|
||||||
add_to_filter_list "$BCJ" ",x86,powerpc,ia64,arm,armthumb,arm64,sparc,riscv"
|
|
||||||
add_to_filter_list "$DELTA" ",delta"
|
|
||||||
|
|
||||||
add_extra_option "$ENCODERS" "--enable-encoders=$FILTER_LIST" "--disable-encoders"
|
|
||||||
add_extra_option "$DECODERS" "--enable-decoders=$FILTER_LIST" "--disable-decoders"
|
|
||||||
add_extra_option "$THREADS" "" "--disable-threads"
|
|
||||||
add_extra_option "$SHARED" "" "--disable-shared"
|
|
||||||
add_extra_option "$NATIVE_LANG_SUPPORT" "" "--disable-nls"
|
|
||||||
add_extra_option "$SMALL" "--enable-small" ""
|
|
||||||
add_extra_option "$CLMUL" "" "--disable-clmul-crc"
|
|
||||||
add_extra_option "$SANDBOX" "" "--disable-sandbox"
|
|
||||||
add_extra_option "$DOXYGEN" "--enable-doxygen" ""
|
|
||||||
|
|
||||||
# Workaround a bug in too old config.guess. Version with
|
|
||||||
# timestamp='2022-05-08' would be needed but the autotools-dev
|
|
||||||
# package has 2022-01-09 in Ubuntu 22.04LTS and 24.04LTS. The
|
|
||||||
# bug breaks i386 assembler usage autodetection.
|
|
||||||
if "$SRC_DIR/build-aux/config.guess" | grep -q x86_64-pc-linux-gnux32
|
|
||||||
then
|
|
||||||
EXTRA_OPTIONS="$EXTRA_OPTIONS --build=i686-pc-linux-gnu"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run configure script
|
|
||||||
"$SRC_DIR"/configure --enable-werror --enable-checks="$CHECK_TYPE" $EXTRA_OPTIONS --config-cache
|
|
||||||
|
|
||||||
# Build the project
|
|
||||||
make
|
|
||||||
;;
|
|
||||||
cmake)
|
|
||||||
cd "$DEST_DIR"
|
|
||||||
|
|
||||||
add_to_filter_list "$BCJ" ";x86;powerpc;ia64;arm;armthumb;arm64;sparc;riscv"
|
|
||||||
add_to_filter_list "$DELTA" ";delta"
|
|
||||||
|
|
||||||
add_extra_option "$THREADS" "-DXZ_THREADS=yes" "-DXZ_THREADS=no"
|
|
||||||
|
|
||||||
# Disable MicroLZMA if encoders are not configured.
|
|
||||||
add_extra_option "$ENCODERS" "-DXZ_ENCODERS=$FILTER_LIST" "-DXZ_ENCODERS= -DXZ_MICROLZMA_ENCODER=OFF"
|
|
||||||
|
|
||||||
# Disable MicroLZMA and lzip decoders if decoders are not configured.
|
|
||||||
add_extra_option "$DECODERS" "-DXZ_DECODERS=$FILTER_LIST" "-DXZ_DECODERS= -DXZ_MICROLZMA_DECODER=OFF -DXZ_LZIP_DECODER=OFF"
|
|
||||||
|
|
||||||
# CMake disables the shared library by default.
|
|
||||||
add_extra_option "$SHARED" "-DBUILD_SHARED_LIBS=ON" ""
|
|
||||||
|
|
||||||
add_extra_option "$NATIVE_LANG_SUPPORT" "" "-DXZ_NLS=OFF"
|
|
||||||
add_extra_option "$SMALL" "-DXZ_SMALL=ON" ""
|
|
||||||
add_extra_option "$DOXYGEN" "-DXZ_DOXYGEN=ON" ""
|
|
||||||
|
|
||||||
# Remove old cache file to clear previous settings.
|
|
||||||
rm -f "CMakeCache.txt"
|
|
||||||
cmake "$SRC_DIR/CMakeLists.txt" -B "$DEST_DIR" $EXTRA_OPTIONS -DXZ_CHECKS="$CHECK_TYPE" -G "Unix Makefiles"
|
|
||||||
cmake --build "$DEST_DIR"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
##############
|
|
||||||
# Test Phase #
|
|
||||||
##############
|
|
||||||
|
|
||||||
if [ "$PHASE" = "all" ] || [ "$PHASE" = "test" ]
|
|
||||||
then
|
|
||||||
case $BUILD_SYSTEM in
|
|
||||||
autotools)
|
|
||||||
cd "$DEST_DIR"
|
|
||||||
# If the tests fail, copy the test logs into the artifacts folder
|
|
||||||
if make check VERBOSE=1 LOG_COMPILER="$WRAPPER"
|
|
||||||
then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
mkdir -p "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
|
|
||||||
cp ./tests/*.log "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
cmake)
|
|
||||||
cd "$DEST_DIR"
|
|
||||||
if ${WRAPPER} make CTEST_OUTPUT_ON_FAILURE=1 test
|
|
||||||
then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
mkdir -p "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
|
|
||||||
cp ./Testing/Temporary/*.log "$SRC_DIR/build-aux/artifacts/$ARTIFACTS_DIR_NAME"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
@ -1,177 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Look for missing license info in xz.git
|
|
||||||
#
|
|
||||||
# The project doesn't conform to the FSFE REUSE specification for now.
|
|
||||||
# Instead, this script helps in finding files that lack license info.
|
|
||||||
# Pass -v as an argument to get license info from all files in xz.git or,
|
|
||||||
# when .git isn't available, from files extracted from a release tarball
|
|
||||||
# (in case of a release tarball, the tree must be clean of any extra files).
|
|
||||||
#
|
|
||||||
# NOTE: This relies on non-POSIX xargs -0. It's supported on GNU and *BSDs.
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
# Print good files too if -v is passed as an argument.
|
|
||||||
VERBOSE=false
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
;;
|
|
||||||
-v)
|
|
||||||
VERBOSE=true
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: $0 [-v]"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
# Use the C locale so that sorting is always the same.
|
|
||||||
LC_ALL=C
|
|
||||||
export LC_ALL
|
|
||||||
|
|
||||||
|
|
||||||
# String to match the SPDX license identifier tag.
|
|
||||||
# Spell it here in a way that doesn't match regular grep patterns.
|
|
||||||
SPDX_LI='SPDX''-License-''Identifier'':'
|
|
||||||
|
|
||||||
# Pattern for files that don't contain SPDX tags but they are under
|
|
||||||
# a free license that isn't 0BSD.
|
|
||||||
PAT_UNTAGGED_MISC='^COPYING\.
|
|
||||||
^INSTALL\.generic$'
|
|
||||||
|
|
||||||
# Pattern for files that are 0BSD but don't contain SPDX tags.
|
|
||||||
# (The two file format specification files are public domain but
|
|
||||||
# they can be treated as 0BSD too.)
|
|
||||||
PAT_UNTAGGED_0BSD='^(.*/)?\.gitattributes$
|
|
||||||
^(.*/)?\.gitignore$
|
|
||||||
^\.github/SECURITY\.md$
|
|
||||||
^AUTHORS$
|
|
||||||
^COPYING$
|
|
||||||
^ChangeLog$
|
|
||||||
^INSTALL$
|
|
||||||
^NEWS$
|
|
||||||
^PACKAGERS$
|
|
||||||
^(.*/)?README$
|
|
||||||
^THANKS$
|
|
||||||
^TODO$
|
|
||||||
^(.*/)?[^/]+\.txt$
|
|
||||||
^doc/SHA256SUMS$
|
|
||||||
^po/LINGUAS$
|
|
||||||
^src/common/w32_application\.manifest$
|
|
||||||
^tests/xzgrep_expected_output$
|
|
||||||
^tests/files/[^/]+\.(lz|lzma|xz)$'
|
|
||||||
|
|
||||||
# Pattern for files that must be ignored when Git isn't available. This is
|
|
||||||
# useful when this script is run right after extracting a release tarball.
|
|
||||||
PAT_TARBALL_IGNORE='^(m4/)?[^/]*\.m4$
|
|
||||||
^(.*/)?Makefile\.in(\.in)?$
|
|
||||||
^(po|po4a)/.*[^.]..$
|
|
||||||
^ABOUT-NLS$
|
|
||||||
^build-aux/(config\..*|ltmain\.sh|[^.]*)$
|
|
||||||
^config\.h\.in$
|
|
||||||
^configure$'
|
|
||||||
|
|
||||||
|
|
||||||
# Go to the top source dir.
|
|
||||||
cd "$(dirname "$0")/.." || exit 1
|
|
||||||
|
|
||||||
# Get the list of files to check from git if possible.
|
|
||||||
# Otherwise list the whole source tree. This script should pass
|
|
||||||
# if it is run right after extracting a release tarball.
|
|
||||||
if test -d .git && type git > /dev/null 2>&1; then
|
|
||||||
FILES=$(git ls-files) || exit 1
|
|
||||||
IS_TARBALL=false
|
|
||||||
else
|
|
||||||
FILES=$(find . -type f) || exit 1
|
|
||||||
FILES=$(printf '%s\n' "$FILES" | sed 's,^\./,,')
|
|
||||||
IS_TARBALL=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sort to keep the order consistent.
|
|
||||||
FILES=$(printf '%s\n' "$FILES" | sort)
|
|
||||||
|
|
||||||
|
|
||||||
# Find the tagged files.
|
|
||||||
TAGGED=$(printf '%s\n' "$FILES" \
|
|
||||||
| tr '\n' '\000' | xargs -0r grep -l "$SPDX_LI" --)
|
|
||||||
|
|
||||||
# Find the tagged 0BSD files.
|
|
||||||
TAGGED_0BSD=$(printf '%s\n' "$TAGGED" \
|
|
||||||
| tr '\n' '\000' | xargs -0r grep -l "$SPDX_LI 0BSD" --)
|
|
||||||
|
|
||||||
# Find the tagged non-0BSD files, that is, remove the 0BSD-tagged files
|
|
||||||
# from the list of tagged files.
|
|
||||||
TAGGED_MISC=$(printf '%s\n%s\n' "$TAGGED" "$TAGGED_0BSD" | sort | uniq -u)
|
|
||||||
|
|
||||||
|
|
||||||
# Remove the tagged files from the list.
|
|
||||||
FILES=$(printf '%s\n%s\n' "$FILES" "$TAGGED" | sort | uniq -u)
|
|
||||||
|
|
||||||
# Find the intentionally-untagged files.
|
|
||||||
UNTAGGED_0BSD=$(printf '%s\n' "$FILES" | grep -E "$PAT_UNTAGGED_0BSD")
|
|
||||||
UNTAGGED_MISC=$(printf '%s\n' "$FILES" | grep -E "$PAT_UNTAGGED_MISC")
|
|
||||||
|
|
||||||
# Remove the intentionally-untagged files from the list.
|
|
||||||
FILES=$(printf '%s\n' "$FILES" | grep -Ev \
|
|
||||||
-e "$PAT_UNTAGGED_0BSD" -e "$PAT_UNTAGGED_MISC")
|
|
||||||
|
|
||||||
|
|
||||||
# FIXME: Allow untagged translations if they have a public domain notice.
|
|
||||||
# These are old translations that haven't been updated after 2024-02-14.
|
|
||||||
# Eventually these should go away.
|
|
||||||
PD_PO=$(printf '%s\n' "$FILES" | grep '\.po$' | tr '\n' '\000' \
|
|
||||||
| xargs -0r grep -Fl '# This file is put in the public domain.' --)
|
|
||||||
|
|
||||||
if test -n "$PD_PO"; then
|
|
||||||
# Remove the public domain .po files from the list.
|
|
||||||
FILES=$(printf '%s\n%s\n' "$FILES" "$PD_PO" | sort | uniq -u)
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Remove generated files from the list which don't have SPDX tags but which
|
|
||||||
# can be present in release tarballs. This step is skipped when the file list
|
|
||||||
# is from "git ls-files".
|
|
||||||
GENERATED=
|
|
||||||
if $IS_TARBALL; then
|
|
||||||
GENERATED=$(printf '%s\n' "$FILES" | grep -E "$PAT_TARBALL_IGNORE")
|
|
||||||
FILES=$(printf '%s\n' "$FILES" | grep -Ev "$PAT_TARBALL_IGNORE")
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if $VERBOSE; then
|
|
||||||
printf '# Tagged 0BSD files:\n%s\n\n' "$TAGGED_0BSD"
|
|
||||||
printf '# Intentionally untagged 0BSD:\n%s\n\n' "$UNTAGGED_0BSD"
|
|
||||||
|
|
||||||
# FIXME: Remove when no longer needed.
|
|
||||||
if test -n "$PD_PO"; then
|
|
||||||
printf '# Old public domain translations:\n%s\n\n' "$PD_PO"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '# Tagged non-0BSD files:\n%s\n\n' "$TAGGED_MISC"
|
|
||||||
printf '# Intentionally untagged miscellaneous: \n%s\n\n' \
|
|
||||||
"$UNTAGGED_MISC"
|
|
||||||
|
|
||||||
if test -n "$GENERATED"; then
|
|
||||||
printf '# Generated files whose license was NOT checked:\n%s\n\n' \
|
|
||||||
"$GENERATED"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Look for files with an unknown license and set the exit status accordingly.
|
|
||||||
STATUS=0
|
|
||||||
if test -n "$FILES"; then
|
|
||||||
printf '# ERROR: Licensing is unclear:\n%s\n' "$FILES"
|
|
||||||
STATUS=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit "$STATUS"
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Wrapper for GNU groff to convert man pages to a few formats
|
|
||||||
#
|
|
||||||
# Usage: manconv.sh FORMAT [PAPER_SIZE] < in.1 > out.suffix
|
|
||||||
#
|
|
||||||
# FORMAT can be ascii, utf8, ps, or pdf. PAPER_SIZE can be anything that
|
|
||||||
# groff accepts, e.g. a4 or letter. See groff_font(5). PAPER_SIZE defaults
|
|
||||||
# to a4 and is used only when FORMAT is ps (PostScript) or pdf.
|
|
||||||
#
|
|
||||||
# Multiple man pages can be given at once e.g. to create a single PDF file
|
|
||||||
# with continuous page numbering.
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
FORMAT=$1
|
|
||||||
PAPER=${2-a4}
|
|
||||||
|
|
||||||
# Make PostScript and PDF output more readable:
|
|
||||||
# - Use 11 pt font instead of the default 10 pt.
|
|
||||||
# - Use larger paragraph spacing than the default 0.4v (man(7) only).
|
|
||||||
FONT=11
|
|
||||||
PD=0.8
|
|
||||||
|
|
||||||
SED_PD="
|
|
||||||
/^\\.TH /s/\$/\\
|
|
||||||
.PD $PD/
|
|
||||||
s/^\\.PD\$/.PD $PD/"
|
|
||||||
|
|
||||||
case $FORMAT in
|
|
||||||
ascii)
|
|
||||||
groff -t -mandoc -Tascii -P-c | col -bx
|
|
||||||
;;
|
|
||||||
utf8)
|
|
||||||
groff -t -mandoc -Tutf8 -P-c | col -bx
|
|
||||||
;;
|
|
||||||
ps)
|
|
||||||
sed "$SED_PD" | groff -dpaper="$PAPER" -t -mandoc \
|
|
||||||
-rC1 -rS"$FONT" -Tps -P-p"$PAPER"
|
|
||||||
;;
|
|
||||||
pdf)
|
|
||||||
sed "$SED_PD" | groff -dpaper="$PAPER" -t -mandoc \
|
|
||||||
-rC1 -rS"$FONT" -Tps -P-p"$PAPER" | ps2pdf - -
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo 'Invalid arguments' >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Get the version string from version.h and print it out without
|
|
||||||
# trailing newline. This makes it suitable for use in configure.ac.
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
sed -n 's/LZMA_VERSION_STABILITY_ALPHA/alpha/
|
|
||||||
s/LZMA_VERSION_STABILITY_BETA/beta/
|
|
||||||
s/LZMA_VERSION_STABILITY_STABLE//
|
|
||||||
s/^#define LZMA_VERSION_[MPS][AIT][AJNT][A-Z]* //p' \
|
|
||||||
src/liblzma/api/lzma/version.h \
|
|
||||||
| sed 'N; N; N; s/\n/./; s/\n/./; s/\n//g' \
|
|
||||||
| tr -d '\012\015\025'
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# remove-ordinals.cmake
|
|
||||||
#
|
|
||||||
# Removes the ordinal numbers from a DEF file that has been created by
|
|
||||||
# GNU ld or LLVM lld option --output-def (when creating a Windows DLL).
|
|
||||||
# This should be equivalent: sed 's/ \+@ *[0-9]\+//'
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
#
|
|
||||||
# cmake -DINPUT_FILE=infile.def.in \
|
|
||||||
# -DOUTPUT_FILE=outfile.def \
|
|
||||||
# -P remove-ordinals.cmake
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
file(READ "${INPUT_FILE}" STR)
|
|
||||||
string(REGEX REPLACE " +@ *[0-9]+" "" STR "${STR}")
|
|
||||||
file(WRITE "${OUTPUT_FILE}" "${STR}")
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# tuklib_common.cmake - common functions and macros for tuklib_*.cmake files
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
function(tuklib_add_definitions TARGET_OR_ALL DEFINITIONS)
|
|
||||||
# DEFINITIONS may be an empty string/list but it's fine here. There is
|
|
||||||
# no need to quote ${DEFINITIONS} as empty arguments are fine here.
|
|
||||||
if(TARGET_OR_ALL STREQUAL "ALL")
|
|
||||||
add_compile_definitions(${DEFINITIONS})
|
|
||||||
else()
|
|
||||||
target_compile_definitions("${TARGET_OR_ALL}" PRIVATE ${DEFINITIONS})
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(tuklib_add_definition_if TARGET_OR_ALL VAR)
|
|
||||||
if(${VAR})
|
|
||||||
tuklib_add_definitions("${TARGET_OR_ALL}" "${VAR}")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# This is an over-simplified version of AC_USE_SYSTEM_EXTENSIONS in Autoconf
|
|
||||||
# or gl_USE_SYSTEM_EXTENSIONS in gnulib.
|
|
||||||
#
|
|
||||||
# NOTE: This is a macro because the changes to CMAKE_REQUIRED_DEFINITIONS
|
|
||||||
# must be visible in the calling scope.
|
|
||||||
macro(tuklib_use_system_extensions)
|
|
||||||
if(NOT MSVC)
|
|
||||||
add_compile_definitions(
|
|
||||||
_GNU_SOURCE # glibc, musl, mingw-w64
|
|
||||||
_NETBSD_SOURCE # NetBSD, MINIX 3
|
|
||||||
_OPENBSD_SOURCE # Also NetBSD!
|
|
||||||
__EXTENSIONS__ # Solaris
|
|
||||||
_POSIX_PTHREAD_SEMANTICS # Solaris
|
|
||||||
_DARWIN_C_SOURCE # macOS
|
|
||||||
_TANDEM_SOURCE # HP NonStop
|
|
||||||
_ALL_SOURCE # AIX, z/OS
|
|
||||||
)
|
|
||||||
|
|
||||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS
|
|
||||||
-D_GNU_SOURCE
|
|
||||||
-D_NETBSD_SOURCE
|
|
||||||
-D_OPENBSD_SOURCE
|
|
||||||
-D__EXTENSIONS__
|
|
||||||
-D_POSIX_PTHREAD_SEMANTICS
|
|
||||||
-D_DARWIN_C_SOURCE
|
|
||||||
-D_TANDEM_SOURCE
|
|
||||||
-D_ALL_SOURCE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endmacro()
|
|
||||||
@ -1,184 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# tuklib_cpucores.cmake - see tuklib_cpucores.m4 for description and comments
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake")
|
|
||||||
include(CMakePushCheckState)
|
|
||||||
include(CheckCSourceCompiles)
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
|
|
||||||
function(tuklib_cpucores_internal_check)
|
|
||||||
if(WIN32 OR CYGWIN)
|
|
||||||
# Nothing to do, the tuklib_cpucores.c handles it.
|
|
||||||
set(TUKLIB_CPUCORES_DEFINITIONS "" CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# glibc-based systems (GNU/Linux and GNU/kFreeBSD) have
|
|
||||||
# sched_getaffinity(). The CPU_COUNT() macro was added in glibc 2.9.
|
|
||||||
# glibc 2.9 is old enough that if someone uses the code on older glibc,
|
|
||||||
# the fallback to sysconf() should be good enough.
|
|
||||||
#
|
|
||||||
# NOTE: This required that _GNU_SOURCE is defined. We assume that whatever
|
|
||||||
# feature test macros the caller wants to use are already set in
|
|
||||||
# CMAKE_REQUIRED_DEFINES and in the target defines.
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <sched.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
cpu_set_t cpu_mask;
|
|
||||||
sched_getaffinity(0, sizeof(cpu_mask), &cpu_mask);
|
|
||||||
return CPU_COUNT(&cpu_mask);
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_CPUCORES_SCHED_GETAFFINITY)
|
|
||||||
if(TUKLIB_CPUCORES_SCHED_GETAFFINITY)
|
|
||||||
set(TUKLIB_CPUCORES_DEFINITIONS
|
|
||||||
"TUKLIB_CPUCORES_SCHED_GETAFFINITY"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# FreeBSD has both cpuset and sysctl. Look for cpuset first because
|
|
||||||
# it's a better approach.
|
|
||||||
#
|
|
||||||
# This test would match on GNU/kFreeBSD too but it would require
|
|
||||||
# -lfreebsd-glue when linking and thus in the current form this would
|
|
||||||
# fail on GNU/kFreeBSD. The above test for sched_getaffinity() matches
|
|
||||||
# on GNU/kFreeBSD so the test below should never run on that OS.
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/cpuset.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
cpuset_t set;
|
|
||||||
cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1,
|
|
||||||
sizeof(set), &set);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_CPUCORES_CPUSET)
|
|
||||||
if(TUKLIB_CPUCORES_CPUSET)
|
|
||||||
set(TUKLIB_CPUCORES_DEFINITIONS "HAVE_PARAM_H;TUKLIB_CPUCORES_CPUSET"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# On OS/2, both sysconf() and sysctl() pass the tests in this file,
|
|
||||||
# but only sysctl() works. On QNX it's the opposite: only sysconf() works
|
|
||||||
# (although it assumes that _POSIX_SOURCE, _XOPEN_SOURCE, and
|
|
||||||
# _POSIX_C_SOURCE are undefined or alternatively _QNX_SOURCE is defined).
|
|
||||||
#
|
|
||||||
# We test sysctl() first and intentionally break the sysctl() test on QNX
|
|
||||||
# so that sysctl() is never used on QNX.
|
|
||||||
cmake_push_check_state()
|
|
||||||
check_include_file(sys/param.h HAVE_SYS_PARAM_H)
|
|
||||||
if(HAVE_SYS_PARAM_H)
|
|
||||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_PARAM_H)
|
|
||||||
endif()
|
|
||||||
check_c_source_compiles("
|
|
||||||
#ifdef __QNX__
|
|
||||||
compile error
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_PARAM_H
|
|
||||||
# include <sys/param.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
#ifdef HW_NCPUONLINE
|
|
||||||
/* This is preferred on OpenBSD, see tuklib_cpucores.c. */
|
|
||||||
int name[2] = { CTL_HW, HW_NCPUONLINE };
|
|
||||||
#else
|
|
||||||
int name[2] = { CTL_HW, HW_NCPU };
|
|
||||||
#endif
|
|
||||||
int cpus;
|
|
||||||
size_t cpus_size = sizeof(cpus);
|
|
||||||
sysctl(name, 2, &cpus, &cpus_size, NULL, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_CPUCORES_SYSCTL)
|
|
||||||
cmake_pop_check_state()
|
|
||||||
if(TUKLIB_CPUCORES_SYSCTL)
|
|
||||||
if(HAVE_SYS_PARAM_H)
|
|
||||||
set(TUKLIB_CPUCORES_DEFINITIONS
|
|
||||||
"HAVE_PARAM_H;TUKLIB_CPUCORES_SYSCTL"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
else()
|
|
||||||
set(TUKLIB_CPUCORES_DEFINITIONS
|
|
||||||
"TUKLIB_CPUCORES_SYSCTL"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
endif()
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Many platforms support sysconf().
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <unistd.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
long i;
|
|
||||||
#ifdef _SC_NPROCESSORS_ONLN
|
|
||||||
/* Many systems using sysconf() */
|
|
||||||
i = sysconf(_SC_NPROCESSORS_ONLN);
|
|
||||||
#else
|
|
||||||
/* IRIX */
|
|
||||||
i = sysconf(_SC_NPROC_ONLN);
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_CPUCORES_SYSCONF)
|
|
||||||
if(TUKLIB_CPUCORES_SYSCONF)
|
|
||||||
set(TUKLIB_CPUCORES_DEFINITIONS "TUKLIB_CPUCORES_SYSCONF"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# HP-UX
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/pstat.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
struct pst_dynamic pst;
|
|
||||||
pstat_getdynamic(&pst, sizeof(pst), 1, 0);
|
|
||||||
(void)pst.psd_proc_cnt;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_CPUCORES_PSTAT_GETDYNAMIC)
|
|
||||||
if(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC)
|
|
||||||
set(TUKLIB_CPUCORES_DEFINITIONS "TUKLIB_CPUCORES_PSTAT_GETDYNAMIC"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(tuklib_cpucores TARGET_OR_ALL)
|
|
||||||
if(NOT DEFINED TUKLIB_CPUCORES_FOUND)
|
|
||||||
message(STATUS
|
|
||||||
"Checking how to detect the number of available CPU cores")
|
|
||||||
tuklib_cpucores_internal_check()
|
|
||||||
|
|
||||||
if(DEFINED TUKLIB_CPUCORES_DEFINITIONS)
|
|
||||||
set(TUKLIB_CPUCORES_FOUND 1 CACHE INTERNAL "")
|
|
||||||
else()
|
|
||||||
set(TUKLIB_CPUCORES_FOUND 0 CACHE INTERNAL "")
|
|
||||||
message(WARNING
|
|
||||||
"No method to detect the number of CPU cores was found")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(TUKLIB_CPUCORES_FOUND)
|
|
||||||
tuklib_add_definitions("${TARGET_OR_ALL}"
|
|
||||||
"${TUKLIB_CPUCORES_DEFINITIONS}")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
@ -1,288 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# tuklib_integer.cmake - see tuklib_integer.m4 for description and comments
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake")
|
|
||||||
include(TestBigEndian)
|
|
||||||
include(CheckCSourceCompiles)
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
|
|
||||||
# An internal helper for tuklib_integer that attempts to detect if
|
|
||||||
# -mstrict-align or -mno-strict-align is in effect. This sets the
|
|
||||||
# cache variable TUKLIB_INTEGER_STRICT_ALIGN to ON if OBJDUMP_REGEX
|
|
||||||
# matches the objdump output of a check program. Otherwise it is set to OFF.
|
|
||||||
function(tuklib_integer_internal_strict_align OBJDUMP_REGEX)
|
|
||||||
if(NOT DEFINED TUKLIB_INTEGER_STRICT_ALIGN)
|
|
||||||
# Build a static library because then the function won't be optimized
|
|
||||||
# away, and there won't be any unrelated startup code either.
|
|
||||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
|
||||||
|
|
||||||
# CMake >= 3.25 wouldn't require us to create a temporary file,
|
|
||||||
# but the following method is compatible with 3.20.
|
|
||||||
file(WRITE "${CMAKE_BINARY_DIR}/tuklib_integer_strict_align.c" "
|
|
||||||
#include <string.h>
|
|
||||||
unsigned int check_strict_align(const void *p)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
memcpy(&i, p, sizeof(i));
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
")
|
|
||||||
|
|
||||||
# Force -O2 because memcpy() won't be optimized out if optimizations
|
|
||||||
# are disabled.
|
|
||||||
try_compile(
|
|
||||||
TRY_COMPILE_RESULT
|
|
||||||
"${CMAKE_BINARY_DIR}"
|
|
||||||
"${CMAKE_BINARY_DIR}/tuklib_integer_strict_align.c"
|
|
||||||
COMPILE_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}"
|
|
||||||
CMAKE_FLAGS "-DCOMPILE_DEFINITIONS=${CMAKE_REQUIRED_FLAGS} -O2"
|
|
||||||
COPY_FILE "${CMAKE_BINARY_DIR}/tuklib_integer_strict_align.a"
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT TRY_COMPILE_RESULT)
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Compilation of the strict align check failed. "
|
|
||||||
"Either the specified compiler flags are broken "
|
|
||||||
"or ${CMAKE_CURRENT_FUNCTION_LIST_FILE} has a bug.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Use WORKING_DIRECTORY instead of passing the full path to objdump.
|
|
||||||
# This ensures that the pathname won't affect the objdump output,
|
|
||||||
# which could result in an unwanted regex match in the next step.
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${CMAKE_OBJDUMP}" -d "tuklib_integer_strict_align.a"
|
|
||||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
|
||||||
OUTPUT_VARIABLE OBJDUMP_OUTPUT
|
|
||||||
RESULT_VARIABLE OBJDUMP_RESULT
|
|
||||||
)
|
|
||||||
|
|
||||||
# FIXME? Should we remove the temporary files here?
|
|
||||||
|
|
||||||
# Look for instructions that load unsigned bytes. If none are found,
|
|
||||||
# assume that -mno-strict-align is in effect.
|
|
||||||
if(OBJDUMP_RESULT STREQUAL "0" AND
|
|
||||||
OBJDUMP_OUTPUT MATCHES "${OBJDUMP_REGEX}")
|
|
||||||
set(TUKLIB_INTEGER_STRICT_ALIGN ON CACHE INTERNAL "")
|
|
||||||
else()
|
|
||||||
set(TUKLIB_INTEGER_STRICT_ALIGN OFF CACHE INTERNAL "")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(tuklib_integer TARGET_OR_ALL)
|
|
||||||
# Check for endianness. Unlike the Autoconf's AC_C_BIGENDIAN, this doesn't
|
|
||||||
# support Apple universal binaries. The CMake module will leave the
|
|
||||||
# variable unset so we can catch that situation here instead of continuing
|
|
||||||
# as if we were little endian.
|
|
||||||
test_big_endian(WORDS_BIGENDIAN)
|
|
||||||
if(NOT DEFINED WORDS_BIGENDIAN)
|
|
||||||
message(FATAL_ERROR "Cannot determine endianness")
|
|
||||||
endif()
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" WORDS_BIGENDIAN)
|
|
||||||
|
|
||||||
# Look for a byteswapping method.
|
|
||||||
check_c_source_compiles("
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
__builtin_bswap16(1);
|
|
||||||
__builtin_bswap32(1);
|
|
||||||
__builtin_bswap64(1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
HAVE___BUILTIN_BSWAPXX)
|
|
||||||
if(HAVE___BUILTIN_BSWAPXX)
|
|
||||||
tuklib_add_definitions("${TARGET_OR_ALL}" HAVE___BUILTIN_BSWAPXX)
|
|
||||||
else()
|
|
||||||
check_include_file(byteswap.h HAVE_BYTESWAP_H)
|
|
||||||
if(HAVE_BYTESWAP_H)
|
|
||||||
tuklib_add_definitions("${TARGET_OR_ALL}" HAVE_BYTESWAP_H)
|
|
||||||
check_symbol_exists(bswap_16 byteswap.h HAVE_BSWAP_16)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_BSWAP_16)
|
|
||||||
check_symbol_exists(bswap_32 byteswap.h HAVE_BSWAP_32)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_BSWAP_32)
|
|
||||||
check_symbol_exists(bswap_64 byteswap.h HAVE_BSWAP_64)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_BSWAP_64)
|
|
||||||
else()
|
|
||||||
check_include_file(sys/endian.h HAVE_SYS_ENDIAN_H)
|
|
||||||
if(HAVE_SYS_ENDIAN_H)
|
|
||||||
tuklib_add_definitions("${TARGET_OR_ALL}" HAVE_SYS_ENDIAN_H)
|
|
||||||
else()
|
|
||||||
check_include_file(sys/byteorder.h HAVE_SYS_BYTEORDER_H)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}"
|
|
||||||
HAVE_SYS_BYTEORDER_H)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Autodetect if unaligned memory access is fast when the cache variable
|
|
||||||
# TUKLIB_FAST_UNALIGNED_ACCESS isn't set. The result is stored in
|
|
||||||
# FAST_UNALIGNED_GUESS. Assume that unaligned access shouldn't be used.
|
|
||||||
# Initialize the variable here so that it's never undefined in the
|
|
||||||
# option() command after the if()...endif() block.
|
|
||||||
set(FAST_UNALIGNED_GUESS OFF)
|
|
||||||
if(NOT DEFINED TUKLIB_FAST_UNALIGNED_ACCESS)
|
|
||||||
message(CHECK_START "Check if unaligned memory access should be used")
|
|
||||||
|
|
||||||
# Guess that unaligned access is fast on these archs:
|
|
||||||
# - 32/64-bit x86 / x86-64
|
|
||||||
# - 32/64-bit big endian PowerPC
|
|
||||||
# - 64-bit little endian PowerPC
|
|
||||||
# - 32/64-bit Loongarch (*)
|
|
||||||
# - Some 32-bit ARM
|
|
||||||
# - Some 64-bit ARM64 (AArch64)
|
|
||||||
# - Some 32/64-bit RISC-V
|
|
||||||
#
|
|
||||||
# (*) See sections 7.4, 8.1, and 8.2:
|
|
||||||
# https://github.com/loongson/la-softdev-convention/blob/v0.2/la-softdev-convention.adoc
|
|
||||||
#
|
|
||||||
# That is, desktop and server processors likely support
|
|
||||||
# unaligned access in hardware but embedded processors
|
|
||||||
# might not. GCC defaults to -mno-strict-align and so
|
|
||||||
# do majority of GNU/Linux distributions. As of
|
|
||||||
# GCC 15.2, there is no predefined macro to detect
|
|
||||||
# if -mstrict-align or -mno-strict-align is in effect.
|
|
||||||
# We use heuristics based on compiler output.
|
|
||||||
#
|
|
||||||
# CMake < 4.1 doesn't provide a standardized/normalized list of arch
|
|
||||||
# names. For example, x86-64 may be "x86_64" (Linux),
|
|
||||||
# "AMD64" (Windows), or even "EM64T" (64-bit WinXP).
|
|
||||||
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" PROCESSOR)
|
|
||||||
|
|
||||||
# CMake 4.1 made CMAKE_<LANG>_COMPILER_ARCHITECTURE_ID useful on many
|
|
||||||
# targets. In earlier versions it's still useful with MSVC with which
|
|
||||||
# CMAKE_SYSTEM_PROCESSOR can refer to the build machine.
|
|
||||||
if(NOT CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "")
|
|
||||||
# CMake 4.2.0 docs say that the list typically has only one entry
|
|
||||||
# except possibly on macOS. On macOS, most (all?) archs support
|
|
||||||
# unaligned access. Just pick the first one from the list.
|
|
||||||
list(GET CMAKE_C_COMPILER_ARCHITECTURE_ID 0 PROCESSOR)
|
|
||||||
string(TOLOWER "${PROCESSOR}" PROCESSOR)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# There is no ^ in the first regex branch to allow "i" at
|
|
||||||
# the beginning so it can match "i386" to "i786", and "x86_64".
|
|
||||||
if(PROCESSOR MATCHES "[x34567]86|^x64|^amd64|^em64t")
|
|
||||||
set(FAST_UNALIGNED_GUESS ON)
|
|
||||||
|
|
||||||
elseif(PROCESSOR MATCHES "^powerpc|^ppc")
|
|
||||||
if(WORDS_BIGENDIAN OR PROCESSOR MATCHES "64")
|
|
||||||
set(FAST_UNALIGNED_GUESS ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
elseif(PROCESSOR MATCHES "^arm|^riscv" AND
|
|
||||||
NOT PROCESSOR MATCHES "^arm64")
|
|
||||||
# On 32-bit ARM, GCC and Clang # #define __ARM_FEATURE_UNALIGNED
|
|
||||||
# if and only if unaligned access is supported.
|
|
||||||
#
|
|
||||||
# RISC-V C API Specification says that if
|
|
||||||
# __riscv_misaligned_fast is defined then
|
|
||||||
# unaligned access is known to be fast.
|
|
||||||
#
|
|
||||||
# MSVC is handled as a special case: We assume that
|
|
||||||
# 32-bit ARM supports fast unaligned access.
|
|
||||||
# If MSVC gets RISC-V support then this will assume
|
|
||||||
# fast unaligned access on RISC-V too.
|
|
||||||
check_c_source_compiles("
|
|
||||||
#if !defined(__ARM_FEATURE_UNALIGNED) \
|
|
||||||
&& !defined(__riscv_misaligned_fast) \
|
|
||||||
&& !defined(_MSC_VER)
|
|
||||||
compile error
|
|
||||||
#endif
|
|
||||||
int main(void) { return 0; }
|
|
||||||
"
|
|
||||||
TUKLIB_FAST_UNALIGNED_DEFINED_BY_PREPROCESSOR)
|
|
||||||
if(TUKLIB_FAST_UNALIGNED_DEFINED_BY_PREPROCESSOR)
|
|
||||||
set(FAST_UNALIGNED_GUESS ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
elseif(PROCESSOR MATCHES "^aarch64|^arm64")
|
|
||||||
# On ARM64, Clang defines __ARM_FEATURE_UNALIGNED if and only if
|
|
||||||
# unaligned access is supported. However, GCC (at least up to 15.2.0)
|
|
||||||
# defines it even when using -mstrict-align, so autodetection with
|
|
||||||
# this macro doesn't work with GCC on ARM64. (It does work on
|
|
||||||
# 32-bit ARM.) See:
|
|
||||||
#
|
|
||||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111555
|
|
||||||
#
|
|
||||||
# We need three checks:
|
|
||||||
#
|
|
||||||
# 1. If __ARM_FEATURE_UNALIGNED is defined and the
|
|
||||||
# compiler isn't GCC, unaligned access is enabled.
|
|
||||||
# If the compiler is MSVC, unaligned access is
|
|
||||||
# enabled even without __ARM_FEATURE_UNALIGNED.
|
|
||||||
check_c_source_compiles("
|
|
||||||
#if defined(__ARM_FEATURE_UNALIGNED) \
|
|
||||||
&& (!defined(__GNUC__) || defined(__clang__))
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#else
|
|
||||||
compile error
|
|
||||||
#endif
|
|
||||||
int main(void) { return 0; }
|
|
||||||
"
|
|
||||||
TUKLIB_FAST_UNALIGNED_DEFINED_BY_PREPROCESSOR)
|
|
||||||
if(TUKLIB_FAST_UNALIGNED_DEFINED_BY_PREPROCESSOR)
|
|
||||||
set(FAST_UNALIGNED_GUESS ON)
|
|
||||||
else()
|
|
||||||
# 2. If __ARM_FEATURE_UNALIGNED is not defined,
|
|
||||||
# unaligned access is disabled.
|
|
||||||
check_c_source_compiles("
|
|
||||||
#ifdef __ARM_FEATURE_UNALIGNED
|
|
||||||
compile error
|
|
||||||
#endif
|
|
||||||
int main(void) { return 0; }
|
|
||||||
"
|
|
||||||
TUKLIB_FAST_UNALIGNED_NOT_DEFINED_BY_PREPROCESSOR)
|
|
||||||
if(NOT TUKLIB_FAST_UNALIGNED_NOT_DEFINED_BY_PREPROCESSOR)
|
|
||||||
# 3. Use heuristics to detect if -mstrict-align is
|
|
||||||
# in effect when building with GCC.
|
|
||||||
tuklib_integer_internal_strict_align("[ \t]ldrb[ \t]")
|
|
||||||
if(NOT TUKLIB_INTEGER_STRICT_ALIGN)
|
|
||||||
set(FAST_UNALIGNED_GUESS ON)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
elseif(PROCESSOR MATCHES "^loongarch")
|
|
||||||
tuklib_integer_internal_strict_align("[ \t]ld\\.bu[ \t]")
|
|
||||||
if(NOT TUKLIB_INTEGER_STRICT_ALIGN)
|
|
||||||
set(FAST_UNALIGNED_GUESS ON)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(FAST_UNALIGNED_GUESS)
|
|
||||||
message(CHECK_PASS "yes")
|
|
||||||
else()
|
|
||||||
message(CHECK_PASS "no")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(TUKLIB_FAST_UNALIGNED_ACCESS
|
|
||||||
"Enable if the system supports *fast* unaligned memory access \
|
|
||||||
with 16-bit, 32-bit, and 64-bit integers."
|
|
||||||
"${FAST_UNALIGNED_GUESS}")
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" TUKLIB_FAST_UNALIGNED_ACCESS)
|
|
||||||
|
|
||||||
# Unsafe type punning:
|
|
||||||
option(TUKLIB_USE_UNSAFE_TYPE_PUNNING
|
|
||||||
"This introduces strict aliasing violations and \
|
|
||||||
may result in broken code. However, this might improve performance \
|
|
||||||
in some cases, especially with old compilers \
|
|
||||||
(e.g. GCC 3 and early 4.x on x86, GCC < 6 on ARMv6 and ARMv7)."
|
|
||||||
OFF)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" TUKLIB_USE_UNSAFE_TYPE_PUNNING)
|
|
||||||
|
|
||||||
# Check for GCC/Clang __builtin_assume_aligned().
|
|
||||||
check_c_source_compiles(
|
|
||||||
"int main(void) { __builtin_assume_aligned(\"\", 1); return 0; }"
|
|
||||||
HAVE___BUILTIN_ASSUME_ALIGNED)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE___BUILTIN_ASSUME_ALIGNED)
|
|
||||||
endfunction()
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# tuklib_large_file_support.cmake
|
|
||||||
#
|
|
||||||
# If off_t is less than 64 bits by default and -D_FILE_OFFSET_BITS=64
|
|
||||||
# makes off_t become 64-bit, the CMake option LARGE_FILE_SUPPORT is
|
|
||||||
# provided (ON by default) and -D_FILE_OFFSET_BITS=64 is added to
|
|
||||||
# the compile definitions if LARGE_FILE_SUPPORT is ON.
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake")
|
|
||||||
include(CMakePushCheckState)
|
|
||||||
include(CheckCSourceCompiles)
|
|
||||||
|
|
||||||
function(tuklib_large_file_support TARGET_OR_ALL)
|
|
||||||
# MSVC must be handled specially in the C code.
|
|
||||||
if(MSVC)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(TUKLIB_LARGE_FILE_SUPPORT_TEST
|
|
||||||
"#include <sys/types.h>
|
|
||||||
int foo[sizeof(off_t) >= 8 ? 1 : -1];
|
|
||||||
int main(void) { return 0; }")
|
|
||||||
|
|
||||||
check_c_source_compiles("${TUKLIB_LARGE_FILE_SUPPORT_TEST}"
|
|
||||||
TUKLIB_LARGE_FILE_SUPPORT_BY_DEFAULT)
|
|
||||||
|
|
||||||
if(NOT TUKLIB_LARGE_FILE_SUPPORT_BY_DEFAULT)
|
|
||||||
cmake_push_check_state()
|
|
||||||
# This needs -D.
|
|
||||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64")
|
|
||||||
check_c_source_compiles("${TUKLIB_LARGE_FILE_SUPPORT_TEST}"
|
|
||||||
TUKLIB_LARGE_FILE_SUPPORT_WITH_FOB64)
|
|
||||||
cmake_pop_check_state()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(TUKLIB_LARGE_FILE_SUPPORT_WITH_FOB64)
|
|
||||||
# Show the option only when _FILE_OFFSET_BITS=64 affects sizeof(off_t).
|
|
||||||
option(LARGE_FILE_SUPPORT
|
|
||||||
"Use -D_FILE_OFFSET_BITS=64 to support files larger than 2 GiB."
|
|
||||||
ON)
|
|
||||||
|
|
||||||
if(LARGE_FILE_SUPPORT)
|
|
||||||
# This must not use -D.
|
|
||||||
tuklib_add_definitions("${TARGET_OR_ALL}" "_FILE_OFFSET_BITS=64")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# tuklib_mbstr.cmake - see tuklib_mbstr.m4 for description and comments
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake")
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
|
|
||||||
function(tuklib_mbstr TARGET_OR_ALL)
|
|
||||||
check_symbol_exists(mbrtowc wchar.h HAVE_MBRTOWC)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_MBRTOWC)
|
|
||||||
|
|
||||||
# NOTE: wcwidth() requires _GNU_SOURCE or _XOPEN_SOURCE on GNU/Linux.
|
|
||||||
check_symbol_exists(wcwidth wchar.h HAVE_WCWIDTH)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_WCWIDTH)
|
|
||||||
|
|
||||||
# NOTE: vasprintf() requires _GNU_SOURCE on GNU/Linux.
|
|
||||||
check_symbol_exists(vasprintf stdio.h HAVE_VASPRINTF)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_VASPRINTF)
|
|
||||||
endfunction()
|
|
||||||
@ -1,153 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# tuklib_physmem.cmake - see tuklib_physmem.m4 for description and comments
|
|
||||||
#
|
|
||||||
# NOTE: Compared tuklib_physmem.m4, this lacks support for Tru64, IRIX, and
|
|
||||||
# Linux sysinfo() (usually sysconf() is used on GNU/Linux).
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake")
|
|
||||||
include(CMakePushCheckState)
|
|
||||||
include(CheckCSourceCompiles)
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
|
|
||||||
function(tuklib_physmem_internal_check)
|
|
||||||
# Shortcut on Windows:
|
|
||||||
if(WIN32 OR CYGWIN)
|
|
||||||
# Nothing to do, the tuklib_physmem.c handles it.
|
|
||||||
set(TUKLIB_PHYSMEM_DEFINITIONS "" CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Full check for special cases:
|
|
||||||
check_c_source_compiles("
|
|
||||||
#if defined(_WIN32) || defined(__CYGWIN__) || defined(__OS2__) \
|
|
||||||
|| defined(__DJGPP__) || defined(__VMS) \
|
|
||||||
|| defined(AMIGA) || defined(__AROS__) || defined(__QNX__)
|
|
||||||
int main(void) { return 0; }
|
|
||||||
#else
|
|
||||||
compile error
|
|
||||||
#endif
|
|
||||||
"
|
|
||||||
TUKLIB_PHYSMEM_SPECIAL)
|
|
||||||
if(TUKLIB_PHYSMEM_SPECIAL)
|
|
||||||
# Nothing to do, the tuklib_physmem.c handles it.
|
|
||||||
set(TUKLIB_PHYSMEM_DEFINITIONS "" CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Look for AIX-specific solution before sysconf(), because the test
|
|
||||||
# for sysconf() will pass on AIX but won't actually work
|
|
||||||
# (sysconf(_SC_PHYS_PAGES) compiles but always returns -1 on AIX).
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <sys/systemcfg.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
(void)_system_configuration.physmem;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_PHYSMEM_AIX)
|
|
||||||
if(TUKLIB_PHYSMEM_AIX)
|
|
||||||
set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_AIX" CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# sysconf()
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <unistd.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
long i;
|
|
||||||
i = sysconf(_SC_PAGESIZE);
|
|
||||||
i = sysconf(_SC_PHYS_PAGES);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_PHYSMEM_SYSCONF)
|
|
||||||
if(TUKLIB_PHYSMEM_SYSCONF)
|
|
||||||
set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_SYSCONF"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# sysctl()
|
|
||||||
cmake_push_check_state()
|
|
||||||
check_include_file(sys/param.h HAVE_SYS_PARAM_H)
|
|
||||||
if(HAVE_SYS_PARAM_H)
|
|
||||||
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_PARAM_H)
|
|
||||||
endif()
|
|
||||||
check_c_source_compiles("
|
|
||||||
#ifdef HAVE_SYS_PARAM_H
|
|
||||||
# include <sys/param.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
int name[2] = { CTL_HW, HW_PHYSMEM };
|
|
||||||
unsigned long mem;
|
|
||||||
size_t mem_ptr_size = sizeof(mem);
|
|
||||||
sysctl(name, 2, &mem, &mem_ptr_size, NULL, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_PHYSMEM_SYSCTL)
|
|
||||||
cmake_pop_check_state()
|
|
||||||
if(TUKLIB_PHYSMEM_SYSCTL)
|
|
||||||
if(HAVE_SYS_PARAM_H)
|
|
||||||
set(TUKLIB_PHYSMEM_DEFINITIONS
|
|
||||||
"HAVE_PARAM_H;TUKLIB_PHYSMEM_SYSCTL"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
else()
|
|
||||||
set(TUKLIB_PHYSMEM_DEFINITIONS
|
|
||||||
"TUKLIB_PHYSMEM_SYSCTL"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
endif()
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# HP-UX
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/pstat.h>
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
struct pst_static pst;
|
|
||||||
pstat_getstatic(&pst, sizeof(pst), 1, 0);
|
|
||||||
(void)pst.physical_memory;
|
|
||||||
(void)pst.page_size;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
"
|
|
||||||
TUKLIB_PHYSMEM_PSTAT_GETSTATIC)
|
|
||||||
if(TUKLIB_PHYSMEM_PSTAT_GETSTATIC)
|
|
||||||
set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_PSTAT_GETSTATIC"
|
|
||||||
CACHE INTERNAL "")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(tuklib_physmem TARGET_OR_ALL)
|
|
||||||
if(NOT DEFINED TUKLIB_PHYSMEM_FOUND)
|
|
||||||
message(STATUS "Checking how to detect the amount of physical memory")
|
|
||||||
tuklib_physmem_internal_check()
|
|
||||||
|
|
||||||
if(DEFINED TUKLIB_PHYSMEM_DEFINITIONS)
|
|
||||||
set(TUKLIB_PHYSMEM_FOUND 1 CACHE INTERNAL "")
|
|
||||||
else()
|
|
||||||
set(TUKLIB_PHYSMEM_FOUND 0 CACHE INTERNAL "")
|
|
||||||
message(WARNING
|
|
||||||
"No method to detect the amount of physical memory was found")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(TUKLIB_PHYSMEM_FOUND)
|
|
||||||
tuklib_add_definitions("${TARGET_OR_ALL}"
|
|
||||||
"${TUKLIB_PHYSMEM_DEFINITIONS}")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# tuklib_progname.cmake - see tuklib_progname.m4 for description and comments
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake")
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
|
|
||||||
function(tuklib_progname TARGET_OR_ALL)
|
|
||||||
# NOTE: This glibc extension requires _GNU_SOURCE.
|
|
||||||
check_symbol_exists(program_invocation_name errno.h
|
|
||||||
HAVE_PROGRAM_INVOCATION_NAME)
|
|
||||||
tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_PROGRAM_INVOCATION_NAME)
|
|
||||||
endfunction()
|
|
||||||
1320
configure.ac
1320
configure.ac
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,16 @@
|
|||||||
## SPDX-License-Identifier: 0BSD
|
##
|
||||||
## Author: Lasse Collin
|
## Copyright (C) 2008 Lasse Collin
|
||||||
|
##
|
||||||
EXTRA_DIST = \
|
## This library is free software; you can redistribute it and/or
|
||||||
translation.bash
|
## modify it under the terms of the GNU Lesser General Public
|
||||||
|
## License as published by the Free Software Foundation; either
|
||||||
|
## version 2.1 of the License, or (at your option) any later version.
|
||||||
|
##
|
||||||
|
## This library is distributed in the hope that it will be useful,
|
||||||
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
## Lesser General Public License for more details.
|
||||||
|
##
|
||||||
|
|
||||||
noinst_PROGRAMS = \
|
noinst_PROGRAMS = \
|
||||||
repeat \
|
repeat \
|
||||||
@ -11,17 +19,18 @@ noinst_PROGRAMS = \
|
|||||||
memusage \
|
memusage \
|
||||||
crc32 \
|
crc32 \
|
||||||
known_sizes \
|
known_sizes \
|
||||||
hex2bin \
|
hex2bin
|
||||||
testfilegen-arm64
|
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
-I$(top_srcdir)/src/common \
|
-I@top_srcdir@/src/common \
|
||||||
-I$(top_srcdir)/src/liblzma/api
|
-I@top_srcdir@/src/liblzma/api
|
||||||
|
|
||||||
LDADD = $(top_builddir)/src/liblzma/liblzma.la
|
AM_LDFLAGS = -static
|
||||||
|
|
||||||
|
LDADD = \
|
||||||
|
@top_builddir@/src/liblzma/liblzma.la \
|
||||||
|
@LTLIBINTL@
|
||||||
|
|
||||||
if COND_GNULIB
|
if COND_GNULIB
|
||||||
LDADD += $(top_builddir)/lib/libgnu.a
|
LDADD += @top_builddir@/lib/libgnu.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDADD += $(LTLIBINTL)
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ Debug tools
|
|||||||
-----------
|
-----------
|
||||||
|
|
||||||
This directory contains a few tiny programs that may be helpful when
|
This directory contains a few tiny programs that may be helpful when
|
||||||
debugging XZ Utils.
|
debugging LZMA Utils.
|
||||||
|
|
||||||
These tools are not meant to be installed. Often one needs to edit
|
These tools are not meant to be installed. Often one needs to edit
|
||||||
the source code a little to make the programs do the wanted things.
|
the source code a little to make the programs do the wanted things.
|
||||||
|
|||||||
@ -1,16 +1,23 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
/// \file crc32.c
|
/// \file crc32.c
|
||||||
/// \brief Primitive CRC32 calculation tool
|
/// \brief Primitive CRC32 calculation tool
|
||||||
//
|
//
|
||||||
// Author: Lasse Collin
|
// Copyright (C) 2008 Lasse Collin
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
//
|
//
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "sysdefs.h"
|
#include "sysdefs.h"
|
||||||
#include "lzma.h"
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,20 +1,25 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
/// \file full_flush.c
|
/// \file full_flush.c
|
||||||
/// \brief Encode files using LZMA_FULL_FLUSH
|
/// \brief Encode files using LZMA_FULL_FLUSH
|
||||||
//
|
//
|
||||||
// Author: Lasse Collin
|
// Copyright (C) 2008 Lasse Collin
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
//
|
//
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "sysdefs.h"
|
#include "sysdefs.h"
|
||||||
#include "lzma.h"
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define CHUNK 64
|
|
||||||
|
|
||||||
|
|
||||||
static lzma_stream strm = LZMA_STREAM_INIT;
|
static lzma_stream strm = LZMA_STREAM_INIT;
|
||||||
static FILE *file_in;
|
static FILE *file_in;
|
||||||
@ -23,13 +28,14 @@ static FILE *file_in;
|
|||||||
static void
|
static void
|
||||||
encode(size_t size, lzma_action action)
|
encode(size_t size, lzma_action action)
|
||||||
{
|
{
|
||||||
|
static const size_t CHUNK = 64;
|
||||||
uint8_t in[CHUNK];
|
uint8_t in[CHUNK];
|
||||||
uint8_t out[CHUNK];
|
uint8_t out[CHUNK];
|
||||||
lzma_ret ret;
|
lzma_ret ret;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (strm.avail_in == 0 && size > 0) {
|
if (strm.avail_in == 0 && size > 0) {
|
||||||
const size_t amount = my_min(size, CHUNK);
|
const size_t amount = MIN(size, CHUNK);
|
||||||
strm.avail_in = fread(in, 1, amount, file_in);
|
strm.avail_in = fread(in, 1, amount, file_in);
|
||||||
strm.next_in = in;
|
strm.next_in = in;
|
||||||
size -= amount; // Intentionally not using avail_in.
|
size -= amount; // Intentionally not using avail_in.
|
||||||
@ -62,22 +68,19 @@ encode(size_t size, lzma_action action)
|
|||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
lzma_init_encoder();
|
||||||
|
|
||||||
file_in = argc > 1 ? fopen(argv[1], "rb") : stdin;
|
file_in = argc > 1 ? fopen(argv[1], "rb") : stdin;
|
||||||
|
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
lzma_options_lzma opt_lzma;
|
lzma_filter filters[LZMA_BLOCK_FILTERS_MAX + 1];
|
||||||
if (lzma_lzma_preset(&opt_lzma, 1)) {
|
|
||||||
fprintf(stderr, "preset failed\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
lzma_filter filters[LZMA_FILTERS_MAX + 1];
|
|
||||||
filters[0].id = LZMA_FILTER_LZMA2;
|
filters[0].id = LZMA_FILTER_LZMA2;
|
||||||
filters[0].options = &opt_lzma;
|
filters[0].options = (void *)&lzma_preset_lzma[0];
|
||||||
filters[1].id = LZMA_VLI_UNKNOWN;
|
filters[1].id = LZMA_VLI_VALUE_UNKNOWN;
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
if (lzma_stream_encoder(&strm, filters, LZMA_CHECK_CRC32) != LZMA_OK) {
|
if (lzma_stream_encoder(&strm, filters, LZMA_CHECK_SHA256) != LZMA_OK) {
|
||||||
fprintf(stderr, "init failed\n");
|
fprintf(stderr, "init failed\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
/// \file hex2bin.c
|
/// \file hex2bin.c
|
||||||
/// \brief Converts hexadecimal input strings to binary
|
/// \brief Converts hexadecimal input strings to binary
|
||||||
//
|
//
|
||||||
// Author: Lasse Collin
|
// This code has been put into the public domain.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
//
|
//
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
/// \file known_sizes.c
|
/// \file known_sizes.c
|
||||||
@ -9,12 +7,21 @@
|
|||||||
/// and/or Uncompressed Size values are stored in the Block Header.
|
/// and/or Uncompressed Size values are stored in the Block Header.
|
||||||
/// As of writing there's no such Stream encoder in liblzma.
|
/// As of writing there's no such Stream encoder in liblzma.
|
||||||
//
|
//
|
||||||
// Author: Lasse Collin
|
// Copyright (C) 2008 Lasse Collin
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
//
|
//
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "sysdefs.h"
|
#include "sysdefs.h"
|
||||||
#include "lzma.h"
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/unistd.h>
|
#include <sys/unistd.h>
|
||||||
@ -40,17 +47,13 @@ main(void)
|
|||||||
const size_t in_size = fread(in, 1, BUFFER_SIZE, stdin);
|
const size_t in_size = fread(in, 1, BUFFER_SIZE, stdin);
|
||||||
|
|
||||||
// Filter setup
|
// Filter setup
|
||||||
lzma_options_lzma opt_lzma;
|
|
||||||
if (lzma_lzma_preset(&opt_lzma, 1))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
lzma_filter filters[] = {
|
lzma_filter filters[] = {
|
||||||
{
|
{
|
||||||
.id = LZMA_FILTER_LZMA2,
|
.id = LZMA_FILTER_LZMA2,
|
||||||
.options = &opt_lzma
|
.options = (void *)(&lzma_preset_lzma[0])
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = LZMA_VLI_UNKNOWN
|
.id = LZMA_VLI_VALUE_UNKNOWN
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -61,15 +64,19 @@ main(void)
|
|||||||
.filters = filters,
|
.filters = filters,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// FIXME Insane paranoia in liblzma.
|
||||||
|
if (lzma_block_header_size(&block) != LZMA_OK)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// We don't actually know the compressed size, so don't tell it to
|
||||||
|
// Block encoder.
|
||||||
|
block.compressed_size = LZMA_VLI_VALUE_UNKNOWN;
|
||||||
|
|
||||||
lzma_stream strm = LZMA_STREAM_INIT;
|
lzma_stream strm = LZMA_STREAM_INIT;
|
||||||
if (lzma_block_encoder(&strm, &block) != LZMA_OK)
|
if (lzma_block_encoder(&strm, &block) != LZMA_OK)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
// Reserve space for Stream Header and Block Header. We need to
|
// Reserve space for Stream Header and Block Header.
|
||||||
// calculate the size of the Block Header first.
|
|
||||||
if (lzma_block_header_size(&block) != LZMA_OK)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
size_t out_size = LZMA_STREAM_HEADER_SIZE + block.header_size;
|
size_t out_size = LZMA_STREAM_HEADER_SIZE + block.header_size;
|
||||||
|
|
||||||
strm.next_in = in;
|
strm.next_in = in;
|
||||||
@ -86,7 +93,7 @@ main(void)
|
|||||||
!= LZMA_OK)
|
!= LZMA_OK)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
lzma_index *idx = lzma_index_init(NULL);
|
lzma_index *idx = lzma_index_init(NULL, NULL);
|
||||||
if (idx == NULL)
|
if (idx == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|||||||
@ -1,50 +1,57 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
/// \file memusage.c
|
/// \file memusage.c
|
||||||
/// \brief Calculates memory usage using lzma_memory_usage()
|
/// \brief Calculates memory usage using lzma_memory_usage()
|
||||||
|
///
|
||||||
|
// Copyright (C) 2008 Lasse Collin
|
||||||
//
|
//
|
||||||
// Author: Lasse Collin
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
//
|
//
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "sysdefs.h"
|
#include "sysdefs.h"
|
||||||
#include "lzma.h"
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
|
lzma_init();
|
||||||
|
|
||||||
lzma_options_lzma lzma = {
|
lzma_options_lzma lzma = {
|
||||||
.dict_size = (1U << 30) + (1U << 29),
|
.dictionary_size = (1 << 27) + (1 << 26),
|
||||||
.lc = 3,
|
.literal_context_bits = 3,
|
||||||
.lp = 0,
|
.literal_pos_bits = 0,
|
||||||
.pb = 2,
|
.pos_bits = 2,
|
||||||
.preset_dict = NULL,
|
.preset_dictionary = NULL,
|
||||||
.preset_dict_size = 0,
|
.preset_dictionary_size = 0,
|
||||||
.mode = LZMA_MODE_NORMAL,
|
.mode = LZMA_MODE_NORMAL,
|
||||||
.nice_len = 48,
|
.fast_bytes = 48,
|
||||||
.mf = LZMA_MF_BT4,
|
.match_finder = LZMA_MF_BT4,
|
||||||
.depth = 0,
|
.match_finder_cycles = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
lzma_options_filter filters[] = {
|
lzma_options_filter filters[] = {
|
||||||
{ LZMA_FILTER_LZMA1,
|
{ LZMA_FILTER_LZMA,
|
||||||
(lzma_options_lzma *)&lzma_preset_lzma[6 - 1] },
|
(lzma_options_lzma *)&lzma_preset_lzma[6 - 1] },
|
||||||
{ UINT64_MAX, NULL }
|
{ UINT64_MAX, NULL }
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
lzma_filter filters[] = {
|
lzma_filter filters[] = {
|
||||||
{ LZMA_FILTER_LZMA1, &lzma },
|
{ LZMA_FILTER_LZMA, &lzma },
|
||||||
{ UINT64_MAX, NULL }
|
{ UINT64_MAX, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
printf("Encoder: %10" PRIu64 " B\n",
|
printf("Encoder: %10" PRIu64 " B\n", lzma_memusage_encoder(filters));
|
||||||
lzma_raw_encoder_memusage(filters));
|
printf("Decoder: %10" PRIu64 " B\n", lzma_memusage_decoder(filters));
|
||||||
printf("Decoder: %10" PRIu64 " B\n",
|
|
||||||
lzma_raw_decoder_memusage(filters));
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
/// \file repeat.c
|
/// \file repeat.c
|
||||||
@ -9,7 +7,17 @@
|
|||||||
/// the Subblock filter, especially the condition when repeat count
|
/// the Subblock filter, especially the condition when repeat count
|
||||||
/// doesn't fit into 28-bit integer.
|
/// doesn't fit into 28-bit integer.
|
||||||
//
|
//
|
||||||
// Author: Lasse Collin
|
// Copyright (C) 2008 Lasse Collin
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
//
|
//
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
@ -1,20 +1,25 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
/// \file sync_flush.c
|
/// \file sync_flush.c
|
||||||
/// \brief Encode files using LZMA_SYNC_FLUSH
|
/// \brief Encode files using LZMA_SYNC_FLUSH
|
||||||
//
|
//
|
||||||
// Author: Lasse Collin
|
// Copyright (C) 2008 Lasse Collin
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2.1 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
//
|
//
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "sysdefs.h"
|
#include "sysdefs.h"
|
||||||
#include "lzma.h"
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define CHUNK 64
|
|
||||||
|
|
||||||
|
|
||||||
static lzma_stream strm = LZMA_STREAM_INIT;
|
static lzma_stream strm = LZMA_STREAM_INIT;
|
||||||
static FILE *file_in;
|
static FILE *file_in;
|
||||||
@ -23,13 +28,14 @@ static FILE *file_in;
|
|||||||
static void
|
static void
|
||||||
encode(size_t size, lzma_action action)
|
encode(size_t size, lzma_action action)
|
||||||
{
|
{
|
||||||
|
static const size_t CHUNK = 64;
|
||||||
uint8_t in[CHUNK];
|
uint8_t in[CHUNK];
|
||||||
uint8_t out[CHUNK];
|
uint8_t out[CHUNK];
|
||||||
lzma_ret ret;
|
lzma_ret ret;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (strm.avail_in == 0 && size > 0) {
|
if (strm.avail_in == 0 && size > 0) {
|
||||||
const size_t amount = my_min(size, CHUNK);
|
const size_t amount = MIN(size, CHUNK);
|
||||||
strm.avail_in = fread(in, 1, amount, file_in);
|
strm.avail_in = fread(in, 1, amount, file_in);
|
||||||
strm.next_in = in;
|
strm.next_in = in;
|
||||||
size -= amount; // Intentionally not using avail_in.
|
size -= amount; // Intentionally not using avail_in.
|
||||||
@ -62,29 +68,44 @@ encode(size_t size, lzma_action action)
|
|||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
lzma_init_encoder();
|
||||||
|
|
||||||
file_in = argc > 1 ? fopen(argv[1], "rb") : stdin;
|
file_in = argc > 1 ? fopen(argv[1], "rb") : stdin;
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
lzma_options_lzma opt_lzma = {
|
lzma_options_lzma opt_lzma = {
|
||||||
.dict_size = 1U << 16,
|
.dictionary_size = 1 << 16,
|
||||||
.lc = LZMA_LC_DEFAULT,
|
.literal_context_bits = LZMA_LITERAL_CONTEXT_BITS_DEFAULT,
|
||||||
.lp = LZMA_LP_DEFAULT,
|
.literal_pos_bits = LZMA_LITERAL_POS_BITS_DEFAULT,
|
||||||
.pb = LZMA_PB_DEFAULT,
|
.pos_bits = LZMA_POS_BITS_DEFAULT,
|
||||||
.preset_dict = NULL,
|
.preset_dictionary = NULL,
|
||||||
|
.persistent = true,
|
||||||
.mode = LZMA_MODE_NORMAL,
|
.mode = LZMA_MODE_NORMAL,
|
||||||
.nice_len = 32,
|
.fast_bytes = 32,
|
||||||
.mf = LZMA_MF_HC3,
|
.match_finder = LZMA_MF_HC3,
|
||||||
.depth = 0,
|
.match_finder_cycles = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
lzma_options_delta opt_delta = {
|
lzma_options_delta opt_delta = {
|
||||||
.dist = 16
|
.distance = 16
|
||||||
};
|
};
|
||||||
|
|
||||||
lzma_filter filters[LZMA_FILTERS_MAX + 1];
|
lzma_options_subblock opt_subblock = {
|
||||||
|
.allow_subfilters = true,
|
||||||
|
.alignment = 8, // LZMA_SUBBLOCK_ALIGNMENT_DEFAULT,
|
||||||
|
.subblock_data_size = LZMA_SUBBLOCK_DATA_SIZE_DEFAULT,
|
||||||
|
.rle = 1, // LZMA_SUBBLOCK_RLE_OFF,
|
||||||
|
.subfilter_mode = LZMA_SUBFILTER_SET,
|
||||||
|
};
|
||||||
|
opt_subblock.subfilter_options.id = LZMA_FILTER_LZMA;
|
||||||
|
opt_subblock.subfilter_options.options = &opt_lzma;
|
||||||
|
opt_subblock.subfilter_options.id = LZMA_FILTER_DELTA;
|
||||||
|
opt_subblock.subfilter_options.options = &opt_delta;
|
||||||
|
|
||||||
|
lzma_filter filters[LZMA_BLOCK_FILTERS_MAX + 1];
|
||||||
filters[0].id = LZMA_FILTER_LZMA2;
|
filters[0].id = LZMA_FILTER_LZMA2;
|
||||||
filters[0].options = &opt_lzma;
|
filters[0].options = &opt_lzma;
|
||||||
filters[1].id = LZMA_VLI_UNKNOWN;
|
filters[1].id = LZMA_VLI_VALUE_UNKNOWN;
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
if (lzma_stream_encoder(&strm, filters, LZMA_CHECK_CRC32) != LZMA_OK) {
|
if (lzma_stream_encoder(&strm, filters, LZMA_CHECK_CRC32) != LZMA_OK) {
|
||||||
@ -93,24 +114,19 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encoding
|
// Encoding
|
||||||
|
/*
|
||||||
encode(0, LZMA_SYNC_FLUSH);
|
encode(0, LZMA_SYNC_FLUSH);
|
||||||
encode(6, LZMA_SYNC_FLUSH);
|
encode(6, LZMA_SYNC_FLUSH);
|
||||||
encode(0, LZMA_SYNC_FLUSH);
|
encode(0, LZMA_SYNC_FLUSH);
|
||||||
encode(7, LZMA_SYNC_FLUSH);
|
encode(7, LZMA_SYNC_FLUSH);
|
||||||
encode(0, LZMA_SYNC_FLUSH);
|
encode(0, LZMA_SYNC_FLUSH);
|
||||||
encode(0, LZMA_FINISH);
|
encode(0, LZMA_FINISH);
|
||||||
|
|
||||||
/*
|
|
||||||
encode(53, LZMA_SYNC_FLUSH);
|
|
||||||
opt_lzma.lc = 2;
|
|
||||||
opt_lzma.lp = 1;
|
|
||||||
opt_lzma.pb = 0;
|
|
||||||
if (lzma_filters_update(&strm, filters) != LZMA_OK) {
|
|
||||||
fprintf(stderr, "update failed\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
encode(404, LZMA_FINISH);
|
|
||||||
*/
|
*/
|
||||||
|
encode(53, LZMA_SYNC_FLUSH);
|
||||||
|
// opt_lzma.literal_context_bits = 2;
|
||||||
|
// opt_lzma.literal_pos_bits = 1;
|
||||||
|
// opt_lzma.pos_bits = 0;
|
||||||
|
encode(404, LZMA_FINISH);
|
||||||
|
|
||||||
// Clean up
|
// Clean up
|
||||||
lzma_end(&strm);
|
lzma_end(&strm);
|
||||||
@ -120,5 +136,6 @@ main(int argc, char **argv)
|
|||||||
// Prevent useless warnings so we don't need to have special CFLAGS
|
// Prevent useless warnings so we don't need to have special CFLAGS
|
||||||
// to disable -Werror.
|
// to disable -Werror.
|
||||||
(void)opt_lzma;
|
(void)opt_lzma;
|
||||||
|
(void)opt_subblock;
|
||||||
(void)opt_delta;
|
(void)opt_delta;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,116 +0,0 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
/// \file testfilegen-arm64.c
|
|
||||||
/// \brief Generates uncompressed test file for the ARM64 filter
|
|
||||||
//
|
|
||||||
// Author: Lasse Collin
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
|
|
||||||
static uint32_t pc4 = 0;
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
put32le(uint32_t v)
|
|
||||||
{
|
|
||||||
putchar((v >> 0) & 0xFF);
|
|
||||||
putchar((v >> 8) & 0xFF);
|
|
||||||
putchar((v >> 16) & 0xFF);
|
|
||||||
putchar((v >> 24) & 0xFF);
|
|
||||||
++pc4;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
putbl(uint32_t imm)
|
|
||||||
{
|
|
||||||
imm &= (1U << 26) - 1;
|
|
||||||
imm |= 0x25U << 26;
|
|
||||||
put32le(imm);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
putadrp32(uint32_t imm)
|
|
||||||
{
|
|
||||||
imm &= 0x1FFFFFU;
|
|
||||||
|
|
||||||
// fprintf(stderr, "ADRP 0x%08X\n", imm);
|
|
||||||
|
|
||||||
uint32_t instr = 0x90000000;
|
|
||||||
instr |= (pc4 * 5 + 11) & 0x1F;
|
|
||||||
instr |= (imm & 3) << 29;
|
|
||||||
instr |= (imm >> 2) << 5;
|
|
||||||
|
|
||||||
put32le(instr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
putbl(0);
|
|
||||||
putbl(0x03FFFFFF);
|
|
||||||
putbl(0x03FFFFFE);
|
|
||||||
putbl(0x03FFFFFD);
|
|
||||||
|
|
||||||
putbl(3);
|
|
||||||
putbl(2);
|
|
||||||
putbl(1);
|
|
||||||
putbl(0);
|
|
||||||
|
|
||||||
|
|
||||||
putbl(0x02000001);
|
|
||||||
putbl(0x02000000);
|
|
||||||
putbl(0x01FFFFFF);
|
|
||||||
putbl(0x01FFFFFE);
|
|
||||||
|
|
||||||
putbl(0x01111117);
|
|
||||||
putbl(0x01111116);
|
|
||||||
putbl(0x01111115);
|
|
||||||
putbl(0x01111114);
|
|
||||||
|
|
||||||
|
|
||||||
putbl(0x02222227);
|
|
||||||
putbl(0x02222226);
|
|
||||||
putbl(0x02222225);
|
|
||||||
putbl(0x02222224);
|
|
||||||
|
|
||||||
putbl(0U - pc4);
|
|
||||||
putbl(0U - pc4);
|
|
||||||
putbl(0U - pc4);
|
|
||||||
putbl(0U - pc4);
|
|
||||||
|
|
||||||
putadrp32(0x00);
|
|
||||||
putadrp32(0x05);
|
|
||||||
putadrp32(0x15);
|
|
||||||
putadrp32(0x25);
|
|
||||||
|
|
||||||
for (unsigned rep = 0; rep < 2; ++rep) {
|
|
||||||
while ((pc4 << 2) & 4095)
|
|
||||||
put32le(0x55555555U);
|
|
||||||
|
|
||||||
for (unsigned i = 10; i <= 21; ++i) {
|
|
||||||
const uint32_t neg = (0x1FFF00 >> (21 - i)) & ~255U;
|
|
||||||
const uint32_t plus = 1U << (i - 1);
|
|
||||||
putadrp32(0x000000 | plus);
|
|
||||||
putadrp32(0x000005 | plus);
|
|
||||||
putadrp32(0x0000FE | plus);
|
|
||||||
putadrp32(0x0000FF | plus);
|
|
||||||
|
|
||||||
putadrp32(0x000000 | neg);
|
|
||||||
putadrp32(0x000005 | neg);
|
|
||||||
putadrp32(0x0000FE | neg);
|
|
||||||
putadrp32(0x0000FF | neg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@ -1,95 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Script to check output of some translated messages
|
|
||||||
#
|
|
||||||
# This should be useful for translators to check that the translated strings
|
|
||||||
# look good. This doesn't make xz print all possible strings, but it should
|
|
||||||
# cover most of the cases where mistakes can easily happen.
|
|
||||||
#
|
|
||||||
# Give the path and filename of the xz executable as an argument. If no
|
|
||||||
# arguments are given, this script uses src/xz/xz (relative to the current
|
|
||||||
# directory).
|
|
||||||
#
|
|
||||||
# You may want to pipe the output of this script to less -S to view the
|
|
||||||
# tables printed by xz --list on a 80-column terminal. On the other hand,
|
|
||||||
# viewing the other messages may be better without -S.
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# If an argument was given, use it to set the location of the xz executable.
|
|
||||||
unset XZ
|
|
||||||
if [ -n "$1" ]; then
|
|
||||||
XZ=$1
|
|
||||||
[ "x${XZ:0:1}" != "x/" ] && XZ="$PWD/$XZ"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If XZ wasn't already set, use the default location.
|
|
||||||
XZ=${XZ-"$PWD/src/xz/xz"}
|
|
||||||
if [ "$(type -t "$XZ" || true)" != "file" ]; then
|
|
||||||
echo "Give the location of the xz executable as an argument" \
|
|
||||||
"to this script."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
XZ=$(type -p -- "$XZ")
|
|
||||||
|
|
||||||
# Locate top_srcdir and go there.
|
|
||||||
top_srcdir="$(cd -- "$(dirname -- "$0")" && cd .. && pwd)"
|
|
||||||
cd -- "$top_srcdir"
|
|
||||||
|
|
||||||
# Print the xz version and locale information.
|
|
||||||
echo "$XZ --version"
|
|
||||||
"$XZ" --version
|
|
||||||
echo
|
|
||||||
if [ -d .git ] && type git > /dev/null 2>&1; then
|
|
||||||
echo "Source code version in $PWD:"
|
|
||||||
git describe --abbrev=8
|
|
||||||
fi
|
|
||||||
echo
|
|
||||||
echo "LANGUAGE=$LANGUAGE"
|
|
||||||
locale
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Make the test files directory the current directory.
|
|
||||||
cd tests/files
|
|
||||||
|
|
||||||
# Put xz in PATH so that argv[0] stays short.
|
|
||||||
PATH=${XZ%/*}:$PATH
|
|
||||||
|
|
||||||
# Some of the test commands are error messages and thus don't
|
|
||||||
# return successfully.
|
|
||||||
set +e
|
|
||||||
|
|
||||||
for CMD in \
|
|
||||||
"xz --foobarbaz" \
|
|
||||||
"xz --memlimit=123abcd" \
|
|
||||||
"xz --memlimit=40MiB -6 /dev/null" \
|
|
||||||
"xz --memlimit=0 --info-memory" \
|
|
||||||
"xz --memlimit-compress=1234MiB --memlimit-decompress=50MiB --info-memory" \
|
|
||||||
"xz --verbose --verbose /dev/null | cat" \
|
|
||||||
"xz --lzma2=foobarbaz" \
|
|
||||||
"xz --lzma2=foobarbaz=abcd" \
|
|
||||||
"xz --lzma2=mf=abcd" \
|
|
||||||
"xz --lzma2=preset=foobarbaz" \
|
|
||||||
"xz --lzma2=nice=50000" \
|
|
||||||
"xz --help" \
|
|
||||||
"xz --long-help" \
|
|
||||||
"xz --filters-help" \
|
|
||||||
"xz --list good-*lzma2*" \
|
|
||||||
"xz --list good-1-check* unsupported-check.xz" \
|
|
||||||
"xz --list --verbose --verbose good-1-arm64-lzma2-1.xz good-1-block_header-1.xz good-1-check-sha256.xz good-2-lzma2.xz"
|
|
||||||
do
|
|
||||||
echo "-----------------------------------------------------------"
|
|
||||||
echo
|
|
||||||
echo "\$ $CMD"
|
|
||||||
eval "$CMD"
|
|
||||||
echo
|
|
||||||
done 2>&1
|
|
||||||
249
doc/SHA256SUMS
249
doc/SHA256SUMS
@ -1,249 +0,0 @@
|
|||||||
61e82b90203cd44c3a712fee5e1efb2a3de62c673cfbe010928856ef2a29b907 xz-4.999.9beta.tar
|
|
||||||
330312c4397608d8b7be362cc7edbfeafa6101614bc2164d816ea767656aa15c xz-4.999.9beta.tar.bz2
|
|
||||||
fa3901d1c034842da47fec1a24a9b5a5bd435f5ecfbb444c168512e2daddb86f xz-4.999.9beta.tar.gz
|
|
||||||
d6649124c7046caea616f599716a559c971c97947e4533c8f25f683310154e8c xz-4.999.9beta.tar.xz
|
|
||||||
0cb40c62ab80536c9cda0125bad445994c0c48f7f9e7c5a3839dbe2be7e7dabc xz-5.0.0.tar
|
|
||||||
47a89e65c4690364a0123871a221e663d23a9fbd1ca756a804b10dd4006056d8 xz-5.0.0.tar.bz2
|
|
||||||
eba9211990a642fc2c35ea02618b710c7fa898d78ccca48b546a07bdde03c44d xz-5.0.0.tar.gz
|
|
||||||
2da61184b5da24b7dd9266416259dbf65212d1ef83726202427233e7fcfe5754 xz-5.0.0.tar.xz
|
|
||||||
2485450f5bdfcdef701454c0ae61eeab144e852a20a14e07b0f3cba2f2a758e9 xz-5.0.0-dos.zip
|
|
||||||
ba46384f060b2c6646f2b342cc9de0e220d057f1ee148b5002eafe7156f27412 xz-5.0.0-windows.zip
|
|
||||||
e4103c00b237a7dfc0f2419ea0aafb739822405facea7e4ecc8fd10dcd82c734 xz-5.0.0-windows.7z
|
|
||||||
e0aa4e3d504d7b27b9d6b76107d0f3656a06a3217dd5006c401aa83d18931b40 xz-5.0.1.tar
|
|
||||||
9b380f502d37085a60821484a3a13747454638927cc36033be64970512451ed8 xz-5.0.1.tar.bz2
|
|
||||||
3770b8872a4322b9502937b4781d523303bf193962c4822899fd3a210878fc80 xz-5.0.1.tar.gz
|
|
||||||
0bd2cb93c172f6cce144493004755aa565d751cb40945bbbb5b5d210c037fce4 xz-5.0.1.tar.xz
|
|
||||||
47337530220b8eb5951c6be1bcdcaee49b32b843e39ea97e0da4c2791e994a98 xz-5.0.1-dos.zip
|
|
||||||
73488c8d475d6634484a65e32aa3ccdc9e56de21b6e8872feaee0d52dc1cd879 xz-5.0.1-windows.zip
|
|
||||||
0505cc1a49b5fd38226a28f145dff6d34bc7f14ff5a1d78a3e08b6fa3398425e xz-5.0.1-windows.7z
|
|
||||||
574b8b84359c263c0bb3c35ee13d53fdf36fac2ea89f0a6234cb5bdc5ae6fe87 xz-5.0.2.tar
|
|
||||||
216df1ddbd591f0da63de31d4b0837eed6d019ccb0e36e57812764c69af645bc xz-5.0.2.tar.bz2
|
|
||||||
57e979baaa40147dde1bbb284e3618f8f18b6532c932648bd57b5aee674b98a7 xz-5.0.2.tar.gz
|
|
||||||
b334483005639a65a37bcc3c33971de2df94764c11a1c3329ce388abb1d95334 xz-5.0.2.tar.xz
|
|
||||||
8d65f9e9b625394f98846fc9a19e79dafeacd7a905aba2e0f28397df099d57c9 xz-5.0.2-windows.zip
|
|
||||||
4e89d87fe9a3d795ed79b93f9d70478107e45ee51047758d4812ac070f13a54a xz-5.0.2-windows.7z
|
|
||||||
74984834d91aadd516f26bcf60e4f82adb74044f9a3f367dca5488ee3c97b8d4 xz-5.0.3.tar
|
|
||||||
5a11b9e17bfcda62319c5a8c4a2062dc81607a316d3f6adff89422d81ec1eae9 xz-5.0.3.tar.bz2
|
|
||||||
10eb4df72dffb2fb14c3d2d82b450e72282ffcb9ee3908a8e5b392b8f09681bf xz-5.0.3.tar.gz
|
|
||||||
3544421e3447fd3f668fd89fb384ff9d312d2730cb860f6b8e09564028de8e32 xz-5.0.3.tar.xz
|
|
||||||
f7e741635976eead2dd5ff592cc98a04261d96df81b7db94a957a96cc2b13cce xz-5.0.3-windows.zip
|
|
||||||
0ed3c11430735e81ec65fb3588b2b8cf4bea6953ad4dda99d9aef4ee231a6036 xz-5.0.3-windows.7z
|
|
||||||
403df1a612036569a1bf54a171a609b6c11370f6b774bcb4940533a72edda1f9 xz-5.0.4.tar
|
|
||||||
5cd9b060d3a1ad396b3be52c9b9311046a1c369e6062aea752658c435629ce92 xz-5.0.4.tar.bz2
|
|
||||||
d67405798dad645965fe51cf4e40c23d1201fb234378d3c44f5a3787142b83b6 xz-5.0.4.tar.gz
|
|
||||||
b7fd25be1ebead021447960804f91006e3fc2f151d7a19948c6a27b4db09b5e9 xz-5.0.4.tar.xz
|
|
||||||
45e5771ebb88bc71805a3fc183bcb49d1e24b21aa6f762d94be6bc11426d9101 xz-5.0.4-dos.zip
|
|
||||||
7ed7d59f71bbfac959a4d4c6eb86733440a0ca115677522c6f5f43ab0e106edc xz-5.0.4-windows.zip
|
|
||||||
7be3642f91ba2fe3339bcb6c458cad303cd9d8ab085537c7b4e96e14c5025de9 xz-5.0.4-windows.7z
|
|
||||||
dd665d739d07ff4b1cae5ecadfad929928fc069d3a617cf682435beadb568e3c xz-5.0.5.tar
|
|
||||||
166c48d2842519bc4f96333bff9e265f8cdda44d38e40594ef3f9bbb52890490 xz-5.0.5.tar.bz2
|
|
||||||
5dcffe6a3726d23d1711a65288de2e215b4960da5092248ce63c99d50093b93a xz-5.0.5.tar.gz
|
|
||||||
3515c74d170d0f6ec00820de63106ad16c07bae55a59c174b4741242c76264a4 xz-5.0.5.tar.xz
|
|
||||||
f5463e2a45788773e33a8056c931d8973da5a00122056df417da24033088daff xz-5.0.5-windows.zip
|
|
||||||
8dbe3357a6ad39cc3076e4f5f0cef9a4ef67461559d4db02f1f06841b74dec44 xz-5.0.5-windows.7z
|
|
||||||
1a8c89616655bf05b04b6dfb62642db02e5fe368d53ee033990be5c26f194a15 xz-5.0.5-with-libtool-2.4.2.418.tar
|
|
||||||
0b6fa3b002c8e15fcc4417001ef0327cfdf6ad53656d7e545c6069ff7657b26d xz-5.0.5-with-libtool-2.4.2.418.tar.gz
|
|
||||||
ea314028ba6aa221de52e0bb4b149db4704a3317e6676adde2607debd026054f xz-5.0.6.tar
|
|
||||||
2f444375cd1d66c04247127e9b5101ce8fb2a8726449f211f05c84c143289408 xz-5.0.6.tar.bz2
|
|
||||||
b6cf4cdc1313556a00848e722625bce40d2cd552c052b0465791c64c9202c3f1 xz-5.0.6.tar.gz
|
|
||||||
9d4136392b6266219fd0f1068256c34180f106ee4214752136c58c0f4864391c xz-5.0.6.tar.xz
|
|
||||||
97ab44b55b252cb2e1b851f6dbdb9811011bad7a80eb42445b0ea63bb1444dc3 xz-5.0.7.tar
|
|
||||||
e8851dc749df2340dac6c9297cb2653eff684e73c3dedf690930119502edd616 xz-5.0.7.tar.bz2
|
|
||||||
f4d2165553b9d0d82fd08bc2eacddeb48ebeb862a5686a603f8c044a2e52c93f xz-5.0.7.tar.gz
|
|
||||||
55146936f33a432282e399ef702b2c3ab06644d9f091a811b39ff483fd190e24 xz-5.0.7.tar.xz
|
|
||||||
e4cb781440e29b2c1e1700730f3fdabf7ccc62317a61931609a098c384bfca96 xz-5.0.8.tar
|
|
||||||
2286f9d90bb0a0de34cba990df1b10cfad0777f00cb2883def26b8ec1b326bda xz-5.0.8.tar.bz2
|
|
||||||
cac71b31ed322a487f1da1f10dfcf47f8855f97ff2c23b92680c7ae7be58babb xz-5.0.8.tar.gz
|
|
||||||
1b5c105c1f372f128bf23ed7a1fd9acf473c88adefb3243d2ea762edca2a0b79 xz-5.0.8.tar.xz
|
|
||||||
812fb3369dde3c81d0765e1a7e00afa0dcfa2e5fa63fdb57e7582147220b2491 xz-5.1.1alpha.tar
|
|
||||||
54e59a83690a4a0ec88a7d7c3bdef90c6b196c892a93463863c71c24fe87951a xz-5.1.1alpha.tar.gz
|
|
||||||
90d7162c001d388d6ef082ccda7b7852c6adc367c492a8935cdf170e49a9ccda xz-5.1.1alpha.tar.xz
|
|
||||||
5d1f5b39d19d1e0b5e7e446b11add769ce68fef781173e116bf8e7d533a90dcb xz-5.1.2alpha.tar
|
|
||||||
70e792d2a67cfbb8f2dffd0feab6ca6e5a4a618d65070fb44a367629d1ba94e5 xz-5.1.2alpha.tar.gz
|
|
||||||
7a9c8dbede0b62e70c75cc0dc14135760a39e9fc6504f87091a59fea87461e18 xz-5.1.2alpha.tar.xz
|
|
||||||
b77cfbdea2f805b69c4c3db40da311555af3fe78271097cf5dec06f7919f07c9 xz-5.1.3alpha.tar
|
|
||||||
9f94506e301d5b6863921bba861a99ba00de384dafb4e5f409679a93e41613d4 xz-5.1.3alpha.tar.gz
|
|
||||||
0413632457df9c65b1ce9dcf78495152fc9307bea5c3267c9996eebf708bf2b6 xz-5.1.3alpha.tar.xz
|
|
||||||
1b70584fdf6c872d7a921dea53772b89962dc0b292b0e3ec0d7a0ca5c860242b xz-5.1.4beta.tar
|
|
||||||
7c47b9e2cfb5be93245d9fcf2bec5b459412b7628c333896dded373dcd0cf0e0 xz-5.1.4beta.tar.gz
|
|
||||||
9f9c6a97959afbbd1315626f253f2d3d48c47e01a921c7f160dab4fde10678b5 xz-5.1.4beta.tar.xz
|
|
||||||
2d066a7ed58c98cd91111d8408fb8896b8100a8ee7e519ce5ea2315c284ba5b0 xz-5.2.0.tar
|
|
||||||
f7357d7455a1670229b3cca021da71dd5d13b789db62743c20624bdffc9cc4a5 xz-5.2.0.tar.bz2
|
|
||||||
231ef369982240bb20ed7cffa52bb12a4a297ce6871f480ab85e8a7ba98bf3d6 xz-5.2.0.tar.gz
|
|
||||||
5962fe32e0b42c7065b4410b7d8ffbf2895e197e97d410c4fc374ea0d7610a14 xz-5.2.0.tar.xz
|
|
||||||
490fc2ad09fea7bc3772bb23432b3dce32d0ef81d413b3b974730436599d9ec5 xz-5.2.0-dos.zip
|
|
||||||
b49c05f82cd05fa67031e72138e40f422d8fd6e2c9ca106016dfd24fae0e629e xz-5.2.0-windows.zip
|
|
||||||
13dfe89a796f4c50f28fac9059d33241746b8e66c540e54d2ac44fd3ea1fd027 xz-5.2.0-windows.7z
|
|
||||||
a9ebc19a511b650c4b678802375505302992214f578a40ce78db089f99c3341f xz-5.2.1.tar
|
|
||||||
679148f497e0bff2c1adce42dee5a23f746e71321c33ebb0f641a302e30c2a80 xz-5.2.1.tar.bz2
|
|
||||||
b918b6648076e74f8d7ae19db5ee663df800049e187259faf5eb997a7b974681 xz-5.2.1.tar.gz
|
|
||||||
6ecdd4d80b12001497df0741d6037f918d270fa0f9a1ab4e2664bf4157ae323c xz-5.2.1.tar.xz
|
|
||||||
e4150f52b2e9937cbe54f0e85325a25a3dc2da68cf643310bd973c9b5c121131 xz-5.2.1-dos.zip
|
|
||||||
2447f5e70dd105900a2957d6c2fad2b5872a6482ba59c1fa0513d03e8b2d10f4 xz-5.2.1-windows.zip
|
|
||||||
afc018a5ab327aac5c8d6e60dc20aae844204b4e86cfac56ec7dd455921dc2ce xz-5.2.1-windows.7z
|
|
||||||
f96b347204dbb984f6e58ecc98f01f823742d403133a461dd8a52993b237bb8c xz-5.2.2.tar
|
|
||||||
6ff5f57a4b9167155e35e6da8b529de69270efb2b4cf3fbabf41a4ee793840b5 xz-5.2.2.tar.bz2
|
|
||||||
73df4d5d34f0468bd57d09f2d8af363e95ed6cc3a4a86129d2f2c366259902a2 xz-5.2.2.tar.gz
|
|
||||||
f341b1906ebcdde291dd619399ae944600edc9193619dd0c0110a5f05bfcc89e xz-5.2.2.tar.xz
|
|
||||||
1a88e9645eca0c3d95e00e8fc4b1a155fa3e527a60bec5a667ca56ed36dbb29b xz-5.2.3.tar
|
|
||||||
fd9ca16de1052aac899ad3495ad20dfa906c27b4a5070102a2ec35ca3a4740c1 xz-5.2.3.tar.bz2
|
|
||||||
71928b357d0a09a12a4b4c5fafca8c31c19b0e7d3b8ebb19622e96f26dbf28cb xz-5.2.3.tar.gz
|
|
||||||
7876096b053ad598c31f6df35f7de5cd9ff2ba3162e5a5554e4fc198447e0347 xz-5.2.3.tar.xz
|
|
||||||
afe73c260e38fdebdd14c9eaab71c19b206ff74cebbdc744b0fa35b77b243220 xz-5.2.3-windows.zip
|
|
||||||
30352e7f1f1605ff0758d10e951f4b3eda108538ecd500b831124dc480e603f3 xz-5.2.3-windows.7z
|
|
||||||
7f77d67aec8207e4fef28c58f19919e51ef469621a58eafd13bf1f80ce956312 xz-5.2.4.tar
|
|
||||||
3313fd2a95f43d88e44264e6b015e7d03053e681860b0d5d3f9baca79c57b7bf xz-5.2.4.tar.bz2
|
|
||||||
b512f3b726d3b37b6dc4c8570e137b9311e7552e8ccbab4d39d47ce5f4177145 xz-5.2.4.tar.gz
|
|
||||||
9717ae363760dedf573dad241420c5fea86256b65bc21d2cf71b2b12f0544f4b xz-5.2.4.tar.xz
|
|
||||||
9a5163623f435b6fa0844b6b884babd6bf4f8d876ae2d8134deeb296afd49c61 xz-5.2.4-windows.zip
|
|
||||||
efb267a5c7b267cd9e7bf18b29857738b06845178c74f424e3c502609fbf9862 xz-5.2.4-windows.7z
|
|
||||||
cdd92f155d202979dace48d16ea9e1a7c93d09eb2c2c0ac9a207e7544ed4703a xz-5.2.5.tar
|
|
||||||
5117f930900b341493827d63aa910ff5e011e0b994197c3b71c08a20228a42df xz-5.2.5.tar.bz2
|
|
||||||
f6f4910fd033078738bd82bfba4f49219d03b17eb0794eb91efbae419f4aba10 xz-5.2.5.tar.gz
|
|
||||||
3e1e518ffc912f86608a8cb35e4bd41ad1aec210df2a47aaa1f95e7f5576ef56 xz-5.2.5.tar.xz
|
|
||||||
601ccfa756da378429eb246b60c52d5e9c7f7b41e95e187c487004c093112789 xz-5.2.5.tar.zst
|
|
||||||
98c6cb1042284fe704ec30083f3fc87364ce9ed2ea51f62bbb0ee9d3448717ec xzgrep-ZDI-CAN-16587.patch
|
|
||||||
0b77f9ac5af53dec0b14773087f8f53e699ad6ce97cc8bfc3ea3cf89535dd335 xz-5.2.5-dos.zip
|
|
||||||
d83b82ca75dfab39a13dda364367b34970c781a9df4d41264db922ac3a8f622d xz-5.2.5-windows.zip
|
|
||||||
bee788dcc8f4a16e232a5a91c5625be1cfad36085eade6983013d1a92a308cfc xz-5.2.5-windows.7z
|
|
||||||
49305a2e5804ba438aa4690377e9b630646da6ae9f3edd0e3e727f92b47dc661 xz-5.2.6.tar
|
|
||||||
13e3402e301b6018f6a71ef0e497f714c6d11e214ae82dab156b81c2a64acb25 xz-5.2.6.tar.bz2
|
|
||||||
a2105abee17bcd2ebd15ced31b4f5eda6e17efd6b10f921a01cda4a44c91b3a0 xz-5.2.6.tar.gz
|
|
||||||
e076ba3439cb7cfc45b908c869f51a8c89f3c9ee9ee982fde28849c015e723a7 xz-5.2.6.tar.xz
|
|
||||||
2716b4067763de99b3901bcc71d3bda233798045cb8189735e611b165b8a7f4f xz-5.2.6.tar.zst
|
|
||||||
6fd6dad79e5b0d3b24a43bc3f79472b62a48d210f1aaa02fb06e5dfad89a4ebc xz-5.2.6-windows.zip
|
|
||||||
88242ad128b131ae7340370cc3c17f8d35e8b238a1db528185b28be2e6c164e1 xz-5.2.6-windows.7z
|
|
||||||
050958af3ccf032f0dba7104743e48ee6ddd9fdf5c21ec905b237e92b221c524 xz-5.2.7.tar
|
|
||||||
b65f1d0c2708e57716f4dd2216989a73847ac6fdb4168ffceb155767e22b834b xz-5.2.7.tar.bz2
|
|
||||||
06327c2ddc81e126a6d9a78b0be5014b976a2c0832f492dcfc4755d7facf6d33 xz-5.2.7.tar.gz
|
|
||||||
8712e9acb0b6b49a97d443458a3067dc5c08a025e02dc5f773176c51dd7cfc69 xz-5.2.7.tar.xz
|
|
||||||
709372e665270acf21a8ef55a8e34ca1f2421e7b5cc3146f4d45cc717fb2bea4 xz-5.2.7.tar.zst
|
|
||||||
30837d396bb50d5cec2c2431686de6f94c537c0551dc884e5cd3ab5551e65f1e xz-5.2.7-windows.zip
|
|
||||||
e9eb1dc1b8beaa5e3c535fbeaaab3780869b08fdfea0aa3ac09a804cc8a84c1a xz-5.2.7-windows.7z
|
|
||||||
96ebba68e4cc33dcd6e47a6326a39babeccc78ed17a08f5db0c11942d2c6fbc4 xz-5.2.8.tar
|
|
||||||
1f8a43d9fcf325d049a31fe4514dc8c44a6d00ce8860d48c4212d1e349d2a3ed xz-5.2.8.tar.bz2
|
|
||||||
ec5cda9f0b91336ab1b881d3d144e8203fcca604e607caca8ae678ddbc29207d xz-5.2.8.tar.gz
|
|
||||||
2424b2711b1d40d2129645d550363896c6853c97528f085f7765092fe68679d4 xz-5.2.8.tar.xz
|
|
||||||
c4092edd7ca1416be97364548cb86d7ef40b07c48a417a7254fb053b68098794 xz-5.2.8.tar.zst
|
|
||||||
f4c1eb727301b9a2acb1ae065562ad0beb7a6512639f8088af1afefcbbcc6260 xz-5.2.8-windows.zip
|
|
||||||
13390e4bd6023e27985cd25a61087e93a248858e7cd01755af8a84f5eef11feb xz-5.2.8-windows.7z
|
|
||||||
18d594e0c3ca307c89c809d636a8878e3d067f0c26983cbc7dc5a586377bc0bd xz-5.2.9.tar
|
|
||||||
b194507fba3a462a753c553149ccdaa168337bcb7deefddd067ba987c83dfce6 xz-5.2.9.tar.bz2
|
|
||||||
e982ea31b81543d7ee2b6fa34c2ad11760e1c50c6f4475add8ba0f2f005f07b4 xz-5.2.9.tar.gz
|
|
||||||
287ef163e7e57561e9de590b2a9037457af24f03a46bbd12bf84f3263679e8d2 xz-5.2.9.tar.xz
|
|
||||||
45cb9dd8785dbb60341450a28c39228cc86146119b4eac48e754a6650bc26931 xz-5.2.9.tar.zst
|
|
||||||
62ac7ba1e223616b365bd7bf1f2231b1c7e0aad111d53e675bef77ef1ac65c43 xz-5.2.9-windows.zip
|
|
||||||
19810e26e202ab2f0b28b70ca785320c006a72826f7bf80c9c9db65db24a23cc xz-5.2.9-windows.7z
|
|
||||||
33aa379c788ffe5af0765296fd9d31fd1fd6d409088ded09af7ff60035694521 xz-5.2.10.tar
|
|
||||||
01b71df61521d9da698ce3c33148bff06a131628ff037398c09482f3a26e5408 xz-5.2.10.tar.bz2
|
|
||||||
eb7a3b2623c9d0135da70ca12808a214be9c019132baaa61c9e1d198d1d9ded3 xz-5.2.10.tar.gz
|
|
||||||
d615974a17299eaa1bf3d0f3b7afa172624755c8885111b17659051869d6f072 xz-5.2.10.tar.xz
|
|
||||||
4cb110fa88b6062758c1c7600f5fc497cbe10372690a7964c611adc3399c8e4b xz-5.2.10.tar.zst
|
|
||||||
02232767320c7587a9f16f9c1c42a1d0bdc94f33d93aa327bb0f0fb67a5f0beb xz-5.2.11.tar
|
|
||||||
7859c47a5e909299e77d0e87e2bafc52fb1d09e35abac48b6426c1be213c5b37 xz-5.2.11.tar.bz2
|
|
||||||
0089d47b966bd9ab48f1d01baf7ce146a3b591716c7477866b807010de3d96ab xz-5.2.11.tar.gz
|
|
||||||
503b4a9fb405e70e1d3912e418fdffe5de27e713e58925fb67e12d20d03a77bc xz-5.2.11.tar.xz
|
|
||||||
1facb7ec3c0950a95e7d5396488fd5c9710c7fec353292962291b2c103777989 xz-5.2.11.tar.zst
|
|
||||||
4d8837034498dcbe64d3cff5f71b5fb6584c1af027eda7548831832efba1c0f4 xz-5.2.12.tar
|
|
||||||
fbedff8eb67e229f2e95eb1ff920b255e405c86c9e1a53d4a6861d9823acff18 xz-5.2.12.tar.bz2
|
|
||||||
61bda930767dcb170a5328a895ec74cab0f5aac4558cdda561c83559db582a13 xz-5.2.12.tar.gz
|
|
||||||
f79a92b84101d19d76be833aecc93e68e56065b61ec737610964cd4f6c54ff2e xz-5.2.12.tar.xz
|
|
||||||
88e6796dada9b65b50ec80a3815be3e4d4ee5fbee17541f112a070d875d59a5d xz-5.2.12.tar.zst
|
|
||||||
515f41be4b7bfd4d2d1ddb939ebd028b8e979bec9baf28b7886e04637a8e54f0 xz-5.2.13.tar
|
|
||||||
620cdbfc31adbc7e3e5cd8c3c3aa9ffed9335f0ddc42719cf9afce5136a978c1 xz-5.2.13.tar.bz2
|
|
||||||
2942a1a8397cd37688f79df9584947d484dd658db088d51b790317eb3184827b xz-5.2.13.tar.gz
|
|
||||||
03eca718652bc8a77f0d2e9ad7744755818aece15cebbc11a3a069cc604ecd84 xz-5.2.13.tar.xz
|
|
||||||
9bbcac67b776385b4345d287e90e345f6c841d4285502aa386515a49696abd5d xz-5.3.1alpha.tar
|
|
||||||
55a92fe16b1dbf2067dda6c0d8fcfff5639b0c8fe926f2a6aad4785699095ec2 xz-5.3.1alpha.tar.xz
|
|
||||||
fe96db09fa3cd289a2e67af8b4045213117e47fbf7fb882bed606556edcf7d5c xz-5.3.2alpha.tar
|
|
||||||
36f4fe561714385eea08945a910a31e6ea5d48611eb7af2fe7966dd030b502d2 xz-5.3.2alpha.tar.gz
|
|
||||||
35b7e753a0da827020bd3fe9c55b34d86b888f69a82a8c5d981e8f89e555360d xz-5.3.2alpha.tar.xz
|
|
||||||
ed8fe42c7f36f707f8b65f70f106c8c06e4cc68322f3277ab31aa17b57ea0927 xz-5.3.3alpha.tar
|
|
||||||
c6d4789a79bab565440784db2e132d6bf03b2e75dd6d66a8102cf002d8dfe926 xz-5.3.3alpha.tar.gz
|
|
||||||
8d50c45575cb943d14dfef2a3f5b1199cc86b5066273d322556cf16e7f75411f xz-5.3.3alpha.tar.xz
|
|
||||||
f3dfc690c1207efd3bcb362dcb5d63df21817c9780ea058c46ef0236febf43e0 xz-5.3.4alpha.tar
|
|
||||||
829e7bc21334b163be9155cb6148f4ca80a573dc453b90e6f1e3bf023764e5f9 xz-5.3.4alpha.tar.gz
|
|
||||||
e0358fb10e59dac8da9b58c14aae59ed9b5b56cc075fbdd884b44d87a35971e9 xz-5.3.4alpha.tar.xz
|
|
||||||
9ad807c4e203ff21b921944c441d5de509d21262f5db81deeae6f56fc97c54ea xz-5.3.5beta.tar
|
|
||||||
542bb3549b2a1988d5d9ce871a5db189d117eb51371c9c1e675f5a0b1870f692 xz-5.3.5beta.tar.gz
|
|
||||||
e08932f382bed9c293a13a3cb72e07464b6caad6d6ceafe9a7545bee501f857c xz-5.3.5beta.tar.xz
|
|
||||||
d2f31178627378b6a2567e028194a4e7c18164925ac0d0364d439a8226bb06a4 xz-5.4.0.tar
|
|
||||||
795ea0494c66d509b052ddc36dc63bd634e59ff2a0f39c16a3b5644dd01d87e6 xz-5.4.0.tar.bz2
|
|
||||||
7471ef5991f690268a8f2be019acec2e0564b7b233ca40035f339fe9a07f830b xz-5.4.0.tar.gz
|
|
||||||
5f260e3b43f75cf43ca43d107dd18209f7d516782956a74ddd53288e02a83a31 xz-5.4.0.tar.xz
|
|
||||||
3d16dc30760af691318cd4bebbae9f7a177ee9a270dbaa47cb58cb1d271cac36 xz-5.4.0.tar.zst
|
|
||||||
48f8a02005c1b0f49eb629daa6567dfeccaa9cb9b6725feaf8b7cd1955bd049d xz-5.4.0-dos.zip
|
|
||||||
749fe4d7c0ce95b5c9cf35e725ed78d6158477e140cf84cde2107ec8465a5e9b xz-5.4.1.tar
|
|
||||||
dd172acb53867a68012f94c17389401b2f274a1aa5ae8f84cbfb8b7e383ea8d3 xz-5.4.1.tar.bz2
|
|
||||||
e4b0f81582efa155ccf27bb88275254a429d44968e488fc94b806f2a61cd3e22 xz-5.4.1.tar.gz
|
|
||||||
5d9827aa1875b21c288f78864bb26d2650b436ea8d2cad364e4921eb6266a5a5 xz-5.4.1.tar.xz
|
|
||||||
9b3d36dd65ecffc9cfef093010061ffe1d48ee34eef0cff69b63cf82b2d099c4 xz-5.4.1.tar.zst
|
|
||||||
3db1ec993b96cfee143df08d780b642ace8b40bb14043537db8a9c951317fafc xz-5.4.2.tar
|
|
||||||
aa49909cbd9028c4666a35fa4975f9a6203ed98154fbb8223ee43ef9ceee97c3 xz-5.4.2.tar.bz2
|
|
||||||
87947679abcf77cc509d8d1b474218fd16b72281e2797360e909deaee1ac9d05 xz-5.4.2.tar.gz
|
|
||||||
3ee13d0f40148625306b90f9622f8c9660b8082884051b0cfe46f18492f88955 xz-5.4.2.tar.xz
|
|
||||||
cd43589df77eb776956c8082a0cbae1d0cd1a2637a6930ea93ba5759639511b1 xz-5.4.2.tar.zst
|
|
||||||
475e09077f4a0cd57306ea1d4cf9ccdfd5add1a2744cf75956725e7fb531ce36 xz-5.4.3.tar
|
|
||||||
9243a04598d7a70c1f567a0143a255581ac5c64b140fd55fd5cbc1e00b0e6f90 xz-5.4.3.tar.bz2
|
|
||||||
1c382e0bc2e4e0af58398a903dd62fff7e510171d2de47a1ebe06d1528e9b7e9 xz-5.4.3.tar.gz
|
|
||||||
92177bef62c3824b4badc524f8abcce54a20b7dbcfb84cde0a2eb8b49159518c xz-5.4.3.tar.xz
|
|
||||||
da51e1105e152e62a72fd81acd9a3e325609b4aed5631c50de3ea58a7f162ebb xz-5.4.3.tar.zst
|
|
||||||
a9ffcc046c96908caed200e2d11b27a4af66b1b4351880f9ba88657a6b6b690c xz-5.4.4.tar
|
|
||||||
0b6fcde1ac38e90433a2556f500c065950b9bcd2d602006efc334782bdfe6296 xz-5.4.4.tar.bz2
|
|
||||||
aae39544e254cfd27e942d35a048d592959bd7a79f9a624afb0498bb5613bdf8 xz-5.4.4.tar.gz
|
|
||||||
705d0d96e94e1840e64dec75fc8d5832d34f6649833bec1ced9c3e08cf88132e xz-5.4.4.tar.xz
|
|
||||||
610c4d79ea3a56bfd1df178578aa17e10a88d58a362b0a7b3fa47321469bae20 xz-5.4.4.tar.zst
|
|
||||||
3ee65a3efb5c96da5e50a0f16567a926258f83f472d2773d40c4d19c8873daad xz-5.4.5.tar
|
|
||||||
8ccf5fff868c006f29522e386fb4c6a1b66463fbca65a4cfc3c4bd596e895e79 xz-5.4.5.tar.bz2
|
|
||||||
135c90b934aee8fbc0d467de87a05cb70d627da36abe518c357a873709e5b7d6 xz-5.4.5.tar.gz
|
|
||||||
da9dec6c12cf2ecf269c31ab65b5de18e8e52b96f35d5bcd08c12b43e6878803 xz-5.4.5.tar.xz
|
|
||||||
9ab5561ce9fed7860695c14b955a0ebec2df9a00fb171862a25910546a1737cc xz-5.4.5.tar.zst
|
|
||||||
b32e1195788a00ca01ea43bc5ea67ecf5bdbaf35ea8faa272da0066e795cb7e2 xz-5.4.6.tar
|
|
||||||
913851b274e8e1d31781ec949f1c23e8dbcf0ecf6e73a2436dc21769dd3e6f49 xz-5.4.6.tar.bz2
|
|
||||||
aeba3e03bf8140ddedf62a0a367158340520f6b384f75ca6045ccc6c0d43fd5c xz-5.4.6.tar.gz
|
|
||||||
b92d4e3a438affcf13362a1305cd9d94ed47ddda22e456a42791e630a5644f5c xz-5.4.6.tar.xz
|
|
||||||
21326933d567a87a7d7484a22cd5723387a71b5934b131dc91ea7495a813bdf3 xz-5.4.6.tar.zst
|
|
||||||
f30cdc66bb071622b382106b0a06ef0e28263e5656a96d88ff55cf92786391f9 xz-5.4.7.tar
|
|
||||||
9976ed9cd0764e962d852d7d519ee1c3a7f87aca3b86e5d021a45650ba3ecb41 xz-5.4.7.tar.bz2
|
|
||||||
8db6664c48ca07908b92baedcfe7f3ba23f49ef2476864518ab5db6723836e71 xz-5.4.7.tar.gz
|
|
||||||
016182c70bb5c7c9eb3465030e3a7f6baa25e17b0e8c0afe92772e6021843ce2 xz-5.4.7.tar.xz
|
|
||||||
f4a16279ebe33a607a41536fd203dc9337bdd6395ef72130cff47dc8276fd9ff xz-5.6.2.tar
|
|
||||||
e12aa03cbd200597bd4ce11d97be2d09a6e6d39a9311ce72c91ac7deacde3171 xz-5.6.2.tar.bz2
|
|
||||||
8bfd20c0e1d86f0402f2497cfa71c6ab62d4cd35fd704276e3140bfb71414519 xz-5.6.2.tar.gz
|
|
||||||
a9db3bb3d64e248a0fae963f8fb6ba851a26ba1822e504dc0efd18a80c626caf xz-5.6.2.tar.xz
|
|
||||||
31f58851acdf0d24d15bce14782dafa5a447ee922eaa39859170277dc9a8fae7 xz-5213-547-562-libtool.patch
|
|
||||||
b55087b6e30fb0cb0175e89022dafd4acb46190a4ec6831cb3e21172fc815186 xz-5.6.3.tar
|
|
||||||
a95a49147b2dbb5487517acc0adcd77f9c2032cf00664eeae352405357d14a6c xz-5.6.3.tar.bz2
|
|
||||||
b1d45295d3f71f25a4c9101bd7c8d16cb56348bbef3bbc738da0351e17c73317 xz-5.6.3.tar.gz
|
|
||||||
db0590629b6f0fa36e74aea5f9731dc6f8df068ce7b7bafa45301832a5eebc3a xz-5.6.3.tar.xz
|
|
||||||
c06b09e74a64616c36ce7c65c8af442d62031135f948d04c704f46d8c2cc2fef xz-5.6.4.tar
|
|
||||||
176d510c30d80a23b8050bbc048f2ecaacb823ae48b6821727ed6591f0df9200 xz-5.6.4.tar.bz2
|
|
||||||
269e3f2e512cbd3314849982014dc199a7b2148cf5c91cedc6db629acdf5e09b xz-5.6.4.tar.gz
|
|
||||||
829ccfe79d769748f7557e7a4429a64d06858e27e1e362e25d01ab7b931d9c95 xz-5.6.4.tar.xz
|
|
||||||
e5403003b4698967680ca57c733e11fdc110426858091cc83c8df8f4322957ee xz-5.6.4-windows.zip
|
|
||||||
a69d83338facb6e9a45147384beb7d7d8ed53b5e2a41e8c059ae0d0260b356ac xz-5.6.4-windows.7z
|
|
||||||
31199267fba9588305c0df3de5d6d9898d00c4ee02f5eee19f79baa427628519 xz-5.7.1alpha.tar
|
|
||||||
ae655a4bec0820f750985ecd270d6802ae0a987bb1cb03d41d9afa37abc2e87c xz-5.7.1alpha.tar.gz
|
|
||||||
c859193b8619f6818326141ee041870d9b76ba83f55c3c94ebcfcb71e1f79e5d xz-5.7.1alpha.tar.xz
|
|
||||||
b75a932fa38515e5d3953242b1e3c2e7edd882504b24280f0e9776d596e9cc0d xz-5.7.2beta.tar
|
|
||||||
608ed92561c9f27a1eead76653c6f63c6a40d0a20ec91753ed508ba40f9703b3 xz-5.7.2beta.tar.gz
|
|
||||||
98a61e45e5917b93ce17d826ef2d11f9331951882b2558675cdf115cdf3f77c8 xz-5.7.2beta.tar.xz
|
|
||||||
bdff4615bf19c46042bced4d7b8c52bdacce61261b39db464d482692c948dd02 xz-5.8.0.tar
|
|
||||||
8c107270289807e2047f35d687b4d7a5bb029137f7c89ebdcfa909cb3b674440 xz-5.8.0.tar.bz2
|
|
||||||
b523c5e47d1490338c5121bdf2a6ecca2bcf0dce05a83ad40a830029cbe6679b xz-5.8.0.tar.gz
|
|
||||||
05ecad9e71919f4fca9f19fbbc979ea28e230188ed123dc6f06b98031ea14542 xz-5.8.0.tar.xz
|
|
||||||
397165cedccb8e16700b8fdd026c3fd7ff2d18923e28cfbf7d0c5f89cd6a50af xz-5.8.0-windows.zip
|
|
||||||
078caa9d406018d4d43df343455f57811e9ba69c1340670a85a0ae6341d42ba3 xz-5.8.0-windows.7z
|
|
||||||
ee188eabc3220684422f62df7a385541a86d2a5c385407f9d8fd94d49b251c4e xz-cve-2025-31115.patch
|
|
||||||
c9789682496d124fd214e665f6aa2f6d3d9e8527a7f0e120f9180c531d322bd6 xz-5.8.1.tar
|
|
||||||
5965c692c4c8800cd4b33ce6d0f6ac9ac9d6ab227b17c512b6561bce4f08d47e xz-5.8.1.tar.bz2
|
|
||||||
507825b599356c10dca1cd720c9d0d0c9d5400b9de300af00e4d1ea150795543 xz-5.8.1.tar.gz
|
|
||||||
0b54f79df85912504de0b14aec7971e3f964491af1812d83447005807513cd9e xz-5.8.1.tar.xz
|
|
||||||
62fdfde73d5c5d293bbb4a96211b29d09adbd56bc6736976e4c9fc9942ae3c67 xz-5.8.1-windows.zip
|
|
||||||
8ed1403fe6c971a2a6ac85fb7b27c8438b83175bc6f3bc49fec06540c904c84d xz-5.8.1-windows.7z
|
|
||||||
b4c8a939220546e275456fac3d19540b152a85dfdb13d6e36289ed8fb49cb700 xz-5.8.2.tar
|
|
||||||
60345d7c0b9c8d7ffa469e96898c300def3669f5047fc76219b819340839f3d8 xz-5.8.2.tar.bz2
|
|
||||||
ce09c50a5962786b83e5da389c90dd2c15ecd0980a258dd01f70f9e7ce58a8f1 xz-5.8.2.tar.gz
|
|
||||||
890966ec3f5d5cc151077879e157c0593500a522f413ac50ba26d22a9a145214 xz-5.8.2.tar.xz
|
|
||||||
c90c4044b9562594d2125409dd4969ce0e281b9db60d2224c2f4a5419c7e2a4e xz-5.8.2-windows.zip
|
|
||||||
a64996b3219461bd959735376eb413fecfe71a6247bcdb870a7be30bf2040fd8 xz-5.8.2-windows.7z
|
|
||||||
46
doc/bugs.txt
Normal file
46
doc/bugs.txt
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
Reporting bugs
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Naturally it is easiest for me if you already know what causes the
|
||||||
|
unexpected behavior. Even better if you have a patch to propose.
|
||||||
|
However, quite often the reason for unexpected behavior is unknown,
|
||||||
|
so below are a few things what to do before sending a bug report.
|
||||||
|
|
||||||
|
In case of a crash (usually segmentation violation):
|
||||||
|
|
||||||
|
1. Try to create a small example how to reprocude the issue.
|
||||||
|
|
||||||
|
2. If you are writing an application using liblzma or libzfile,
|
||||||
|
double check that you are using the libraries correctly (for
|
||||||
|
example, that you didn't forget to call lzma_init()). If it is
|
||||||
|
the command line tool included in LZMA Utils that is crashing,
|
||||||
|
ignore this step.
|
||||||
|
|
||||||
|
3. Compile LZMA Utils with debugging code using configure switch
|
||||||
|
`--enable-debug'. If you are using GCC as the compiler, use
|
||||||
|
CFLAGS='-O0 -ggdb'. Don't strip the resulting binaries.
|
||||||
|
|
||||||
|
4. Turn on core dumps. The exact command depends on your shell;
|
||||||
|
for example in GNU bash it is done with `ulimit -c unlimited',
|
||||||
|
and in tcsh with `limit coredumpsize unlimited'.
|
||||||
|
|
||||||
|
5. Try to reproduce the suspected bug. If you get `assertion failed'
|
||||||
|
message, be sure to include the complete message in your bug
|
||||||
|
report. If the application leaves a coredump, get a backtrace
|
||||||
|
using gdb:
|
||||||
|
$ gdb /path/to/app-binary # Loads the app to the debugger.
|
||||||
|
(gdb) core core # Opens the coredump.
|
||||||
|
(gdb) bt # Prints the backtrace. Copy & paste to bug report.
|
||||||
|
(gdb) quit # Quits gdb.
|
||||||
|
|
||||||
|
Send your bug report to Lasse Collin <lasse.collin@tukaani.org>. Don't
|
||||||
|
send the core dump file or the actual executables. If you have a small
|
||||||
|
example file(s) (total size less than 100 KiB), please include it/them
|
||||||
|
as an attachment.
|
||||||
|
|
||||||
|
Do NOT complain about problems with LZMA Utils to Igor Pavlov.
|
||||||
|
Although the code of LZMA Utils is derived from his code, there are
|
||||||
|
a lot of changes, which may have introduced bugs not present in
|
||||||
|
the original version.
|
||||||
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
|
|
||||||
liblzma example programs
|
|
||||||
========================
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
|
|
||||||
The examples are written so that the same comments aren't
|
|
||||||
repeated (much) in later files.
|
|
||||||
|
|
||||||
On POSIX systems, the examples should build by just typing "make".
|
|
||||||
|
|
||||||
The examples that use stdin or stdout don't set stdin and stdout
|
|
||||||
to binary mode. On systems where it matters (e.g. Windows) it is
|
|
||||||
possible that the examples won't work without modification.
|
|
||||||
|
|
||||||
|
|
||||||
List of examples
|
|
||||||
|
|
||||||
01_compress_easy.c Multi-call compression using
|
|
||||||
a compression preset
|
|
||||||
|
|
||||||
02_decompress.c Multi-call decompression
|
|
||||||
|
|
||||||
03_compress_custom.c Like 01_compress_easy.c but using
|
|
||||||
a custom filter chain
|
|
||||||
(x86 BCJ + LZMA2)
|
|
||||||
|
|
||||||
04_compress_easy_mt.c Multi-threaded multi-call
|
|
||||||
compression using a compression
|
|
||||||
preset
|
|
||||||
|
|
||||||
@ -1,296 +0,0 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
/// \file 01_compress_easy.c
|
|
||||||
/// \brief Compress from stdin to stdout in multi-call mode
|
|
||||||
///
|
|
||||||
/// Usage: ./01_compress_easy PRESET < INFILE > OUTFILE
|
|
||||||
///
|
|
||||||
/// Example: ./01_compress_easy 6 < foo > foo.xz
|
|
||||||
//
|
|
||||||
// Author: Lasse Collin
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <lzma.h>
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
show_usage_and_exit(const char *argv0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Usage: %s PRESET < INFILE > OUTFILE\n"
|
|
||||||
"PRESET is a number 0-9 and can optionally be "
|
|
||||||
"followed by 'e' to indicate extreme preset\n",
|
|
||||||
argv0);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static uint32_t
|
|
||||||
get_preset(int argc, char **argv)
|
|
||||||
{
|
|
||||||
// One argument whose first char must be 0-9.
|
|
||||||
if (argc != 2 || argv[1][0] < '0' || argv[1][0] > '9')
|
|
||||||
show_usage_and_exit(argv[0]);
|
|
||||||
|
|
||||||
// Calculate the preste level 0-9.
|
|
||||||
uint32_t preset = argv[1][0] - '0';
|
|
||||||
|
|
||||||
// If there is a second char, it must be 'e'. It will set
|
|
||||||
// the LZMA_PRESET_EXTREME flag.
|
|
||||||
if (argv[1][1] != '\0') {
|
|
||||||
if (argv[1][1] != 'e' || argv[1][2] != '\0')
|
|
||||||
show_usage_and_exit(argv[0]);
|
|
||||||
|
|
||||||
preset |= LZMA_PRESET_EXTREME;
|
|
||||||
}
|
|
||||||
|
|
||||||
return preset;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
init_encoder(lzma_stream *strm, uint32_t preset)
|
|
||||||
{
|
|
||||||
// Initialize the encoder using a preset. Set the integrity to check
|
|
||||||
// to CRC64, which is the default in the xz command line tool. If
|
|
||||||
// the .xz file needs to be decompressed with XZ Embedded, use
|
|
||||||
// LZMA_CHECK_CRC32 instead.
|
|
||||||
lzma_ret ret = lzma_easy_encoder(strm, preset, LZMA_CHECK_CRC64);
|
|
||||||
|
|
||||||
// Return successfully if the initialization went fine.
|
|
||||||
if (ret == LZMA_OK)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Something went wrong. The possible errors are documented in
|
|
||||||
// lzma/container.h (src/liblzma/api/lzma/container.h in the source
|
|
||||||
// package or e.g. /usr/include/lzma/container.h depending on the
|
|
||||||
// install prefix).
|
|
||||||
const char *msg;
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
msg = "Memory allocation failed";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_OPTIONS_ERROR:
|
|
||||||
msg = "Specified preset is not supported";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_UNSUPPORTED_CHECK:
|
|
||||||
msg = "Specified integrity check is not supported";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// This is most likely LZMA_PROG_ERROR indicating a bug in
|
|
||||||
// this program or in liblzma. It is inconvenient to have a
|
|
||||||
// separate error message for errors that should be impossible
|
|
||||||
// to occur, but knowing the error code is important for
|
|
||||||
// debugging. That's why it is good to print the error code
|
|
||||||
// at least when there is no good error message to show.
|
|
||||||
msg = "Unknown error, possibly a bug";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Error initializing the encoder: %s (error code %u)\n",
|
|
||||||
msg, ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
compress(lzma_stream *strm, FILE *infile, FILE *outfile)
|
|
||||||
{
|
|
||||||
// This will be LZMA_RUN until the end of the input file is reached.
|
|
||||||
// This tells lzma_code() when there will be no more input.
|
|
||||||
lzma_action action = LZMA_RUN;
|
|
||||||
|
|
||||||
// Buffers to temporarily hold uncompressed input
|
|
||||||
// and compressed output.
|
|
||||||
uint8_t inbuf[BUFSIZ];
|
|
||||||
uint8_t outbuf[BUFSIZ];
|
|
||||||
|
|
||||||
// Initialize the input and output pointers. Initializing next_in
|
|
||||||
// and avail_in isn't really necessary when we are going to encode
|
|
||||||
// just one file since LZMA_STREAM_INIT takes care of initializing
|
|
||||||
// those already. But it doesn't hurt much and it will be needed
|
|
||||||
// if encoding more than one file like we will in 02_decompress.c.
|
|
||||||
//
|
|
||||||
// While we don't care about strm->total_in or strm->total_out in this
|
|
||||||
// example, it is worth noting that initializing the encoder will
|
|
||||||
// always reset total_in and total_out to zero. But the encoder
|
|
||||||
// initialization doesn't touch next_in, avail_in, next_out, or
|
|
||||||
// avail_out.
|
|
||||||
strm->next_in = NULL;
|
|
||||||
strm->avail_in = 0;
|
|
||||||
strm->next_out = outbuf;
|
|
||||||
strm->avail_out = sizeof(outbuf);
|
|
||||||
|
|
||||||
// Loop until the file has been successfully compressed or until
|
|
||||||
// an error occurs.
|
|
||||||
while (true) {
|
|
||||||
// Fill the input buffer if it is empty.
|
|
||||||
if (strm->avail_in == 0 && !feof(infile)) {
|
|
||||||
strm->next_in = inbuf;
|
|
||||||
strm->avail_in = fread(inbuf, 1, sizeof(inbuf),
|
|
||||||
infile);
|
|
||||||
|
|
||||||
if (ferror(infile)) {
|
|
||||||
fprintf(stderr, "Read error: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Once the end of the input file has been reached,
|
|
||||||
// we need to tell lzma_code() that no more input
|
|
||||||
// will be coming and that it should finish the
|
|
||||||
// encoding.
|
|
||||||
if (feof(infile))
|
|
||||||
action = LZMA_FINISH;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell liblzma do the actual encoding.
|
|
||||||
//
|
|
||||||
// This reads up to strm->avail_in bytes of input starting
|
|
||||||
// from strm->next_in. avail_in will be decremented and
|
|
||||||
// next_in incremented by an equal amount to match the
|
|
||||||
// number of input bytes consumed.
|
|
||||||
//
|
|
||||||
// Up to strm->avail_out bytes of compressed output will be
|
|
||||||
// written starting from strm->next_out. avail_out and next_out
|
|
||||||
// will be incremented by an equal amount to match the number
|
|
||||||
// of output bytes written.
|
|
||||||
//
|
|
||||||
// The encoder has to do internal buffering, which means that
|
|
||||||
// it may take quite a bit of input before the same data is
|
|
||||||
// available in compressed form in the output buffer.
|
|
||||||
lzma_ret ret = lzma_code(strm, action);
|
|
||||||
|
|
||||||
// If the output buffer is full or if the compression finished
|
|
||||||
// successfully, write the data from the output buffer to
|
|
||||||
// the output file.
|
|
||||||
if (strm->avail_out == 0 || ret == LZMA_STREAM_END) {
|
|
||||||
// When lzma_code() has returned LZMA_STREAM_END,
|
|
||||||
// the output buffer is likely to be only partially
|
|
||||||
// full. Calculate how much new data there is to
|
|
||||||
// be written to the output file.
|
|
||||||
size_t write_size = sizeof(outbuf) - strm->avail_out;
|
|
||||||
|
|
||||||
if (fwrite(outbuf, 1, write_size, outfile)
|
|
||||||
!= write_size) {
|
|
||||||
fprintf(stderr, "Write error: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset next_out and avail_out.
|
|
||||||
strm->next_out = outbuf;
|
|
||||||
strm->avail_out = sizeof(outbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Normally the return value of lzma_code() will be LZMA_OK
|
|
||||||
// until everything has been encoded.
|
|
||||||
if (ret != LZMA_OK) {
|
|
||||||
// Once everything has been encoded successfully, the
|
|
||||||
// return value of lzma_code() will be LZMA_STREAM_END.
|
|
||||||
//
|
|
||||||
// It is important to check for LZMA_STREAM_END. Do not
|
|
||||||
// assume that getting ret != LZMA_OK would mean that
|
|
||||||
// everything has gone well.
|
|
||||||
if (ret == LZMA_STREAM_END)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// It's not LZMA_OK nor LZMA_STREAM_END,
|
|
||||||
// so it must be an error code. See lzma/base.h
|
|
||||||
// (src/liblzma/api/lzma/base.h in the source package
|
|
||||||
// or e.g. /usr/include/lzma/base.h depending on the
|
|
||||||
// install prefix) for the list and documentation of
|
|
||||||
// possible values. Most values listen in lzma_ret
|
|
||||||
// enumeration aren't possible in this example.
|
|
||||||
const char *msg;
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
msg = "Memory allocation failed";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_DATA_ERROR:
|
|
||||||
// This error is returned if the compressed
|
|
||||||
// or uncompressed size get near 8 EiB
|
|
||||||
// (2^63 bytes) because that's where the .xz
|
|
||||||
// file format size limits currently are.
|
|
||||||
// That is, the possibility of this error
|
|
||||||
// is mostly theoretical unless you are doing
|
|
||||||
// something very unusual.
|
|
||||||
//
|
|
||||||
// Note that strm->total_in and strm->total_out
|
|
||||||
// have nothing to do with this error. Changing
|
|
||||||
// those variables won't increase or decrease
|
|
||||||
// the chance of getting this error.
|
|
||||||
msg = "File size limits exceeded";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// This is most likely LZMA_PROG_ERROR, but
|
|
||||||
// if this program is buggy (or liblzma has
|
|
||||||
// a bug), it may be e.g. LZMA_BUF_ERROR or
|
|
||||||
// LZMA_OPTIONS_ERROR too.
|
|
||||||
//
|
|
||||||
// It is inconvenient to have a separate
|
|
||||||
// error message for errors that should be
|
|
||||||
// impossible to occur, but knowing the error
|
|
||||||
// code is important for debugging. That's why
|
|
||||||
// it is good to print the error code at least
|
|
||||||
// when there is no good error message to show.
|
|
||||||
msg = "Unknown error, possibly a bug";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Encoder error: %s (error code %u)\n",
|
|
||||||
msg, ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
// Get the preset number from the command line.
|
|
||||||
uint32_t preset = get_preset(argc, argv);
|
|
||||||
|
|
||||||
// Initialize a lzma_stream structure. When it is allocated on stack,
|
|
||||||
// it is simplest to use LZMA_STREAM_INIT macro like below. When it
|
|
||||||
// is allocated on heap, using memset(strmptr, 0, sizeof(*strmptr))
|
|
||||||
// works (as long as NULL pointers are represented with zero bits
|
|
||||||
// as they are on practically all computers today).
|
|
||||||
lzma_stream strm = LZMA_STREAM_INIT;
|
|
||||||
|
|
||||||
// Initialize the encoder. If it succeeds, compress from
|
|
||||||
// stdin to stdout.
|
|
||||||
bool success = init_encoder(&strm, preset);
|
|
||||||
if (success)
|
|
||||||
success = compress(&strm, stdin, stdout);
|
|
||||||
|
|
||||||
// Free the memory allocated for the encoder. If we were encoding
|
|
||||||
// multiple files, this would only need to be done after the last
|
|
||||||
// file. See 02_decompress.c for handling of multiple files.
|
|
||||||
//
|
|
||||||
// It is OK to call lzma_end() multiple times or when it hasn't been
|
|
||||||
// actually used except initialized with LZMA_STREAM_INIT.
|
|
||||||
lzma_end(&strm);
|
|
||||||
|
|
||||||
// Close stdout to catch possible write errors that can occur
|
|
||||||
// when pending data is flushed from the stdio buffers.
|
|
||||||
if (fclose(stdout)) {
|
|
||||||
fprintf(stderr, "Write error: %s\n", strerror(errno));
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return success ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
@ -1,286 +0,0 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
/// \file 02_decompress.c
|
|
||||||
/// \brief Decompress .xz files to stdout
|
|
||||||
///
|
|
||||||
/// Usage: ./02_decompress INPUT_FILES... > OUTFILE
|
|
||||||
///
|
|
||||||
/// Example: ./02_decompress foo.xz bar.xz > foobar
|
|
||||||
//
|
|
||||||
// Author: Lasse Collin
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <lzma.h>
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
init_decoder(lzma_stream *strm)
|
|
||||||
{
|
|
||||||
// Initialize a .xz decoder. The decoder supports a memory usage limit
|
|
||||||
// and a set of flags.
|
|
||||||
//
|
|
||||||
// The memory usage of the decompressor depends on the settings used
|
|
||||||
// to compress a .xz file. It can vary from less than a megabyte to
|
|
||||||
// a few gigabytes, but in practice (at least for now) it rarely
|
|
||||||
// exceeds 65 MiB because that's how much memory is required to
|
|
||||||
// decompress files created with "xz -9". Settings requiring more
|
|
||||||
// memory take extra effort to use and don't (at least for now)
|
|
||||||
// provide significantly better compression in most cases.
|
|
||||||
//
|
|
||||||
// Memory usage limit is useful if it is important that the
|
|
||||||
// decompressor won't consume gigabytes of memory. The need
|
|
||||||
// for limiting depends on the application. In this example,
|
|
||||||
// no memory usage limiting is used. This is done by setting
|
|
||||||
// the limit to UINT64_MAX.
|
|
||||||
//
|
|
||||||
// The .xz format allows concatenating compressed files as is:
|
|
||||||
//
|
|
||||||
// echo foo | xz > foobar.xz
|
|
||||||
// echo bar | xz >> foobar.xz
|
|
||||||
//
|
|
||||||
// When decompressing normal standalone .xz files, LZMA_CONCATENATED
|
|
||||||
// should always be used to support decompression of concatenated
|
|
||||||
// .xz files. If LZMA_CONCATENATED isn't used, the decoder will stop
|
|
||||||
// after the first .xz stream. This can be useful when .xz data has
|
|
||||||
// been embedded inside another file format.
|
|
||||||
//
|
|
||||||
// Flags other than LZMA_CONCATENATED are supported too, and can
|
|
||||||
// be combined with bitwise-or. See lzma/container.h
|
|
||||||
// (src/liblzma/api/lzma/container.h in the source package or e.g.
|
|
||||||
// /usr/include/lzma/container.h depending on the install prefix)
|
|
||||||
// for details.
|
|
||||||
lzma_ret ret = lzma_stream_decoder(
|
|
||||||
strm, UINT64_MAX, LZMA_CONCATENATED);
|
|
||||||
|
|
||||||
// Return successfully if the initialization went fine.
|
|
||||||
if (ret == LZMA_OK)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Something went wrong. The possible errors are documented in
|
|
||||||
// lzma/container.h (src/liblzma/api/lzma/container.h in the source
|
|
||||||
// package or e.g. /usr/include/lzma/container.h depending on the
|
|
||||||
// install prefix).
|
|
||||||
//
|
|
||||||
// Note that LZMA_MEMLIMIT_ERROR is never possible here. If you
|
|
||||||
// specify a very tiny limit, the error will be delayed until
|
|
||||||
// the first headers have been parsed by a call to lzma_code().
|
|
||||||
const char *msg;
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
msg = "Memory allocation failed";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_OPTIONS_ERROR:
|
|
||||||
msg = "Unsupported decompressor flags";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// This is most likely LZMA_PROG_ERROR indicating a bug in
|
|
||||||
// this program or in liblzma. It is inconvenient to have a
|
|
||||||
// separate error message for errors that should be impossible
|
|
||||||
// to occur, but knowing the error code is important for
|
|
||||||
// debugging. That's why it is good to print the error code
|
|
||||||
// at least when there is no good error message to show.
|
|
||||||
msg = "Unknown error, possibly a bug";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Error initializing the decoder: %s (error code %u)\n",
|
|
||||||
msg, ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
decompress(lzma_stream *strm, const char *inname, FILE *infile, FILE *outfile)
|
|
||||||
{
|
|
||||||
// When LZMA_CONCATENATED flag was used when initializing the decoder,
|
|
||||||
// we need to tell lzma_code() when there will be no more input.
|
|
||||||
// This is done by setting action to LZMA_FINISH instead of LZMA_RUN
|
|
||||||
// in the same way as it is done when encoding.
|
|
||||||
//
|
|
||||||
// When LZMA_CONCATENATED isn't used, there is no need to use
|
|
||||||
// LZMA_FINISH to tell when all the input has been read, but it
|
|
||||||
// is still OK to use it if you want. When LZMA_CONCATENATED isn't
|
|
||||||
// used, the decoder will stop after the first .xz stream. In that
|
|
||||||
// case some unused data may be left in strm->next_in.
|
|
||||||
lzma_action action = LZMA_RUN;
|
|
||||||
|
|
||||||
uint8_t inbuf[BUFSIZ];
|
|
||||||
uint8_t outbuf[BUFSIZ];
|
|
||||||
|
|
||||||
strm->next_in = NULL;
|
|
||||||
strm->avail_in = 0;
|
|
||||||
strm->next_out = outbuf;
|
|
||||||
strm->avail_out = sizeof(outbuf);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (strm->avail_in == 0 && !feof(infile)) {
|
|
||||||
strm->next_in = inbuf;
|
|
||||||
strm->avail_in = fread(inbuf, 1, sizeof(inbuf),
|
|
||||||
infile);
|
|
||||||
|
|
||||||
if (ferror(infile)) {
|
|
||||||
fprintf(stderr, "%s: Read error: %s\n",
|
|
||||||
inname, strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Once the end of the input file has been reached,
|
|
||||||
// we need to tell lzma_code() that no more input
|
|
||||||
// will be coming. As said before, this isn't required
|
|
||||||
// if the LZMA_CONCATENATED flag isn't used when
|
|
||||||
// initializing the decoder.
|
|
||||||
if (feof(infile))
|
|
||||||
action = LZMA_FINISH;
|
|
||||||
}
|
|
||||||
|
|
||||||
lzma_ret ret = lzma_code(strm, action);
|
|
||||||
|
|
||||||
if (strm->avail_out == 0 || ret == LZMA_STREAM_END) {
|
|
||||||
size_t write_size = sizeof(outbuf) - strm->avail_out;
|
|
||||||
|
|
||||||
if (fwrite(outbuf, 1, write_size, outfile)
|
|
||||||
!= write_size) {
|
|
||||||
fprintf(stderr, "Write error: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
strm->next_out = outbuf;
|
|
||||||
strm->avail_out = sizeof(outbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret != LZMA_OK) {
|
|
||||||
// Once everything has been decoded successfully, the
|
|
||||||
// return value of lzma_code() will be LZMA_STREAM_END.
|
|
||||||
//
|
|
||||||
// It is important to check for LZMA_STREAM_END. Do not
|
|
||||||
// assume that getting ret != LZMA_OK would mean that
|
|
||||||
// everything has gone well or that when you aren't
|
|
||||||
// getting more output it must have successfully
|
|
||||||
// decoded everything.
|
|
||||||
if (ret == LZMA_STREAM_END)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// It's not LZMA_OK nor LZMA_STREAM_END,
|
|
||||||
// so it must be an error code. See lzma/base.h
|
|
||||||
// (src/liblzma/api/lzma/base.h in the source package
|
|
||||||
// or e.g. /usr/include/lzma/base.h depending on the
|
|
||||||
// install prefix) for the list and documentation of
|
|
||||||
// possible values. Many values listen in lzma_ret
|
|
||||||
// enumeration aren't possible in this example, but
|
|
||||||
// can be made possible by enabling memory usage limit
|
|
||||||
// or adding flags to the decoder initialization.
|
|
||||||
const char *msg;
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
msg = "Memory allocation failed";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_FORMAT_ERROR:
|
|
||||||
// .xz magic bytes weren't found.
|
|
||||||
msg = "The input is not in the .xz format";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_OPTIONS_ERROR:
|
|
||||||
// For example, the headers specify a filter
|
|
||||||
// that isn't supported by this liblzma
|
|
||||||
// version (or it hasn't been enabled when
|
|
||||||
// building liblzma, but no-one sane does
|
|
||||||
// that unless building liblzma for an
|
|
||||||
// embedded system). Upgrading to a newer
|
|
||||||
// liblzma might help.
|
|
||||||
//
|
|
||||||
// Note that it is unlikely that the file has
|
|
||||||
// accidentally became corrupt if you get this
|
|
||||||
// error. The integrity of the .xz headers is
|
|
||||||
// always verified with a CRC32, so
|
|
||||||
// unintentionally corrupt files can be
|
|
||||||
// distinguished from unsupported files.
|
|
||||||
msg = "Unsupported compression options";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_DATA_ERROR:
|
|
||||||
msg = "Compressed file is corrupt";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_BUF_ERROR:
|
|
||||||
// Typically this error means that a valid
|
|
||||||
// file has got truncated, but it might also
|
|
||||||
// be a damaged part in the file that makes
|
|
||||||
// the decoder think the file is truncated.
|
|
||||||
// If you prefer, you can use the same error
|
|
||||||
// message for this as for LZMA_DATA_ERROR.
|
|
||||||
msg = "Compressed file is truncated or "
|
|
||||||
"otherwise corrupt";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// This is most likely LZMA_PROG_ERROR.
|
|
||||||
msg = "Unknown error, possibly a bug";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "%s: Decoder error: "
|
|
||||||
"%s (error code %u)\n",
|
|
||||||
inname, msg, ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
if (argc <= 1) {
|
|
||||||
fprintf(stderr, "Usage: %s FILES...\n", argv[0]);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
lzma_stream strm = LZMA_STREAM_INIT;
|
|
||||||
|
|
||||||
bool success = true;
|
|
||||||
|
|
||||||
// Try to decompress all files.
|
|
||||||
for (int i = 1; i < argc; ++i) {
|
|
||||||
if (!init_decoder(&strm)) {
|
|
||||||
// Decoder initialization failed. There's no point
|
|
||||||
// to retry it so we need to exit.
|
|
||||||
success = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE *infile = fopen(argv[i], "rb");
|
|
||||||
|
|
||||||
if (infile == NULL) {
|
|
||||||
fprintf(stderr, "%s: Error opening the "
|
|
||||||
"input file: %s\n",
|
|
||||||
argv[i], strerror(errno));
|
|
||||||
success = false;
|
|
||||||
} else {
|
|
||||||
success &= decompress(&strm, argv[i], infile, stdout);
|
|
||||||
fclose(infile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the memory allocated for the decoder. This only needs to be
|
|
||||||
// done after the last file.
|
|
||||||
lzma_end(&strm);
|
|
||||||
|
|
||||||
if (fclose(stdout)) {
|
|
||||||
fprintf(stderr, "Write error: %s\n", strerror(errno));
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return success ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
@ -1,192 +0,0 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
/// \file 03_compress_custom.c
|
|
||||||
/// \brief Compress in multi-call mode using x86 BCJ and LZMA2
|
|
||||||
///
|
|
||||||
/// Usage: ./03_compress_custom < INFILE > OUTFILE
|
|
||||||
///
|
|
||||||
/// Example: ./03_compress_custom < foo > foo.xz
|
|
||||||
//
|
|
||||||
// Author: Lasse Collin
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <lzma.h>
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
init_encoder(lzma_stream *strm)
|
|
||||||
{
|
|
||||||
// Use the default preset (6) for LZMA2.
|
|
||||||
//
|
|
||||||
// The lzma_options_lzma structure and the lzma_lzma_preset() function
|
|
||||||
// are declared in lzma/lzma12.h (src/liblzma/api/lzma/lzma12.h in the
|
|
||||||
// source package or e.g. /usr/include/lzma/lzma12.h depending on
|
|
||||||
// the install prefix).
|
|
||||||
lzma_options_lzma opt_lzma2;
|
|
||||||
if (lzma_lzma_preset(&opt_lzma2, LZMA_PRESET_DEFAULT)) {
|
|
||||||
// It should never fail because the default preset
|
|
||||||
// (and presets 0-9 optionally with LZMA_PRESET_EXTREME)
|
|
||||||
// are supported by all stable liblzma versions.
|
|
||||||
//
|
|
||||||
// (The encoder initialization later in this function may
|
|
||||||
// still fail due to unsupported preset *if* the features
|
|
||||||
// required by the preset have been disabled at build time,
|
|
||||||
// but no-one does such things except on embedded systems.)
|
|
||||||
fprintf(stderr, "Unsupported preset, possibly a bug\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now we could customize the LZMA2 options if we wanted. For example,
|
|
||||||
// we could set the dictionary size (opt_lzma2.dict_size) to
|
|
||||||
// something else than the default (8 MiB) of the default preset.
|
|
||||||
// See lzma/lzma12.h for details of all LZMA2 options.
|
|
||||||
//
|
|
||||||
// The x86 BCJ filter will try to modify the x86 instruction stream so
|
|
||||||
// that LZMA2 can compress it better. The x86 BCJ filter doesn't need
|
|
||||||
// any options so it will be set to NULL below.
|
|
||||||
//
|
|
||||||
// Construct the filter chain. The uncompressed data goes first to
|
|
||||||
// the first filter in the array, in this case the x86 BCJ filter.
|
|
||||||
// The array is always terminated by setting .id = LZMA_VLI_UNKNOWN.
|
|
||||||
//
|
|
||||||
// See lzma/filter.h for more information about the lzma_filter
|
|
||||||
// structure.
|
|
||||||
lzma_filter filters[] = {
|
|
||||||
{ .id = LZMA_FILTER_X86, .options = NULL },
|
|
||||||
{ .id = LZMA_FILTER_LZMA2, .options = &opt_lzma2 },
|
|
||||||
{ .id = LZMA_VLI_UNKNOWN, .options = NULL },
|
|
||||||
};
|
|
||||||
|
|
||||||
// Initialize the encoder using the custom filter chain.
|
|
||||||
lzma_ret ret = lzma_stream_encoder(strm, filters, LZMA_CHECK_CRC64);
|
|
||||||
|
|
||||||
if (ret == LZMA_OK)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
const char *msg;
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
msg = "Memory allocation failed";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_OPTIONS_ERROR:
|
|
||||||
// We are no longer using a plain preset so this error
|
|
||||||
// message has been edited accordingly compared to
|
|
||||||
// 01_compress_easy.c.
|
|
||||||
msg = "Specified filter chain is not supported";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_UNSUPPORTED_CHECK:
|
|
||||||
msg = "Specified integrity check is not supported";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
msg = "Unknown error, possibly a bug";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Error initializing the encoder: %s (error code %u)\n",
|
|
||||||
msg, ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// This function is identical to the one in 01_compress_easy.c.
|
|
||||||
static bool
|
|
||||||
compress(lzma_stream *strm, FILE *infile, FILE *outfile)
|
|
||||||
{
|
|
||||||
lzma_action action = LZMA_RUN;
|
|
||||||
|
|
||||||
uint8_t inbuf[BUFSIZ];
|
|
||||||
uint8_t outbuf[BUFSIZ];
|
|
||||||
|
|
||||||
strm->next_in = NULL;
|
|
||||||
strm->avail_in = 0;
|
|
||||||
strm->next_out = outbuf;
|
|
||||||
strm->avail_out = sizeof(outbuf);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (strm->avail_in == 0 && !feof(infile)) {
|
|
||||||
strm->next_in = inbuf;
|
|
||||||
strm->avail_in = fread(inbuf, 1, sizeof(inbuf),
|
|
||||||
infile);
|
|
||||||
|
|
||||||
if (ferror(infile)) {
|
|
||||||
fprintf(stderr, "Read error: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (feof(infile))
|
|
||||||
action = LZMA_FINISH;
|
|
||||||
}
|
|
||||||
|
|
||||||
lzma_ret ret = lzma_code(strm, action);
|
|
||||||
|
|
||||||
if (strm->avail_out == 0 || ret == LZMA_STREAM_END) {
|
|
||||||
size_t write_size = sizeof(outbuf) - strm->avail_out;
|
|
||||||
|
|
||||||
if (fwrite(outbuf, 1, write_size, outfile)
|
|
||||||
!= write_size) {
|
|
||||||
fprintf(stderr, "Write error: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
strm->next_out = outbuf;
|
|
||||||
strm->avail_out = sizeof(outbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret != LZMA_OK) {
|
|
||||||
if (ret == LZMA_STREAM_END)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
const char *msg;
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
msg = "Memory allocation failed";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_DATA_ERROR:
|
|
||||||
msg = "File size limits exceeded";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
msg = "Unknown error, possibly a bug";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Encoder error: %s (error code %u)\n",
|
|
||||||
msg, ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
lzma_stream strm = LZMA_STREAM_INIT;
|
|
||||||
|
|
||||||
bool success = init_encoder(&strm);
|
|
||||||
if (success)
|
|
||||||
success = compress(&strm, stdin, stdout);
|
|
||||||
|
|
||||||
lzma_end(&strm);
|
|
||||||
|
|
||||||
if (fclose(stdout)) {
|
|
||||||
fprintf(stderr, "Write error: %s\n", strerror(errno));
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return success ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
@ -1,205 +0,0 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
/// \file 04_compress_easy_mt.c
|
|
||||||
/// \brief Compress in multi-call mode using LZMA2 in multi-threaded mode
|
|
||||||
///
|
|
||||||
/// Usage: ./04_compress_easy_mt < INFILE > OUTFILE
|
|
||||||
///
|
|
||||||
/// Example: ./04_compress_easy_mt < foo > foo.xz
|
|
||||||
//
|
|
||||||
// Author: Lasse Collin
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <lzma.h>
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
init_encoder(lzma_stream *strm)
|
|
||||||
{
|
|
||||||
// The threaded encoder takes the options as pointer to
|
|
||||||
// a lzma_mt structure.
|
|
||||||
lzma_mt mt = {
|
|
||||||
// No flags are needed.
|
|
||||||
.flags = 0,
|
|
||||||
|
|
||||||
// Let liblzma determine a sane block size.
|
|
||||||
.block_size = 0,
|
|
||||||
|
|
||||||
// Use no timeout for lzma_code() calls by setting timeout
|
|
||||||
// to zero. That is, sometimes lzma_code() might block for
|
|
||||||
// a long time (from several seconds to even minutes).
|
|
||||||
// If this is not OK, for example due to progress indicator
|
|
||||||
// needing updates, specify a timeout in milliseconds here.
|
|
||||||
// See the documentation of lzma_mt in lzma/container.h for
|
|
||||||
// information how to choose a reasonable timeout.
|
|
||||||
.timeout = 0,
|
|
||||||
|
|
||||||
// Use the default preset (6) for LZMA2.
|
|
||||||
// To use a preset, filters must be set to NULL.
|
|
||||||
.preset = LZMA_PRESET_DEFAULT,
|
|
||||||
.filters = NULL,
|
|
||||||
|
|
||||||
// Use CRC64 for integrity checking. See also
|
|
||||||
// 01_compress_easy.c about choosing the integrity check.
|
|
||||||
.check = LZMA_CHECK_CRC64,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Detect how many threads the CPU supports.
|
|
||||||
mt.threads = lzma_cputhreads();
|
|
||||||
|
|
||||||
// If the number of CPU cores/threads cannot be detected,
|
|
||||||
// use one thread. Note that this isn't the same as the normal
|
|
||||||
// single-threaded mode as this will still split the data into
|
|
||||||
// blocks and use more RAM than the normal single-threaded mode.
|
|
||||||
// You may want to consider using lzma_easy_encoder() or
|
|
||||||
// lzma_stream_encoder() instead of lzma_stream_encoder_mt() if
|
|
||||||
// lzma_cputhreads() returns 0 or 1.
|
|
||||||
if (mt.threads == 0)
|
|
||||||
mt.threads = 1;
|
|
||||||
|
|
||||||
// If the number of CPU cores/threads exceeds threads_max,
|
|
||||||
// limit the number of threads to keep memory usage lower.
|
|
||||||
// The number 8 is arbitrarily chosen and may be too low or
|
|
||||||
// high depending on the compression preset and the computer
|
|
||||||
// being used.
|
|
||||||
//
|
|
||||||
// FIXME: A better way could be to check the amount of RAM
|
|
||||||
// (or available RAM) and use lzma_stream_encoder_mt_memusage()
|
|
||||||
// to determine if the number of threads should be reduced.
|
|
||||||
const uint32_t threads_max = 8;
|
|
||||||
if (mt.threads > threads_max)
|
|
||||||
mt.threads = threads_max;
|
|
||||||
|
|
||||||
// Initialize the threaded encoder.
|
|
||||||
lzma_ret ret = lzma_stream_encoder_mt(strm, &mt);
|
|
||||||
|
|
||||||
if (ret == LZMA_OK)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
const char *msg;
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
msg = "Memory allocation failed";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_OPTIONS_ERROR:
|
|
||||||
// We are no longer using a plain preset so this error
|
|
||||||
// message has been edited accordingly compared to
|
|
||||||
// 01_compress_easy.c.
|
|
||||||
msg = "Specified filter chain is not supported";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_UNSUPPORTED_CHECK:
|
|
||||||
msg = "Specified integrity check is not supported";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
msg = "Unknown error, possibly a bug";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Error initializing the encoder: %s (error code %u)\n",
|
|
||||||
msg, ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// This function is identical to the one in 01_compress_easy.c.
|
|
||||||
static bool
|
|
||||||
compress(lzma_stream *strm, FILE *infile, FILE *outfile)
|
|
||||||
{
|
|
||||||
lzma_action action = LZMA_RUN;
|
|
||||||
|
|
||||||
uint8_t inbuf[BUFSIZ];
|
|
||||||
uint8_t outbuf[BUFSIZ];
|
|
||||||
|
|
||||||
strm->next_in = NULL;
|
|
||||||
strm->avail_in = 0;
|
|
||||||
strm->next_out = outbuf;
|
|
||||||
strm->avail_out = sizeof(outbuf);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (strm->avail_in == 0 && !feof(infile)) {
|
|
||||||
strm->next_in = inbuf;
|
|
||||||
strm->avail_in = fread(inbuf, 1, sizeof(inbuf),
|
|
||||||
infile);
|
|
||||||
|
|
||||||
if (ferror(infile)) {
|
|
||||||
fprintf(stderr, "Read error: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (feof(infile))
|
|
||||||
action = LZMA_FINISH;
|
|
||||||
}
|
|
||||||
|
|
||||||
lzma_ret ret = lzma_code(strm, action);
|
|
||||||
|
|
||||||
if (strm->avail_out == 0 || ret == LZMA_STREAM_END) {
|
|
||||||
size_t write_size = sizeof(outbuf) - strm->avail_out;
|
|
||||||
|
|
||||||
if (fwrite(outbuf, 1, write_size, outfile)
|
|
||||||
!= write_size) {
|
|
||||||
fprintf(stderr, "Write error: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
strm->next_out = outbuf;
|
|
||||||
strm->avail_out = sizeof(outbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret != LZMA_OK) {
|
|
||||||
if (ret == LZMA_STREAM_END)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
const char *msg;
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
msg = "Memory allocation failed";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_DATA_ERROR:
|
|
||||||
msg = "File size limits exceeded";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
msg = "Unknown error, possibly a bug";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "Encoder error: %s (error code %u)\n",
|
|
||||||
msg, ret);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
lzma_stream strm = LZMA_STREAM_INIT;
|
|
||||||
|
|
||||||
bool success = init_encoder(&strm);
|
|
||||||
if (success)
|
|
||||||
success = compress(&strm, stdin, stdout);
|
|
||||||
|
|
||||||
lzma_end(&strm);
|
|
||||||
|
|
||||||
if (fclose(stdout)) {
|
|
||||||
fprintf(stderr, "Write error: %s\n", strerror(errno));
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return success ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
@ -1,205 +0,0 @@
|
|||||||
// SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
/// \file 11_file_info.c
|
|
||||||
/// \brief Get uncompressed size of .xz file(s)
|
|
||||||
///
|
|
||||||
/// Usage: ./11_file_info INFILE1.xz [INFILEn.xz]...
|
|
||||||
///
|
|
||||||
/// Example: ./11_file_info foo.xz
|
|
||||||
//
|
|
||||||
// Author: Lasse Collin
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <lzma.h>
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
print_file_size(lzma_stream *strm, FILE *infile, const char *filename)
|
|
||||||
{
|
|
||||||
// Get the file size. In standard C it can be done by seeking to
|
|
||||||
// the end of the file and then getting the file position.
|
|
||||||
// In POSIX one can use fstat() and then st_size from struct stat.
|
|
||||||
// Also note that fseek() and ftell() use long and thus don't support
|
|
||||||
// large files on 32-bit systems (POSIX versions fseeko() and
|
|
||||||
// ftello() can support large files).
|
|
||||||
if (fseek(infile, 0, SEEK_END)) {
|
|
||||||
fprintf(stderr, "Error seeking the file '%s': %s\n",
|
|
||||||
filename, strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const long file_size = ftell(infile);
|
|
||||||
|
|
||||||
// The decoder wants to start from the beginning of the .xz file.
|
|
||||||
rewind(infile);
|
|
||||||
|
|
||||||
// Initialize the decoder.
|
|
||||||
lzma_index *i;
|
|
||||||
lzma_ret ret = lzma_file_info_decoder(strm, &i, UINT64_MAX,
|
|
||||||
(uint64_t)file_size);
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_OK:
|
|
||||||
// Initialization succeeded.
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
fprintf(stderr, "Out of memory when initializing "
|
|
||||||
"the .xz file info decoder\n");
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case LZMA_PROG_ERROR:
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Unknown error, possibly a bug\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This example program reuses the same lzma_stream structure
|
|
||||||
// for multiple files, so we need to reset this when starting
|
|
||||||
// a new file.
|
|
||||||
strm->avail_in = 0;
|
|
||||||
|
|
||||||
// Buffer for input data.
|
|
||||||
uint8_t inbuf[BUFSIZ];
|
|
||||||
|
|
||||||
// Pass data to the decoder and seek when needed.
|
|
||||||
while (true) {
|
|
||||||
if (strm->avail_in == 0) {
|
|
||||||
strm->next_in = inbuf;
|
|
||||||
strm->avail_in = fread(inbuf, 1, sizeof(inbuf),
|
|
||||||
infile);
|
|
||||||
|
|
||||||
if (ferror(infile)) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Error reading from '%s': %s\n",
|
|
||||||
filename, strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We don't need to care about hitting the end of
|
|
||||||
// the file so no need to check for feof().
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = lzma_code(strm, LZMA_RUN);
|
|
||||||
|
|
||||||
switch (ret) {
|
|
||||||
case LZMA_OK:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_SEEK_NEEDED:
|
|
||||||
// The cast is safe because liblzma won't ask us to
|
|
||||||
// seek past the known size of the input file which
|
|
||||||
// did fit into a long.
|
|
||||||
//
|
|
||||||
// NOTE: Remember to change these to off_t if you
|
|
||||||
// switch fseeko() or lseek().
|
|
||||||
if (fseek(infile, (long)(strm->seek_pos), SEEK_SET)) {
|
|
||||||
fprintf(stderr, "Error seeking the "
|
|
||||||
"file '%s': %s\n",
|
|
||||||
filename, strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The old data in the inbuf is useless now. Set
|
|
||||||
// avail_in to zero so that we will read new input
|
|
||||||
// from the new file position on the next iteration
|
|
||||||
// of this loop.
|
|
||||||
strm->avail_in = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LZMA_STREAM_END:
|
|
||||||
// File information was successfully decoded.
|
|
||||||
// See <lzma/index.h> for functions that can be
|
|
||||||
// used on it. In this example we just print
|
|
||||||
// the uncompressed size (in bytes) of
|
|
||||||
// the .xz file followed by its file name.
|
|
||||||
printf("%10" PRIu64 " %s\n",
|
|
||||||
lzma_index_uncompressed_size(i),
|
|
||||||
filename);
|
|
||||||
|
|
||||||
// Free the memory of the lzma_index structure.
|
|
||||||
lzma_index_end(i, NULL);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case LZMA_FORMAT_ERROR:
|
|
||||||
// .xz magic bytes weren't found.
|
|
||||||
fprintf(stderr, "The file '%s' is not "
|
|
||||||
"in the .xz format\n", filename);
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case LZMA_OPTIONS_ERROR:
|
|
||||||
fprintf(stderr, "The file '%s' has .xz headers that "
|
|
||||||
"are not supported by this liblzma "
|
|
||||||
"version\n", filename);
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case LZMA_DATA_ERROR:
|
|
||||||
fprintf(stderr, "The file '%s' is corrupt\n",
|
|
||||||
filename);
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case LZMA_MEM_ERROR:
|
|
||||||
fprintf(stderr, "Memory allocation failed when "
|
|
||||||
"decoding the file '%s'\n", filename);
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// LZMA_MEMLIMIT_ERROR shouldn't happen because we used
|
|
||||||
// UINT64_MAX as the limit.
|
|
||||||
//
|
|
||||||
// LZMA_BUF_ERROR shouldn't happen because we always provide
|
|
||||||
// new input when the input buffer is empty. The decoder
|
|
||||||
// knows the input file size and thus won't try to read past
|
|
||||||
// the end of the file.
|
|
||||||
case LZMA_MEMLIMIT_ERROR:
|
|
||||||
case LZMA_BUF_ERROR:
|
|
||||||
case LZMA_PROG_ERROR:
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Unknown error, possibly a bug\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This line is never reached.
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
bool success = true;
|
|
||||||
lzma_stream strm = LZMA_STREAM_INIT;
|
|
||||||
|
|
||||||
for (int i = 1; i < argc; ++i) {
|
|
||||||
FILE *infile = fopen(argv[i], "rb");
|
|
||||||
|
|
||||||
if (infile == NULL) {
|
|
||||||
fprintf(stderr, "Cannot open the file '%s': %s\n",
|
|
||||||
argv[i], strerror(errno));
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
success &= print_file_size(&strm, infile, argv[i]);
|
|
||||||
|
|
||||||
(void)fclose(infile);
|
|
||||||
}
|
|
||||||
|
|
||||||
lzma_end(&strm);
|
|
||||||
|
|
||||||
// Close stdout to catch possible write errors that can occur
|
|
||||||
// when pending data is flushed from the stdio buffers.
|
|
||||||
if (fclose(stdout)) {
|
|
||||||
fprintf(stderr, "Write error: %s\n", strerror(errno));
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return success ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
# Author: Lasse Collin
|
|
||||||
|
|
||||||
CC = c99
|
|
||||||
CFLAGS = -g
|
|
||||||
LDFLAGS = -llzma
|
|
||||||
|
|
||||||
PROGS = \
|
|
||||||
01_compress_easy \
|
|
||||||
02_decompress \
|
|
||||||
03_compress_custom \
|
|
||||||
04_compress_easy_mt \
|
|
||||||
11_file_info
|
|
||||||
|
|
||||||
all: $(PROGS)
|
|
||||||
|
|
||||||
.c:
|
|
||||||
$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
-rm -f $(PROGS)
|
|
||||||
373
doc/faq.txt
373
doc/faq.txt
@ -1,114 +1,193 @@
|
|||||||
|
|
||||||
XZ Utils FAQ
|
LZMA Utils FAQ
|
||||||
============
|
--------------
|
||||||
|
|
||||||
Q: What do the letters XZ mean?
|
Copyright (C) 2007 Lasse Collin
|
||||||
|
|
||||||
A: Nothing. They are just two letters, which come from the file format
|
Copying and distribution of this file, with or without modification,
|
||||||
suffix .xz. The .xz suffix was selected, because it seemed to be
|
are permitted in any medium without royalty provided the copyright
|
||||||
pretty much unused. It has no deeper meaning.
|
notice and this notice are preserved.
|
||||||
|
|
||||||
|
|
||||||
Q: What are LZMA and LZMA2?
|
Q: What are LZMA, LZMA Utils, lzma, .lzma, liblzma, LZMA SDK, LZMA_Alone,
|
||||||
|
7-Zip and p7zip?
|
||||||
|
|
||||||
A: LZMA stands for Lempel-Ziv-Markov chain-Algorithm. It is the name
|
A: LZMA stands for Lempel-Ziv-Markov chain-Algorithm. LZMA is the name
|
||||||
of the compression algorithm designed by Igor Pavlov for 7-Zip.
|
of the compression algorithm designed by Igor Pavlov. He is the author
|
||||||
LZMA is based on LZ77 and range encoding.
|
of 7-Zip, which is a great LGPL'd compression tool for Microsoft
|
||||||
|
Windows operating systems. In addition to 7-Zip itself, also LZMA SDK
|
||||||
|
is available on the website of 7-Zip. LZMA SDK contains LZMA
|
||||||
|
implementations in C++, Java and C#. The C++ version is the original
|
||||||
|
implementation which is used also in 7-Zip itself.
|
||||||
|
|
||||||
LZMA2 is an updated version of the original LZMA to fix a couple of
|
Excluding the unrar plugin, 7-Zip is free software (free as in
|
||||||
practical issues. In context of XZ Utils, LZMA is called LZMA1 to
|
freedom). Thanks to this, it was possible to port it to POSIX
|
||||||
emphasize that LZMA is not the same thing as LZMA2. LZMA2 is the
|
platforms. The port was done and is maintained by myspace (TODO:
|
||||||
primary compression algorithm in the .xz file format.
|
myspace's real name?). p7zip is a port of 7-Zip's command line version;
|
||||||
|
p7zip doesn't include the 7-Zip's GUI.
|
||||||
|
|
||||||
|
In POSIX world, users are used to gzip and bzip2 command line tools.
|
||||||
|
Developers know APIs of zlib and libbzip2. LZMA Utils try to ease
|
||||||
|
adoption of LZMA on free operating systems by providing a compression
|
||||||
|
library and a set of command line tools. The library is called liblzma.
|
||||||
|
It provides a zlib-like API making it easy to adapt LZMA compression in
|
||||||
|
existing applications. The main command line tool is known as lzma,
|
||||||
|
whose command line syntax is very similar to that of gzip and bzip2.
|
||||||
|
|
||||||
|
The original command line tool from LZMA SDK (lzma.exe) was found from
|
||||||
|
a directory called LZMA_Alone in the LZMA SDK. It used a simple header
|
||||||
|
format in .lzma files. This format was also used by LZMA Utils up to
|
||||||
|
and including 4.32.x. In LZMA Utils documentation, LZMA_Alone refers
|
||||||
|
to both the file format and the command line tool from LZMA SDK.
|
||||||
|
|
||||||
|
Because of various limitations of the LZMA_Alone file format, a new
|
||||||
|
file format was developed. Extending some existing format such as .gz
|
||||||
|
used by gzip was considered, but these formats were found to be too
|
||||||
|
limited. The filename suffix for the new .lzma format is `.lzma'. The
|
||||||
|
same suffix is also used for files in the LZMA_Alone format. To make
|
||||||
|
the transition to the new format as transparent as possible, LZMA Utils
|
||||||
|
support both the new and old formats transparently.
|
||||||
|
|
||||||
|
7-Zip and LZMA SDK: <http://7-zip.org/>
|
||||||
|
p7zip: <http://p7zip.sourceforge.net/>
|
||||||
|
LZMA Utils: <http://tukaani.org/lzma/>
|
||||||
|
|
||||||
|
|
||||||
Q: There are many LZMA related projects. How does XZ Utils relate to them?
|
Q: What LZMA implementations there are available?
|
||||||
|
|
||||||
A: 7-Zip and LZMA SDK are the original projects. LZMA SDK is roughly
|
A: LZMA SDK contains implementations in C++, Java and C#. The C++ version
|
||||||
a subset of the 7-Zip source tree.
|
is the original implementation which is part of 7-Zip. LZMA SDK
|
||||||
|
contains also a small LZMA decoder in C.
|
||||||
|
|
||||||
p7zip is 7-Zip's command-line tools ported to POSIX-like systems.
|
A port of LZMA SDK to Pascal was made by Alan Birtles
|
||||||
|
<http://www.birtles.org.uk/programming/>. It should work with
|
||||||
|
multiple Pascal programming language implementations.
|
||||||
|
|
||||||
LZMA Utils provide a gzip-like lzma tool for POSIX-like systems.
|
LZMA Utils includes liblzma, which is directly based on LZMA SDK.
|
||||||
LZMA Utils are based on LZMA SDK. XZ Utils are the successor to
|
liblzma is written in C (C99, not C89). In contrast to C++ callback
|
||||||
LZMA Utils.
|
API used by LZMA SDK, liblzma uses zlib-like stateful C API. I do not
|
||||||
|
want to comment whether both/former/latter/neither API(s) are good or
|
||||||
|
bad. The only reason to implement a zlib-like API was, that many
|
||||||
|
developers are already familiar with zlib, and very many applications
|
||||||
|
already use zlib. Having a similar API makes it easier to include LZMA
|
||||||
|
support in existing applications.
|
||||||
|
|
||||||
There are several other projects using LZMA. Most are more or less
|
See also <http://en.wikipedia.org/wiki/LZMA#External_links>.
|
||||||
based on LZMA SDK. See <https://7-zip.org/links.html>.
|
|
||||||
|
|
||||||
|
|
||||||
Q: Why is liblzma named liblzma if its primary file format is .xz?
|
Q: Which file formats are supported by LZMA Utils?
|
||||||
Shouldn't it be e.g. libxz?
|
|
||||||
|
|
||||||
A: When the designing of the .xz format began, the idea was to replace
|
A: Even when the raw LZMA stream is always the same, it can be wrapped
|
||||||
the .lzma format and use the same .lzma suffix. It would have been
|
in different container formats. The preferred format is the new .lzma
|
||||||
quite OK to reuse the suffix when there were very few .lzma files
|
format. It has magic bytes (the first six bytes: 0xFF 'L' 'Z' 'M'
|
||||||
around. However, the old .lzma format became popular before the
|
'A' 0x00). The format supports chaining up to seven filters, splitting
|
||||||
new format was finished. The new format was renamed to .xz but the
|
data to multiple blocks for easier multi-threading and rough
|
||||||
name of liblzma wasn't changed.
|
random-access reading. The file integrity is verified using CRC32,
|
||||||
|
CRC64, or SHA256, and by verifying the uncompressed size of the file.
|
||||||
|
|
||||||
|
LZMA SDK includes a tool called LZMA_Alone. It supports uses a
|
||||||
|
primitive header which includes only the mandatory stream information
|
||||||
|
required by the LZMA decoder. This format can be both read and
|
||||||
|
written by liblzma and the command line tool (use --format=alone to
|
||||||
|
create such files).
|
||||||
|
|
||||||
|
.7z is the native archive format used by 7-Zip. This format is not
|
||||||
|
supported by liblzma, and probably will never be supported. You
|
||||||
|
should use e.g. p7zip to extract .7z files.
|
||||||
|
|
||||||
|
It is possible to implement custom file formats by using raw filter
|
||||||
|
mode in liblzma. In this mode the application needs to store the filter
|
||||||
|
properties and provide them to liblzma before starting to uncompress
|
||||||
|
the data.
|
||||||
|
|
||||||
|
|
||||||
Q: Do XZ Utils support the .7z format?
|
Q: How can I identify files containing LZMA compressed data?
|
||||||
|
|
||||||
A: No. Use 7-Zip (Windows) or p7zip (POSIX-like systems) to handle .7z
|
A: The preferred filename suffix for .lzma files is `.lzma'. `.tar.lzma'
|
||||||
files.
|
may be abbreviated to `.tlz'. The same suffixes are used for files in
|
||||||
|
LZMA_Alone format. In practice this should be no problem since tools
|
||||||
|
included in LZMA Utils support both formats transparently.
|
||||||
|
|
||||||
|
Checking the magic bytes is easy way to detect files in the new .lzma
|
||||||
|
format (the first six bytes: 0xFF 'L' 'Z' 'M' 'A' 0x00). The "file"
|
||||||
|
command version FIXME contains magic strings for this format.
|
||||||
|
|
||||||
|
The old LZMA_Alone format has no magic bytes. Its header cannot contain
|
||||||
|
arbitrary bytes, thus it is possible to make a guess. Unfortunately the
|
||||||
|
guessing is usually too hard to be reliable, so don't try it unless you
|
||||||
|
are desperate.
|
||||||
|
|
||||||
|
|
||||||
Q: I have many .tar.7z files. Can I convert them to .tar.xz without
|
Q: Does the lzma command line tool support sparse files?
|
||||||
spending hours recompressing the data?
|
|
||||||
|
|
||||||
A: In the "extra" directory, there is a script named 7z2lzma.bash which
|
A: Sparse files can (of course) be compressed like normal files, but
|
||||||
is able to convert some .7z files to the .lzma format (not .xz). It
|
uncompression will not restore sparseness of the file. Use an archiver
|
||||||
needs the 7za (or 7z) command from p7zip. The script may silently
|
tool to take care of sparseness before compressing the data with lzma.
|
||||||
produce corrupt output if certain assumptions are not met, so
|
|
||||||
decompress the resulting .lzma file and compare it against the
|
The reason for this is that archiver tools handle files, while
|
||||||
original before deleting the original file!
|
compression tools handle streams or buffers. Being a sparse file is
|
||||||
|
a property of the file on the disk, not a property of the stream or
|
||||||
|
buffer.
|
||||||
|
|
||||||
|
|
||||||
Q: I have many .lzma files. Can I quickly convert them to the .xz format?
|
Q: Can I recover parts of a broken LZMA file (e.g. corrupted CD-R)?
|
||||||
|
|
||||||
A: For now, no. Since XZ Utils supports the .lzma format, it's usually
|
A: With LZMA_Alone and single-block .lzma files, you can uncompress the
|
||||||
not too bad to keep the old files in the old format. If you want to
|
file until you hit the first broken byte. The data after the broken
|
||||||
do the conversion anyway, you need to decompress the .lzma files and
|
position is lost. LZMA relies on the uncompression history, and if
|
||||||
then recompress to the .xz format.
|
bytes are missing in the middle of the file, it is impossible to
|
||||||
|
reliably continue after the broken section.
|
||||||
|
|
||||||
Technically, there is a way to make the conversion relatively fast
|
With multi-block .lzma files it may be possible to locale the next
|
||||||
(roughly twice the time that normal decompression takes). Writing
|
block in the file and continue decoding there. A limited recovery
|
||||||
such a tool would take quite a bit of time though, and would probably
|
tool for this kind of situations is planned.
|
||||||
be useful to only a few people. If you really want such a conversion
|
|
||||||
tool, contact Lasse Collin and offer some money.
|
|
||||||
|
|
||||||
|
|
||||||
Q: I have installed xz, but my tar doesn't recognize .tar.xz files.
|
Q: Is LZMA patented?
|
||||||
How can I extract .tar.xz files?
|
|
||||||
|
|
||||||
A: xz -dc foo.tar.xz | tar xf -
|
A: No, the authors are not aware of any patents that could affect LZMA.
|
||||||
|
However, due to nature of software patents, the authors cannot
|
||||||
|
guarantee, that LZMA isn't affected by any third party patent.
|
||||||
|
|
||||||
|
|
||||||
Q: Can I recover parts of a broken .xz file (e.g. a corrupted CD-R)?
|
Q: Where can I find documentation about how LZMA works as an algorithm?
|
||||||
|
|
||||||
A: It may be possible if the file consists of multiple blocks, which
|
A: Read the source code, Luke. There is no documentation about LZMA
|
||||||
typically is not the case if the file was created in single-threaded
|
internals. It is possible that Igor Pavlov is the only person on
|
||||||
mode. There is no recovery program yet.
|
the Earth that completely knows and understands the algorithm.
|
||||||
|
|
||||||
|
You could begin by downloading LZMA SDK, and start reading from
|
||||||
|
the LZMA decoder to get some idea about the bitstream format.
|
||||||
|
Before you begin, you should know the basics of LZ77 and
|
||||||
|
range coding algorithms. LZMA is based on LZ77, but LZMA is
|
||||||
|
*a lot* more complex. Range coding is used to compress the
|
||||||
|
final bitstream like Huffman coding is used in Deflate.
|
||||||
|
|
||||||
|
|
||||||
Q: Is (some part of) XZ Utils patented?
|
Q: What are filters?
|
||||||
|
|
||||||
A: Lasse Collin is not aware of any patents that could affect XZ Utils.
|
A: In context of .lzma files, a filter means an implementation of a
|
||||||
However, due to the nature of software patents, it's not possible to
|
compression algorithm. The primary filter is LZMA, which is why
|
||||||
guarantee that XZ Utils isn't affected by any third party patent(s).
|
the names of the tools contain the letters LZMA.
|
||||||
|
|
||||||
|
liblzma and the new .lzma format support also other filters than LZMA.
|
||||||
|
There are different types of filters, which are suitable for different
|
||||||
|
types of data. Thus, to select the optimal filter and settings, the
|
||||||
|
type of the input data being compressed needs to be known.
|
||||||
|
|
||||||
Q: Where can I find documentation about the file format and algorithms?
|
Some filters are most useful when combined with another filter like
|
||||||
|
LZMA. These filters increase redundancy in the data, without changing
|
||||||
|
the size of the data, by taking advantage of properties specific to
|
||||||
|
the data being compressed.
|
||||||
|
|
||||||
A: The .xz format is documented in xz-file-format.txt. It is a container
|
So far, all the filters are always reversible. That is, no matter what
|
||||||
format only, and doesn't include descriptions of any non-trivial
|
data you pass to a filter encoder, it can be always defiltered back to
|
||||||
filters.
|
the original form. Because of this, it is safe to compress for example
|
||||||
|
a software package that contains other file types than executables
|
||||||
|
using a filter specific to the architechture of the package being
|
||||||
|
compressed.
|
||||||
|
|
||||||
Documenting LZMA and LZMA2 is planned, but for now, there is no other
|
The old LZMA_Alone format supports only the LZMA filter.
|
||||||
documentation than the source code. Before you begin, you should know
|
|
||||||
the basics of LZ77 and range-coding algorithms. LZMA is based on LZ77,
|
|
||||||
but LZMA is a lot more complex. Range coding is used to compress
|
|
||||||
the final bitstream like Huffman coding is used in Deflate.
|
|
||||||
|
|
||||||
|
|
||||||
Q: I cannot find BCJ and BCJ2 filters. Don't they exist in liblzma?
|
Q: I cannot find BCJ and BCJ2 filters. Don't they exist in liblzma?
|
||||||
@ -117,128 +196,52 @@ A: BCJ filter is called "x86" in liblzma. BCJ2 is not included,
|
|||||||
because it requires using more than one encoded output stream.
|
because it requires using more than one encoded output stream.
|
||||||
|
|
||||||
|
|
||||||
Q: I need to use a script that runs "xz -9". On a system with 256 MiB
|
Q: Can I use LZMA in proprietary, non-free applications?
|
||||||
of RAM, xz says that it cannot allocate memory. Can I make the
|
|
||||||
script work without modifying it?
|
|
||||||
|
|
||||||
A: Set a default memory usage limit for compression. You can do it e.g.
|
A: liblzma is under the GNU LGPL version 2.1 or (at your opinion) any
|
||||||
in a shell initialization script such as ~/.bashrc or /etc/profile:
|
later version. To summarise (*NOTE* This summary is not legally
|
||||||
|
binding, that is, it doesn't give you any extra permissions compared
|
||||||
|
to the LGPL. Read the GNU LGPL carefully for the exact license
|
||||||
|
conditions.):
|
||||||
|
* All the changes made into the library itself must be published
|
||||||
|
under the same license.
|
||||||
|
* End users must be able to replace the used liblzma. Easiest way
|
||||||
|
to assure this is to link dynamically against liblzma so users
|
||||||
|
can replace the shared library file if they want.
|
||||||
|
* You must make it clear to your users, that your application uses
|
||||||
|
liblzma, and that liblzma is free software under the GNU LGPL.
|
||||||
|
A copy of GNU LGPL must be included.
|
||||||
|
|
||||||
XZ_DEFAULTS=--memlimit-compress=150MiB
|
LZMA SDK contains a special exception which allows linking *unmodified*
|
||||||
export XZ_DEFAULTS
|
code statically with a non-free application. This exception does *not*
|
||||||
|
apply to liblzma.
|
||||||
|
|
||||||
xz will then scale the compression settings down so that the given
|
As an alternative, you can support the development of LZMA and 7-Zip
|
||||||
memory usage limit is not reached. This way xz shouldn't run out
|
by buying a proprietary license from Igor Pavlov. See homepage of
|
||||||
of memory.
|
LZMA SDK <http://7-zip.org/sdk.html> for more information. Note that
|
||||||
|
having a proprietary license from Igor Pavlov doesn't allow you to use
|
||||||
Check also that memory-related resource limits are high enough.
|
liblzma in a way that contradicts with the GNU LGPL, because liblzma
|
||||||
On most systems, "ulimit -a" will show the current resource limits.
|
contains code that is not copyrighted by Igor Pavlov. Please contact
|
||||||
|
both Lasse Collin and Igor Pavlov if the license conditions of liblzma
|
||||||
|
are not suitable for you.
|
||||||
|
|
||||||
|
|
||||||
Q: How do I create files that can be decompressed with XZ Embedded?
|
Q: I would like to help. What can I do?
|
||||||
|
|
||||||
A: See the documentation in XZ Embedded. In short, something like
|
A: See the TODO file. Please contact Lasse Collin before starting to do
|
||||||
this is a good start:
|
anything, because it is possible that someone else is already working
|
||||||
|
on the same thing.
|
||||||
xz --check=crc32 --lzma2=preset=6e,dict=64KiB
|
|
||||||
|
|
||||||
Or if a BCJ filter is needed too, e.g. if compressing
|
|
||||||
a kernel image for PowerPC:
|
|
||||||
|
|
||||||
xz --check=crc32 --powerpc --lzma2=preset=6e,dict=64KiB
|
|
||||||
|
|
||||||
Adjust the dictionary size to get a good compromise between
|
|
||||||
compression ratio and decompressor memory usage. Note that
|
|
||||||
in single-call decompression mode of XZ Embedded, a big
|
|
||||||
dictionary doesn't increase memory usage.
|
|
||||||
|
|
||||||
|
|
||||||
Q: How is multi-threaded compression implemented in XZ Utils?
|
Q: How can I contact the authors?
|
||||||
|
|
||||||
A: The simplest method is splitting the uncompressed data into blocks
|
A: Lasse Collin is the maintainer of LZMA Utils. You can contact him
|
||||||
and compressing them in parallel independent from each other.
|
either via IRC (Larhzu on #tukaani at Freenode or IRCnet). Email
|
||||||
This is currently the only threading method supported in XZ Utils.
|
should work too, <lasse.collin@tukaani.org>.
|
||||||
Since the blocks are compressed independently, they can also be
|
|
||||||
decompressed independently. Together with the index feature in .xz,
|
|
||||||
this allows using threads to create .xz files for random-access
|
|
||||||
reading. This also makes threaded decompression possible.
|
|
||||||
|
|
||||||
The independent blocks method has a couple of disadvantages too. It
|
Igor Pavlov is the father of LZMA. He is the author of 7-Zip
|
||||||
will compress worse than a single-block method. Often the difference
|
and LZMA SDK. <http://7-zip.org/>
|
||||||
is not too big (maybe 1-2 %) but sometimes it can be too big. Also,
|
|
||||||
the memory usage of the compressor increases linearly when adding
|
|
||||||
threads.
|
|
||||||
|
|
||||||
At least two other threading methods are possible but these haven't
|
NOTE: Please don't bother Igor Pavlov with questions specific
|
||||||
been implemented in XZ Utils:
|
to LZMA Utils.
|
||||||
|
|
||||||
Match finder parallelization has been in 7-Zip for ages. It doesn't
|
|
||||||
affect compression ratio or memory usage significantly. Among the
|
|
||||||
three threading methods, only this is useful when compressing small
|
|
||||||
files (files that are not significantly bigger than the dictionary).
|
|
||||||
Unfortunately this method scales only to about two CPU cores.
|
|
||||||
|
|
||||||
The third method is pigz-style threading (I use that name, because
|
|
||||||
pigz <https://www.zlib.net/pigz/> uses that method). It doesn't
|
|
||||||
affect compression ratio significantly and scales to many cores.
|
|
||||||
The memory usage scales linearly when threads are added. This isn't
|
|
||||||
significant with pigz, because Deflate uses only a 32 KiB dictionary,
|
|
||||||
but with LZMA2 the memory usage will increase dramatically just like
|
|
||||||
with the independent-blocks method. There is also a constant
|
|
||||||
computational overhead, which may make pigz-method a bit dull on
|
|
||||||
dual-core compared to the parallel match finder method, but with more
|
|
||||||
cores the overhead is not a big deal anymore.
|
|
||||||
|
|
||||||
Combining the threading methods will be possible and also useful.
|
|
||||||
For example, combining match finder parallelization with pigz-style
|
|
||||||
threading or independent-blocks-threading can cut the memory usage
|
|
||||||
by 50 %.
|
|
||||||
|
|
||||||
|
|
||||||
Q: I told xz to use many threads but it is using only one or two
|
|
||||||
processor cores. What is wrong?
|
|
||||||
|
|
||||||
A: Since multi-threaded compression is done by splitting the data into
|
|
||||||
blocks that are compressed individually, if the input file is too
|
|
||||||
small for the block size, then many threads cannot be used. The
|
|
||||||
default block size increases when the compression level is
|
|
||||||
increased. For example, xz -6 uses 8 MiB LZMA2 dictionary and
|
|
||||||
24 MiB blocks, and xz -9 uses 64 MiB LZMA dictionary and 192 MiB
|
|
||||||
blocks. If the input file is 100 MiB, xz -6 can use five threads
|
|
||||||
of which one will finish quickly as it has only 4 MiB to compress.
|
|
||||||
However, for the same file, xz -9 can only use one thread.
|
|
||||||
|
|
||||||
One can adjust block size with --block-size=SIZE but making the
|
|
||||||
block size smaller than LZMA2 dictionary is waste of RAM: using
|
|
||||||
xz -9 with 6 MiB blocks isn't any better than using xz -6 with
|
|
||||||
6 MiB blocks. The default settings use a block size bigger than
|
|
||||||
the LZMA2 dictionary size because this was seen as a reasonable
|
|
||||||
compromise between RAM usage and compression ratio.
|
|
||||||
|
|
||||||
When decompressing, the ability to use threads depends on how the
|
|
||||||
file was created. If it was created in multi-threaded mode then
|
|
||||||
it can be decompressed in multi-threaded mode too if there are
|
|
||||||
multiple blocks in the file.
|
|
||||||
|
|
||||||
|
|
||||||
Q: How do I build a program that needs liblzmadec (lzmadec.h)?
|
|
||||||
|
|
||||||
A: liblzmadec is part of LZMA Utils. XZ Utils has liblzma, but no
|
|
||||||
liblzmadec. The code using liblzmadec should be ported to use
|
|
||||||
liblzma instead. If you cannot or don't want to do that, download
|
|
||||||
LZMA Utils from <https://tukaani.org/lzma/>.
|
|
||||||
|
|
||||||
|
|
||||||
Q: The default build of liblzma is too big. How can I make it smaller?
|
|
||||||
|
|
||||||
A: Give --enable-small to the configure script. Use also appropriate
|
|
||||||
--enable or --disable options to include only those filter encoders
|
|
||||||
and decoders and integrity checks that you actually need. Use
|
|
||||||
CFLAGS=-Os (with GCC) or equivalent to tell your compiler to optimize
|
|
||||||
for size. See INSTALL for information about configure options.
|
|
||||||
|
|
||||||
If the result is still too big, take a look at XZ Embedded. It is
|
|
||||||
a separate project, which provides a limited but significantly
|
|
||||||
smaller XZ decoder implementation than XZ Utils. You can find it
|
|
||||||
at <https://tukaani.org/xz/embedded.html>.
|
|
||||||
|
|
||||||
|
|||||||
@ -1,18 +1,14 @@
|
|||||||
|
|
||||||
The .xz File Format
|
The .lzma File Format
|
||||||
===================
|
---------------------
|
||||||
|
|
||||||
Version 1.2.1 (2024-04-08)
|
|
||||||
|
|
||||||
|
|
||||||
0. Preface
|
0. Preface
|
||||||
0.1. Notices and Acknowledgements
|
0.1. Copyright Notices
|
||||||
0.2. Getting the Latest Version
|
0.2. Changes
|
||||||
0.3. Version History
|
|
||||||
1. Conventions
|
1. Conventions
|
||||||
1.1. Byte and Its Representation
|
1.1. Byte and Its Representation
|
||||||
1.2. Multibyte Integers
|
1.2. Multibyte Integers
|
||||||
2. Overall Structure of .xz File
|
2. Overall Structure of .lzma File
|
||||||
2.1. Stream
|
2.1. Stream
|
||||||
2.1.1. Stream Header
|
2.1.1. Stream Header
|
||||||
2.1.1.1. Header Magic Bytes
|
2.1.1.1. Header Magic Bytes
|
||||||
@ -34,13 +30,12 @@ Version 1.2.1 (2024-04-08)
|
|||||||
3.1.6. Header Padding
|
3.1.6. Header Padding
|
||||||
3.1.7. CRC32
|
3.1.7. CRC32
|
||||||
3.2. Compressed Data
|
3.2. Compressed Data
|
||||||
3.3. Block Padding
|
3.3. Check
|
||||||
3.4. Check
|
|
||||||
4. Index
|
4. Index
|
||||||
4.1. Index Indicator
|
4.1. Index Indicator
|
||||||
4.2. Number of Records
|
4.2. Number of Records
|
||||||
4.3. List of Records
|
4.3. List of Records
|
||||||
4.3.1. Unpadded Size
|
4.3.1. Total Size
|
||||||
4.3.2. Uncompressed Size
|
4.3.2. Uncompressed Size
|
||||||
4.4. Index Padding
|
4.4. Index Padding
|
||||||
4.5. CRC32
|
4.5. CRC32
|
||||||
@ -48,10 +43,11 @@ Version 1.2.1 (2024-04-08)
|
|||||||
5.1. Alignment
|
5.1. Alignment
|
||||||
5.2. Security
|
5.2. Security
|
||||||
5.3. Filters
|
5.3. Filters
|
||||||
5.3.1. LZMA2
|
5.3.1. LZMA
|
||||||
5.3.2. Branch/Call/Jump Filters for Executables
|
5.3.2. LZMA2
|
||||||
5.3.3. Delta
|
5.3.3. Branch/Call/Jump Filters for Executables
|
||||||
5.3.3.1. Format of the Encoded Output
|
5.3.4. Delta
|
||||||
|
5.3.4.1. Format of the Encoded Output
|
||||||
5.4. Custom Filter IDs
|
5.4. Custom Filter IDs
|
||||||
5.4.1. Reserved Custom Filter ID Ranges
|
5.4.1. Reserved Custom Filter ID Ranges
|
||||||
6. Cyclic Redundancy Checks
|
6. Cyclic Redundancy Checks
|
||||||
@ -60,80 +56,58 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
0. Preface
|
0. Preface
|
||||||
|
|
||||||
This document describes the .xz file format (filename suffix
|
This document describes the .lzma file format (filename suffix
|
||||||
".xz", MIME type "application/x-xz"). It is intended that this
|
`.lzma', MIME type `application/x-lzma'). It is intended that
|
||||||
this format replace the old .lzma format used by LZMA SDK and
|
this format replace the format used by the LZMA_Alone tool
|
||||||
LZMA Utils.
|
included in LZMA SDK up to and including version 4.57.
|
||||||
|
|
||||||
|
IMPORTANT: The version described in this document is a
|
||||||
|
draft, NOT a final, official version. Changes
|
||||||
|
are possible.
|
||||||
|
|
||||||
|
|
||||||
0.1. Notices and Acknowledgements
|
0.1. Copyright Notices
|
||||||
|
|
||||||
This file format was designed by Lasse Collin
|
Copyright (C) 2006-2008 Lasse Collin <lasse.collin@tukaani.org>
|
||||||
<lasse.collin@tukaani.org> and Igor Pavlov.
|
Copyright (C) 2006 Ville Koskinen <w-ber@iki.fi>
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without
|
||||||
|
modification, are permitted in any medium without royalty
|
||||||
|
provided the copyright notice and this notice are preserved.
|
||||||
|
Modified versions must be marked as such.
|
||||||
|
|
||||||
|
All source code examples given in this document are put into
|
||||||
|
the public domain by the authors of this document.
|
||||||
|
|
||||||
Special thanks for helping with this document goes to
|
Special thanks for helping with this document goes to
|
||||||
Ville Koskinen. Thanks for helping with this document goes to
|
Igor Pavlov. Thanks for helping with this document goes to
|
||||||
Mark Adler, H. Peter Anvin, Mikko Pouru, and Lars Wirzenius.
|
Mark Adler, H. Peter Anvin, and Mikko Pouru.
|
||||||
|
|
||||||
This document has been put into the public domain.
|
|
||||||
|
|
||||||
|
|
||||||
0.2. Getting the Latest Version
|
0.2. Changes
|
||||||
|
|
||||||
The latest official version of this document can be downloaded
|
Last modified: 2008-09-07 10:20+0300
|
||||||
from <https://tukaani.org/xz/xz-file-format.txt>.
|
|
||||||
|
|
||||||
Specific versions of this document have a filename
|
(A changelog will be kept once the first official version
|
||||||
xz-file-format-X.Y.Z.txt where X.Y.Z is the version number.
|
is made.)
|
||||||
For example, the version 1.0.0 of this document is available
|
|
||||||
at <https://tukaani.org/xz/xz-file-format-1.0.0.txt>.
|
|
||||||
|
|
||||||
|
|
||||||
0.3. Version History
|
|
||||||
|
|
||||||
Version Date Description
|
|
||||||
|
|
||||||
1.2.1 2024-04-08 The URLs of this specification and
|
|
||||||
XZ Utils were changed back to the
|
|
||||||
original ones in Sections 0.2 and 7.
|
|
||||||
|
|
||||||
1.2.0 2024-01-19 Added RISC-V filter and updated URLs in
|
|
||||||
Sections 0.2 and 7. The URL of this
|
|
||||||
specification was changed.
|
|
||||||
|
|
||||||
1.1.0 2022-12-11 Added ARM64 filter and clarified 32-bit
|
|
||||||
ARM endianness in Section 5.3.2,
|
|
||||||
language improvements in Section 5.4
|
|
||||||
|
|
||||||
1.0.4 2009-08-27 Language improvements in Sections 1.2,
|
|
||||||
2.1.1.2, 3.1.1, 3.1.2, and 5.3.1
|
|
||||||
|
|
||||||
1.0.3 2009-06-05 Spelling fixes in Sections 5.1 and 5.4
|
|
||||||
|
|
||||||
1.0.2 2009-06-04 Typo fixes in Sections 4 and 5.3.1
|
|
||||||
|
|
||||||
1.0.1 2009-06-01 Typo fix in Section 0.3 and minor
|
|
||||||
clarifications to Sections 2, 2.2,
|
|
||||||
3.3, 4.4, and 5.3.2
|
|
||||||
|
|
||||||
1.0.0 2009-01-14 The first official version
|
|
||||||
|
|
||||||
|
|
||||||
1. Conventions
|
1. Conventions
|
||||||
|
|
||||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD",
|
The keywords `must', `must not', `required', `should',
|
||||||
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
|
`should not', `recommended', `may', and `optional' in this
|
||||||
document are to be interpreted as described in [RFC-2119].
|
document are to be interpreted as described in [RFC-2119].
|
||||||
|
These words are not capitalized in this document.
|
||||||
|
|
||||||
Indicating a warning means displaying a message, returning
|
Indicating a warning means displaying a message, returning
|
||||||
appropriate exit status, or doing something else to let the
|
appropriate exit status, or something else to let the user
|
||||||
user know that something worth warning occurred. The operation
|
know that something worth warning occurred. The operation
|
||||||
SHOULD still finish if a warning is indicated.
|
should still finish if a warning is indicated.
|
||||||
|
|
||||||
Indicating an error means displaying a message, returning
|
Indicating an error means displaying a message, returning
|
||||||
appropriate exit status, or doing something else to let the
|
appropriate exit status, or something else to let the user
|
||||||
user know that something prevented successfully finishing the
|
know that something prevented successfully finishing the
|
||||||
operation. The operation MUST be aborted once an error has
|
operation. The operation must be aborted once an error has
|
||||||
been indicated.
|
been indicated.
|
||||||
|
|
||||||
|
|
||||||
@ -141,7 +115,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
In this document, byte is always 8 bits.
|
In this document, byte is always 8 bits.
|
||||||
|
|
||||||
A "null byte" has all bits unset. That is, the value of a null
|
A `nul byte' has all bits unset. That is, the value of a nul
|
||||||
byte is 0x00.
|
byte is 0x00.
|
||||||
|
|
||||||
To represent byte blocks, this document uses notation that
|
To represent byte blocks, this document uses notation that
|
||||||
@ -160,25 +134,8 @@ Version 1.2.1 (2024-04-08)
|
|||||||
+=======+
|
+=======+
|
||||||
|
|
||||||
In this document, a boxed byte or a byte sequence declared
|
In this document, a boxed byte or a byte sequence declared
|
||||||
using this notation is called "a field". The example field
|
using this notation is called `a field'. The example field
|
||||||
above would be called "the Foo field" or plain "Foo".
|
above would be called `the Foo field' or plain `Foo'.
|
||||||
|
|
||||||
If there are many fields, they may be split to multiple lines.
|
|
||||||
This is indicated with an arrow ("--->"):
|
|
||||||
|
|
||||||
+=====+
|
|
||||||
| Foo |
|
|
||||||
+=====+
|
|
||||||
|
|
||||||
+=====+
|
|
||||||
---> | Bar |
|
|
||||||
+=====+
|
|
||||||
|
|
||||||
The above is equivalent to this:
|
|
||||||
|
|
||||||
+=====+=====+
|
|
||||||
| Foo | Bar |
|
|
||||||
+=====+=====+
|
|
||||||
|
|
||||||
|
|
||||||
1.2. Multibyte Integers
|
1.2. Multibyte Integers
|
||||||
@ -198,20 +155,19 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
For now, the value of the variable-length integers is limited
|
For now, the value of the variable-length integers is limited
|
||||||
to 63 bits, which limits the encoded size of the integer to
|
to 63 bits, which limits the encoded size of the integer to
|
||||||
nine bytes. These limits may be increased in the future if
|
nine bytes. These limits may be increased in future if needed.
|
||||||
needed.
|
|
||||||
|
|
||||||
The following C code illustrates encoding and decoding of
|
The following C code illustrates encoding and decoding of
|
||||||
variable-length integers. The functions return the number of
|
variable-length integers. The functions return the number of
|
||||||
bytes occupied by the integer (1-9), or zero on error.
|
bytes occupied by the integer (1-9), or zero on error.
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <sys/types.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
encode(uint8_t buf[static 9], uint64_t num)
|
encode(uint8_t buf[static 9], uint64_t num)
|
||||||
{
|
{
|
||||||
if (num > UINT64_MAX / 2)
|
if (num >= UINT64_MAX / 2)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
@ -239,7 +195,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
while (buf[i++] & 0x80) {
|
while (buf[i++] & 0x80) {
|
||||||
if (i >= size_max || buf[i] == 0x00)
|
if (i > size_max || buf[i] == 0x00)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
*num |= (uint64_t)(buf[i] & 0x7F) << (i * 7);
|
*num |= (uint64_t)(buf[i] & 0x7F) << (i * 7);
|
||||||
@ -249,28 +205,17 @@ Version 1.2.1 (2024-04-08)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
2. Overall Structure of .xz File
|
2. Overall Structure of .lzma File
|
||||||
|
|
||||||
A standalone .xz files consist of one or more Streams which may
|
|
||||||
have Stream Padding between or after them:
|
|
||||||
|
|
||||||
+========+================+========+================+
|
+========+================+========+================+
|
||||||
| Stream | Stream Padding | Stream | Stream Padding | ...
|
| Stream | Stream Padding | Stream | Stream Padding | ...
|
||||||
+========+================+========+================+
|
+========+================+========+================+
|
||||||
|
|
||||||
The sizes of Stream and Stream Padding are always multiples
|
A file contains usually only one Stream. However, it is
|
||||||
of four bytes, thus the size of every valid .xz file MUST be
|
possible to concatenate multiple Streams together with no
|
||||||
a multiple of four bytes.
|
additional processing. It is up to the implementation to
|
||||||
|
decide if the decoder will continue decoding from the next
|
||||||
While a typical file contains only one Stream and no Stream
|
Stream once the end of the first Stream has been reached.
|
||||||
Padding, a decoder handling standalone .xz files SHOULD support
|
|
||||||
files that have more than one Stream or Stream Padding.
|
|
||||||
|
|
||||||
In contrast to standalone .xz files, when the .xz file format
|
|
||||||
is used as an internal part of some other file format or
|
|
||||||
communication protocol, it usually is expected that the decoder
|
|
||||||
stops after the first Stream, and doesn't look for Stream
|
|
||||||
Padding or possibly other Streams.
|
|
||||||
|
|
||||||
|
|
||||||
2.1. Stream
|
2.1. Stream
|
||||||
@ -285,7 +230,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
All the above fields have a size that is a multiple of four. If
|
All the above fields have a size that is a multiple of four. If
|
||||||
Stream is used as an internal part of another file format, it
|
Stream is used as an internal part of another file format, it
|
||||||
is RECOMMENDED to make the Stream start at an offset that is
|
is recommended to make the Stream start at an offset that is
|
||||||
a multiple of four bytes.
|
a multiple of four bytes.
|
||||||
|
|
||||||
Stream Header, Index, and Stream Footer are always present in
|
Stream Header, Index, and Stream Footer are always present in
|
||||||
@ -294,13 +239,13 @@ Version 1.2.1 (2024-04-08)
|
|||||||
There are zero or more Blocks. The maximum number of Blocks is
|
There are zero or more Blocks. The maximum number of Blocks is
|
||||||
limited only by the maximum size of the Index field.
|
limited only by the maximum size of the Index field.
|
||||||
|
|
||||||
Total size of a Stream MUST be less than 8 EiB (2^63 bytes).
|
Total size of a Stream must be less than 8 EiB (2^63 bytes).
|
||||||
The same limit applies to the total amount of uncompressed
|
The same limit applies to the total amount of uncompressed
|
||||||
data stored in a Stream.
|
data stored in a Stream.
|
||||||
|
|
||||||
If an implementation supports handling .xz files with multiple
|
If an implementation supports handling .lzma files with
|
||||||
concatenated Streams, it MAY apply the above limits to the file
|
multiple concatenated Streams, it may apply the above limits
|
||||||
as a whole instead of limiting per Stream basis.
|
to the file as a whole instead of limiting per Stream basis.
|
||||||
|
|
||||||
|
|
||||||
2.1.1. Stream Header
|
2.1.1. Stream Header
|
||||||
@ -317,32 +262,32 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
Using a C array and ASCII:
|
Using a C array and ASCII:
|
||||||
const uint8_t HEADER_MAGIC[6]
|
const uint8_t HEADER_MAGIC[6]
|
||||||
= { 0xFD, '7', 'z', 'X', 'Z', 0x00 };
|
= { 0xFF, 'L', 'Z', 'M', 'A', 0x00 };
|
||||||
|
|
||||||
In plain hexadecimal:
|
In plain hexadecimal:
|
||||||
FD 37 7A 58 5A 00
|
FF 4C 5A 4D 41 00
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
- The first byte (0xFD) was chosen so that the files cannot
|
- The first byte (0xFF) was chosen so that the files cannot
|
||||||
be erroneously detected as being in .lzma format, in which
|
be erroneously detected as being in LZMA_Alone format, in
|
||||||
the first byte is in the range [0x00, 0xE0].
|
which the first byte is in the range [0x00, 0xE0].
|
||||||
- The sixth byte (0x00) was chosen to prevent applications
|
- The sixth byte (0x00) was chosen to prevent applications
|
||||||
from misdetecting the file as a text file.
|
from misdetecting the file as a text file.
|
||||||
|
|
||||||
If the Header Magic Bytes don't match, the decoder MUST
|
If the Header Magic Bytes don't match, the decoder must
|
||||||
indicate an error.
|
indicate an error.
|
||||||
|
|
||||||
|
|
||||||
2.1.1.2. Stream Flags
|
2.1.1.2. Stream Flags
|
||||||
|
|
||||||
The first byte of Stream Flags is always a null byte. In the
|
The first byte of Stream Flags is always a nul byte. In future
|
||||||
future, this byte may be used to indicate a new Stream version
|
this byte may be used to indicate new Stream version or other
|
||||||
or other Stream properties.
|
Stream properties.
|
||||||
|
|
||||||
The second byte of Stream Flags is a bit field:
|
The second byte of Stream Flags is a bit field:
|
||||||
|
|
||||||
Bit(s) Mask Description
|
Bit(s) Mask Description
|
||||||
0-3 0x0F Type of Check (see Section 3.4):
|
0-3 0x0F Type of Check (see Section 3.3):
|
||||||
ID Size Check name
|
ID Size Check name
|
||||||
0x00 0 bytes None
|
0x00 0 bytes None
|
||||||
0x01 4 bytes CRC32
|
0x01 4 bytes CRC32
|
||||||
@ -360,14 +305,14 @@ Version 1.2.1 (2024-04-08)
|
|||||||
0x0D 64 bytes (Reserved)
|
0x0D 64 bytes (Reserved)
|
||||||
0x0E 64 bytes (Reserved)
|
0x0E 64 bytes (Reserved)
|
||||||
0x0F 64 bytes (Reserved)
|
0x0F 64 bytes (Reserved)
|
||||||
4-7 0xF0 Reserved for future use; MUST be zero for now.
|
4-7 0xF0 Reserved for future use; must be zero for now.
|
||||||
|
|
||||||
Implementations SHOULD support at least the Check IDs 0x00
|
Implementations must support at least the Check IDs 0x00 (None)
|
||||||
(None) and 0x01 (CRC32). Supporting other Check IDs is
|
and 0x01 (CRC32). Supporting other Check IDs is optional. If
|
||||||
OPTIONAL. If an unsupported Check is used, the decoder SHOULD
|
an unsupported Check is used, the decoder should indicate a
|
||||||
indicate a warning or error.
|
warning or error.
|
||||||
|
|
||||||
If any reserved bit is set, the decoder MUST indicate an error.
|
If any reserved bit is set, the decoder must indicate an error.
|
||||||
It is possible that there is a new field present which the
|
It is possible that there is a new field present which the
|
||||||
decoder is not aware of, and can thus parse the Stream Header
|
decoder is not aware of, and can thus parse the Stream Header
|
||||||
incorrectly.
|
incorrectly.
|
||||||
@ -378,7 +323,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
The CRC32 is calculated from the Stream Flags field. It is
|
The CRC32 is calculated from the Stream Flags field. It is
|
||||||
stored as an unsigned 32-bit little endian integer. If the
|
stored as an unsigned 32-bit little endian integer. If the
|
||||||
calculated value does not match the stored one, the decoder
|
calculated value does not match the stored one, the decoder
|
||||||
MUST indicate an error.
|
must indicate an error.
|
||||||
|
|
||||||
The idea is that Stream Flags would always be two bytes, even
|
The idea is that Stream Flags would always be two bytes, even
|
||||||
if new features are needed. This way old decoders will be able
|
if new features are needed. This way old decoders will be able
|
||||||
@ -400,7 +345,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
The CRC32 is calculated from the Backward Size and Stream Flags
|
The CRC32 is calculated from the Backward Size and Stream Flags
|
||||||
fields. It is stored as an unsigned 32-bit little endian
|
fields. It is stored as an unsigned 32-bit little endian
|
||||||
integer. If the calculated value does not match the stored one,
|
integer. If the calculated value does not match the stored one,
|
||||||
the decoder MUST indicate an error.
|
the decoder must indicate an error.
|
||||||
|
|
||||||
The reason to have the CRC32 field before the Backward Size and
|
The reason to have the CRC32 field before the Backward Size and
|
||||||
Stream Flags fields is to keep the four-byte fields aligned to
|
Stream Flags fields is to keep the four-byte fields aligned to
|
||||||
@ -415,11 +360,8 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
real_backward_size = (stored_backward_size + 1) * 4;
|
real_backward_size = (stored_backward_size + 1) * 4;
|
||||||
|
|
||||||
If the stored value does not match the real size of the Index
|
Using a fixed-size integer to store this value makes it
|
||||||
field, the decoder MUST indicate an error.
|
slightly simpler to parse the Stream Footer when the
|
||||||
|
|
||||||
Using a fixed-size integer to store Backward Size makes
|
|
||||||
it slightly simpler to parse the Stream Footer when the
|
|
||||||
application needs to parse the Stream backwards.
|
application needs to parse the Stream backwards.
|
||||||
|
|
||||||
|
|
||||||
@ -427,16 +369,16 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
This is a copy of the Stream Flags field from the Stream
|
This is a copy of the Stream Flags field from the Stream
|
||||||
Header. The information stored to Stream Flags is needed
|
Header. The information stored to Stream Flags is needed
|
||||||
when parsing the Stream backwards. The decoder MUST compare
|
when parsing the Stream backwards. The decoder must compare
|
||||||
the Stream Flags fields in both Stream Header and Stream
|
the Stream Flags fields in both Stream Header and Stream
|
||||||
Footer, and indicate an error if they are not identical.
|
Footer, and indicate an error if they are not identical.
|
||||||
|
|
||||||
|
|
||||||
2.1.2.4. Footer Magic Bytes
|
2.1.2.4. Footer Magic Bytes
|
||||||
|
|
||||||
As the last step of the decoding process, the decoder MUST
|
As the last step of the decoding process, the decoder must
|
||||||
verify the existence of Footer Magic Bytes. If they don't
|
verify the existence of Footer Magic Bytes. If they don't
|
||||||
match, an error MUST be indicated.
|
match, an error must be indicated.
|
||||||
|
|
||||||
Using a C array and ASCII:
|
Using a C array and ASCII:
|
||||||
const uint8_t FOOTER_MAGIC[2] = { 'Y', 'Z' };
|
const uint8_t FOOTER_MAGIC[2] = { 'Y', 'Z' };
|
||||||
@ -455,29 +397,28 @@ Version 1.2.1 (2024-04-08)
|
|||||||
2.2. Stream Padding
|
2.2. Stream Padding
|
||||||
|
|
||||||
Only the decoders that support decoding of concatenated Streams
|
Only the decoders that support decoding of concatenated Streams
|
||||||
MUST support Stream Padding.
|
must support Stream Padding.
|
||||||
|
|
||||||
Stream Padding MUST contain only null bytes. To preserve the
|
Stream Padding must contain only nul bytes. Any non-nul byte
|
||||||
four-byte alignment of consecutive Streams, the size of Stream
|
should be considered as the beginning of a new Stream. To
|
||||||
Padding MUST be a multiple of four bytes. Empty Stream Padding
|
preserve the four-byte alignment of consecutive Streams, the
|
||||||
is allowed. If these requirements are not met, the decoder MUST
|
size of Stream Padding must be a multiple of four bytes. Empty
|
||||||
indicate an error.
|
Stream Padding is allowed.
|
||||||
|
|
||||||
Note that non-empty Stream Padding is allowed at the end of the
|
Note that non-empty Stream Padding is allowed at the end of the
|
||||||
file; there doesn't need to be a new Stream after non-empty
|
file; there doesn't need to be a new Stream after non-empty
|
||||||
Stream Padding. This can be convenient in certain situations
|
Stream Padding. This can be convenient in certain situations
|
||||||
[GNU-tar].
|
[GNU-tar].
|
||||||
|
|
||||||
The possibility of Stream Padding MUST be taken into account
|
The possibility of Padding should be taken into account when
|
||||||
when designing an application that parses Streams backwards,
|
designing an application that parses the Stream backwards.
|
||||||
and the application supports concatenated Streams.
|
|
||||||
|
|
||||||
|
|
||||||
3. Block
|
3. Block
|
||||||
|
|
||||||
+==============+=================+===============+=======+
|
+==============+=================+=======+
|
||||||
| Block Header | Compressed Data | Block Padding | Check |
|
| Block Header | Compressed Data | Check |
|
||||||
+==============+=================+===============+=======+
|
+==============+=================+=======+
|
||||||
|
|
||||||
|
|
||||||
3.1. Block Header
|
3.1. Block Header
|
||||||
@ -508,23 +449,23 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
real_header_size = (encoded_header_size + 1) * 4;
|
real_header_size = (encoded_header_size + 1) * 4;
|
||||||
|
|
||||||
If a Block Header bigger than 1024 bytes is needed in the
|
If bigger Block Header is needed in future, a new field can be
|
||||||
future, a new field can be added between the Block Header and
|
added between the current Block Header and Compressed Data
|
||||||
Compressed Data fields. The presence of this new field would
|
fields. The presence of this new field would be indicated in
|
||||||
be indicated in the Block Header field.
|
the Block Header.
|
||||||
|
|
||||||
|
|
||||||
3.1.2. Block Flags
|
3.1.2. Block Flags
|
||||||
|
|
||||||
The Block Flags field is a bit field:
|
The first byte of the Block Flags field is a bit field:
|
||||||
|
|
||||||
Bit(s) Mask Description
|
Bit(s) Mask Description
|
||||||
0-1 0x03 Number of filters (1-4)
|
0-1 0x03 Number of filters (1-4)
|
||||||
2-5 0x3C Reserved for future use; MUST be zero for now.
|
2-5 0x3C Reserved for future use; must be zero for now.
|
||||||
6 0x40 The Compressed Size field is present.
|
6 0x40 The Compressed Size field is present.
|
||||||
7 0x80 The Uncompressed Size field is present.
|
7 0x80 The Uncompressed Size field is present.
|
||||||
|
|
||||||
If any reserved bit is set, the decoder MUST indicate an error.
|
If any reserved bit is set, the decoder must indicate an error.
|
||||||
It is possible that there is a new field present which the
|
It is possible that there is a new field present which the
|
||||||
decoder is not aware of, and can thus parse the Block Header
|
decoder is not aware of, and can thus parse the Block Header
|
||||||
incorrectly.
|
incorrectly.
|
||||||
@ -535,11 +476,14 @@ Version 1.2.1 (2024-04-08)
|
|||||||
This field is present only if the appropriate bit is set in
|
This field is present only if the appropriate bit is set in
|
||||||
the Block Flags field (see Section 3.1.2).
|
the Block Flags field (see Section 3.1.2).
|
||||||
|
|
||||||
The Compressed Size field contains the size of the Compressed
|
This field contains the size of the Compressed Data field as
|
||||||
Data field, which MUST be non-zero. Compressed Size is stored
|
multiple of four bytes, minimum value being four bytes:
|
||||||
using the encoding described in Section 1.2. If the Compressed
|
|
||||||
Size doesn't match the size of the Compressed Data field, the
|
real_compressed_size = (stored_compressed_size + 1) * 4;
|
||||||
decoder MUST indicate an error.
|
|
||||||
|
The size is stored using the encoding described in Section 1.2.
|
||||||
|
If the Compressed Size does not match the real size of the
|
||||||
|
Compressed Data field, the decoder must indicate an error.
|
||||||
|
|
||||||
|
|
||||||
3.1.4. Uncompressed Size
|
3.1.4. Uncompressed Size
|
||||||
@ -550,7 +494,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
The Uncompressed Size field contains the size of the Block
|
The Uncompressed Size field contains the size of the Block
|
||||||
after uncompressing. Uncompressed Size is stored using the
|
after uncompressing. Uncompressed Size is stored using the
|
||||||
encoding described in Section 1.2. If the Uncompressed Size
|
encoding described in Section 1.2. If the Uncompressed Size
|
||||||
does not match the real uncompressed size, the decoder MUST
|
does not match the real uncompressed size, the decoder must
|
||||||
indicate an error.
|
indicate an error.
|
||||||
|
|
||||||
Storing the Compressed Size and Uncompressed Size fields serves
|
Storing the Compressed Size and Uncompressed Size fields serves
|
||||||
@ -589,14 +533,14 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
Filter IDs greater than or equal to 0x4000_0000_0000_0000
|
Filter IDs greater than or equal to 0x4000_0000_0000_0000
|
||||||
(2^62) are reserved for implementation-specific internal use.
|
(2^62) are reserved for implementation-specific internal use.
|
||||||
These Filter IDs MUST never be used in List of Filter Flags.
|
These Filter IDs must never be used in List of Filter Flags.
|
||||||
|
|
||||||
|
|
||||||
3.1.6. Header Padding
|
3.1.6. Header Padding
|
||||||
|
|
||||||
This field contains as many null byte as it is needed to make
|
This field contains as many nul byte as it is needed to make
|
||||||
the Block Header have the size specified in Block Header Size.
|
the Block Header have the size specified in Block Header Size.
|
||||||
If any of the bytes are not null bytes, the decoder MUST
|
If any of the bytes are not nul bytes, the decoder must
|
||||||
indicate an error. It is possible that there is a new field
|
indicate an error. It is possible that there is a new field
|
||||||
present which the decoder is not aware of, and can thus parse
|
present which the decoder is not aware of, and can thus parse
|
||||||
the Block Header incorrectly.
|
the Block Header incorrectly.
|
||||||
@ -607,7 +551,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
The CRC32 is calculated over everything in the Block Header
|
The CRC32 is calculated over everything in the Block Header
|
||||||
field except the CRC32 field itself. It is stored as an
|
field except the CRC32 field itself. It is stored as an
|
||||||
unsigned 32-bit little endian integer. If the calculated
|
unsigned 32-bit little endian integer. If the calculated
|
||||||
value does not match the stored one, the decoder MUST indicate
|
value does not match the stored one, the decoder must indicate
|
||||||
an error.
|
an error.
|
||||||
|
|
||||||
By verifying the CRC32 of the Block Header before parsing the
|
By verifying the CRC32 of the Block Header before parsing the
|
||||||
@ -622,39 +566,34 @@ Version 1.2.1 (2024-04-08)
|
|||||||
filters in Section 5.3, the format of the filter-specific
|
filters in Section 5.3, the format of the filter-specific
|
||||||
encoded data is out of scope of this document.
|
encoded data is out of scope of this document.
|
||||||
|
|
||||||
|
If the natural size of Compressed Data is not a multiple of
|
||||||
3.3. Block Padding
|
four bytes, it must be padded with 1-3 nul bytes to make it
|
||||||
|
a multiple of four bytes.
|
||||||
Block Padding MUST contain 0-3 null bytes to make the size of
|
|
||||||
the Block a multiple of four bytes. This can be needed when
|
|
||||||
the size of Compressed Data is not a multiple of four. If any
|
|
||||||
of the bytes in Block Padding are not null bytes, the decoder
|
|
||||||
MUST indicate an error.
|
|
||||||
|
|
||||||
|
|
||||||
3.4. Check
|
3.3. Check
|
||||||
|
|
||||||
The type and size of the Check field depends on which bits
|
The type and size of the Check field depends on which bits
|
||||||
are set in the Stream Flags field (see Section 2.1.1.2).
|
are set in the Stream Flags field (see Section 2.1.1.2).
|
||||||
|
|
||||||
The Check, when used, is calculated from the original
|
The Check, when used, is calculated from the original
|
||||||
uncompressed data. If the calculated Check does not match the
|
uncompressed data. If the calculated Check does not match the
|
||||||
stored one, the decoder MUST indicate an error. If the selected
|
stored one, the decoder must indicate an error. If the selected
|
||||||
type of Check is not supported by the decoder, it SHOULD
|
type of Check is not supported by the decoder, it must indicate
|
||||||
indicate a warning or error.
|
a warning or error.
|
||||||
|
|
||||||
|
|
||||||
4. Index
|
4. Index
|
||||||
|
|
||||||
+-----------------+===================+
|
+-----------------+=========================+
|
||||||
| Index Indicator | Number of Records |
|
| Index Indicator | Number of Index Records |
|
||||||
+-----------------+===================+
|
+-----------------+=========================+
|
||||||
|
|
||||||
+=================+===============+-+-+-+-+
|
+=================+=========+-+-+-+-+
|
||||||
---> | List of Records | Index Padding | CRC32 |
|
---> | List of Records | Padding | CRC32 |
|
||||||
+=================+===============+-+-+-+-+
|
+=================+=========+-+-+-+-+
|
||||||
|
|
||||||
Index serves several purposes. Using it, one can
|
Index serves several purporses. Using it, one can
|
||||||
- verify that all Blocks in a Stream have been processed;
|
- verify that all Blocks in a Stream have been processed;
|
||||||
- find out the uncompressed size of a Stream; and
|
- find out the uncompressed size of a Stream; and
|
||||||
- quickly access the beginning of any Block (random access).
|
- quickly access the beginning of any Block (random access).
|
||||||
@ -673,7 +612,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
Stream. The value is stored using the encoding described in
|
Stream. The value is stored using the encoding described in
|
||||||
Section 1.2. If the decoder has decoded all the Blocks of the
|
Section 1.2. If the decoder has decoded all the Blocks of the
|
||||||
Stream, and then notices that the Number of Records doesn't
|
Stream, and then notices that the Number of Records doesn't
|
||||||
match the real number of Blocks, the decoder MUST indicate an
|
match the real number of Blocks, the decoder must indicate an
|
||||||
error.
|
error.
|
||||||
|
|
||||||
|
|
||||||
@ -686,49 +625,39 @@ Version 1.2.1 (2024-04-08)
|
|||||||
| Record | Record | ...
|
| Record | Record | ...
|
||||||
+========+========+
|
+========+========+
|
||||||
|
|
||||||
Each Record contains information about one Block:
|
Each Record contains two fields:
|
||||||
|
|
||||||
+===============+===================+
|
+============+===================+
|
||||||
| Unpadded Size | Uncompressed Size |
|
| Total Size | Uncompressed Size |
|
||||||
+===============+===================+
|
+============+===================+
|
||||||
|
|
||||||
If the decoder has decoded all the Blocks of the Stream, it
|
If the decoder has decoded all the Blocks of the Stream, it
|
||||||
MUST verify that the contents of the Records match the real
|
must verify that the contents of the Records match the real
|
||||||
Unpadded Size and Uncompressed Size of the respective Blocks.
|
Total Size and Uncompressed Size of the respective Blocks.
|
||||||
|
|
||||||
Implementation hint: It is possible to verify the Index with
|
Implementation hint: It is possible to verify the Index with
|
||||||
constant memory usage by calculating for example SHA-256 of
|
constant memory usage by calculating for example SHA256 of both
|
||||||
both the real size values and the List of Records, then
|
the real size values and the List of Records, then comparing
|
||||||
comparing the hash values. Implementing this using
|
the check values. Implementing this using non-cryptographic
|
||||||
non-cryptographic hash like CRC32 SHOULD be avoided unless
|
check like CRC32 should be avoided unless small code size is
|
||||||
small code size is important.
|
important.
|
||||||
|
|
||||||
If the decoder supports random-access reading, it MUST verify
|
If the decoder supports random-access reading, it must verify
|
||||||
that Unpadded Size and Uncompressed Size of every completely
|
that Total Size and Uncompressed Size of every completely
|
||||||
decoded Block match the sizes stored in the Index. If only
|
decoded Block match the sizes stored in the Index. If only
|
||||||
partial Block is decoded, the decoder MUST verify that the
|
partial Block is decoded, the decoder must verify that the
|
||||||
processed sizes don't exceed the sizes stored in the Index.
|
processed sizes don't exceed the sizes stored in the Index.
|
||||||
|
|
||||||
|
|
||||||
4.3.1. Unpadded Size
|
4.3.1. Total Size
|
||||||
|
|
||||||
This field indicates the size of the Block excluding the Block
|
This field indicates the encoded size of the respective Block
|
||||||
Padding field. That is, Unpadded Size is the size of the Block
|
as multiples of four bytes, minimum value being four bytes:
|
||||||
Header, Compressed Data, and Check fields. Unpadded Size is
|
|
||||||
stored using the encoding described in Section 1.2. The value
|
|
||||||
MUST never be zero; with the current structure of Blocks, the
|
|
||||||
actual minimum value for Unpadded Size is five.
|
|
||||||
|
|
||||||
Implementation note: Because the size of the Block Padding
|
real_total_size = (stored_total_size + 1) * 4;
|
||||||
field is not included in Unpadded Size, calculating the total
|
|
||||||
size of a Stream or doing random-access reading requires
|
|
||||||
calculating the actual size of the Blocks by rounding Unpadded
|
|
||||||
Sizes up to the next multiple of four.
|
|
||||||
|
|
||||||
The reason to exclude Block Padding from Unpadded Size is to
|
The value is stored using the encoding described in Section
|
||||||
ease making a raw copy of Compressed Data without Block
|
1.2.
|
||||||
Padding. This can be useful, for example, if someone wants
|
|
||||||
to convert Streams to some other file format quickly.
|
|
||||||
|
|
||||||
|
|
||||||
4.3.2. Uncompressed Size
|
4.3.2. Uncompressed Size
|
||||||
@ -740,9 +669,8 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
4.4. Index Padding
|
4.4. Index Padding
|
||||||
|
|
||||||
This field MUST contain 0-3 null bytes to pad the Index to
|
This field must contain 0-3 nul bytes to pad the Index to
|
||||||
a multiple of four bytes. If any of the bytes are not null
|
a multiple of four bytes.
|
||||||
bytes, the decoder MUST indicate an error.
|
|
||||||
|
|
||||||
|
|
||||||
4.5. CRC32
|
4.5. CRC32
|
||||||
@ -750,7 +678,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
The CRC32 is calculated over everything in the Index field
|
The CRC32 is calculated over everything in the Index field
|
||||||
except the CRC32 field itself. The CRC32 is stored as an
|
except the CRC32 field itself. The CRC32 is stored as an
|
||||||
unsigned 32-bit little endian integer. If the calculated
|
unsigned 32-bit little endian integer. If the calculated
|
||||||
value does not match the stored one, the decoder MUST indicate
|
value does not match the stored one, the decoder must indicate
|
||||||
an error.
|
an error.
|
||||||
|
|
||||||
|
|
||||||
@ -776,15 +704,15 @@ Version 1.2.1 (2024-04-08)
|
|||||||
PowerPC executable files in the archive stream start at
|
PowerPC executable files in the archive stream start at
|
||||||
offsets that are multiples of four bytes.
|
offsets that are multiples of four bytes.
|
||||||
|
|
||||||
Some filters, for example LZMA2, can be configured to take
|
Some filters, for example LZMA, can be configured to take
|
||||||
advantage of specified alignment of input data. Note that
|
advantage of specified alignment of input data. Note that
|
||||||
taking advantage of aligned input can be beneficial also when
|
taking advantage of aligned input can be benefical also when
|
||||||
a filter is not the first filter in the chain. For example,
|
a filter is not the first filter in the chain. For example,
|
||||||
if you compress PowerPC executables, you may want to use the
|
if you compress PowerPC executables, you may want to use the
|
||||||
PowerPC filter and chain that with the LZMA2 filter. Because
|
PowerPC filter and chain that with the LZMA filter. Because not
|
||||||
not only the input but also the output alignment of the PowerPC
|
only the input but also the output alignment of the PowerPC
|
||||||
filter is four bytes, it is now beneficial to set LZMA2
|
filter is four bytes, it is now benefical to set LZMA settings
|
||||||
settings so that the LZMA2 encoder can take advantage of its
|
so that the LZMA encoder can take advantage of its
|
||||||
four-byte-aligned input data.
|
four-byte-aligned input data.
|
||||||
|
|
||||||
The output of the last filter in the chain is stored to the
|
The output of the last filter in the chain is stored to the
|
||||||
@ -821,7 +749,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
gets very little work done.
|
gets very little work done.
|
||||||
|
|
||||||
To prevent this kind of slow files, there are restrictions on
|
To prevent this kind of slow files, there are restrictions on
|
||||||
how the filters can be chained. These restrictions MUST be
|
how the filters can be chained. These restrictions must be
|
||||||
taken into account when designing new filters.
|
taken into account when designing new filters.
|
||||||
|
|
||||||
The maximum number of filters in the chain has been limited to
|
The maximum number of filters in the chain has been limited to
|
||||||
@ -829,11 +757,11 @@ Version 1.2.1 (2024-04-08)
|
|||||||
Of these three non-last filters, only two are allowed to change
|
Of these three non-last filters, only two are allowed to change
|
||||||
the size of the data.
|
the size of the data.
|
||||||
|
|
||||||
The non-last filters, that change the size of the data, MUST
|
The non-last filters, that change the size of the data, must
|
||||||
have a limit how much the decoder can compress the data: the
|
have a limit how much the decoder can compress the data: the
|
||||||
decoder SHOULD produce at least n bytes of output when the
|
decoder should produce at least n bytes of output when the
|
||||||
filter is given 2n bytes of input. This limit is not
|
filter is given 2n bytes of input. This limit is not
|
||||||
absolute, but significant deviations MUST be avoided.
|
absolute, but significant deviations must be avoided.
|
||||||
|
|
||||||
The above limitations guarantee that if the last filter in the
|
The above limitations guarantee that if the last filter in the
|
||||||
chain produces 4n bytes of output, the chain as a whole will
|
chain produces 4n bytes of output, the chain as a whole will
|
||||||
@ -842,18 +770,78 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
5.3. Filters
|
5.3. Filters
|
||||||
|
|
||||||
5.3.1. LZMA2
|
5.3.1. LZMA
|
||||||
|
|
||||||
LZMA (Lempel-Ziv-Markov chain-Algorithm) is a general-purpose
|
LZMA (Lempel-Ziv-Markov chain-Algorithm) is a general-purporse
|
||||||
compression algorithm with high compression ratio and fast
|
compression algorithm with high compression ratio and fast
|
||||||
decompression. LZMA is based on LZ77 and range coding
|
decompression. LZMA is based on LZ77 and range coding
|
||||||
algorithms.
|
algorithms.
|
||||||
|
|
||||||
LZMA2 is an extension on top of the original LZMA. LZMA2 uses
|
Filter ID: 0x20
|
||||||
|
Size of Filter Properties: 5 bytes
|
||||||
|
Changes size of data: Yes
|
||||||
|
Allow as a non-last filter: No
|
||||||
|
Allow as the last filter: Yes
|
||||||
|
|
||||||
|
Preferred alignment:
|
||||||
|
Input data: Adjustable to 1/2/4/8/16 byte(s)
|
||||||
|
Output data: 1 byte
|
||||||
|
|
||||||
|
At the time of writing, there is no other documentation about
|
||||||
|
how LZMA works than the source code in LZMA SDK. Once such
|
||||||
|
documentation gets written, it will probably be published as
|
||||||
|
a separate document, because including the documentation here
|
||||||
|
would lengthen this document considerably.
|
||||||
|
|
||||||
|
The format of the Filter Properties field is as follows:
|
||||||
|
|
||||||
|
+-----------------+----+----+----+----+
|
||||||
|
| LZMA Properties | Dictionary Size |
|
||||||
|
+-----------------+----+----+----+----+
|
||||||
|
|
||||||
|
The LZMA Properties field contains three properties. An
|
||||||
|
abbreviation is given in parentheses, followed by the value
|
||||||
|
range of the property. The field consists of
|
||||||
|
|
||||||
|
1) the number of literal context bits (lc, [0, 4]);
|
||||||
|
2) the number of literal position bits (lp, [0, 4]); and
|
||||||
|
3) the number of position bits (pb, [0, 4]).
|
||||||
|
|
||||||
|
In addition to above ranges, the sum of lc and lp must not
|
||||||
|
exceed four. Note that this limit didn't exist in the old
|
||||||
|
LZMA_Alone format, which allowed lc to be in the range [0, 8].
|
||||||
|
|
||||||
|
The properties are encoded using the following formula:
|
||||||
|
|
||||||
|
LZMA Properties = (pb * 5 + lp) * 9 + lc
|
||||||
|
|
||||||
|
The following C code illustrates a straightforward way to
|
||||||
|
decode the properties:
|
||||||
|
|
||||||
|
uint8_t lc, lp, pb;
|
||||||
|
uint8_t prop = get_lzma_properties();
|
||||||
|
if (prop > (4 * 5 + 4) * 9 + 8)
|
||||||
|
return LZMA_PROPERTIES_ERROR;
|
||||||
|
|
||||||
|
pb = prop / (9 * 5);
|
||||||
|
prop -= pb * 9 * 5;
|
||||||
|
lp = prop / 9;
|
||||||
|
lc = prop - lp * 9;
|
||||||
|
|
||||||
|
if (lc + lp > 4)
|
||||||
|
return LZMA_PROPERTIES_ERROR;
|
||||||
|
|
||||||
|
Dictionary Size is encoded as unsigned 32-bit little endian
|
||||||
|
integer.
|
||||||
|
|
||||||
|
|
||||||
|
5.3.2. LZMA2
|
||||||
|
|
||||||
|
LZMA2 is an extensions on top of the original LZMA. LZMA2 uses
|
||||||
LZMA internally, but adds support for flushing the encoder,
|
LZMA internally, but adds support for flushing the encoder,
|
||||||
uncompressed chunks, eases stateful decoder implementations,
|
uncompressed chunks, eases stateful decoder implementations,
|
||||||
and improves support for multithreading. Thus, the plain LZMA
|
and improves support for multithreading. For most uses, it is
|
||||||
will not be supported in this file format.
|
recommended to use LZMA2 instead of LZMA.
|
||||||
|
|
||||||
Filter ID: 0x21
|
Filter ID: 0x21
|
||||||
Size of Filter Properties: 1 byte
|
Size of Filter Properties: 1 byte
|
||||||
@ -870,7 +858,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
Bits Mask Description
|
Bits Mask Description
|
||||||
0-5 0x3F Dictionary Size
|
0-5 0x3F Dictionary Size
|
||||||
6-7 0xC0 Reserved for future use; MUST be zero for now.
|
6-7 0xC0 Reserved for future use; must be zero for now.
|
||||||
|
|
||||||
Dictionary Size is encoded with one-bit mantissa and five-bit
|
Dictionary Size is encoded with one-bit mantissa and five-bit
|
||||||
exponent. The smallest dictionary size is 4 KiB and the biggest
|
exponent. The smallest dictionary size is 4 KiB and the biggest
|
||||||
@ -908,7 +896,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
5.3.2. Branch/Call/Jump Filters for Executables
|
5.3.3. Branch/Call/Jump Filters for Executables
|
||||||
|
|
||||||
These filters convert relative branch, call, and jump
|
These filters convert relative branch, call, and jump
|
||||||
instructions to their absolute counterparts in executable
|
instructions to their absolute counterparts in executable
|
||||||
@ -920,6 +908,11 @@ Version 1.2.1 (2024-04-08)
|
|||||||
Allow as a non-last filter: Yes
|
Allow as a non-last filter: Yes
|
||||||
Allow as the last filter: No
|
Allow as the last filter: No
|
||||||
|
|
||||||
|
Detecting when all of the data has been decoded:
|
||||||
|
Uncompressed size: Yes
|
||||||
|
End of Payload Marker: No
|
||||||
|
End of Input: Yes
|
||||||
|
|
||||||
Below is the list of filters in this category. The alignment
|
Below is the list of filters in this category. The alignment
|
||||||
is the same for both input and output data.
|
is the same for both input and output data.
|
||||||
|
|
||||||
@ -927,37 +920,23 @@ Version 1.2.1 (2024-04-08)
|
|||||||
0x04 1 byte x86 filter (BCJ)
|
0x04 1 byte x86 filter (BCJ)
|
||||||
0x05 4 bytes PowerPC (big endian) filter
|
0x05 4 bytes PowerPC (big endian) filter
|
||||||
0x06 16 bytes IA64 filter
|
0x06 16 bytes IA64 filter
|
||||||
0x07 4 bytes ARM filter [1]
|
0x07 4 bytes ARM (little endian) filter
|
||||||
0x08 2 bytes ARM Thumb filter [1]
|
0x08 2 bytes ARM Thumb (little endian) filter
|
||||||
0x09 4 bytes SPARC filter
|
0x09 4 bytes SPARC filter
|
||||||
0x0A 4 bytes ARM64 filter [2]
|
|
||||||
0x0B 2 bytes RISC-V filter
|
|
||||||
|
|
||||||
[1] These are for little endian instruction encoding.
|
|
||||||
This must not be confused with data endianness.
|
|
||||||
A processor configured for big endian data access
|
|
||||||
may still use little endian instruction encoding.
|
|
||||||
The filters don't care about the data endianness.
|
|
||||||
|
|
||||||
[2] 4096-byte alignment gives the best results
|
|
||||||
because the address in the ADRP instruction
|
|
||||||
is a multiple of 4096 bytes.
|
|
||||||
|
|
||||||
If the size of Filter Properties is four bytes, the Filter
|
If the size of Filter Properties is four bytes, the Filter
|
||||||
Properties field contains the start offset used for address
|
Properties field contains the start offset used for address
|
||||||
conversions. It is stored as an unsigned 32-bit little endian
|
conversions. It is stored as an unsigned 32-bit little endian
|
||||||
integer. The start offset MUST be a multiple of the alignment
|
integer. If the size of Filter Properties is zero, the start
|
||||||
of the filter as listed in the table above; if it isn't, the
|
offset is zero.
|
||||||
decoder MUST indicate an error. If the size of Filter
|
|
||||||
Properties is zero, the start offset is zero.
|
|
||||||
|
|
||||||
Setting the start offset may be useful if an executable has
|
Setting the start offset may be useful if an executable has
|
||||||
multiple sections, and there are many cross-section calls.
|
multiple sections, and there are many cross-section calls.
|
||||||
Taking advantage of this feature usually requires usage of
|
Taking advantage of this feature usually requires usage of
|
||||||
the Subblock filter, whose design is not complete yet.
|
the Subblock filter.
|
||||||
|
|
||||||
|
|
||||||
5.3.3. Delta
|
5.3.4. Delta
|
||||||
|
|
||||||
The Delta filter may increase compression ratio when the value
|
The Delta filter may increase compression ratio when the value
|
||||||
of the next byte correlates with the value of an earlier byte
|
of the next byte correlates with the value of an earlier byte
|
||||||
@ -978,7 +957,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
distance of 1 byte and 0xFF distance of 256 bytes.
|
distance of 1 byte and 0xFF distance of 256 bytes.
|
||||||
|
|
||||||
|
|
||||||
5.3.3.1. Format of the Encoded Output
|
5.3.4.1. Format of the Encoded Output
|
||||||
|
|
||||||
The code below illustrates both encoding and decoding with
|
The code below illustrates both encoding and decoding with
|
||||||
the Delta filter.
|
the Delta filter.
|
||||||
@ -1011,20 +990,20 @@ Version 1.2.1 (2024-04-08)
|
|||||||
|
|
||||||
5.4. Custom Filter IDs
|
5.4. Custom Filter IDs
|
||||||
|
|
||||||
If a developer wants to use custom Filter IDs, there are two
|
If a developer wants to use custom Filter IDs, he has two
|
||||||
choices. The first choice is to contact Lasse Collin and ask
|
choices. The first choice is to contact Lasse Collin and ask
|
||||||
him to allocate a range of IDs for the developer.
|
him to allocate a range of IDs for the developer.
|
||||||
|
|
||||||
The second choice is to generate a 40-bit random integer
|
The second choice is to generate a 40-bit random integer,
|
||||||
which the developer can use as a personal Developer ID.
|
which the developer can use as his personal Developer ID.
|
||||||
To minimize the risk of collisions, Developer ID has to be
|
To minimalize the risk of collisions, Developer ID has to be
|
||||||
a randomly generated integer, not manually selected "hex word".
|
a randomly generated integer, not manually selected "hex word".
|
||||||
The following command, which works on many free operating
|
The following command, which works on many free operating
|
||||||
systems, can be used to generate Developer ID:
|
systems, can be used to generate Developer ID:
|
||||||
|
|
||||||
dd if=/dev/urandom bs=5 count=1 | hexdump
|
dd if=/dev/urandom bs=5 count=1 | hexdump
|
||||||
|
|
||||||
The developer can then use the Developer ID to create unique
|
The developer can then use his Developer ID to create unique
|
||||||
(well, hopefully unique) Filter IDs.
|
(well, hopefully unique) Filter IDs.
|
||||||
|
|
||||||
Bits Mask Description
|
Bits Mask Description
|
||||||
@ -1041,7 +1020,6 @@ Version 1.2.1 (2024-04-08)
|
|||||||
5.4.1. Reserved Custom Filter ID Ranges
|
5.4.1. Reserved Custom Filter ID Ranges
|
||||||
|
|
||||||
Range Description
|
Range Description
|
||||||
0x0000_0300 - 0x0000_04FF Reserved to ease .7z compatibility
|
|
||||||
0x0002_0000 - 0x0007_FFFF Reserved to ease .7z compatibility
|
0x0002_0000 - 0x0007_FFFF Reserved to ease .7z compatibility
|
||||||
0x0200_0000 - 0x07FF_FFFF Reserved to ease .7z compatibility
|
0x0200_0000 - 0x07FF_FFFF Reserved to ease .7z compatibility
|
||||||
|
|
||||||
@ -1051,14 +1029,14 @@ Version 1.2.1 (2024-04-08)
|
|||||||
There are several incompatible variations to calculate CRC32
|
There are several incompatible variations to calculate CRC32
|
||||||
and CRC64. For simplicity and clarity, complete examples are
|
and CRC64. For simplicity and clarity, complete examples are
|
||||||
provided to calculate the checks as they are used in this file
|
provided to calculate the checks as they are used in this file
|
||||||
format. Implementations MAY use different code as long as it
|
format. Implementations may use different code as long as it
|
||||||
gives identical results.
|
gives identical results.
|
||||||
|
|
||||||
The program below reads data from standard input, calculates
|
The program below reads data from standard input, calculates
|
||||||
the CRC32 and CRC64 values, and prints the calculated values
|
the CRC32 and CRC64 values, and prints the calculated values
|
||||||
as big endian hexadecimal strings to standard output.
|
as big endian hexadecimal strings to standard output.
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <sys/types.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@ -1124,8 +1102,7 @@ Version 1.2.1 (2024-04-08)
|
|||||||
uint8_t buf[8192];
|
uint8_t buf[8192];
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
const size_t buf_size
|
const size_t buf_size = fread(buf, 1, 8192, stdin);
|
||||||
= fread(buf, 1, sizeof(buf), stdin);
|
|
||||||
if (buf_size == 0)
|
if (buf_size == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1145,30 +1122,27 @@ Version 1.2.1 (2024-04-08)
|
|||||||
7. References
|
7. References
|
||||||
|
|
||||||
LZMA SDK - The original LZMA implementation
|
LZMA SDK - The original LZMA implementation
|
||||||
https://7-zip.org/sdk.html
|
http://7-zip.org/sdk.html
|
||||||
|
|
||||||
LZMA Utils - LZMA adapted to POSIX-like systems
|
LZMA Utils - LZMA adapted to POSIX-like systems
|
||||||
https://tukaani.org/lzma/
|
http://tukaani.org/lzma/
|
||||||
|
|
||||||
XZ Utils - The next generation of LZMA Utils
|
|
||||||
https://tukaani.org/xz/
|
|
||||||
|
|
||||||
[RFC-1952]
|
[RFC-1952]
|
||||||
GZIP file format specification version 4.3
|
GZIP file format specification version 4.3
|
||||||
https://www.ietf.org/rfc/rfc1952.txt
|
http://www.ietf.org/rfc/rfc1952.txt
|
||||||
- Notation of byte boxes in section "2.1. Overall conventions"
|
- Notation of byte boxes in section `2.1. Overall conventions'
|
||||||
|
|
||||||
[RFC-2119]
|
[RFC-2119]
|
||||||
Key words for use in RFCs to Indicate Requirement Levels
|
Key words for use in RFCs to Indicate Requirement Levels
|
||||||
https://www.ietf.org/rfc/rfc2119.txt
|
http://www.ietf.org/rfc/rfc2119.txt
|
||||||
|
|
||||||
[GNU-tar]
|
[GNU-tar]
|
||||||
GNU tar 1.35 manual
|
GNU tar 1.16.1 manual
|
||||||
https://www.gnu.org/software/tar/manual/html_node/Blocking-Factor.html
|
http://www.gnu.org/software/tar/manual/html_node/Blocking-Factor.html
|
||||||
- Node 9.4.2 "Blocking Factor", paragraph that begins
|
- Node 9.4.2 `Blocking Factor', paragraph that begins
|
||||||
"gzip will complain about trailing garbage"
|
`gzip will complain about trailing garbage'
|
||||||
- Note that this URL points to the latest version of the
|
- Note that this URL points to the latest version of the
|
||||||
manual, and may some day not contain the note which is in
|
manual, and may some day not contain the note which is in
|
||||||
1.35. For the exact version of the manual, download GNU
|
1.16.1. For the exact version of the manual, download GNU
|
||||||
tar 1.35: ftp://ftp.gnu.org/pub/gnu/tar/tar-1.35.tar.gz
|
tar 1.16.1: ftp://ftp.gnu.org/pub/gnu/tar/tar-1.16.1.tar.gz
|
||||||
|
|
||||||
162
doc/history.txt
162
doc/history.txt
@ -1,24 +1,24 @@
|
|||||||
|
|
||||||
History of LZMA Utils and XZ Utils
|
LZMA Utils history
|
||||||
==================================
|
------------------
|
||||||
|
|
||||||
Tukaani distribution
|
Tukaani distribution
|
||||||
|
|
||||||
In 2005, there was a small group working on the Tukaani distribution,
|
In 2005, there was a small group working on Tukaani distribution, which
|
||||||
which was a Slackware fork. One of the project's goals was to fit the
|
was a Slackware fork. One of the project goals was to fit the distro on
|
||||||
distro on a single 700 MiB ISO-9660 image. Using LZMA instead of gzip
|
a single 700 MiB ISO-9660 image. Using LZMA instead of gzip helped a
|
||||||
helped a lot. Roughly speaking, one could fit data that took 1000 MiB
|
lot. Roughly speaking, one could fit data that took 1000 MiB in gzipped
|
||||||
in gzipped form into 700 MiB with LZMA. Naturally, the compression
|
form into 700 MiB with LZMA. Naturally compression ratio varied across
|
||||||
ratio varied across packages, but this was what we got on average.
|
packages, but this was what we got on average.
|
||||||
|
|
||||||
Slackware packages have traditionally had .tgz as the filename suffix,
|
Slackware packages have traditionally had .tgz as the filename suffix,
|
||||||
which is an abbreviation of .tar.gz. A logical naming for LZMA
|
which is an abbreviation of .tar.gz. A logical naming for LZMA
|
||||||
compressed packages was .tlz, being an abbreviation of .tar.lzma.
|
compressed packages was .tlz, being an abbreviation of .tar.lzma.
|
||||||
|
|
||||||
At the end of the year 2007, there was no distribution under the
|
At the end of the year 2007, there's no distribution under the Tukaani
|
||||||
Tukaani project anymore, but development of LZMA Utils was kept going.
|
project anymore. Development of LZMA Utils still continues. Still,
|
||||||
Still, there were .tlz packages around, because at least Vector Linux
|
there are .tlz packages around, because at least Vector Linux (a
|
||||||
(a Slackware based distribution) used LZMA for its packages.
|
Slackware based distribution) uses LZMA for its packages.
|
||||||
|
|
||||||
First versions of the modified pkgtools used the LZMA_Alone tool from
|
First versions of the modified pkgtools used the LZMA_Alone tool from
|
||||||
Igor Pavlov's LZMA SDK as is. It was fine, because users wouldn't need
|
Igor Pavlov's LZMA SDK as is. It was fine, because users wouldn't need
|
||||||
@ -30,13 +30,13 @@ Tukaani distribution
|
|||||||
First steps of LZMA Utils
|
First steps of LZMA Utils
|
||||||
|
|
||||||
The first version of LZMA Utils (4.22.0) included a shell script called
|
The first version of LZMA Utils (4.22.0) included a shell script called
|
||||||
lzmash. It was a wrapper that had a gzip-like command-line interface. It
|
lzmash. It was wrapper that had gzip-like command line interface. It
|
||||||
used the LZMA_Alone tool from LZMA SDK to do all the real work. zgrep,
|
used the LZMA_Alone tool from LZMA SDK to do all the real work. zgrep,
|
||||||
zdiff, and related scripts from gzip were adapted to work with LZMA and
|
zdiff, and related scripts from gzip were adapted work with LZMA and
|
||||||
were part of the first LZMA Utils release too.
|
were part of the first LZMA Utils release too.
|
||||||
|
|
||||||
LZMA Utils 4.22.0 included also lzmadec, which was a small (less than
|
LZMA Utils 4.22.0 included also lzmadec, which was a small (less than
|
||||||
10 KiB) decoder-only command-line tool. It was written on top of the
|
10 KiB) decoder-only command line tool. It was written on top of the
|
||||||
decoder-only C code found from the LZMA SDK. lzmadec was convenient in
|
decoder-only C code found from the LZMA SDK. lzmadec was convenient in
|
||||||
situations where LZMA_Alone (a few hundred KiB) would be too big.
|
situations where LZMA_Alone (a few hundred KiB) would be too big.
|
||||||
|
|
||||||
@ -48,103 +48,93 @@ Second generation
|
|||||||
The lzmash script was an ugly and not very secure hack. The last
|
The lzmash script was an ugly and not very secure hack. The last
|
||||||
version of LZMA Utils to use lzmash was 4.27.1.
|
version of LZMA Utils to use lzmash was 4.27.1.
|
||||||
|
|
||||||
LZMA Utils 4.32.0beta1 introduced a new lzma command-line tool written
|
LZMA Utils 4.32.0beta1 introduced a new lzma command line tool written
|
||||||
by Ville Koskinen. It was written in C++, and used the encoder and
|
by Ville Koskinen. It was written in C++, and used the encoder and
|
||||||
decoder from C++ LZMA SDK with some little modifications. This tool
|
decoder from C++ LZMA SDK with little modifications. This tool replaced
|
||||||
replaced both the lzmash script and the LZMA_Alone command-line tool
|
both the lzmash script and the LZMA_Alone command line tool in LZMA
|
||||||
in LZMA Utils.
|
Utils.
|
||||||
|
|
||||||
Introducing this new tool caused some temporary incompatibilities,
|
Introducing this new tool caused some temporary incompatibilities,
|
||||||
because the LZMA_Alone executable was simply named lzma like the new
|
because LZMA_Alone executable was simply named lzma like the new
|
||||||
command-line tool, but they had a completely different command-line
|
command line tool, but they had completely different command line
|
||||||
interface. The file format was still the same.
|
interface. The file format was still the same.
|
||||||
|
|
||||||
Lasse wrote liblzmadec, which was a small decoder-only library based
|
Lasse wrote liblzmadec, which was a small decoder-only library based on
|
||||||
on the C code found from LZMA SDK. liblzmadec had an API similar to
|
the C code found from LZMA SDK. liblzmadec had API similar to zlib,
|
||||||
zlib, although there were some significant differences, which made it
|
although there were some significant differences, which made it
|
||||||
non-trivial to use it in some applications designed for zlib and
|
non-trivial to use it in some applications designed for zlib and
|
||||||
libbzip2.
|
libbzip2.
|
||||||
|
|
||||||
The lzmadec command-line tool was converted to use liblzmadec.
|
The lzmadec command line tool was converted to use liblzmadec.
|
||||||
|
|
||||||
Alexandre Sauvé helped converting the build system to use GNU
|
Alexandre Sauvé helped converting build system to use GNU Autotools.
|
||||||
Autotools. This made it easier to test for certain less portable
|
This made is easier to test for certain less portable features needed
|
||||||
features needed by the new command-line tool.
|
by the new command line tool.
|
||||||
|
|
||||||
Since the new command-line tool never got completely finished (for
|
Since the new command line tool never got completely finished (for
|
||||||
example, it didn't support the LZMA_OPT environment variable), the
|
example, it didn't support LZMA_OPT environment variable), the intent
|
||||||
intent was to not call 4.32.x stable. Similarly, liblzmadec wasn't
|
was to not call 4.32.x stable. Similarly, liblzmadec wasn't polished,
|
||||||
polished, but appeared to work well enough, so some people started
|
but appeared to work well enough, so some people started using it too.
|
||||||
using it too.
|
|
||||||
|
|
||||||
Because the development of the third generation of LZMA Utils was
|
Because the development of the third generation of LZMA Utils was
|
||||||
delayed considerably (3-4 years), the 4.32.x branch had to be kept
|
delayed considerably (roughly two years), the 4.32.x branch had to be
|
||||||
maintained. It got some bug fixes now and then, and finally it was
|
kept maintained. It got some bug fixes now and then, and finally it was
|
||||||
decided to call it stable, although most of the missing features were
|
decided to call it stable, although most of the missing features were
|
||||||
never added.
|
never added.
|
||||||
|
|
||||||
|
|
||||||
File format problems
|
File format problems
|
||||||
|
|
||||||
The file format used by LZMA_Alone was primitive. It was designed with
|
The file format used by LZMA_Alone was primitive. It was designed for
|
||||||
embedded systems in mind, and thus provided only a minimal set of
|
embedded systems in mind, and thus provided only minimal set of
|
||||||
features. The two biggest problems for non-embedded use were the lack
|
features. The two biggest problems for non-embedded use were lack of
|
||||||
of magic bytes and an integrity check.
|
magic bytes and integrity check.
|
||||||
|
|
||||||
Igor and Lasse started developing a new file format with some help
|
Igor and Lasse started developing a new file format with some help from
|
||||||
from Ville Koskinen. Also Mark Adler, Mikko Pouru, H. Peter Anvin,
|
Ville Koskinen, Mark Adler and Mikko Pouru. Designing the new format
|
||||||
and Lars Wirzenius helped with some minor things at some point of the
|
took quite a long time. It was mostly because Lasse was quite slow at
|
||||||
development. Designing the new format took quite a long time (actually,
|
getting things done due to personal reasons.
|
||||||
too long a time would be a more appropriate expression). It was mostly
|
|
||||||
because Lasse was quite slow at getting things done due to personal
|
|
||||||
reasons.
|
|
||||||
|
|
||||||
Originally the new format was supposed to use the same .lzma suffix
|
Near the end of the year 2007 the new format was practically finished.
|
||||||
that was already used by the old file format. Switching to the new
|
Compared to LZMA_Alone format and the .gz format used by gzip, the new
|
||||||
format wouldn't have caused much trouble when the old format wasn't
|
.lzma format is quite complex as a whole. This means that tools having
|
||||||
used by many people. But since the development of the new format took
|
*full* support for the new format would be larger and more complex than
|
||||||
such a long time, the old format got quite popular, and it was decided
|
the tools supporting only the old LZMA_Alone format.
|
||||||
that the new file format must use a different suffix.
|
|
||||||
|
|
||||||
It was decided to use .xz as the suffix of the new file format. The
|
For the situations where the full support for the .lzma format wouldn't
|
||||||
first stable .xz file format specification was finally released in
|
be required (embedded systems, operating system kernels), the new
|
||||||
December 2008. In addition to fixing the most obvious problems of
|
format has a well-defined subset, which is easy to support with small
|
||||||
the old .lzma format, the .xz format added some new features like
|
amount of code. It wouldn't be as small as an implementation using the
|
||||||
support for multiple filters (compression algorithms), filter chaining
|
LZMA_Alone format, but the difference shouldn't be significant.
|
||||||
(like piping on the command line), and limited random-access reading.
|
|
||||||
|
|
||||||
Currently the primary compression algorithm used in .xz is LZMA2.
|
The new .lzma format allows dividing the data in multiple independent
|
||||||
It is an extension on top of the original LZMA to fix some practical
|
blocks, which can be compressed and uncompressed independenly. This
|
||||||
problems: LZMA2 adds support for flushing the encoder, uncompressed
|
makes multi-threading possible with algorithms that aren't inherently
|
||||||
chunks, eases stateful decoder implementations, and improves support
|
parallel (such as LZMA). There's also a central index of the sizes of
|
||||||
for multithreading. Since LZMA2 is better than the original LZMA, the
|
the blocks, which makes it possible to do limited random-access reading
|
||||||
original LZMA is not supported in .xz.
|
with granularity of the block size.
|
||||||
|
|
||||||
|
The new .lzma format uses the same filename suffix that was used for
|
||||||
|
LZMA_Alone files. The advantage is that users using the new tools won't
|
||||||
|
notice the change to the new format. The disadvantage is that the old
|
||||||
|
tools won't work with the new files.
|
||||||
|
|
||||||
|
|
||||||
Transition to XZ Utils
|
Third generation
|
||||||
|
|
||||||
The early versions of XZ Utils were called LZMA Utils. The first
|
LZMA Utils 4.42.0alphas drop the rest of the C++ LZMA SDK. The LZMA and
|
||||||
releases were 4.42.0alphas. They dropped the rest of the C++ LZMA SDK.
|
other included filters (algorithm implementations) are still directly
|
||||||
The code was still directly based on LZMA SDK but ported to C and
|
based on LZMA SDK, but ported to C.
|
||||||
converted from a callback API to a stateful API. Later, Igor Pavlov
|
|
||||||
made a C version of the LZMA encoder too; these ports from C++ to C
|
|
||||||
were independent in LZMA SDK and LZMA Utils.
|
|
||||||
|
|
||||||
The core of the new LZMA Utils was liblzma, a compression library with
|
liblzma is now the core of LZMA Utils. It has zlib-like API, which
|
||||||
a zlib-like API. liblzma supported both the old and new file format.
|
doesn't suffer from the problems of the API of liblzmadec. liblzma
|
||||||
The gzip-like lzma command-line tool was rewritten to use liblzma.
|
supports not only LZMA, but several other filters, which together
|
||||||
|
can improve compression ratio even further with certain file types.
|
||||||
|
|
||||||
The new LZMA Utils code base was renamed to XZ Utils when the name
|
The lzma and lzmadec command line tools have been rewritten. They uses
|
||||||
of the new file format had been decided. The liblzma compression
|
liblzma to do the actual compressing or uncompressing.
|
||||||
library retained its name though, because changing it would have
|
|
||||||
caused unnecessary breakage in applications already using the early
|
|
||||||
liblzma snapshots.
|
|
||||||
|
|
||||||
The xz command-line tool can emulate the gzip-like lzma tool by
|
The development of LZMA Utils 4.42.x is still in alpha stage. Several
|
||||||
creating appropriate symlinks (e.g. lzma -> xz). Thus, practically
|
features are still missing or don't fully work yet. Documentation is
|
||||||
all scripts using the lzma tool from LZMA Utils will work as is with
|
also very minimal.
|
||||||
XZ Utils (and will keep using the old .lzma format). Still, the .lzma
|
|
||||||
format is more or less deprecated. XZ Utils will keep supporting it,
|
|
||||||
but new applications should use the .xz format, and migrating old
|
|
||||||
applications to .xz is often a good idea too.
|
|
||||||
|
|
||||||
|
|||||||
324
doc/liblzma-advanced.txt
Normal file
324
doc/liblzma-advanced.txt
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
|
||||||
|
Advanced features of liblzma
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
0. Introduction
|
||||||
|
|
||||||
|
Most developers need only the basic features of liblzma. These
|
||||||
|
features allow single-threaded encoding and decoding of .lzma files
|
||||||
|
in streamed mode.
|
||||||
|
|
||||||
|
In some cases developers want more. The .lzma file format is
|
||||||
|
designed to allow multi-threaded encoding and decoding and limited
|
||||||
|
random-access reading. These features are possible in non-streamed
|
||||||
|
mode and limitedly also in streamed mode.
|
||||||
|
|
||||||
|
To take advange of these features, the application needs a custom
|
||||||
|
.lzma file format handler. liblzma provides a set of tools to ease
|
||||||
|
this task, but it's still quite a bit of work to get a good custom
|
||||||
|
.lzma handler done.
|
||||||
|
|
||||||
|
|
||||||
|
1. Where to begin
|
||||||
|
|
||||||
|
Start by reading the .lzma file format specification. Understanding
|
||||||
|
the basics of the .lzma file structure is required to implement a
|
||||||
|
custom .lzma file handler and to understand the rest of this document.
|
||||||
|
|
||||||
|
|
||||||
|
2. The basic components
|
||||||
|
|
||||||
|
2.1. Stream Header and tail
|
||||||
|
|
||||||
|
Stream Header begins the .lzma Stream and Stream tail ends it. Stream
|
||||||
|
Header is defined in the file format specification, but Stream tail
|
||||||
|
isn't (thus I write "tail" with a lower-case letter). Stream tail is
|
||||||
|
simply the Stream Flags and the Footer Magic Bytes fields together.
|
||||||
|
It was done this way in liblzma, because the Block coders take care
|
||||||
|
of the rest of the stuff in the Stream Footer.
|
||||||
|
|
||||||
|
For now, the size of Stream Header is fixed to 11 bytes. The header
|
||||||
|
<lzma/stream_flags.h> defines LZMA_STREAM_HEADER_SIZE, which you
|
||||||
|
should use instead of a hardcoded number. Similarly, Stream tail
|
||||||
|
is fixed to 3 bytes, and there is a constant LZMA_STREAM_TAIL_SIZE.
|
||||||
|
|
||||||
|
It is possible, that a future version of the .lzma format will have
|
||||||
|
variable-sized Stream Header and tail. As of writing, this seems so
|
||||||
|
unlikely though, that it was considered simplest to just use a
|
||||||
|
constant instead of providing a functions to get and store the sizes
|
||||||
|
of the Stream Header and tail.
|
||||||
|
|
||||||
|
|
||||||
|
2.x. Stream tail
|
||||||
|
|
||||||
|
For now, the size of Stream tail is fixed to 3 bytes. The header
|
||||||
|
<lzma/stream_flags.h> defines LZMA_STREAM_TAIL_SIZE, which you
|
||||||
|
should use instead of a hardcoded number.
|
||||||
|
|
||||||
|
|
||||||
|
3. Keeping track of size information
|
||||||
|
|
||||||
|
The lzma_info_* functions found from <lzma/info.h> should ease the
|
||||||
|
task of keeping track of sizes of the Blocks and also the Stream
|
||||||
|
as a whole. Using these functions is strongly recommended, because
|
||||||
|
there are surprisingly many situations where an error can occur,
|
||||||
|
and these functions check for possible errors every time some new
|
||||||
|
information becomes available.
|
||||||
|
|
||||||
|
If you find lzma_info_* functions lacking something that you would
|
||||||
|
find useful, please contact the author.
|
||||||
|
|
||||||
|
|
||||||
|
3.1. Start offset of the Stream
|
||||||
|
|
||||||
|
If you are storing the .lzma Stream inside anothe file format, or
|
||||||
|
for some other reason are placing the .lzma Stream to somewhere
|
||||||
|
else than to the beginning of the file, you should tell the starting
|
||||||
|
offset of the Stream using lzma_info_start_offset_set().
|
||||||
|
|
||||||
|
The start offset of the Stream is used for two distinct purporses.
|
||||||
|
First, knowing the start offset of the Stream allows
|
||||||
|
lzma_info_alignment_get() to correctly calculate the alignment of
|
||||||
|
every Block. This information is given to the Block encoder, which
|
||||||
|
will calculate the size of Header Padding so that Compressed Data
|
||||||
|
is alignment at an optimal offset.
|
||||||
|
|
||||||
|
Another use for start offset of the Stream is in random-access
|
||||||
|
reading. If you set the start offset of the Stream, lzma_info_locate()
|
||||||
|
will be able to calculate the offset relative to the beginning of the
|
||||||
|
file containing the Stream (instead of offset relative to the
|
||||||
|
beginning of the Stream).
|
||||||
|
|
||||||
|
|
||||||
|
3.2. Size of Stream Header
|
||||||
|
|
||||||
|
While the size of Stream Header is constant (11 bytes) in the current
|
||||||
|
version of the .lzma file format, this may change in future.
|
||||||
|
|
||||||
|
|
||||||
|
3.3. Size of Header Metadata Block
|
||||||
|
|
||||||
|
This information is needed when doing random-access reading, and
|
||||||
|
to verify the value of this field stored in Footer Metadata Block.
|
||||||
|
|
||||||
|
|
||||||
|
3.4. Total Size of the Data Blocks
|
||||||
|
|
||||||
|
|
||||||
|
3.5. Uncompressed Size of Data Blocks
|
||||||
|
|
||||||
|
|
||||||
|
3.6. Index
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
x. Alignment
|
||||||
|
|
||||||
|
There are a few slightly different types of alignment issues when
|
||||||
|
working with .lzma files.
|
||||||
|
|
||||||
|
The .lzma format doesn't strictly require any kind of alignment.
|
||||||
|
However, if the encoder carefully optimizes the alignment in all
|
||||||
|
situations, it can improve compression ratio, speed of the encoder
|
||||||
|
and decoder, and slightly help if the files get damaged and need
|
||||||
|
recovery.
|
||||||
|
|
||||||
|
Alignment has the most significant effect compression ratio FIXME
|
||||||
|
|
||||||
|
|
||||||
|
x.1. Compression ratio
|
||||||
|
|
||||||
|
Some filters take advantage of the alignment of the input data.
|
||||||
|
To get the best compression ratio, make sure that you feed these
|
||||||
|
filters correctly aligned data.
|
||||||
|
|
||||||
|
Some filters (e.g. LZMA) don't necessarily mind too much if the
|
||||||
|
input doesn't match the preferred alignment. With these filters
|
||||||
|
the penalty in compression ratio depends on the specific type of
|
||||||
|
data being compressed.
|
||||||
|
|
||||||
|
Other filters (e.g. PowerPC executable filter) won't work at all
|
||||||
|
with data that is improperly aligned. While the data can still
|
||||||
|
be de-filtered back to its original form, the benefit of the
|
||||||
|
filtering (better compression ratio) is completely lost, because
|
||||||
|
these filters expect certain patterns at properly aligned offsets.
|
||||||
|
The compression ratio may even worse with incorrectly aligned input
|
||||||
|
than without the filter.
|
||||||
|
|
||||||
|
|
||||||
|
x.1.1. Inter-filter alignment
|
||||||
|
|
||||||
|
When there are multiple filters chained, checking the alignment can
|
||||||
|
be useful not only with the input of the first filter and output of
|
||||||
|
the last filter, but also between the filters.
|
||||||
|
|
||||||
|
Inter-filter alignment important especially with the Subblock filter.
|
||||||
|
|
||||||
|
|
||||||
|
x.1.2. Further compression with external tools
|
||||||
|
|
||||||
|
This is relatively rare situation in practice, but still worth
|
||||||
|
understanding.
|
||||||
|
|
||||||
|
Let's say that there are several SPARC executables, which are each
|
||||||
|
filtered to separate .lzma files using only the SPARC filter. If
|
||||||
|
Uncompressed Size is written to the Block Header, the size of Block
|
||||||
|
Header may vary between the .lzma files. If no Padding is used in
|
||||||
|
the Block Header to correct the alignment, the starting offset of
|
||||||
|
the Compressed Data field will be differently aligned in different
|
||||||
|
.lzma files.
|
||||||
|
|
||||||
|
All these .lzma files are archived into a single .tar archive. Due
|
||||||
|
to nature of the .tar format, every file is aligned inside the
|
||||||
|
archive to an offset that is a multiple of 512 bytes.
|
||||||
|
|
||||||
|
The .tar archive is compressed into a new .lzma file using the LZMA
|
||||||
|
filter with options, that prefer input alignment of four bytes. Now
|
||||||
|
if the independent .lzma files don't have the same alignment of
|
||||||
|
the Compressed Data fields, the LZMA filter will be unable to take
|
||||||
|
advantage of the input alignment between the files in the .tar
|
||||||
|
archive, which reduces compression ratio.
|
||||||
|
|
||||||
|
Thus, even if you have only single Block per file, it can be good for
|
||||||
|
compression ratio to align the Compressed Data to optimal offset.
|
||||||
|
|
||||||
|
|
||||||
|
x.2. Speed
|
||||||
|
|
||||||
|
Most modern computers are faster when multi-byte data is located
|
||||||
|
at aligned offsets in RAM. Proper alignment of the Compressed Data
|
||||||
|
fields can slightly increase the speed of some filters.
|
||||||
|
|
||||||
|
|
||||||
|
x.3. Recovery
|
||||||
|
|
||||||
|
Aligning every Block Header to start at an offset with big enough
|
||||||
|
alignment may ease or at least speed up recovery of broken files.
|
||||||
|
|
||||||
|
|
||||||
|
y. Typical usage cases
|
||||||
|
|
||||||
|
y.x. Parsing the Stream backwards
|
||||||
|
|
||||||
|
You may need to parse the Stream backwards if you need to get
|
||||||
|
information such as the sizes of the Stream, Index, or Extra.
|
||||||
|
The basic procedure to do this follows.
|
||||||
|
|
||||||
|
Locate the end of the Stream. If the Stream is stored as is in a
|
||||||
|
standalone .lzma file, simply seek to the end of the file and start
|
||||||
|
reading backwards using appropriate buffer size. The file format
|
||||||
|
specification allows arbitrary amount of Footer Padding (zero or more
|
||||||
|
NUL bytes), which you skip before trying to decode the Stream tail.
|
||||||
|
|
||||||
|
Once you have located the end of the Stream (a non-NULL byte), make
|
||||||
|
sure you have at least the last LZMA_STREAM_TAIL_SIZE bytes of the
|
||||||
|
Stream in a buffer. If there isn't enough bytes left from the file,
|
||||||
|
the file is too small to contain a valid Stream. Decode the Stream
|
||||||
|
tail using lzma_stream_tail_decoder(). Store the offset of the first
|
||||||
|
byte of the Stream tail; you will need it later.
|
||||||
|
|
||||||
|
You may now want to do some internal verifications e.g. if the Check
|
||||||
|
type is supported by the liblzma build you are using.
|
||||||
|
|
||||||
|
Decode the Backward Size field with lzma_vli_reverse_decode(). The
|
||||||
|
field is at maximum of LZMA_VLI_BYTES_MAX bytes long. Check that
|
||||||
|
Backward Size is not zero. Store the offset of the first byte of
|
||||||
|
the Backward Size; you will need it later.
|
||||||
|
|
||||||
|
Now you know the Total Size of the last Block of the Stream. It's the
|
||||||
|
value of Backward Size plus the size of the Backward Size field. Note
|
||||||
|
that you cannot use lzma_vli_size() to calculate the size since there
|
||||||
|
might be padding; you need to use the real observed size of the
|
||||||
|
Backward Size field.
|
||||||
|
|
||||||
|
At this point, the operation continues differently for Single-Block
|
||||||
|
and Multi-Block Streams.
|
||||||
|
|
||||||
|
|
||||||
|
y.x.1. Single-Block Stream
|
||||||
|
|
||||||
|
There might be Uncompressed Size field present in the Stream Footer.
|
||||||
|
You cannot know it for sure unless you have already parsed the Block
|
||||||
|
Header earlier. For security reasons, you probably want to try to
|
||||||
|
decode the Uncompressed Size field, but you must not indicate any
|
||||||
|
error if decoding fails. Later you can give the decoded Uncompressed
|
||||||
|
Size to Block decoder if Uncopmressed Size isn't otherwise known;
|
||||||
|
this prevents it from producing too much output in case of (possibly
|
||||||
|
intentionally) corrupt file.
|
||||||
|
|
||||||
|
Calculate the start offset of the Stream:
|
||||||
|
|
||||||
|
backward_offset - backward_size - LZMA_STREAM_HEADER_SIZE
|
||||||
|
|
||||||
|
backward_offset is the offset of the first byte of the Backward Size
|
||||||
|
field. Remember to check for integer overflows, which can occur with
|
||||||
|
invalid input files.
|
||||||
|
|
||||||
|
Seek to the beginning of the Stream. Decode the Stream Header using
|
||||||
|
lzma_stream_header_decoder(). Verify that the decoded Stream Flags
|
||||||
|
match the values found from Stream tail. You can use the
|
||||||
|
lzma_stream_flags_is_equal() macro for this.
|
||||||
|
|
||||||
|
Decode the Block Header. Verify that it isn't a Metadata Block, since
|
||||||
|
Single-Block Streams cannot have Metadata. If Uncompressed Size is
|
||||||
|
present in the Block Header, the value you tried to decode from the
|
||||||
|
Stream Footer must be ignored, since Uncompressed Size wasn't actually
|
||||||
|
present there. If Block Header doesn't have Uncompressed Size, and
|
||||||
|
decoding the Uncompressed Size field from the Stream Footer failed,
|
||||||
|
the file is corrupt.
|
||||||
|
|
||||||
|
If you were only looking for the Uncompressed Size of the Stream,
|
||||||
|
you now got that information, and you can stop processing the Stream.
|
||||||
|
|
||||||
|
To decode the Block, the same instructions apply as described in
|
||||||
|
FIXME. However, because you have some extra known information decoded
|
||||||
|
from the Stream Footer, you should give this information to the Block
|
||||||
|
decoder so that it can verify it while decoding:
|
||||||
|
- If Uncompressed Size is not present in the Block Header, set
|
||||||
|
lzma_options_block.uncompressed_size to the value you decoded
|
||||||
|
from the Stream Footer.
|
||||||
|
- Always set lzma_options_block.total_size to backward_size +
|
||||||
|
size_of_backward_size (you calculated this sum earlier already).
|
||||||
|
|
||||||
|
|
||||||
|
y.x.2. Multi-Block Stream
|
||||||
|
|
||||||
|
Calculate the start offset of the Footer Metadata Block:
|
||||||
|
|
||||||
|
backward_offset - backward_size
|
||||||
|
|
||||||
|
backward_offset is the offset of the first byte of the Backward Size
|
||||||
|
field. Remember to check for integer overflows, which can occur with
|
||||||
|
broken input files.
|
||||||
|
|
||||||
|
Decode the Block Header. Verify that it is a Metadata Block. Set
|
||||||
|
lzma_options_block.total_size to backward_size + size_of_backward_size
|
||||||
|
(you calculated this sum earlier already). Then decode the Footer
|
||||||
|
Metadata Block.
|
||||||
|
|
||||||
|
Store the decoded Footer Metadata to lzma_info structure using
|
||||||
|
lzma_info_set_metadata(). Set also the offset of the Backward Size
|
||||||
|
field using lzma_info_size_set(). Then you can get the start offset
|
||||||
|
of the Stream using lzma_info_size_get(). Note that any of these steps
|
||||||
|
may fail so don't omit error checking.
|
||||||
|
|
||||||
|
Seek to the beginning of the Stream. Decode the Stream Header using
|
||||||
|
lzma_stream_header_decoder(). Verify that the decoded Stream Flags
|
||||||
|
match the values found from Stream tail. You can use the
|
||||||
|
lzma_stream_flags_is_equal() macro for this.
|
||||||
|
|
||||||
|
If you were only looking for the Uncompressed Size of the Stream,
|
||||||
|
it's possible that you already have it now. If Uncompressed Size (or
|
||||||
|
whatever information you were looking for) isn't available yet,
|
||||||
|
continue by decoding also the Header Metadata Block. (If some
|
||||||
|
information is missing, the Header Metadata Block has to be present.)
|
||||||
|
|
||||||
|
Decoding the Data Blocks goes the same way as described in FIXME.
|
||||||
|
|
||||||
|
|
||||||
|
y.x.3. Variations
|
||||||
|
|
||||||
|
If you know the offset of the beginning of the Stream, you may want
|
||||||
|
to parse the Stream Header before parsing the Stream tail.
|
||||||
|
|
||||||
112
doc/liblzma-hacking.txt
Normal file
112
doc/liblzma-hacking.txt
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
|
||||||
|
Hacking liblzma
|
||||||
|
---------------
|
||||||
|
|
||||||
|
0. Preface
|
||||||
|
|
||||||
|
This document gives some overall information about the internals of
|
||||||
|
liblzma, which should make it easier to start reading and modifying
|
||||||
|
the code.
|
||||||
|
|
||||||
|
|
||||||
|
1. Programming language
|
||||||
|
|
||||||
|
liblzma was written in C99. If you use GCC, this means that you need
|
||||||
|
at least GCC 3.x.x. GCC 2 isn't and won't be supported.
|
||||||
|
|
||||||
|
Some GCC-specific extensions are used *conditionally*. They aren't
|
||||||
|
required to build a full-featured library. Don't make the code rely
|
||||||
|
on any non-standard compiler extensions or even C99 features that
|
||||||
|
aren't portable between almost-C99 compatible compilers (for example
|
||||||
|
non-static inlines).
|
||||||
|
|
||||||
|
The public API headers are in C89. This is to avoid frustrating those
|
||||||
|
who maintain programs, which are strictly in C89 or C++.
|
||||||
|
|
||||||
|
An assumption about sizeof(size_t) is made. If this assumption is
|
||||||
|
wrong, some porting is probably needed:
|
||||||
|
|
||||||
|
sizeof(uint32_t) <= sizeof(size_t) <= sizeof(uint64_t)
|
||||||
|
|
||||||
|
|
||||||
|
2. Internal vs. external API
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Input Output
|
||||||
|
v Application ^
|
||||||
|
| liblzma public API |
|
||||||
|
| Stream coder |
|
||||||
|
| Block coder |
|
||||||
|
| Filter coder |
|
||||||
|
| ... |
|
||||||
|
v Filter coder ^
|
||||||
|
|
||||||
|
|
||||||
|
Application
|
||||||
|
`-- liblzma public API
|
||||||
|
`-- Stream coder
|
||||||
|
|-- Stream info handler
|
||||||
|
|-- Stream Header coder
|
||||||
|
|-- Block Header coder
|
||||||
|
| `-- Filter Flags coder
|
||||||
|
|-- Metadata coder
|
||||||
|
| `-- Block coder
|
||||||
|
| `-- Filter 0
|
||||||
|
| `-- Filter 1
|
||||||
|
| ...
|
||||||
|
|-- Data Block coder
|
||||||
|
| `-- Filter 0
|
||||||
|
| `-- Filter 1
|
||||||
|
| ...
|
||||||
|
`-- Stream tail coder
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
x. Designing new filters
|
||||||
|
|
||||||
|
All filters must be designed so that the decoder cannot consume
|
||||||
|
arbitrary amount input without producing any decoded output. Failing
|
||||||
|
to follow this rule makes liblzma vulnerable to DoS attacks if
|
||||||
|
untrusted files are decoded (usually they are untrusted).
|
||||||
|
|
||||||
|
An example should clarify the reason behind this requirement: There
|
||||||
|
are two filters in the chain. The decoder of the first filter produces
|
||||||
|
huge amount of output (many gigabytes or more) with a few bytes of
|
||||||
|
input, which gets passed to the decoder of the second filter. If the
|
||||||
|
data passed to the second filter is interpreted as something that
|
||||||
|
produces no output (e.g. padding), the filter chain as a whole
|
||||||
|
produces no output and consumes no input for a long period of time.
|
||||||
|
|
||||||
|
The above problem was present in the first versions of the Subblock
|
||||||
|
filter. A tiny .lzma file could have taken several years to decode
|
||||||
|
while it wouldn't produce any output at all. The problem was fixed
|
||||||
|
by adding limits for number of consecutive Padding bytes, and requiring
|
||||||
|
that some decoded output must be produced between Set Subfilter and
|
||||||
|
Unset Subfilter.
|
||||||
|
|
||||||
|
|
||||||
|
x. Implementing new filters
|
||||||
|
|
||||||
|
If the filter supports embedding End of Payload Marker, make sure that
|
||||||
|
when your filter detects End of Payload Marker,
|
||||||
|
- the usage of End of Payload Marker is actually allowed (i.e. End
|
||||||
|
of Input isn't used); and
|
||||||
|
- it also checks that there is no more input coming from the next
|
||||||
|
filter in the chain.
|
||||||
|
|
||||||
|
The second requirement is slightly tricky. It's possible that the next
|
||||||
|
filter hasn't returned LZMA_STREAM_END yet. It may even need a few
|
||||||
|
bytes more input before it will do so. You need to give it as much
|
||||||
|
input as it needs, and verify that it doesn't produce any output.
|
||||||
|
|
||||||
|
Don't call the next filter in the chain after it has returned
|
||||||
|
LZMA_STREAM_END (except in encoder if action == LZMA_SYNC_FLUSH).
|
||||||
|
It will result undefined behavior.
|
||||||
|
|
||||||
|
Be pedantic. If the input data isn't exactly valid, reject it.
|
||||||
|
|
||||||
|
At the moment, liblzma isn't modular. You will need to edit several
|
||||||
|
files in src/liblzma/common to include support for a new filter. grep
|
||||||
|
for LZMA_FILTER_LZMA to locate the files needing changes.
|
||||||
|
|
||||||
194
doc/liblzma-intro.txt
Normal file
194
doc/liblzma-intro.txt
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
|
||||||
|
Introduction to liblzma
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Writing applications to work with liblzma
|
||||||
|
|
||||||
|
liblzma API is split in several subheaders to improve readability and
|
||||||
|
maintainance. The subheaders must not be #included directly. lzma.h
|
||||||
|
requires that certain integer types and macros are available when
|
||||||
|
the header is #included. On systems that have inttypes.h that conforms
|
||||||
|
to C99, the following will work:
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <lzma.h>
|
||||||
|
|
||||||
|
Those who have used zlib should find liblzma's API easy to use.
|
||||||
|
To developers who haven't used zlib before, I recommend learning
|
||||||
|
zlib first, because zlib has excellent documentation.
|
||||||
|
|
||||||
|
While the API is similar to that of zlib, there are some major
|
||||||
|
differences, which are summarized below.
|
||||||
|
|
||||||
|
For basic stream encoding, zlib has three functions (deflateInit(),
|
||||||
|
deflate(), and deflateEnd()). Similarly, there are three functions
|
||||||
|
for stream decoding (inflateInit(), inflate(), and inflateEnd()).
|
||||||
|
liblzma has only single coding and ending function. Thus, to
|
||||||
|
encode one may use, for example, lzma_stream_encoder_single(),
|
||||||
|
lzma_code(), and lzma_end(). Simlarly for decoding, one may
|
||||||
|
use lzma_auto_decoder(), lzma_code(), and lzma_end().
|
||||||
|
|
||||||
|
zlib has deflateReset() and inflateReset() to reset the stream
|
||||||
|
structure without reallocating all the memory. In liblzma, all
|
||||||
|
coder initialization functions are like zlib's reset functions:
|
||||||
|
the first-time initializations are done with the same functions
|
||||||
|
as the reinitializations (resetting).
|
||||||
|
|
||||||
|
To make all this work, liblzma needs to know when lzma_stream
|
||||||
|
doesn't already point to an allocated and initialized coder.
|
||||||
|
This is achieved by initializing lzma_stream structure with
|
||||||
|
LZMA_STREAM_INIT (static initialization) or LZMA_STREAM_INIT_VAR
|
||||||
|
(for exampple when new lzma_stream has been allocated with malloc()).
|
||||||
|
This initialization should be done exactly once per lzma_stream
|
||||||
|
structure to avoid leaking memory. Calling lzma_end() will leave
|
||||||
|
lzma_stream into a state comparable to the state achieved with
|
||||||
|
LZMA_STREAM_INIT and LZMA_STREAM_INIT_VAR.
|
||||||
|
|
||||||
|
Example probably clarifies a lot. With zlib, compression goes
|
||||||
|
roughly like this:
|
||||||
|
|
||||||
|
z_stream strm;
|
||||||
|
deflateInit(&strm, level);
|
||||||
|
deflate(&strm, Z_RUN);
|
||||||
|
deflate(&strm, Z_RUN);
|
||||||
|
...
|
||||||
|
deflate(&strm, Z_FINISH);
|
||||||
|
deflateEnd(&strm) or deflateReset(&strm)
|
||||||
|
|
||||||
|
With liblzma, it's slightly different:
|
||||||
|
|
||||||
|
lzma_stream strm = LZMA_STREAM_INIT;
|
||||||
|
lzma_stream_encoder_single(&strm, &options);
|
||||||
|
lzma_code(&strm, LZMA_RUN);
|
||||||
|
lzma_code(&strm, LZMA_RUN);
|
||||||
|
...
|
||||||
|
lzma_code(&strm, LZMA_FINISH);
|
||||||
|
lzma_end(&strm) or reinitialize for new coding work
|
||||||
|
|
||||||
|
Reinitialization in the last step can be any function that can
|
||||||
|
initialize lzma_stream; it doesn't need to be the same function
|
||||||
|
that was used for the previous initialization. If it is the same
|
||||||
|
function, liblzma will usually be able to re-use most of the
|
||||||
|
existing memory allocations (depends on how much the initialization
|
||||||
|
options change). If you reinitialize with different function,
|
||||||
|
liblzma will automatically free the memory of the previous coder.
|
||||||
|
|
||||||
|
|
||||||
|
File formats
|
||||||
|
|
||||||
|
liblzma supports multiple container formats for the compressed data.
|
||||||
|
Different initialization functions initialize the lzma_stream to
|
||||||
|
process different container formats. See the details from the public
|
||||||
|
header files.
|
||||||
|
|
||||||
|
The following functions are the most commonly used:
|
||||||
|
|
||||||
|
- lzma_stream_encoder_single(): Encodes Single-Block Stream; this
|
||||||
|
the recommended format for most purporses.
|
||||||
|
|
||||||
|
- lzma_alone_encoder(): Useful if you need to encode into the
|
||||||
|
legacy LZMA_Alone format.
|
||||||
|
|
||||||
|
- lzma_auto_decoder(): Decoder that automatically detects the
|
||||||
|
file format; recommended when you decode compressed files on
|
||||||
|
disk, because this way compatibility with the legacy LZMA_Alone
|
||||||
|
format is transparent.
|
||||||
|
|
||||||
|
- lzma_stream_decoder(): Decoder for Single- and Multi-Block
|
||||||
|
Streams; this is good if you want to accept only .lzma Streams.
|
||||||
|
|
||||||
|
|
||||||
|
Filters
|
||||||
|
|
||||||
|
liblzma supports multiple filters (algorithm implementations). The new
|
||||||
|
.lzma format supports filter-chain having up to seven filters. In the
|
||||||
|
filter chain, the output of one filter is input of the next filter in
|
||||||
|
the chain. The legacy LZMA_Alone format supports only one filter, and
|
||||||
|
that must always be LZMA.
|
||||||
|
|
||||||
|
General-purporse compression:
|
||||||
|
|
||||||
|
LZMA The main algorithm of liblzma (surprise!)
|
||||||
|
|
||||||
|
Branch/Call/Jump filters for executables:
|
||||||
|
|
||||||
|
x86 This filter is known as BCJ in 7-Zip
|
||||||
|
IA64 IA-64 (Itanium)
|
||||||
|
PowerPC Big endian PowerPC
|
||||||
|
ARM
|
||||||
|
ARM-Thumb
|
||||||
|
SPARC
|
||||||
|
|
||||||
|
Other filters:
|
||||||
|
|
||||||
|
Copy Dummy filter that simply copies all the data
|
||||||
|
from input to output.
|
||||||
|
|
||||||
|
Subblock Multi-purporse filter, that can
|
||||||
|
- embed End of Payload Marker if the previous
|
||||||
|
filter in the chain doesn't support it; and
|
||||||
|
- apply Subfilters, which filter only part
|
||||||
|
of the same compressed Block in the Stream.
|
||||||
|
|
||||||
|
Branch/Call/Jump filters never change the size of the data. They
|
||||||
|
should usually be used as a pre-filter for some compression filter
|
||||||
|
like LZMA.
|
||||||
|
|
||||||
|
|
||||||
|
Integrity checks
|
||||||
|
|
||||||
|
The .lzma Stream format uses CRC32 as the integrity check for
|
||||||
|
different file format headers. It is possible to omit CRC32 from
|
||||||
|
the Block Headers, but not from Stream Header. This is the reason
|
||||||
|
why CRC32 code cannot be disabled when building liblzma (in addition,
|
||||||
|
the LZMA encoder uses CRC32 for hashing, so that's another reason).
|
||||||
|
|
||||||
|
The integrity check of the actual data is calculated from the
|
||||||
|
uncompressed data. This check can be CRC32, CRC64, or SHA256.
|
||||||
|
It can also be omitted completely, although that usually is not
|
||||||
|
a good thing to do. There are free IDs left, so support for new
|
||||||
|
checks algorithms can be added later.
|
||||||
|
|
||||||
|
|
||||||
|
API and ABI stability
|
||||||
|
|
||||||
|
The API and ABI of liblzma isn't stable yet, although no huge
|
||||||
|
changes should happen. One potential place for change is the
|
||||||
|
lzma_options_subblock structure.
|
||||||
|
|
||||||
|
In the 4.42.0alpha phase, the shared library version number won't
|
||||||
|
be updated even if ABI breaks. I don't want to track the ABI changes
|
||||||
|
yet. Just rebuild everything when you upgrade liblzma until we get
|
||||||
|
to the beta stage.
|
||||||
|
|
||||||
|
|
||||||
|
Size of the library
|
||||||
|
|
||||||
|
While liblzma isn't huge, it is quite far from the smallest possible
|
||||||
|
LZMA implementation: full liblzma binary (with support for all
|
||||||
|
filters and other features) is way over 100 KiB, but the plain raw
|
||||||
|
LZMA decoder is only 5-10 KiB.
|
||||||
|
|
||||||
|
To decrease the size of the library, you can omit parts of the library
|
||||||
|
by passing certain options to the `configure' script. Disabling
|
||||||
|
everything but the decoders of the require filters will usually give
|
||||||
|
you a small enough library, but if you need a decoder for example
|
||||||
|
embedded in the operating system kernel, the code from liblzma probably
|
||||||
|
isn't suitable as is.
|
||||||
|
|
||||||
|
If you need a minimal implementation supporting .lzma Streams, you
|
||||||
|
may need to do partial rewrite. liblzma uses stateful API like zlib.
|
||||||
|
That increases the size of the library. Using callback API or even
|
||||||
|
simpler buffer-to-buffer API would allow smaller implementation.
|
||||||
|
|
||||||
|
LZMA SDK contains smaller LZMA decoder written in ANSI-C than
|
||||||
|
liblzma, so you may want to take a look at that code. However,
|
||||||
|
it doesn't (at least not yet) support the new .lzma Stream format.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
|
||||||
|
There's no other documentation than the public headers and this
|
||||||
|
text yet. Real docs will be written some day, I hope.
|
||||||
|
|
||||||
219
doc/liblzma-security.txt
Normal file
219
doc/liblzma-security.txt
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
|
||||||
|
Using liblzma securely
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
0. Introduction
|
||||||
|
|
||||||
|
This document discusses how to use liblzma securely. There are issues
|
||||||
|
that don't apply to zlib or libbzip2, so reading this document is
|
||||||
|
strongly recommended even for those who are very familiar with zlib
|
||||||
|
or libbzip2.
|
||||||
|
|
||||||
|
While making liblzma itself as secure as possible is essential, it's
|
||||||
|
out of scope of this document.
|
||||||
|
|
||||||
|
|
||||||
|
1. Memory usage
|
||||||
|
|
||||||
|
The memory usage of liblzma varies a lot.
|
||||||
|
|
||||||
|
|
||||||
|
1.1. Problem sources
|
||||||
|
|
||||||
|
1.1.1. Block coder
|
||||||
|
|
||||||
|
The memory requirements of Block encoder depend on the used filters
|
||||||
|
and their settings. The memory requirements of the Block decoder
|
||||||
|
depend on the which filters and with which filter settings the Block
|
||||||
|
was encoded. Usually the memory requirements of a decoder are equal
|
||||||
|
or less than the requirements of the encoder with the same settings.
|
||||||
|
|
||||||
|
While the typical memory requirements to decode a Block is from a few
|
||||||
|
hundred kilobytes to tens of megabytes, a maliciously constructed
|
||||||
|
files can require a lot more RAM to decode. With the current filters,
|
||||||
|
the maximum amount is about 7 GiB. If you use multi-threaded decoding,
|
||||||
|
every Block can require this amount of RAM, thus a four-threaded
|
||||||
|
decoder could suddenly try to allocate 28 GiB of RAM.
|
||||||
|
|
||||||
|
If you don't limit the maximum memory usage in any way, and there are
|
||||||
|
no resource limits set on the operating system side, one malicious
|
||||||
|
input file can run the system out of memory, or at least make it swap
|
||||||
|
badly for a long time. This is exceptionally bad on servers e.g.
|
||||||
|
email server doing virus scanning on incoming messages.
|
||||||
|
|
||||||
|
|
||||||
|
1.1.2. Metadata decoder
|
||||||
|
|
||||||
|
Multi-Block .lzma files contain at least one Metadata Block.
|
||||||
|
Externally the Metadata Blocks are similar to Data Blocks, so all
|
||||||
|
the issues mentioned about memory usage of Data Blocks applies to
|
||||||
|
Metadata Blocks too.
|
||||||
|
|
||||||
|
The uncompressed content of Metadata Blocks contain information about
|
||||||
|
the Stream as a whole, and optionally some Extra Records. The
|
||||||
|
information about the Stream is kept in liblzma's internal data
|
||||||
|
structures in RAM. Extra Records can contain arbitrary data. They are
|
||||||
|
not interpreted by liblzma, but liblzma will provide them to the
|
||||||
|
application in uninterpreted form if the application wishes so.
|
||||||
|
|
||||||
|
Usually the Uncompressed Size of a Metadata Block is small. Even on
|
||||||
|
extreme cases, it shouldn't be much bigger than a few megabytes. Once
|
||||||
|
the Metadata has been parsed into native data structures in liblzma,
|
||||||
|
it usually takes a little more memory than in the encoded form. For
|
||||||
|
all normal files, this is no problem, since the resulting memory usage
|
||||||
|
won't be too much.
|
||||||
|
|
||||||
|
The problem is that a maliciously constructed Metadata Block can
|
||||||
|
contain huge amount of "information", which liblzma will try to store
|
||||||
|
in its internal data structures. This may cause liblzma to allocate
|
||||||
|
all the available RAM unless some kind of resource usage limits are
|
||||||
|
applied.
|
||||||
|
|
||||||
|
Note that the Extra Records in Metadata are always parsed but, but
|
||||||
|
memory is allocated for them only if the application has requested
|
||||||
|
liblzma to provide the Extra Records to the application.
|
||||||
|
|
||||||
|
|
||||||
|
1.2. Solutions
|
||||||
|
|
||||||
|
If you need to decode files from untrusted sources (most people do),
|
||||||
|
you must limit the memory usage to avoid denial of service (DoS)
|
||||||
|
conditions caused by malicious input files.
|
||||||
|
|
||||||
|
The first step is to find out how much memory you are allowed consume
|
||||||
|
at maximum. This may be a hardcoded constant or derived from the
|
||||||
|
available RAM; whatever is appropriate in the application.
|
||||||
|
|
||||||
|
The simplest solution is to use setrlimit() if the kernel supports
|
||||||
|
RLIMIT_AS, which limits the memory usage of the whole process.
|
||||||
|
For more portable and fine-grained limiting, you can use
|
||||||
|
memory limiter functions found from <lzma/memlimit.h>.
|
||||||
|
|
||||||
|
|
||||||
|
1.2.1. Encoder
|
||||||
|
|
||||||
|
lzma_memory_usage() will give you a rough estimate about the memory
|
||||||
|
usage of the given filter chain. To dramatically simplify the internal
|
||||||
|
implementation, this function doesn't take into account all the small
|
||||||
|
helper data structures needed in various places; only the structures
|
||||||
|
with significant memory usage are taken into account. Still, the
|
||||||
|
accuracy of this function should be well within a mebibyte.
|
||||||
|
|
||||||
|
The Subblock filter is a special case. If a Subfilter has been
|
||||||
|
specified, it isn't taken into account when lzma_memory_usage()
|
||||||
|
calculates the memory usage. You need to calculate the memory usage
|
||||||
|
of the Subfilter separately.
|
||||||
|
|
||||||
|
Keeping track of Blocks in a Multi-Block Stream takes a few dozen
|
||||||
|
bytes of RAM per Block (size of the lzma_index structure plus overhead
|
||||||
|
of malloc()). It isn't a good idea to put tens of thousands of Blocks
|
||||||
|
into a Stream unless you have a very good reason to do so (compressed
|
||||||
|
dictionary could be an example of such situation).
|
||||||
|
|
||||||
|
Also keep the number and sizes of Extra Records sane. If you produce
|
||||||
|
the list of Extra Records automatically from some untrusted source,
|
||||||
|
you should not only validate the content of these Records, but also
|
||||||
|
their memory usage.
|
||||||
|
|
||||||
|
|
||||||
|
1.2.2. Decoder
|
||||||
|
|
||||||
|
A single-threaded decoder should simply use a memory limiter and
|
||||||
|
indicate an error if it runs out of memory.
|
||||||
|
|
||||||
|
Memory-limiting with multi-threaded decoding is tricky. The simple
|
||||||
|
solution is to divide the maximum allowed memory usage with the
|
||||||
|
maximum allowed threads, and give each Block decoder their own
|
||||||
|
independent lzma_memory_limiter. The drawback is that if one Block
|
||||||
|
needs notably more RAM than any other Block, the decoder will run out
|
||||||
|
of memory when in reality there would be plenty of free RAM.
|
||||||
|
|
||||||
|
An attractive alternative would be using shared lzma_memory_limiter.
|
||||||
|
Depending on the application and the expected type of input, this may
|
||||||
|
either be the best solution or a source of hard-to-repeat problems.
|
||||||
|
Consider the following requirements:
|
||||||
|
- You use a maximum of n threads.
|
||||||
|
- x(i) is the decoder memory requirements of the Block number i
|
||||||
|
in an expected input Stream.
|
||||||
|
- The memory limiter is set to higher value than the sum of n
|
||||||
|
highest values x(i).
|
||||||
|
|
||||||
|
(If you are better at explaining the above conditions, please
|
||||||
|
contribute your improved version.)
|
||||||
|
|
||||||
|
If the above conditions aren't met, it is possible that the decoding
|
||||||
|
will fail unpredictably. That is, on the same machine using the same
|
||||||
|
settings, the decoding may sometimes succeed and sometimes fail. This
|
||||||
|
is because sometimes threads may run so that the Blocks with highest
|
||||||
|
memory usage are tried to be decoded at the same time.
|
||||||
|
|
||||||
|
Most .lzma files have all the Blocks encoded with identical settings,
|
||||||
|
or at least the memory usage won't vary dramatically. That's why most
|
||||||
|
multi-threaded decoders probably want to use the simple "separate
|
||||||
|
lzma_memory_limiter for each thread" solution, possibly falling back
|
||||||
|
to single-threaded mode in case the per-thread memory limits aren't
|
||||||
|
enough in multi-threaded mode.
|
||||||
|
|
||||||
|
FIXME: Memory usage of Stream info.
|
||||||
|
|
||||||
|
[
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
2. Huge uncompressed output
|
||||||
|
|
||||||
|
2.1. Data Blocks
|
||||||
|
|
||||||
|
Decoding a tiny .lzma file can produce huge amount of uncompressed
|
||||||
|
output. There is an example file of 45 bytes, which decodes to 64 PiB
|
||||||
|
(that's 2^56 bytes). Uncompressing such a file to disk is likely to
|
||||||
|
fill even a bigger disk array. If the data is written to a pipe, it
|
||||||
|
may not fill the disk, but would still take very long time to finish.
|
||||||
|
|
||||||
|
To avoid denial of service conditions caused by huge amount of
|
||||||
|
uncompressed output, applications using liblzma should use some method
|
||||||
|
to limit the amount of output produced. The exact method depends on
|
||||||
|
the application.
|
||||||
|
|
||||||
|
All valid .lzma Streams make it possible to find out the uncompressed
|
||||||
|
size of the Stream without actually uncompressing the data. This
|
||||||
|
information is available in at least one of the Metadata Blocks.
|
||||||
|
Once the uncompressed size is parsed, the decoder can verify that
|
||||||
|
it doesn't exceed certain limits (e.g. available disk space).
|
||||||
|
|
||||||
|
When the uncompressed size is known, the decoder can actively keep
|
||||||
|
track of the amount of output produced so far, and that it doesn't
|
||||||
|
exceed the known uncompressed size. If it does exceed, the file is
|
||||||
|
known to be corrupt and an error should be indicated without
|
||||||
|
continuing to decode the rest of the file.
|
||||||
|
|
||||||
|
Unfortunately, finding the uncompressed size beforehand is often
|
||||||
|
possible only in non-streamed mode, because the needed information
|
||||||
|
could be in the Footer Metdata Block, which (obviously) is at the
|
||||||
|
end of the Stream. In purely streamed mode decoding, one may need to
|
||||||
|
use some rough arbitrary limits to prevent the problems described in
|
||||||
|
the beginning of this section.
|
||||||
|
|
||||||
|
|
||||||
|
2.2. Metadata
|
||||||
|
|
||||||
|
Metadata is stored in Metadata Blocks, which are very similar to
|
||||||
|
Data Blocks. Thus, the uncompressed size can be huge just like with
|
||||||
|
Data Blocks. The difference is, that the contents of Metadata Blocks
|
||||||
|
aren't given to the application as is, but parsed by liblzma. Still,
|
||||||
|
reading through a huge Metadata can take very long time, effectively
|
||||||
|
creating a denial of service like piping decoded a Data Block to
|
||||||
|
another process would do.
|
||||||
|
|
||||||
|
At first it would seem that using a memory limiter would prevent
|
||||||
|
this issue as a side effect. But it does so only if the application
|
||||||
|
requests liblzma to allocate the Extra Records and provide them to
|
||||||
|
the application. If Extra Records aren't requested, they aren't
|
||||||
|
allocated either. Still, the Extra Records are being read through
|
||||||
|
to validate that the Metadata is in proper format.
|
||||||
|
|
||||||
|
The solution is to limit the Uncompressed Size of a Metadata Block
|
||||||
|
to some relatively large value. This will make liblzma to give an
|
||||||
|
error when the given limit is reached.
|
||||||
|
|
||||||
@ -1,173 +0,0 @@
|
|||||||
|
|
||||||
The .lzma File Format
|
|
||||||
=====================
|
|
||||||
|
|
||||||
0. Preface
|
|
||||||
0.1. Notices and Acknowledgements
|
|
||||||
0.2. Changes
|
|
||||||
1. File Format
|
|
||||||
1.1. Header
|
|
||||||
1.1.1. Properties
|
|
||||||
1.1.2. Dictionary Size
|
|
||||||
1.1.3. Uncompressed Size
|
|
||||||
1.2. LZMA Compressed Data
|
|
||||||
2. References
|
|
||||||
|
|
||||||
|
|
||||||
0. Preface
|
|
||||||
|
|
||||||
This document describes the .lzma file format, which is
|
|
||||||
sometimes also called LZMA_Alone format. It is a legacy file
|
|
||||||
format, which is being or has been replaced by the .xz format.
|
|
||||||
The MIME type of the .lzma format is `application/x-lzma'.
|
|
||||||
|
|
||||||
The most commonly used software to handle .lzma files are
|
|
||||||
LZMA SDK, LZMA Utils, 7-Zip, and XZ Utils. This document
|
|
||||||
describes some of the differences between these implementations
|
|
||||||
and gives hints what subset of the .lzma format is the most
|
|
||||||
portable.
|
|
||||||
|
|
||||||
|
|
||||||
0.1. Notices and Acknowledgements
|
|
||||||
|
|
||||||
This file format was designed by Igor Pavlov for use in
|
|
||||||
LZMA SDK. This document was written by Lasse Collin
|
|
||||||
<lasse.collin@tukaani.org> using the documentation found
|
|
||||||
from the LZMA SDK.
|
|
||||||
|
|
||||||
This document has been put into the public domain.
|
|
||||||
|
|
||||||
|
|
||||||
0.2. Changes
|
|
||||||
|
|
||||||
Last modified: 2024-04-08 17:35+0300
|
|
||||||
|
|
||||||
From version 2011-04-12 11:55+0300 to 2022-07-13 21:00+0300:
|
|
||||||
The section 1.1.3 was modified to allow End of Payload Marker
|
|
||||||
with a known Uncompressed Size.
|
|
||||||
|
|
||||||
|
|
||||||
1. File Format
|
|
||||||
|
|
||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+==========================+
|
|
||||||
| Header | LZMA Compressed Data |
|
|
||||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+==========================+
|
|
||||||
|
|
||||||
The .lzma format file consist of 13-byte Header followed by
|
|
||||||
the LZMA Compressed Data.
|
|
||||||
|
|
||||||
Unlike the .gz, .bz2, and .xz formats, it is not possible to
|
|
||||||
concatenate multiple .lzma files as is and expect the
|
|
||||||
decompression tool to decode the resulting file as if it were
|
|
||||||
a single .lzma file.
|
|
||||||
|
|
||||||
For example, the command line tools from LZMA Utils and
|
|
||||||
LZMA SDK silently ignore all the data after the first .lzma
|
|
||||||
stream. In contrast, the command line tool from XZ Utils
|
|
||||||
considers the .lzma file to be corrupt if there is data after
|
|
||||||
the first .lzma stream.
|
|
||||||
|
|
||||||
|
|
||||||
1.1. Header
|
|
||||||
|
|
||||||
+------------+----+----+----+----+--+--+--+--+--+--+--+--+
|
|
||||||
| Properties | Dictionary Size | Uncompressed Size |
|
|
||||||
+------------+----+----+----+----+--+--+--+--+--+--+--+--+
|
|
||||||
|
|
||||||
|
|
||||||
1.1.1. Properties
|
|
||||||
|
|
||||||
The Properties field contains three properties. An abbreviation
|
|
||||||
is given in parentheses, followed by the value range of the
|
|
||||||
property. The field consists of
|
|
||||||
|
|
||||||
1) the number of literal context bits (lc, [0, 8]);
|
|
||||||
2) the number of literal position bits (lp, [0, 4]); and
|
|
||||||
3) the number of position bits (pb, [0, 4]).
|
|
||||||
|
|
||||||
The properties are encoded using the following formula:
|
|
||||||
|
|
||||||
Properties = (pb * 5 + lp) * 9 + lc
|
|
||||||
|
|
||||||
The following C code illustrates a straightforward way to
|
|
||||||
decode the Properties field:
|
|
||||||
|
|
||||||
uint8_t lc, lp, pb;
|
|
||||||
uint8_t prop = get_lzma_properties();
|
|
||||||
if (prop > (4 * 5 + 4) * 9 + 8)
|
|
||||||
return LZMA_PROPERTIES_ERROR;
|
|
||||||
|
|
||||||
pb = prop / (9 * 5);
|
|
||||||
prop -= pb * 9 * 5;
|
|
||||||
lp = prop / 9;
|
|
||||||
lc = prop - lp * 9;
|
|
||||||
|
|
||||||
XZ Utils has an additional requirement: lc + lp <= 4. Files
|
|
||||||
which don't follow this requirement cannot be decompressed
|
|
||||||
with XZ Utils. Usually this isn't a problem since the most
|
|
||||||
common lc/lp/pb values are 3/0/2. It is the only lc/lp/pb
|
|
||||||
combination that the files created by LZMA Utils can have,
|
|
||||||
but LZMA Utils can decompress files with any lc/lp/pb.
|
|
||||||
|
|
||||||
|
|
||||||
1.1.2. Dictionary Size
|
|
||||||
|
|
||||||
Dictionary Size is stored as an unsigned 32-bit little endian
|
|
||||||
integer. Any 32-bit value is possible, but for maximum
|
|
||||||
portability, only sizes of 2^n and 2^n + 2^(n-1) should be
|
|
||||||
used.
|
|
||||||
|
|
||||||
LZMA Utils creates only files with dictionary size 2^n,
|
|
||||||
16 <= n <= 25. LZMA Utils can decompress files with any
|
|
||||||
dictionary size.
|
|
||||||
|
|
||||||
XZ Utils creates and decompresses .lzma files only with
|
|
||||||
dictionary sizes 2^n and 2^n + 2^(n-1). If some other
|
|
||||||
dictionary size is specified when compressing, the value
|
|
||||||
stored in the Dictionary Size field is a rounded up, but the
|
|
||||||
specified value is still used in the actual compression code.
|
|
||||||
|
|
||||||
|
|
||||||
1.1.3. Uncompressed Size
|
|
||||||
|
|
||||||
Uncompressed Size is stored as unsigned 64-bit little endian
|
|
||||||
integer. A special value of 0xFFFF_FFFF_FFFF_FFFF indicates
|
|
||||||
that Uncompressed Size is unknown. End of Payload Marker (*)
|
|
||||||
is used if Uncompressed Size is unknown. End of Payload Marker
|
|
||||||
is allowed but rarely used if Uncompressed Size is known.
|
|
||||||
XZ Utils 5.2.5 and older don't support .lzma files that have
|
|
||||||
End of Payload Marker together with a known Uncompressed Size.
|
|
||||||
|
|
||||||
XZ Utils rejects files whose Uncompressed Size field specifies
|
|
||||||
a known size that is 256 GiB or more. This is to reject false
|
|
||||||
positives when trying to guess if the input file is in the
|
|
||||||
.lzma format. When Uncompressed Size is unknown, there is no
|
|
||||||
limit for the uncompressed size of the file.
|
|
||||||
|
|
||||||
(*) Some tools use the term End of Stream (EOS) marker
|
|
||||||
instead of End of Payload Marker.
|
|
||||||
|
|
||||||
|
|
||||||
1.2. LZMA Compressed Data
|
|
||||||
|
|
||||||
Detailed description of the format of this field is out of
|
|
||||||
scope of this document.
|
|
||||||
|
|
||||||
|
|
||||||
2. References
|
|
||||||
|
|
||||||
LZMA SDK - The original LZMA implementation
|
|
||||||
https://7-zip.org/sdk.html
|
|
||||||
|
|
||||||
7-Zip
|
|
||||||
https://7-zip.org/
|
|
||||||
|
|
||||||
LZMA Utils - LZMA adapted to POSIX-like systems
|
|
||||||
https://tukaani.org/lzma/
|
|
||||||
|
|
||||||
XZ Utils - The next generation of LZMA Utils
|
|
||||||
https://tukaani.org/xz/
|
|
||||||
|
|
||||||
The .xz file format - The successor of the .lzma format
|
|
||||||
https://tukaani.org/xz/xz-file-format.txt
|
|
||||||
|
|
||||||
107
doc/lzma-intro.txt
Normal file
107
doc/lzma-intro.txt
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
|
||||||
|
Introduction to the lzma command line tool
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
Overview
|
||||||
|
|
||||||
|
The lzma command line tool is similar to gzip and bzip2, but for
|
||||||
|
compressing and uncompressing .lzma files.
|
||||||
|
|
||||||
|
|
||||||
|
Supported file formats
|
||||||
|
|
||||||
|
By default, the tool creates files in the new .lzma format. This can
|
||||||
|
be overriden with --format=FMT command line option. Use --format=alone
|
||||||
|
to create files in the old LZMA_Alone format.
|
||||||
|
|
||||||
|
By default, the tool uncompresses both the new .lzma format and
|
||||||
|
LZMA_Alone format. This is to make it transparent to switch from
|
||||||
|
the old LZMA_Alone format to the new .lzma format. Since both
|
||||||
|
formats use the same filename suffix, average user should never
|
||||||
|
notice which format was used.
|
||||||
|
|
||||||
|
|
||||||
|
Differences to gzip and bzip2
|
||||||
|
|
||||||
|
Standard input and output
|
||||||
|
|
||||||
|
Both gzip and bzip2 refuse to write compressed data to a terminal and
|
||||||
|
read compressed data from a terminal. With gzip (but not with bzip2),
|
||||||
|
this can be overriden with the `--force' option. lzma follows the
|
||||||
|
behavior of gzip here.
|
||||||
|
|
||||||
|
Usage of LZMA_OPT environment variable
|
||||||
|
|
||||||
|
gzip and bzip2 read GZIP and BZIP2 environment variables at startup.
|
||||||
|
These variables may contain extra command line options.
|
||||||
|
|
||||||
|
gzip and bzip2 allow passing not only options, but also end-of-options
|
||||||
|
indicator (`--') and filenames via the environment variable. No quoting
|
||||||
|
is supported with the filenames.
|
||||||
|
|
||||||
|
Here are examples with gzip. bzip2 behaves identically.
|
||||||
|
|
||||||
|
bash$ echo asdf > 'foo bar'
|
||||||
|
bash$ GZIP='"foo bar"' gzip
|
||||||
|
gzip: "foo: No such file or directory
|
||||||
|
gzip: bar": No such file or directory
|
||||||
|
|
||||||
|
bash$ GZIP=-- gzip --help
|
||||||
|
gzip: --help: No such file or directory
|
||||||
|
|
||||||
|
lzma silently ignores all non-option arguments given via the
|
||||||
|
environment variable LZMA_OPT. Like on the command line, everything
|
||||||
|
after `--' is taken as non-options, and thus ignored in LZMA_OPT.
|
||||||
|
|
||||||
|
bash$ LZMA_OPT='--help' lzma --version # Displays help
|
||||||
|
bash$ LZMA_OPT='-- --help' lzma --version # Displays version
|
||||||
|
|
||||||
|
|
||||||
|
Filter chain presets
|
||||||
|
|
||||||
|
Like in gzip and bzip2, lzma supports numbered presets from 1 to 9
|
||||||
|
where 1 is the fastest and 9 the best compression. 1 and 2 are for
|
||||||
|
fast compressing with small memory usage, 3 to 6 for good compression
|
||||||
|
ratio with medium memory usage, and 7 to 9 for excellent compression
|
||||||
|
ratio with higher memory requirements. The default is 7 if memory
|
||||||
|
usage limit allows.
|
||||||
|
|
||||||
|
In future, there will probably be an option like --preset=NAME, which
|
||||||
|
will contain more special presets for specific file types.
|
||||||
|
|
||||||
|
It's also possible that there will be some heuristics to select good
|
||||||
|
filters. For example, the tool could detect when a .tar archive is
|
||||||
|
being compressed, and enable x86 filter only for those files in the
|
||||||
|
.tar archive that are ELF or PE executables for x86.
|
||||||
|
|
||||||
|
|
||||||
|
Specifying custom filter chains
|
||||||
|
|
||||||
|
Custom filter chains are specified by using long options with the name
|
||||||
|
of the filters in correct order. For example, to pass the input data to
|
||||||
|
the x86 filter and the output of that to the LZMA filter, the following
|
||||||
|
command will do:
|
||||||
|
|
||||||
|
lzma --x86 --lzma filename
|
||||||
|
|
||||||
|
Some filters accept options, which are specified as a comma-separated
|
||||||
|
list of key=value pairs:
|
||||||
|
|
||||||
|
lzma --delta=distance=4 --lzma=dict=4Mi,lc=8,lp=2 filename
|
||||||
|
|
||||||
|
|
||||||
|
Memory usage control
|
||||||
|
|
||||||
|
By default, the command line tool limits memory usage to 1/3 of the
|
||||||
|
available physical RAM. If no preset or custom filter chain has been
|
||||||
|
given, the default preset will be used. If the memory limit is too
|
||||||
|
low for the default preset, the tool will silently switch to lower
|
||||||
|
preset.
|
||||||
|
|
||||||
|
When a preset or a custom filter chain has been specified and the
|
||||||
|
memory limit is too low, an error message is displayed and no files
|
||||||
|
are processed.
|
||||||
|
|
||||||
|
If the decoder hits the memory usage limit, an error is displayed and
|
||||||
|
no more files are processed.
|
||||||
|
|
||||||
@ -1,78 +0,0 @@
|
|||||||
|
|
||||||
Building XZ Utils for DOS
|
|
||||||
=========================
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
|
|
||||||
This document explains how to build XZ Utils for DOS using DJGPP.
|
|
||||||
The resulting binaries should run at least on various DOS versions
|
|
||||||
and under Windows 95/98/98SE/ME.
|
|
||||||
|
|
||||||
This is somewhat experimental and has got very little testing.
|
|
||||||
|
|
||||||
Note: Makefile and config.h are updated only now and then. This
|
|
||||||
means that if you checked out a development version, building for
|
|
||||||
DOS might not work without updating Makefile and config.h first.
|
|
||||||
|
|
||||||
|
|
||||||
Getting and Installing DJGPP
|
|
||||||
|
|
||||||
You may use <https://www.delorie.com/djgpp/zip-picker.html> to help
|
|
||||||
deciding what to download. If you are only interested in building
|
|
||||||
XZ Utils, the zip-picker may list files that you don't strictly
|
|
||||||
need. However, using the zip-picker can still be worth it to get a
|
|
||||||
nice short summary of installation instructions (they can be found
|
|
||||||
from readme.1st too).
|
|
||||||
|
|
||||||
For a more manual method, first select a mirror from
|
|
||||||
<https://www.delorie.com/djgpp/getting.html> and go the
|
|
||||||
subdirectory named "current". You need the following files:
|
|
||||||
|
|
||||||
unzip32.exe (if you don't already have a LFN-capable unzipper)
|
|
||||||
v2/djdev205.zip
|
|
||||||
v2gnu/bnu234b.zip
|
|
||||||
v2gnu/gcc920b.zip
|
|
||||||
v2gnu/mak43b.zip
|
|
||||||
v2misc/csdpmi7b.zip
|
|
||||||
|
|
||||||
If newer versions are available, probably you should try them first.
|
|
||||||
Note that versions older than djdev205.zip aren't supported. Also
|
|
||||||
note that you want csdpmi7b.zip even if you run under Windows or
|
|
||||||
DOSEMU because the XZ Utils Makefile will embed cwsdstub.exe to
|
|
||||||
the resulting xz.exe.
|
|
||||||
|
|
||||||
See the instructions in readme.1st found from djdev205.zip. Here's
|
|
||||||
a short summary, but you should still read readme.1st.
|
|
||||||
|
|
||||||
C:\> mkdir DJGPP
|
|
||||||
C:\> cd DJGPP
|
|
||||||
C:\DJGPP> c:\download\unzip32 c:\download\djdev205.zip
|
|
||||||
C:\DJGPP> c:\download\unzip32 c:\download\bnu234b.zip
|
|
||||||
C:\DJGPP> c:\download\unzip32 c:\download\gcc920b.zip
|
|
||||||
C:\DJGPP> c:\download\unzip32 c:\download\mak43b.zip
|
|
||||||
C:\DJGPP> c:\download\unzip32 c:\download\csdpmi7b.zip
|
|
||||||
|
|
||||||
C:\DJGPP> set PATH=C:\DJGPP\BIN;%PATH%
|
|
||||||
C:\DJGPP> set DJGPP=C:\DJGPP\DJGPP.ENV
|
|
||||||
|
|
||||||
You may want to add the last two lines into AUTOEXEC.BAT or have,
|
|
||||||
for example, DJGPP.BAT which you can run before using DJGPP.
|
|
||||||
|
|
||||||
Make sure you use completely upper case path in the DJGPP environment
|
|
||||||
variable. This is not required by DJGPP, but the XZ Utils Makefile is
|
|
||||||
a bit stupid and expects that everything in DJGPP environment variable
|
|
||||||
is uppercase.
|
|
||||||
|
|
||||||
|
|
||||||
Building
|
|
||||||
|
|
||||||
You need to have an environment that supports long filenames (LFN).
|
|
||||||
Once you have built XZ Utils, the resulting binaries can be run
|
|
||||||
without long filename support.
|
|
||||||
|
|
||||||
Run "make" in this directory (the directory containing this
|
|
||||||
INSTALL.txt). You should get xz.exe (and a bunch of temporary files).
|
|
||||||
Other tools are not built. Having e.g. xzdec.exe doesn't save much
|
|
||||||
space compared to xz.exe because the DJGPP runtime makes the .exe
|
|
||||||
quite big anyway.
|
|
||||||
|
|
||||||
150
dos/Makefile
150
dos/Makefile
@ -1,150 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
#
|
|
||||||
# Makefile to build XZ Utils using DJGPP
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
# For debugging, set comment "#define NDEBUG 1" from config.h to enable
|
|
||||||
# the assert() macro, set STRIP=rem to disable stripping, and finally
|
|
||||||
# e.g. CFLAGS="-g -O0".
|
|
||||||
CC = gcc
|
|
||||||
STRIP = strip
|
|
||||||
CPPFLAGS =
|
|
||||||
CFLAGS = -g -Wall -Wextra -Wfatal-errors -march=i386 -mtune=i686 -O2
|
|
||||||
LDFLAGS = -lemu
|
|
||||||
|
|
||||||
ALL_CFLAGS = -std=gnu99
|
|
||||||
|
|
||||||
ALL_CPPFLAGS = \
|
|
||||||
-I. \
|
|
||||||
-I../lib \
|
|
||||||
-I../src/common \
|
|
||||||
-I../src/liblzma/api \
|
|
||||||
-I../src/liblzma/common \
|
|
||||||
-I../src/liblzma/check \
|
|
||||||
-I../src/liblzma/rangecoder \
|
|
||||||
-I../src/liblzma/lz \
|
|
||||||
-I../src/liblzma/lzma \
|
|
||||||
-I../src/liblzma/delta \
|
|
||||||
-I../src/liblzma/simple \
|
|
||||||
-DHAVE_CONFIG_H
|
|
||||||
|
|
||||||
ALL_CPPFLAGS += $(CPPFLAGS)
|
|
||||||
ALL_CFLAGS += $(CFLAGS)
|
|
||||||
|
|
||||||
.PHONY: all
|
|
||||||
all: xz.exe
|
|
||||||
|
|
||||||
SRCS_C = \
|
|
||||||
../lib/getopt.c \
|
|
||||||
../lib/getopt1.c \
|
|
||||||
../src/common/tuklib_cpucores.c \
|
|
||||||
../src/common/tuklib_exit.c \
|
|
||||||
../src/common/tuklib_mbstr_fw.c \
|
|
||||||
../src/common/tuklib_mbstr_nonprint.c \
|
|
||||||
../src/common/tuklib_mbstr_width.c \
|
|
||||||
../src/common/tuklib_mbstr_wrap.c \
|
|
||||||
../src/common/tuklib_open_stdxxx.c \
|
|
||||||
../src/common/tuklib_physmem.c \
|
|
||||||
../src/common/tuklib_progname.c \
|
|
||||||
../src/liblzma/check/check.c \
|
|
||||||
../src/liblzma/check/crc32_fast.c \
|
|
||||||
../src/liblzma/check/crc64_fast.c \
|
|
||||||
../src/liblzma/check/sha256.c \
|
|
||||||
../src/liblzma/common/alone_decoder.c \
|
|
||||||
../src/liblzma/common/alone_encoder.c \
|
|
||||||
../src/liblzma/common/block_decoder.c \
|
|
||||||
../src/liblzma/common/block_encoder.c \
|
|
||||||
../src/liblzma/common/block_header_decoder.c \
|
|
||||||
../src/liblzma/common/block_header_encoder.c \
|
|
||||||
../src/liblzma/common/block_util.c \
|
|
||||||
../src/liblzma/common/common.c \
|
|
||||||
../src/liblzma/common/file_info.c \
|
|
||||||
../src/liblzma/common/filter_common.c \
|
|
||||||
../src/liblzma/common/filter_decoder.c \
|
|
||||||
../src/liblzma/common/filter_encoder.c \
|
|
||||||
../src/liblzma/common/filter_flags_decoder.c \
|
|
||||||
../src/liblzma/common/filter_flags_encoder.c \
|
|
||||||
../src/liblzma/common/hardware_physmem.c \
|
|
||||||
../src/liblzma/common/index.c \
|
|
||||||
../src/liblzma/common/index_decoder.c \
|
|
||||||
../src/liblzma/common/index_encoder.c \
|
|
||||||
../src/liblzma/common/index_hash.c \
|
|
||||||
../src/liblzma/common/lzip_decoder.c \
|
|
||||||
../src/liblzma/common/stream_decoder.c \
|
|
||||||
../src/liblzma/common/stream_encoder.c \
|
|
||||||
../src/liblzma/common/stream_flags_common.c \
|
|
||||||
../src/liblzma/common/stream_flags_decoder.c \
|
|
||||||
../src/liblzma/common/stream_flags_encoder.c \
|
|
||||||
../src/liblzma/common/string_conversion.c \
|
|
||||||
../src/liblzma/common/vli_decoder.c \
|
|
||||||
../src/liblzma/common/vli_encoder.c \
|
|
||||||
../src/liblzma/common/vli_size.c \
|
|
||||||
../src/liblzma/delta/delta_common.c \
|
|
||||||
../src/liblzma/delta/delta_decoder.c \
|
|
||||||
../src/liblzma/delta/delta_encoder.c \
|
|
||||||
../src/liblzma/lz/lz_decoder.c \
|
|
||||||
../src/liblzma/lz/lz_encoder.c \
|
|
||||||
../src/liblzma/lz/lz_encoder_mf.c \
|
|
||||||
../src/liblzma/lzma/fastpos_table.c \
|
|
||||||
../src/liblzma/lzma/lzma2_decoder.c \
|
|
||||||
../src/liblzma/lzma/lzma2_encoder.c \
|
|
||||||
../src/liblzma/lzma/lzma_decoder.c \
|
|
||||||
../src/liblzma/lzma/lzma_encoder.c \
|
|
||||||
../src/liblzma/lzma/lzma_encoder_optimum_fast.c \
|
|
||||||
../src/liblzma/lzma/lzma_encoder_optimum_normal.c \
|
|
||||||
../src/liblzma/lzma/lzma_encoder_presets.c \
|
|
||||||
../src/liblzma/rangecoder/price_table.c \
|
|
||||||
../src/liblzma/simple/arm.c \
|
|
||||||
../src/liblzma/simple/arm64.c \
|
|
||||||
../src/liblzma/simple/armthumb.c \
|
|
||||||
../src/liblzma/simple/ia64.c \
|
|
||||||
../src/liblzma/simple/powerpc.c \
|
|
||||||
../src/liblzma/simple/simple_coder.c \
|
|
||||||
../src/liblzma/simple/simple_decoder.c \
|
|
||||||
../src/liblzma/simple/simple_encoder.c \
|
|
||||||
../src/liblzma/simple/sparc.c \
|
|
||||||
../src/liblzma/simple/x86.c \
|
|
||||||
../src/xz/args.c \
|
|
||||||
../src/xz/coder.c \
|
|
||||||
../src/xz/file_io.c \
|
|
||||||
../src/xz/hardware.c \
|
|
||||||
../src/xz/list.c \
|
|
||||||
../src/xz/main.c \
|
|
||||||
../src/xz/message.c \
|
|
||||||
../src/xz/mytime.c \
|
|
||||||
../src/xz/options.c \
|
|
||||||
../src/xz/signals.c \
|
|
||||||
../src/xz/suffix.c \
|
|
||||||
../src/xz/util.c
|
|
||||||
SRCS_ASM = \
|
|
||||||
../src/liblzma/check/crc32_x86.S \
|
|
||||||
../src/liblzma/check/crc64_x86.S
|
|
||||||
|
|
||||||
OBJS_C = $(SRCS_C:.c=.o)
|
|
||||||
OBJS_ASM = $(SRCS_ASM:.S=.o)
|
|
||||||
OBJS = $(OBJS_C) $(OBJS_ASM)
|
|
||||||
|
|
||||||
getopt.h:
|
|
||||||
update ../lib/getopt.in.h getopt.h
|
|
||||||
|
|
||||||
$(OBJS): getopt.h
|
|
||||||
|
|
||||||
$(OBJS_C): %.o: %.c
|
|
||||||
$(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(OBJS_ASM): %.o: %.S
|
|
||||||
$(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
# Make xz.exe not depend on an external DPMI server.
|
|
||||||
xz.exe: $(OBJS)
|
|
||||||
$(CC) $(ALL_CFLAGS) $(OBJS) $(LDFLAGS) -o $@
|
|
||||||
$(STRIP) --strip-all $@
|
|
||||||
exe2coff $@
|
|
||||||
del $@
|
|
||||||
copy /b $(DJGPP:DJGPP.ENV=BIN\CWSDSTUB.EXE) + $(@:.exe=) $@
|
|
||||||
del $(@:.exe=)
|
|
||||||
123
dos/README.txt
123
dos/README.txt
@ -1,123 +0,0 @@
|
|||||||
|
|
||||||
XZ Utils on DOS
|
|
||||||
===============
|
|
||||||
|
|
||||||
DOS-specific filename handling
|
|
||||||
|
|
||||||
xz detects at runtime if long filename (LFN) support is
|
|
||||||
available and will use it by default. It can be disabled by
|
|
||||||
setting an environment variable:
|
|
||||||
|
|
||||||
set lfn=n
|
|
||||||
|
|
||||||
When xz is in LFN mode, it behaves pretty much the same as it
|
|
||||||
does on other operating systems. Examples:
|
|
||||||
|
|
||||||
xz foo.tar -> foo.tar.xz
|
|
||||||
xz -d foo.tar.xz -> foo.tar
|
|
||||||
|
|
||||||
xz -F lzma foo.tar -> foo.tar.lzma
|
|
||||||
xz -d foo.tar.lzma -> foo.tar
|
|
||||||
|
|
||||||
When LFN support isn't available or it is disabled with LFN=n
|
|
||||||
environment setting, xz works in short filename (SFN) mode. This
|
|
||||||
affects filename suffix handling when compressing.
|
|
||||||
|
|
||||||
When compressing to the .xz format in SFN mode:
|
|
||||||
|
|
||||||
- Files without an extension get .xz just like on LFN systems.
|
|
||||||
|
|
||||||
- *.tar files become *.txz (shorthand for *.tar.xz). *.txz
|
|
||||||
is recognized by xz on all supported operating systems.
|
|
||||||
(Try to avoid confusing this with gzipped .txt files.)
|
|
||||||
|
|
||||||
- Files with 1-3 character extension have their extension modified
|
|
||||||
so that the last character is a dash ("-"). If the extension
|
|
||||||
is already three characters, the last character is lost. The
|
|
||||||
resulting *.?- or *.??- filename is recognized in LFN mode, but
|
|
||||||
it isn't recognized by xz on other operating systems.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
xz foo -> foo.xz | xz -d foo.xz -> foo
|
|
||||||
xz foo.tar -> foo.txz | xz -d foo.txz -> foo.tar
|
|
||||||
xz foo.c -> foo.c- | xz -d foo.c- -> foo.c
|
|
||||||
xz read.me -> read.me- | xz -d read.me- -> read.me
|
|
||||||
xz foo.txt -> foo.tx- | xz -d foo.tx- -> foo.tx !
|
|
||||||
|
|
||||||
Note that in the last example above, the third character of the
|
|
||||||
filename extension is lost.
|
|
||||||
|
|
||||||
When compressing to the legacy .lzma format in SFN mode:
|
|
||||||
|
|
||||||
- *.tar files become *.tlz (shorthand for *.tar.lzma). *.tlz
|
|
||||||
is recognized by xz on all supported operating systems.
|
|
||||||
|
|
||||||
- Other files become *.lzm. The original filename extension
|
|
||||||
is lost. *.lzm is recognized also in LFN mode, but it is not
|
|
||||||
recognized by xz on other operating systems.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
xz -F lzma foo -> foo.lzm | xz -d foo.lzm -> foo
|
|
||||||
xz -F lzma foo.tar -> foo.tlz | xz -d foo.tlz -> foo.tar
|
|
||||||
xz -F lzma foo.c -> foo.lzm | xz -d foo.lzm -> foo !
|
|
||||||
xz -F lzma read.me -> read.lzm | xz -d read.lzm -> read !
|
|
||||||
xz -F lzma foo.txt -> foo.lzm | xz -d foo.lzm -> foo !
|
|
||||||
|
|
||||||
When compressing with a custom suffix (-S .SUF, --suffix=.SUF) to
|
|
||||||
any file format:
|
|
||||||
|
|
||||||
- If the suffix begins with a dot, the filename extension is
|
|
||||||
replaced with the new suffix. The original extension is lost.
|
|
||||||
|
|
||||||
- If the suffix doesn't begin with a dot and the filename has no
|
|
||||||
extension and the filename given on the command line doesn't
|
|
||||||
have a dot at the end, the custom suffix is appended just like
|
|
||||||
on LFN systems.
|
|
||||||
|
|
||||||
- If the suffix doesn't begin with a dot and the filename has
|
|
||||||
an extension (or an extension-less filename is given with a dot
|
|
||||||
at the end), the last 1-3 characters of the filename extension
|
|
||||||
may get overwritten to fit the given custom suffix.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
xz -S x foo -> foox | xz -dS x foox -> foo
|
|
||||||
xz -S x foo. -> foo.x | xz -dS x foo.x -> foo
|
|
||||||
xz -S .x foo -> foo.x | xz -dS .x foo.x -> foo
|
|
||||||
xz -S .x foo. -> foo.x | xz -dS .x foo.x -> foo
|
|
||||||
xz -S x.y foo -> foox.y | xz -dS x.y foox.y -> foo
|
|
||||||
xz -S .a foo.c -> foo.a | xz -dS .a foo.a -> foo !
|
|
||||||
xz -S a foo.c -> foo.ca | xz -dS a foo.ca -> foo.c
|
|
||||||
xz -S ab foo.c -> foo.cab | xz -dS ab foo.cab -> foo.c
|
|
||||||
xz -S ab read.me -> read.mab | xz -dS ab read.mab -> read.m !
|
|
||||||
xz -S ab foo.txt -> foo.tab | xz -dS ab foo.tab -> foo.t !
|
|
||||||
xz -S abc foo.txt -> foo.abc | xz -dS abc foo.abc -> foo !
|
|
||||||
|
|
||||||
When decompressing, the suffix handling in SFN mode is the same as
|
|
||||||
in LFN mode. The DOS-specific filenames *.lzm, *.?-, and *.??- are
|
|
||||||
recognized also in LFN mode.
|
|
||||||
|
|
||||||
xz handles certain uncommon situations safely:
|
|
||||||
|
|
||||||
- If the generated output filename refers to the same file as
|
|
||||||
the input file, xz detects this and refuses to compress or
|
|
||||||
decompress the input file even if --force is used. This can
|
|
||||||
happen when giving an overlong filename in SFN mode. E.g.
|
|
||||||
"xz -S x foo.texinfo" would try to write to foo.tex which on
|
|
||||||
SFN system is the same file as foo.texinfo.
|
|
||||||
|
|
||||||
- If the generated output filename is a special file like "con"
|
|
||||||
or "prn", xz detects this and refuses to compress or decompress
|
|
||||||
the input file even if --force is used.
|
|
||||||
|
|
||||||
|
|
||||||
Bugs
|
|
||||||
|
|
||||||
xz doesn't necessarily work in Dosbox. It should work in DOSEMU.
|
|
||||||
|
|
||||||
Pressing Ctrl-c or Ctrl-Break won't remove the incomplete target file
|
|
||||||
when running under Windows XP Command Prompt (something goes wrong
|
|
||||||
with SIGINT handling). It works correctly under Windows 95/98/98SE/ME.
|
|
||||||
|
|
||||||
146
dos/config.h
146
dos/config.h
@ -1,146 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: 0BSD */
|
|
||||||
|
|
||||||
/* How many MiB of RAM to assume if the real amount cannot be determined. */
|
|
||||||
#define ASSUME_RAM 32
|
|
||||||
|
|
||||||
/* Define to 1 if crc32 integrity check is enabled. */
|
|
||||||
#define HAVE_CHECK_CRC32 1
|
|
||||||
|
|
||||||
/* Define to 1 if crc64 integrity check is enabled. */
|
|
||||||
#define HAVE_CHECK_CRC64 1
|
|
||||||
|
|
||||||
/* Define to 1 if sha256 integrity check is enabled. */
|
|
||||||
#define HAVE_CHECK_SHA256 1
|
|
||||||
|
|
||||||
/* Define to 1 if the 32-bit x86 CRC assembly files are used. */
|
|
||||||
#define HAVE_CRC_X86_ASM 1
|
|
||||||
|
|
||||||
/* Define to 1 if any of HAVE_DECODER_foo have been defined. */
|
|
||||||
#define HAVE_DECODERS 1
|
|
||||||
|
|
||||||
/* Define to 1 if arm decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_ARM 1
|
|
||||||
|
|
||||||
/* Define to 1 if arm64 decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_ARM64 1
|
|
||||||
|
|
||||||
/* Define to 1 if armthumb decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_ARMTHUMB 1
|
|
||||||
|
|
||||||
/* Define to 1 if delta decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_DELTA 1
|
|
||||||
|
|
||||||
/* Define to 1 if ia64 decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_IA64 1
|
|
||||||
|
|
||||||
/* Define to 1 if lzma1 decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_LZMA1 1
|
|
||||||
|
|
||||||
/* Define to 1 if lzma2 decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_LZMA2 1
|
|
||||||
|
|
||||||
/* Define to 1 if powerpc decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_POWERPC 1
|
|
||||||
|
|
||||||
/* Define to 1 if sparc decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_SPARC 1
|
|
||||||
|
|
||||||
/* Define to 1 if x86 decoder is enabled. */
|
|
||||||
#define HAVE_DECODER_X86 1
|
|
||||||
|
|
||||||
/* Define to 1 if any of HAVE_ENCODER_foo have been defined. */
|
|
||||||
#define HAVE_ENCODERS 1
|
|
||||||
|
|
||||||
/* Define to 1 if arm encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_ARM 1
|
|
||||||
|
|
||||||
/* Define to 1 if arm64 encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_ARM64 1
|
|
||||||
|
|
||||||
/* Define to 1 if armthumb encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_ARMTHUMB 1
|
|
||||||
|
|
||||||
/* Define to 1 if delta encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_DELTA 1
|
|
||||||
|
|
||||||
/* Define to 1 if ia64 encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_IA64 1
|
|
||||||
|
|
||||||
/* Define to 1 if lzma1 encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_LZMA1 1
|
|
||||||
|
|
||||||
/* Define to 1 if lzma2 encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_LZMA2 1
|
|
||||||
|
|
||||||
/* Define to 1 if powerpc encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_POWERPC 1
|
|
||||||
|
|
||||||
/* Define to 1 if sparc encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_SPARC 1
|
|
||||||
|
|
||||||
/* Define to 1 if x86 encoder is enabled. */
|
|
||||||
#define HAVE_ENCODER_X86 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#define HAVE_INTTYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if .lz (lzip) decompression support is enabled. */
|
|
||||||
#define HAVE_LZIP_DECODER 1
|
|
||||||
|
|
||||||
/* Define to 1 to enable bt2 match finder. */
|
|
||||||
#define HAVE_MF_BT2 1
|
|
||||||
|
|
||||||
/* Define to 1 to enable bt3 match finder. */
|
|
||||||
#define HAVE_MF_BT3 1
|
|
||||||
|
|
||||||
/* Define to 1 to enable bt4 match finder. */
|
|
||||||
#define HAVE_MF_BT4 1
|
|
||||||
|
|
||||||
/* Define to 1 to enable hc3 match finder. */
|
|
||||||
#define HAVE_MF_HC3 1
|
|
||||||
|
|
||||||
/* Define to 1 to enable hc4 match finder. */
|
|
||||||
#define HAVE_MF_HC4 1
|
|
||||||
|
|
||||||
/* Define to 1 if stdbool.h conforms to C99. */
|
|
||||||
#define HAVE_STDBOOL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#define HAVE_STDINT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the 'utimes' function. */
|
|
||||||
#define HAVE_UTIMES 1
|
|
||||||
|
|
||||||
/* Define to 1 or 0, depending whether the compiler supports simple visibility
|
|
||||||
declarations. */
|
|
||||||
#define HAVE_VISIBILITY 0
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type '_Bool'. */
|
|
||||||
#define HAVE__BOOL 1
|
|
||||||
|
|
||||||
/* Define to 1 if the GNU C extension __builtin_assume_aligned is supported.
|
|
||||||
*/
|
|
||||||
#define HAVE___BUILTIN_ASSUME_ALIGNED 1
|
|
||||||
|
|
||||||
/* Define to 1 if the GNU C extensions __builtin_bswap16/32/64 are supported.
|
|
||||||
*/
|
|
||||||
#define HAVE___BUILTIN_BSWAPXX 1
|
|
||||||
|
|
||||||
/* Define to 1 to disable debugging code. */
|
|
||||||
#define NDEBUG 1
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#define PACKAGE_BUGREPORT "xz@tukaani.org"
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#define PACKAGE_NAME "XZ Utils"
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#define PACKAGE_URL "https://tukaani.org/xz/"
|
|
||||||
|
|
||||||
/* The size of 'size_t', as computed by sizeof. */
|
|
||||||
#define SIZEOF_SIZE_T 4
|
|
||||||
|
|
||||||
/* Define to 1 if the system supports fast unaligned access to 16-bit and
|
|
||||||
32-bit integers. */
|
|
||||||
#define TUKLIB_FAST_UNALIGNED_ACCESS 1
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
# Run "doxygen" in this directory to generate the liblzma API documentation
|
|
||||||
# into ../doc/api.
|
|
||||||
#
|
|
||||||
# Use the "update-doxygen" script for more choices:
|
|
||||||
# - Include the liblzma version number in the generated documentation.
|
|
||||||
# - Instead of API docs, docs of XZ Utils internals may be built.
|
|
||||||
# - Change the output directory for out-of-tree builds.
|
|
||||||
#
|
|
||||||
# These options were tested with Doxygen 1.9.8 and 1.13.2.
|
|
||||||
|
|
||||||
PROJECT_NAME = "liblzma (XZ Utils)"
|
|
||||||
OUTPUT_DIRECTORY = ../doc
|
|
||||||
STRIP_FROM_PATH = ../src/liblzma/api
|
|
||||||
INPUT = ../src/liblzma/api
|
|
||||||
FILE_PATTERNS = *.c *.h
|
|
||||||
RECURSIVE = YES
|
|
||||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
|
||||||
EXTRACT_STATIC = YES
|
|
||||||
SORT_MEMBER_DOCS = NO
|
|
||||||
WARN_IF_UNDOCUMENTED = NO
|
|
||||||
WARN_AS_ERROR = FAIL_ON_WARNINGS
|
|
||||||
SOURCE_TOOLTIPS = NO
|
|
||||||
VERBATIM_HEADERS = NO
|
|
||||||
ALPHABETICAL_INDEX = NO
|
|
||||||
HTML_OUTPUT = api
|
|
||||||
HTML_COLORSTYLE_HUE = 210
|
|
||||||
HTML_COLORSTYLE_SAT = 180
|
|
||||||
HTML_COLORSTYLE_GAMMA = 110
|
|
||||||
HTML_DYNAMIC_MENUS = NO
|
|
||||||
SEARCHENGINE = NO
|
|
||||||
GENERATE_LATEX = NO
|
|
||||||
MACRO_EXPANSION = YES
|
|
||||||
EXPAND_ONLY_PREDEF = YES
|
|
||||||
PREDEFINED = LZMA_API(type)=type \
|
|
||||||
LZMA_API_IMPORT= \
|
|
||||||
LZMA_API_CALL= \
|
|
||||||
tuklib_attr_noreturn= \
|
|
||||||
lzma_attribute(attr)= \
|
|
||||||
lzma_attr_alloc_size(size)=
|
|
||||||
|
|
||||||
# Debian and Ubuntu patch Doxygen so that HAVE_DOT = YES is the default.
|
|
||||||
# Set HAVE_DOT explicitly to get consistent behavior across distributions.
|
|
||||||
HAVE_DOT = NO
|
|
||||||
@ -1,114 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# While it's possible to use the Doxyfile as is to generate liblzma API
|
|
||||||
# documentation, it is recommended to use this script because this adds
|
|
||||||
# the XZ Utils version number to the generated HTML.
|
|
||||||
#
|
|
||||||
# Other features:
|
|
||||||
# - Generate documentation of the XZ Utils internals.
|
|
||||||
# - Set input and output paths for out-of-tree builds.
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Authors: Jia Tan
|
|
||||||
# Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
show_usage()
|
|
||||||
{
|
|
||||||
echo "Usage: $0 <api|internal> [ABS_TOP_SRCDIR ABS_OUTDIR]"
|
|
||||||
echo
|
|
||||||
echo "Supported modes:"
|
|
||||||
echo " - 'api' (default): liblzma API docs into doc/api"
|
|
||||||
echo " - 'internal': internal docs into doc/internal"
|
|
||||||
echo
|
|
||||||
echo "Absolute source and output dirs may be set" \
|
|
||||||
"to do an out-of-tree build."
|
|
||||||
echo "The output directory must already exist."
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
api|internal)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
show_usage
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if type doxygen > /dev/null 2>&1; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
echo "$0: 'doxygen' command not found" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
case $# in
|
|
||||||
1)
|
|
||||||
# One argument: Building inside the source tree
|
|
||||||
ABS_TOP_SRCDIR=`dirname "$0"`/..
|
|
||||||
ABS_OUTDIR=$ABS_TOP_SRCDIR/doc
|
|
||||||
;;
|
|
||||||
3)
|
|
||||||
# Three arguments: Possibly an out of tree build
|
|
||||||
ABS_TOP_SRCDIR=$2
|
|
||||||
ABS_OUTDIR=$3
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
show_usage
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test ! -f "$ABS_TOP_SRCDIR/doxygen/Doxyfile"; then
|
|
||||||
echo "$0: Source dir '$ABS_TOP_SRCDIR/doxygen/Doxyfile' not found" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if test ! -d "$ABS_OUTDIR"; then
|
|
||||||
echo "$0: Output dir '$ABS_OUTDIR' not found" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get the package version so that it can be included in the generated docs.
|
|
||||||
PACKAGE_VERSION=`cd "$ABS_TOP_SRCDIR" && sh build-aux/version.sh`
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
api)
|
|
||||||
# Remove old documentation before re-generating the new.
|
|
||||||
rm -rf "$ABS_OUTDIR/api"
|
|
||||||
|
|
||||||
# Generate the HTML documentation by preparing the Doxyfile
|
|
||||||
# in stdin and piping the result to the doxygen command.
|
|
||||||
# With Doxygen, the last assignment of a value to a tag will
|
|
||||||
# override any earlier assignment. So, we can use this
|
|
||||||
# feature to override the tags that need to change between
|
|
||||||
# "api" and "internal" modes.
|
|
||||||
ABS_SRCDIR=$ABS_TOP_SRCDIR/src/liblzma/api
|
|
||||||
(
|
|
||||||
cat "$ABS_TOP_SRCDIR/doxygen/Doxyfile"
|
|
||||||
echo "PROJECT_NUMBER = $PACKAGE_VERSION"
|
|
||||||
echo "OUTPUT_DIRECTORY = $ABS_OUTDIR"
|
|
||||||
echo "STRIP_FROM_PATH = $ABS_SRCDIR"
|
|
||||||
echo "INPUT = $ABS_SRCDIR"
|
|
||||||
) | doxygen -q -
|
|
||||||
;;
|
|
||||||
|
|
||||||
internal)
|
|
||||||
rm -rf "$ABS_OUTDIR/internal"
|
|
||||||
(
|
|
||||||
cat "$ABS_TOP_SRCDIR/doxygen/Doxyfile"
|
|
||||||
echo 'PROJECT_NAME = "XZ Utils"'
|
|
||||||
echo "PROJECT_NUMBER = $PACKAGE_VERSION"
|
|
||||||
echo "OUTPUT_DIRECTORY = $ABS_OUTDIR"
|
|
||||||
echo "STRIP_FROM_PATH = $ABS_TOP_SRCDIR"
|
|
||||||
echo "INPUT = $ABS_TOP_SRCDIR/src"
|
|
||||||
echo 'HTML_OUTPUT = internal'
|
|
||||||
echo 'SEARCHENGINE = YES'
|
|
||||||
) | doxygen -q -
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@ -1,113 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# 7z2lzma.bash is very primitive .7z to .lzma converter. The input file must
|
|
||||||
# have exactly one LZMA compressed stream, which has been created with the
|
|
||||||
# default lc, lp, and pb values. The CRC32 in the .7z archive is not checked,
|
|
||||||
# and the script may seem to succeed while it actually created a corrupt .lzma
|
|
||||||
# file. You should always try uncompressing both the original .7z and the
|
|
||||||
# created .lzma and compare that the output is identical.
|
|
||||||
#
|
|
||||||
# This script requires basic GNU tools and 7z or 7za tool from p7zip.
|
|
||||||
#
|
|
||||||
# Last modified: 2009-01-15 14:25+0200
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin <lasse.collin@tukaani.org>
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
# You can use 7z or 7za, both will work.
|
|
||||||
SEVENZIP=7za
|
|
||||||
|
|
||||||
if [ $# != 2 -o -z "$1" -o -z "$2" ]; then
|
|
||||||
echo "Usage: $0 input.7z output.lzma"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Converts an integer variable to little endian binary integer.
|
|
||||||
int2bin()
|
|
||||||
{
|
|
||||||
local LEN=$1
|
|
||||||
local NUM=$2
|
|
||||||
local HEX=(0 1 2 3 4 5 6 7 8 9 A B C D E F)
|
|
||||||
local I
|
|
||||||
for ((I=0; I < "$LEN"; ++I)); do
|
|
||||||
printf "\\x${HEX[(NUM >> 4) & 0x0F]}${HEX[NUM & 0x0F]}"
|
|
||||||
NUM=$((NUM >> 8))
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Make sure we get possible errors from pipes.
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# Get information about the input file. At least older 7z and 7za versions
|
|
||||||
# may return with zero exit status even when an error occurred, so check
|
|
||||||
# if the output has any lines beginning with "Error".
|
|
||||||
INFO=$("$SEVENZIP" l -slt "$1")
|
|
||||||
if [ $? != 0 ] || printf '%s\n' "$INFO" | grep -q ^Error; then
|
|
||||||
printf '%s\n' "$INFO"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check if the input file has more than one compressed block.
|
|
||||||
if printf '%s\n' "$INFO" | grep -q '^Block = 1'; then
|
|
||||||
echo "Cannot convert, because the input file has more than"
|
|
||||||
echo "one compressed block."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get compressed, uncompressed, and dictionary size.
|
|
||||||
CSIZE=$(printf '%s\n' "$INFO" | sed -rn 's|^Packed Size = ([0-9]+$)|\1|p')
|
|
||||||
USIZE=$(printf '%s\n' "$INFO" | sed -rn 's|^Size = ([0-9]+$)|\1|p')
|
|
||||||
DICT=$(printf '%s\n' "$INFO" | sed -rn 's|^Method = LZMA:([0-9]+[bkm]?)$|\1|p')
|
|
||||||
|
|
||||||
if [ -z "$CSIZE" -o -z "$USIZE" -o -z "$DICT" ]; then
|
|
||||||
echo "Parsing output of $SEVENZIP failed. Maybe the file uses some"
|
|
||||||
echo "other compression method than plain LZMA."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The following assumes that the default lc, lp, and pb settings were used.
|
|
||||||
# Otherwise the output will be corrupt.
|
|
||||||
printf '\x5D' > "$2"
|
|
||||||
|
|
||||||
# Dictionary size can be either was power of two, bytes, kibibytes, or
|
|
||||||
# mebibytes. We need to convert it to bytes.
|
|
||||||
case $DICT in
|
|
||||||
*b)
|
|
||||||
DICT=${DICT%b}
|
|
||||||
;;
|
|
||||||
*k)
|
|
||||||
DICT=${DICT%k}
|
|
||||||
DICT=$((DICT << 10))
|
|
||||||
;;
|
|
||||||
*m)
|
|
||||||
DICT=${DICT%m}
|
|
||||||
DICT=$((DICT << 20))
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
DICT=$((1 << DICT))
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
int2bin 4 "$DICT" >> "$2"
|
|
||||||
|
|
||||||
# Uncompressed size
|
|
||||||
int2bin 8 "$USIZE" >> "$2"
|
|
||||||
|
|
||||||
# Copy the actual compressed data. Using multiple dd commands to avoid
|
|
||||||
# copying large amount of data with one-byte block size, which would be
|
|
||||||
# annoyingly slow.
|
|
||||||
BS=8192
|
|
||||||
BIGSIZE=$((CSIZE / BS))
|
|
||||||
CSIZE=$((CSIZE % BS))
|
|
||||||
{
|
|
||||||
dd of=/dev/null bs=32 count=1 \
|
|
||||||
&& dd bs="$BS" count="$BIGSIZE" \
|
|
||||||
&& dd bs=1 count="$CSIZE"
|
|
||||||
} < "$1" >> "$2"
|
|
||||||
|
|
||||||
exit $?
|
|
||||||
@ -1,5 +1,3 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
scanlzma, scan for lzma compressed data in stdin and echo it to stdout.
|
scanlzma, scan for lzma compressed data in stdin and echo it to stdout.
|
||||||
Copyright (C) 2006 Timo Lindfors
|
Copyright (C) 2006 Timo Lindfors
|
||||||
@ -39,10 +37,6 @@
|
|||||||
/* 5 8 Uncompressed size (little endian). -1 means unknown size */
|
/* 5 8 Uncompressed size (little endian). -1 means unknown size */
|
||||||
/* 13 Compressed data */
|
/* 13 Compressed data */
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define BUFSIZE 4096
|
#define BUFSIZE 4096
|
||||||
|
|
||||||
int find_lzma_header(unsigned char *buf) {
|
int find_lzma_header(unsigned char *buf) {
|
||||||
@ -54,7 +48,7 @@ int find_lzma_header(unsigned char *buf) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
unsigned char buf[BUFSIZE];
|
char buf[BUFSIZE];
|
||||||
int ret, i, numlzma, blocks=0;
|
int ret, i, numlzma, blocks=0;
|
||||||
|
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
@ -82,6 +76,7 @@ int main(int argc, char *argv[]) {
|
|||||||
exit(0);
|
exit(0);
|
||||||
putchar(ch);
|
putchar(ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
blocks++;
|
blocks++;
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
## SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
##
|
##
|
||||||
## Copyright (C) 2004-2007 Free Software Foundation, Inc.
|
## Copyright (C) 2004-2007 Free Software Foundation, Inc.
|
||||||
|
## Copyright (C) 2007 Lasse Collin
|
||||||
##
|
##
|
||||||
## This program is free software; you can redistribute it and/or modify
|
## This program is free software; you can redistribute it and/or modify
|
||||||
## it under the terms of the GNU General Public License as published by
|
## it under the terms of the GNU General Public License as published by
|
||||||
@ -14,8 +13,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
##
|
##
|
||||||
|
|
||||||
## Not using gnulib-tool, at least for now. It is likely that we won't
|
## Not using gnulib-tool, at least for now. Less mess this way.
|
||||||
## need anything else from Gnulib than getopt_long().
|
|
||||||
|
|
||||||
noinst_LIBRARIES = libgnu.a
|
noinst_LIBRARIES = libgnu.a
|
||||||
|
|
||||||
@ -23,22 +21,12 @@ libgnu_a_SOURCES =
|
|||||||
libgnu_a_DEPENDENCIES = $(LIBOBJS)
|
libgnu_a_DEPENDENCIES = $(LIBOBJS)
|
||||||
libgnu_a_LIBADD = $(LIBOBJS)
|
libgnu_a_LIBADD = $(LIBOBJS)
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = gettext.h getopt_.h getopt.c getopt1.c getopt_int.h
|
||||||
getopt.in.h \
|
|
||||||
getopt.c \
|
|
||||||
getopt1.c \
|
|
||||||
getopt_int.h \
|
|
||||||
getopt-cdefs.h \
|
|
||||||
getopt-core.h \
|
|
||||||
getopt-ext.h \
|
|
||||||
getopt-pfx-core.h \
|
|
||||||
getopt-pfx-ext.h
|
|
||||||
|
|
||||||
BUILT_SOURCES = $(GETOPT_H)
|
BUILT_SOURCES = $(GETOPT_H)
|
||||||
MOSTLYCLEANFILES = getopt.h getopt.h-t
|
MOSTLYCLEANFILES = getopt.h getopt.h-t
|
||||||
|
|
||||||
getopt.h: getopt.in.h
|
getopt.h: getopt_.h
|
||||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||||
cat $(srcdir)/getopt.in.h; \
|
cat $(srcdir)/getopt_.h; \
|
||||||
} > $@-t
|
} > $@-t
|
||||||
mv -f $@-t $@
|
mv -f $@-t $@
|
||||||
|
|||||||
@ -1,72 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
|
|
||||||
/* getopt-on-non-glibc compatibility macros.
|
|
||||||
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
|
||||||
This file is part of gnulib.
|
|
||||||
Unlike most of the getopt implementation, it is NOT shared
|
|
||||||
with the GNU C Library.
|
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Lesser General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2.1 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This file is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GETOPT_CDEFS_H
|
|
||||||
#define _GETOPT_CDEFS_H 1
|
|
||||||
|
|
||||||
/* This header should not be used directly; include getopt.h or
|
|
||||||
unistd.h instead. It does not have a protective #error, because
|
|
||||||
the guard macro for getopt.h in gnulib is not fixed. */
|
|
||||||
|
|
||||||
/* getopt-core.h and getopt-ext.h are shared with GNU libc, and expect
|
|
||||||
a number of the internal macros supplied to GNU libc's headers by
|
|
||||||
sys/cdefs.h. Provide fallback definitions for all of them. */
|
|
||||||
#ifdef HAVE_SYS_CDEFS_H
|
|
||||||
# include <sys/cdefs.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __BEGIN_DECLS
|
|
||||||
# ifdef __cplusplus
|
|
||||||
# define __BEGIN_DECLS extern "C" {
|
|
||||||
# else
|
|
||||||
# define __BEGIN_DECLS /* nothing */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#ifndef __END_DECLS
|
|
||||||
# ifdef __cplusplus
|
|
||||||
# define __END_DECLS }
|
|
||||||
# else
|
|
||||||
# define __END_DECLS /* nothing */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __GNUC_PREREQ
|
|
||||||
# if defined __GNUC__ && defined __GNUC_VERSION__
|
|
||||||
# define __GNUC_PREREQ(maj, min) \
|
|
||||||
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
|
||||||
# else
|
|
||||||
# define __GNUC_PREREQ(maj, min) 0
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __THROW
|
|
||||||
# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
|
|
||||||
# if __cplusplus >= 201103L
|
|
||||||
# define __THROW noexcept (true)
|
|
||||||
# else
|
|
||||||
# define __THROW throw ()
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
# define __THROW
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _GETOPT_CDEFS_H */
|
|
||||||
@ -1,98 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
|
|
||||||
/* Declarations for getopt (basic, portable features only).
|
|
||||||
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library and is also part of gnulib.
|
|
||||||
Patches to this file should be submitted to both projects.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GETOPT_CORE_H
|
|
||||||
#define _GETOPT_CORE_H 1
|
|
||||||
|
|
||||||
/* This header should not be used directly; include getopt.h or
|
|
||||||
unistd.h instead. Unlike most bits headers, it does not have
|
|
||||||
a protective #error, because the guard macro for getopt.h in
|
|
||||||
gnulib is not fixed. */
|
|
||||||
|
|
||||||
__BEGIN_DECLS
|
|
||||||
|
|
||||||
/* For communication from 'getopt' to the caller.
|
|
||||||
When 'getopt' finds an option that takes an argument,
|
|
||||||
the argument value is returned here.
|
|
||||||
Also, when 'ordering' is RETURN_IN_ORDER,
|
|
||||||
each non-option ARGV-element is returned here. */
|
|
||||||
|
|
||||||
extern char *optarg;
|
|
||||||
|
|
||||||
/* Index in ARGV of the next element to be scanned.
|
|
||||||
This is used for communication to and from the caller
|
|
||||||
and for communication between successive calls to 'getopt'.
|
|
||||||
|
|
||||||
On entry to 'getopt', zero means this is the first call; initialize.
|
|
||||||
|
|
||||||
When 'getopt' returns -1, this is the index of the first of the
|
|
||||||
non-option elements that the caller should itself scan.
|
|
||||||
|
|
||||||
Otherwise, 'optind' communicates from one call to the next
|
|
||||||
how much of ARGV has been scanned so far. */
|
|
||||||
|
|
||||||
extern int optind;
|
|
||||||
|
|
||||||
/* Callers store zero here to inhibit the error message 'getopt' prints
|
|
||||||
for unrecognized options. */
|
|
||||||
|
|
||||||
extern int opterr;
|
|
||||||
|
|
||||||
/* Set to an option character which was unrecognized. */
|
|
||||||
|
|
||||||
extern int optopt;
|
|
||||||
|
|
||||||
/* Get definitions and prototypes for functions to process the
|
|
||||||
arguments in ARGV (ARGC of them, minus the program name) for
|
|
||||||
options given in OPTS.
|
|
||||||
|
|
||||||
Return the option character from OPTS just read. Return -1 when
|
|
||||||
there are no more options. For unrecognized options, or options
|
|
||||||
missing arguments, 'optopt' is set to the option letter, and '?' is
|
|
||||||
returned.
|
|
||||||
|
|
||||||
The OPTS string is a list of characters which are recognized option
|
|
||||||
letters, optionally followed by colons, specifying that that letter
|
|
||||||
takes an argument, to be placed in 'optarg'.
|
|
||||||
|
|
||||||
If a letter in OPTS is followed by two colons, its argument is
|
|
||||||
optional. This behavior is specific to the GNU 'getopt'.
|
|
||||||
|
|
||||||
The argument '--' causes premature termination of argument
|
|
||||||
scanning, explicitly telling 'getopt' that there are no more
|
|
||||||
options.
|
|
||||||
|
|
||||||
If OPTS begins with '-', then non-option arguments are treated as
|
|
||||||
arguments to the option '\1'. This behavior is specific to the GNU
|
|
||||||
'getopt'. If OPTS begins with '+', or POSIXLY_CORRECT is set in
|
|
||||||
the environment, then do not permute arguments.
|
|
||||||
|
|
||||||
For standards compliance, the 'argv' argument has the type
|
|
||||||
char *const *, but this is inaccurate; if argument permutation is
|
|
||||||
enabled, the argv array (not the strings it points to) must be
|
|
||||||
writable. */
|
|
||||||
|
|
||||||
extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
|
|
||||||
__THROW _GL_ARG_NONNULL ((2, 3));
|
|
||||||
|
|
||||||
__END_DECLS
|
|
||||||
|
|
||||||
#endif /* _GETOPT_CORE_H */
|
|
||||||
@ -1,79 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
|
|
||||||
/* Declarations for getopt (GNU extensions).
|
|
||||||
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library and is also part of gnulib.
|
|
||||||
Patches to this file should be submitted to both projects.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with the GNU C Library; if not, see
|
|
||||||
<https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GETOPT_EXT_H
|
|
||||||
#define _GETOPT_EXT_H 1
|
|
||||||
|
|
||||||
/* This header should not be used directly; include getopt.h instead.
|
|
||||||
Unlike most bits headers, it does not have a protective #error,
|
|
||||||
because the guard macro for getopt.h in gnulib is not fixed. */
|
|
||||||
|
|
||||||
__BEGIN_DECLS
|
|
||||||
|
|
||||||
/* Describe the long-named options requested by the application.
|
|
||||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
|
||||||
of 'struct option' terminated by an element containing a name which is
|
|
||||||
zero.
|
|
||||||
|
|
||||||
The field 'has_arg' is:
|
|
||||||
no_argument (or 0) if the option does not take an argument,
|
|
||||||
required_argument (or 1) if the option requires an argument,
|
|
||||||
optional_argument (or 2) if the option takes an optional argument.
|
|
||||||
|
|
||||||
If the field 'flag' is not NULL, it points to a variable that is set
|
|
||||||
to the value given in the field 'val' when the option is found, but
|
|
||||||
left unchanged if the option is not found.
|
|
||||||
|
|
||||||
To have a long-named option do something other than set an 'int' to
|
|
||||||
a compiled-in constant, such as set a value from 'optarg', set the
|
|
||||||
option's 'flag' field to zero and its 'val' field to a nonzero
|
|
||||||
value (the equivalent single-letter option character, if there is
|
|
||||||
one). For long options that have a zero 'flag' field, 'getopt'
|
|
||||||
returns the contents of the 'val' field. */
|
|
||||||
|
|
||||||
struct option
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
/* has_arg can't be an enum because some compilers complain about
|
|
||||||
type mismatches in all the code that assumes it is an int. */
|
|
||||||
int has_arg;
|
|
||||||
int *flag;
|
|
||||||
int val;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Names for the values of the 'has_arg' field of 'struct option'. */
|
|
||||||
|
|
||||||
#define no_argument 0
|
|
||||||
#define required_argument 1
|
|
||||||
#define optional_argument 2
|
|
||||||
|
|
||||||
extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
|
|
||||||
const char *__shortopts,
|
|
||||||
const struct option *__longopts, int *__longind)
|
|
||||||
__THROW _GL_ARG_NONNULL ((2, 3));
|
|
||||||
extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
|
|
||||||
const char *__shortopts,
|
|
||||||
const struct option *__longopts, int *__longind)
|
|
||||||
__THROW _GL_ARG_NONNULL ((2, 3));
|
|
||||||
|
|
||||||
__END_DECLS
|
|
||||||
|
|
||||||
#endif /* _GETOPT_EXT_H */
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
|
|
||||||
/* getopt (basic, portable features) gnulib wrapper header.
|
|
||||||
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
|
||||||
This file is part of gnulib.
|
|
||||||
Unlike most of the getopt implementation, it is NOT shared
|
|
||||||
with the GNU C Library.
|
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Lesser General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2.1 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This file is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GETOPT_PFX_CORE_H
|
|
||||||
#define _GETOPT_PFX_CORE_H 1
|
|
||||||
|
|
||||||
/* This header should not be used directly; include getopt.h or
|
|
||||||
unistd.h instead. It does not have a protective #error, because
|
|
||||||
the guard macro for getopt.h in gnulib is not fixed. */
|
|
||||||
|
|
||||||
/* Standalone applications should #define __GETOPT_PREFIX to an
|
|
||||||
identifier that prefixes the external functions and variables
|
|
||||||
defined in getopt-core.h and getopt-ext.h. Systematically
|
|
||||||
rename identifiers so that they do not collide with the system
|
|
||||||
functions and variables. Renaming avoids problems with some
|
|
||||||
compilers and linkers. */
|
|
||||||
#ifdef __GETOPT_PREFIX
|
|
||||||
# ifndef __GETOPT_ID
|
|
||||||
# define __GETOPT_CONCAT(x, y) x ## y
|
|
||||||
# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
|
|
||||||
# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
|
|
||||||
# endif
|
|
||||||
# undef getopt
|
|
||||||
# undef optarg
|
|
||||||
# undef opterr
|
|
||||||
# undef optind
|
|
||||||
# undef optopt
|
|
||||||
# define getopt __GETOPT_ID (getopt)
|
|
||||||
# define optarg __GETOPT_ID (optarg)
|
|
||||||
# define opterr __GETOPT_ID (opterr)
|
|
||||||
# define optind __GETOPT_ID (optind)
|
|
||||||
# define optopt __GETOPT_ID (optopt)
|
|
||||||
|
|
||||||
/* Work around a problem on macOS, which declares getopt with a
|
|
||||||
trailing __DARWIN_ALIAS(getopt) that would expand to something like
|
|
||||||
__asm("_" "rpl_getopt" "$UNIX2003") were it not for the following
|
|
||||||
hack to suppress the macOS declaration <https://bugs.gnu.org/40205>. */
|
|
||||||
# ifdef __APPLE__
|
|
||||||
# define _GETOPT
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/* The system's getopt.h may have already included getopt-core.h to
|
|
||||||
declare the unprefixed identifiers. Undef _GETOPT_CORE_H so that
|
|
||||||
getopt-core.h declares them with prefixes. */
|
|
||||||
# undef _GETOPT_CORE_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <getopt-core.h>
|
|
||||||
|
|
||||||
#endif /* _GETOPT_PFX_CORE_H */
|
|
||||||
@ -1,72 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
|
|
||||||
/* getopt (GNU extensions) gnulib wrapper header.
|
|
||||||
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
|
||||||
This file is part of gnulib.
|
|
||||||
Unlike most of the getopt implementation, it is NOT shared
|
|
||||||
with the GNU C Library.
|
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Lesser General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2.1 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This file is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GETOPT_PFX_EXT_H
|
|
||||||
#define _GETOPT_PFX_EXT_H 1
|
|
||||||
|
|
||||||
/* This header should not be used directly; include getopt.h instead.
|
|
||||||
It does not have a protective #error, because the guard macro for
|
|
||||||
getopt.h in gnulib is not fixed. */
|
|
||||||
|
|
||||||
/* Standalone applications should #define __GETOPT_PREFIX to an
|
|
||||||
identifier that prefixes the external functions and variables
|
|
||||||
defined in getopt-core.h and getopt-ext.h. Systematically
|
|
||||||
rename identifiers so that they do not collide with the system
|
|
||||||
functions and variables. Renaming avoids problems with some
|
|
||||||
compilers and linkers. */
|
|
||||||
#ifdef __GETOPT_PREFIX
|
|
||||||
# ifndef __GETOPT_ID
|
|
||||||
# define __GETOPT_CONCAT(x, y) x ## y
|
|
||||||
# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
|
|
||||||
# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
|
|
||||||
# endif
|
|
||||||
# undef getopt_long
|
|
||||||
# undef getopt_long_only
|
|
||||||
# undef option
|
|
||||||
# undef _getopt_internal
|
|
||||||
# define getopt_long __GETOPT_ID (getopt_long)
|
|
||||||
# define getopt_long_only __GETOPT_ID (getopt_long_only)
|
|
||||||
# define option __GETOPT_ID (option)
|
|
||||||
# define _getopt_internal __GETOPT_ID (getopt_internal)
|
|
||||||
|
|
||||||
/* The system's getopt.h may have already included getopt-ext.h to
|
|
||||||
declare the unprefixed identifiers. Undef _GETOPT_EXT_H so that
|
|
||||||
getopt-ext.h declares them with prefixes. */
|
|
||||||
# undef _GETOPT_EXT_H
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Standalone applications get correct prototypes for getopt_long and
|
|
||||||
getopt_long_only; they declare "char **argv". For backward
|
|
||||||
compatibility with old applications, if __GETOPT_PREFIX is not
|
|
||||||
defined, we supply GNU-libc-compatible, but incorrect, prototypes
|
|
||||||
using "char *const *argv". (GNU libc is stuck with the incorrect
|
|
||||||
prototypes, as they are baked into older versions of LSB.) */
|
|
||||||
#ifndef __getopt_argv_const
|
|
||||||
# if defined __GETOPT_PREFIX
|
|
||||||
# define __getopt_argv_const /* empty */
|
|
||||||
# else
|
|
||||||
# define __getopt_argv_const const
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <getopt-ext.h>
|
|
||||||
|
|
||||||
#endif /* _GETOPT_PFX_EXT_H */
|
|
||||||
1124
lib/getopt.c
1124
lib/getopt.c
File diff suppressed because it is too large
Load Diff
@ -1,60 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
|
|
||||||
/* Declarations for getopt.
|
|
||||||
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
|
||||||
This file is part of gnulib.
|
|
||||||
Unlike most of the getopt implementation, it is NOT shared
|
|
||||||
with the GNU C Library, which supplies a different version of
|
|
||||||
this file.
|
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Lesser General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2.1 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This file is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GETOPT_H
|
|
||||||
|
|
||||||
#define _GETOPT_H 1
|
|
||||||
|
|
||||||
/* Standalone applications should #define __GETOPT_PREFIX to an
|
|
||||||
identifier that prefixes the external functions and variables
|
|
||||||
defined in this header. When this happens, include the
|
|
||||||
headers that might declare getopt so that they will not cause
|
|
||||||
confusion if included after this file. Then systematically rename
|
|
||||||
identifiers so that they do not collide with the system functions
|
|
||||||
and variables. Renaming avoids problems with some compilers and
|
|
||||||
linkers. */
|
|
||||||
#if defined __GETOPT_PREFIX
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <stdio.h>
|
|
||||||
|
|
||||||
# ifndef _MSC_VER
|
|
||||||
# include <unistd.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* From Gnulib's lib/arg-nonnull.h: */
|
|
||||||
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
|
||||||
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
|
||||||
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
|
||||||
#ifndef _GL_ARG_NONNULL
|
|
||||||
# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
|
|
||||||
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
|
||||||
# else
|
|
||||||
# define _GL_ARG_NONNULL(params)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <getopt-cdefs.h>
|
|
||||||
#include <getopt-pfx-core.h>
|
|
||||||
#include <getopt-pfx-ext.h>
|
|
||||||
|
|
||||||
#endif /* _GETOPT_H */
|
|
||||||
@ -1,32 +1,41 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
|
|
||||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||||
Copyright (C) 1987-2023 Free Software Foundation, Inc.
|
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004,2006
|
||||||
This file is part of the GNU C Library and is also part of gnulib.
|
Free Software Foundation, Inc.
|
||||||
Patches to this file should be submitted to both projects.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or modify
|
||||||
modify it under the terms of the GNU Lesser General Public
|
it under the terms of the GNU General Public License as published by
|
||||||
License as published by the Free Software Foundation; either
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
Lesser General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
You should have received a copy of the GNU General Public License along
|
||||||
License along with the GNU C Library; if not, see
|
with this program; if not, write to the Free Software Foundation,
|
||||||
<https://www.gnu.org/licenses/>. */
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
#ifndef _LIBC
|
#ifdef _LIBC
|
||||||
# ifdef HAVE_CONFIG_H
|
# include <getopt.h>
|
||||||
|
#else
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
|
# include "getopt.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "getopt_int.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* This needs to come after some library #include
|
||||||
|
to get __GNU_LIBRARY__ defined. */
|
||||||
|
#ifdef __GNU_LIBRARY__
|
||||||
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "getopt.h"
|
#ifndef NULL
|
||||||
#include "getopt_int.h"
|
#define NULL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
|
getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
|
||||||
@ -42,7 +51,7 @@ _getopt_long_r (int argc, char **argv, const char *options,
|
|||||||
struct _getopt_data *d)
|
struct _getopt_data *d)
|
||||||
{
|
{
|
||||||
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
|
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
|
||||||
0, d, 0);
|
0, 0, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
|
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
|
||||||
@ -65,14 +74,13 @@ _getopt_long_only_r (int argc, char **argv, const char *options,
|
|||||||
struct _getopt_data *d)
|
struct _getopt_data *d)
|
||||||
{
|
{
|
||||||
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
|
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
|
||||||
1, d, 0);
|
1, 0, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
@ -84,7 +92,7 @@ main (int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int this_option_optind = optind ? optind : 1;
|
int this_option_optind = optind ? optind : 1;
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
static const struct option long_options[] =
|
static struct option long_options[] =
|
||||||
{
|
{
|
||||||
{"add", 1, 0, 0},
|
{"add", 1, 0, 0},
|
||||||
{"append", 0, 0, 0},
|
{"append", 0, 0, 0},
|
||||||
@ -134,11 +142,11 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
printf ("option c with value '%s'\n", optarg);
|
printf ("option c with value `%s'\n", optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
printf ("option d with value '%s'\n", optarg);
|
printf ("option d with value `%s'\n", optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '?':
|
case '?':
|
||||||
|
|||||||
226
lib/getopt_.h
Normal file
226
lib/getopt_.h
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
/* Declarations for getopt.
|
||||||
|
Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2005,2006,2007
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef _GETOPT_H
|
||||||
|
|
||||||
|
#ifndef __need_getopt
|
||||||
|
# define _GETOPT_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Standalone applications should #define __GETOPT_PREFIX to an
|
||||||
|
identifier that prefixes the external functions and variables
|
||||||
|
defined in this header. When this happens, include the
|
||||||
|
headers that might declare getopt so that they will not cause
|
||||||
|
confusion if included after this file. Then systematically rename
|
||||||
|
identifiers so that they do not collide with the system functions
|
||||||
|
and variables. Renaming avoids problems with some compilers and
|
||||||
|
linkers. */
|
||||||
|
#if defined __GETOPT_PREFIX && !defined __need_getopt
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
# undef __need_getopt
|
||||||
|
# undef getopt
|
||||||
|
# undef getopt_long
|
||||||
|
# undef getopt_long_only
|
||||||
|
# undef optarg
|
||||||
|
# undef opterr
|
||||||
|
# undef optind
|
||||||
|
# undef optopt
|
||||||
|
# define __GETOPT_CONCAT(x, y) x ## y
|
||||||
|
# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
|
||||||
|
# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
|
||||||
|
# define getopt __GETOPT_ID (getopt)
|
||||||
|
# define getopt_long __GETOPT_ID (getopt_long)
|
||||||
|
# define getopt_long_only __GETOPT_ID (getopt_long_only)
|
||||||
|
# define optarg __GETOPT_ID (optarg)
|
||||||
|
# define opterr __GETOPT_ID (opterr)
|
||||||
|
# define optind __GETOPT_ID (optind)
|
||||||
|
# define optopt __GETOPT_ID (optopt)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Standalone applications get correct prototypes for getopt_long and
|
||||||
|
getopt_long_only; they declare "char **argv". libc uses prototypes
|
||||||
|
with "char *const *argv" that are incorrect because getopt_long and
|
||||||
|
getopt_long_only can permute argv; this is required for backward
|
||||||
|
compatibility (e.g., for LSB 2.0.1).
|
||||||
|
|
||||||
|
This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt',
|
||||||
|
but it caused redefinition warnings if both unistd.h and getopt.h were
|
||||||
|
included, since unistd.h includes getopt.h having previously defined
|
||||||
|
__need_getopt.
|
||||||
|
|
||||||
|
The only place where __getopt_argv_const is used is in definitions
|
||||||
|
of getopt_long and getopt_long_only below, but these are visible
|
||||||
|
only if __need_getopt is not defined, so it is quite safe to rewrite
|
||||||
|
the conditional as follows:
|
||||||
|
*/
|
||||||
|
#if !defined __need_getopt
|
||||||
|
# if defined __GETOPT_PREFIX
|
||||||
|
# define __getopt_argv_const /* empty */
|
||||||
|
# else
|
||||||
|
# define __getopt_argv_const const
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If __GNU_LIBRARY__ is not already defined, either we are being used
|
||||||
|
standalone, or this is the first header included in the source file.
|
||||||
|
If we are being used with glibc, we need to include <features.h>, but
|
||||||
|
that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
|
||||||
|
not defined, include <ctype.h>, which will pull in <features.h> for us
|
||||||
|
if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
|
||||||
|
doesn't flood the namespace with stuff the way some other headers do.) */
|
||||||
|
#if !defined __GNU_LIBRARY__
|
||||||
|
# include <ctype.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __THROW
|
||||||
|
# ifndef __GNUC_PREREQ
|
||||||
|
# define __GNUC_PREREQ(maj, min) (0)
|
||||||
|
# endif
|
||||||
|
# if defined __cplusplus && __GNUC_PREREQ (2,8)
|
||||||
|
# define __THROW throw ()
|
||||||
|
# else
|
||||||
|
# define __THROW
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For communication from `getopt' to the caller.
|
||||||
|
When `getopt' finds an option that takes an argument,
|
||||||
|
the argument value is returned here.
|
||||||
|
Also, when `ordering' is RETURN_IN_ORDER,
|
||||||
|
each non-option ARGV-element is returned here. */
|
||||||
|
|
||||||
|
extern char *optarg;
|
||||||
|
|
||||||
|
/* Index in ARGV of the next element to be scanned.
|
||||||
|
This is used for communication to and from the caller
|
||||||
|
and for communication between successive calls to `getopt'.
|
||||||
|
|
||||||
|
On entry to `getopt', zero means this is the first call; initialize.
|
||||||
|
|
||||||
|
When `getopt' returns -1, this is the index of the first of the
|
||||||
|
non-option elements that the caller should itself scan.
|
||||||
|
|
||||||
|
Otherwise, `optind' communicates from one call to the next
|
||||||
|
how much of ARGV has been scanned so far. */
|
||||||
|
|
||||||
|
extern int optind;
|
||||||
|
|
||||||
|
/* Callers store zero here to inhibit the error message `getopt' prints
|
||||||
|
for unrecognized options. */
|
||||||
|
|
||||||
|
extern int opterr;
|
||||||
|
|
||||||
|
/* Set to an option character which was unrecognized. */
|
||||||
|
|
||||||
|
extern int optopt;
|
||||||
|
|
||||||
|
#ifndef __need_getopt
|
||||||
|
/* Describe the long-named options requested by the application.
|
||||||
|
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||||
|
of `struct option' terminated by an element containing a name which is
|
||||||
|
zero.
|
||||||
|
|
||||||
|
The field `has_arg' is:
|
||||||
|
no_argument (or 0) if the option does not take an argument,
|
||||||
|
required_argument (or 1) if the option requires an argument,
|
||||||
|
optional_argument (or 2) if the option takes an optional argument.
|
||||||
|
|
||||||
|
If the field `flag' is not NULL, it points to a variable that is set
|
||||||
|
to the value given in the field `val' when the option is found, but
|
||||||
|
left unchanged if the option is not found.
|
||||||
|
|
||||||
|
To have a long-named option do something other than set an `int' to
|
||||||
|
a compiled-in constant, such as set a value from `optarg', set the
|
||||||
|
option's `flag' field to zero and its `val' field to a nonzero
|
||||||
|
value (the equivalent single-letter option character, if there is
|
||||||
|
one). For long options that have a zero `flag' field, `getopt'
|
||||||
|
returns the contents of the `val' field. */
|
||||||
|
|
||||||
|
struct option
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
/* has_arg can't be an enum because some compilers complain about
|
||||||
|
type mismatches in all the code that assumes it is an int. */
|
||||||
|
int has_arg;
|
||||||
|
int *flag;
|
||||||
|
int val;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Names for the values of the `has_arg' field of `struct option'. */
|
||||||
|
|
||||||
|
# define no_argument 0
|
||||||
|
# define required_argument 1
|
||||||
|
# define optional_argument 2
|
||||||
|
#endif /* need getopt */
|
||||||
|
|
||||||
|
|
||||||
|
/* Get definitions and prototypes for functions to process the
|
||||||
|
arguments in ARGV (ARGC of them, minus the program name) for
|
||||||
|
options given in OPTS.
|
||||||
|
|
||||||
|
Return the option character from OPTS just read. Return -1 when
|
||||||
|
there are no more options. For unrecognized options, or options
|
||||||
|
missing arguments, `optopt' is set to the option letter, and '?' is
|
||||||
|
returned.
|
||||||
|
|
||||||
|
The OPTS string is a list of characters which are recognized option
|
||||||
|
letters, optionally followed by colons, specifying that that letter
|
||||||
|
takes an argument, to be placed in `optarg'.
|
||||||
|
|
||||||
|
If a letter in OPTS is followed by two colons, its argument is
|
||||||
|
optional. This behavior is specific to the GNU `getopt'.
|
||||||
|
|
||||||
|
The argument `--' causes premature termination of argument
|
||||||
|
scanning, explicitly telling `getopt' that there are no more
|
||||||
|
options.
|
||||||
|
|
||||||
|
If OPTS begins with `-', then non-option arguments are treated as
|
||||||
|
arguments to the option '\1'. This behavior is specific to the GNU
|
||||||
|
`getopt'. If OPTS begins with `+', or POSIXLY_CORRECT is set in
|
||||||
|
the environment, then do not permute arguments. */
|
||||||
|
|
||||||
|
extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
|
||||||
|
__THROW;
|
||||||
|
|
||||||
|
#ifndef __need_getopt
|
||||||
|
extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
|
||||||
|
const char *__shortopts,
|
||||||
|
const struct option *__longopts, int *__longind)
|
||||||
|
__THROW;
|
||||||
|
extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
|
||||||
|
const char *__shortopts,
|
||||||
|
const struct option *__longopts, int *__longind)
|
||||||
|
__THROW;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Make sure we later can get all the definitions and declarations. */
|
||||||
|
#undef __need_getopt
|
||||||
|
|
||||||
|
#endif /* getopt.h */
|
||||||
109
lib/getopt_int.h
109
lib/getopt_int.h
@ -1,29 +1,25 @@
|
|||||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
||||||
|
|
||||||
/* Internal declarations for getopt.
|
/* Internal declarations for getopt.
|
||||||
Copyright (C) 1989-2023 Free Software Foundation, Inc.
|
Copyright (C) 1989-1994,1996-1999,2001,2003,2004
|
||||||
This file is part of the GNU C Library and is also part of gnulib.
|
Free Software Foundation, Inc.
|
||||||
Patches to this file should be submitted to both projects.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or modify
|
||||||
modify it under the terms of the GNU Lesser General Public
|
it under the terms of the GNU General Public License as published by
|
||||||
License as published by the Free Software Foundation; either
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
Lesser General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
You should have received a copy of the GNU General Public License along
|
||||||
License along with the GNU C Library; if not, see
|
with this program; if not, write to the Free Software Foundation,
|
||||||
<https://www.gnu.org/licenses/>. */
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
#ifndef _GETOPT_INT_H
|
#ifndef _GETOPT_INT_H
|
||||||
#define _GETOPT_INT_H 1
|
#define _GETOPT_INT_H 1
|
||||||
|
|
||||||
#include <getopt.h>
|
|
||||||
|
|
||||||
extern int _getopt_internal (int ___argc, char **___argv,
|
extern int _getopt_internal (int ___argc, char **___argv,
|
||||||
const char *__shortopts,
|
const char *__shortopts,
|
||||||
const struct option *__longopts, int *__longind,
|
const struct option *__longopts, int *__longind,
|
||||||
@ -33,32 +29,6 @@ extern int _getopt_internal (int ___argc, char **___argv,
|
|||||||
/* Reentrant versions which can handle parsing multiple argument
|
/* Reentrant versions which can handle parsing multiple argument
|
||||||
vectors at the same time. */
|
vectors at the same time. */
|
||||||
|
|
||||||
/* Describe how to deal with options that follow non-option ARGV-elements.
|
|
||||||
|
|
||||||
REQUIRE_ORDER means don't recognize them as options; stop option
|
|
||||||
processing when the first non-option is seen. This is what POSIX
|
|
||||||
specifies should happen.
|
|
||||||
|
|
||||||
PERMUTE means permute the contents of ARGV as we scan, so that
|
|
||||||
eventually all the non-options are at the end. This allows options
|
|
||||||
to be given in any order, even with programs that were not written
|
|
||||||
to expect this.
|
|
||||||
|
|
||||||
RETURN_IN_ORDER is an option available to programs that were
|
|
||||||
written to expect options and other ARGV-elements in any order
|
|
||||||
and that care about the ordering of the two. We describe each
|
|
||||||
non-option ARGV-element as if it were the argument of an option
|
|
||||||
with character code 1.
|
|
||||||
|
|
||||||
The special argument '--' forces an end of option-scanning regardless
|
|
||||||
of the value of 'ordering'. In the case of RETURN_IN_ORDER, only
|
|
||||||
'--' can cause 'getopt' to return -1 with 'optind' != ARGC. */
|
|
||||||
|
|
||||||
enum __ord
|
|
||||||
{
|
|
||||||
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Data type for reentrant functions. */
|
/* Data type for reentrant functions. */
|
||||||
struct _getopt_data
|
struct _getopt_data
|
||||||
{
|
{
|
||||||
@ -83,17 +53,58 @@ struct _getopt_data
|
|||||||
by advancing to the next ARGV-element. */
|
by advancing to the next ARGV-element. */
|
||||||
char *__nextchar;
|
char *__nextchar;
|
||||||
|
|
||||||
/* See __ord above. */
|
/* Describe how to deal with options that follow non-option ARGV-elements.
|
||||||
enum __ord __ordering;
|
|
||||||
|
If the caller did not specify anything,
|
||||||
|
the default is REQUIRE_ORDER if the environment variable
|
||||||
|
POSIXLY_CORRECT is defined, PERMUTE otherwise.
|
||||||
|
|
||||||
|
REQUIRE_ORDER means don't recognize them as options;
|
||||||
|
stop option processing when the first non-option is seen.
|
||||||
|
This is what Unix does.
|
||||||
|
This mode of operation is selected by either setting the environment
|
||||||
|
variable POSIXLY_CORRECT, or using `+' as the first character
|
||||||
|
of the list of option characters, or by calling getopt.
|
||||||
|
|
||||||
|
PERMUTE is the default. We permute the contents of ARGV as we
|
||||||
|
scan, so that eventually all the non-options are at the end.
|
||||||
|
This allows options to be given in any order, even with programs
|
||||||
|
that were not written to expect this.
|
||||||
|
|
||||||
|
RETURN_IN_ORDER is an option available to programs that were
|
||||||
|
written to expect options and other ARGV-elements in any order
|
||||||
|
and that care about the ordering of the two. We describe each
|
||||||
|
non-option ARGV-element as if it were the argument of an option
|
||||||
|
with character code 1. Using `-' as the first character of the
|
||||||
|
list of option characters selects this mode of operation.
|
||||||
|
|
||||||
|
The special argument `--' forces an end of option-scanning regardless
|
||||||
|
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
||||||
|
`--' can cause `getopt' to return -1 with `optind' != ARGC. */
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
|
||||||
|
} __ordering;
|
||||||
|
|
||||||
|
/* If the POSIXLY_CORRECT environment variable is set
|
||||||
|
or getopt was called. */
|
||||||
|
int __posixly_correct;
|
||||||
|
|
||||||
|
|
||||||
/* Handle permutation of arguments. */
|
/* Handle permutation of arguments. */
|
||||||
|
|
||||||
/* Describe the part of ARGV that contains non-options that have
|
/* Describe the part of ARGV that contains non-options that have
|
||||||
been skipped. 'first_nonopt' is the index in ARGV of the first
|
been skipped. `first_nonopt' is the index in ARGV of the first
|
||||||
of them; 'last_nonopt' is the index after the last of them. */
|
of them; `last_nonopt' is the index after the last of them. */
|
||||||
|
|
||||||
int __first_nonopt;
|
int __first_nonopt;
|
||||||
int __last_nonopt;
|
int __last_nonopt;
|
||||||
|
|
||||||
|
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
||||||
|
int __nonoption_flags_max_len;
|
||||||
|
int __nonoption_flags_len;
|
||||||
|
# endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The initializer is necessary to set OPTIND and OPTERR to their
|
/* The initializer is necessary to set OPTIND and OPTERR to their
|
||||||
@ -103,8 +114,8 @@ struct _getopt_data
|
|||||||
extern int _getopt_internal_r (int ___argc, char **___argv,
|
extern int _getopt_internal_r (int ___argc, char **___argv,
|
||||||
const char *__shortopts,
|
const char *__shortopts,
|
||||||
const struct option *__longopts, int *__longind,
|
const struct option *__longopts, int *__longind,
|
||||||
int __long_only, struct _getopt_data *__data,
|
int __long_only, int __posixly_correct,
|
||||||
int __posixly_correct);
|
struct _getopt_data *__data);
|
||||||
|
|
||||||
extern int _getopt_long_r (int ___argc, char **___argv,
|
extern int _getopt_long_r (int ___argc, char **___argv,
|
||||||
const char *__shortopts,
|
const char *__shortopts,
|
||||||
|
|||||||
240
lib/gettext.h
Normal file
240
lib/gettext.h
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
/* Convenience header for conditional use of GNU <libintl.h>.
|
||||||
|
Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Library General Public License as published
|
||||||
|
by the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifndef _LIBGETTEXT_H
|
||||||
|
#define _LIBGETTEXT_H 1
|
||||||
|
|
||||||
|
/* NLS can be disabled through the configure --disable-nls option.
|
||||||
|
*
|
||||||
|
* Extra hack in LZMA Utils: if DISABLE_NLS is defined, NLS is disabled
|
||||||
|
* even if ENABLE_NLS is true. See Makefile.am for more information.
|
||||||
|
*/
|
||||||
|
#if ENABLE_NLS && !defined(DISABLE_NLS)
|
||||||
|
|
||||||
|
/* Get declarations of GNU message catalog functions. */
|
||||||
|
# include <libintl.h>
|
||||||
|
|
||||||
|
/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
|
||||||
|
the gettext() and ngettext() macros. This is an alternative to calling
|
||||||
|
textdomain(), and is useful for libraries. */
|
||||||
|
# ifdef DEFAULT_TEXT_DOMAIN
|
||||||
|
# undef gettext
|
||||||
|
# define gettext(Msgid) \
|
||||||
|
dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
|
||||||
|
# undef ngettext
|
||||||
|
# define ngettext(Msgid1, Msgid2, N) \
|
||||||
|
dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
|
||||||
|
chokes if dcgettext is defined as a macro. So include it now, to make
|
||||||
|
later inclusions of <locale.h> a NOP. We don't include <libintl.h>
|
||||||
|
as well because people using "gettext.h" will not include <libintl.h>,
|
||||||
|
and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
|
||||||
|
is OK. */
|
||||||
|
#if defined(__sun)
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
|
||||||
|
<libintl.h>, which chokes if dcgettext is defined as a macro. So include
|
||||||
|
it now, to make later inclusions of <libintl.h> a NOP. */
|
||||||
|
#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
|
||||||
|
# include <cstdlib>
|
||||||
|
# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H
|
||||||
|
# include <libintl.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Disabled NLS.
|
||||||
|
The casts to 'const char *' serve the purpose of producing warnings
|
||||||
|
for invalid uses of the value returned from these functions.
|
||||||
|
On pre-ANSI systems without 'const', the config.h file is supposed to
|
||||||
|
contain "#define const". */
|
||||||
|
# define gettext(Msgid) ((const char *) (Msgid))
|
||||||
|
# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
|
||||||
|
# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
|
||||||
|
# define ngettext(Msgid1, Msgid2, N) \
|
||||||
|
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
||||||
|
# define dngettext(Domainname, Msgid1, Msgid2, N) \
|
||||||
|
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
||||||
|
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
|
||||||
|
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
||||||
|
# define textdomain(Domainname) ((const char *) (Domainname))
|
||||||
|
# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
|
||||||
|
# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* A pseudo function call that serves as a marker for the automated
|
||||||
|
extraction of messages, but does not call gettext(). The run-time
|
||||||
|
translation is done at a different place in the code.
|
||||||
|
The argument, String, should be a literal string. Concatenated strings
|
||||||
|
and other string expressions won't work.
|
||||||
|
The macro's expansion is not parenthesized, so that it is suitable as
|
||||||
|
initializer for static 'char[]' or 'const char[]' variables. */
|
||||||
|
#define gettext_noop(String) String
|
||||||
|
|
||||||
|
/* The separator between msgctxt and msgid in a .mo file. */
|
||||||
|
#define GETTEXT_CONTEXT_GLUE "\004"
|
||||||
|
|
||||||
|
/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
|
||||||
|
MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
|
||||||
|
short and rarely need to change.
|
||||||
|
The letter 'p' stands for 'particular' or 'special'. */
|
||||||
|
#ifdef DEFAULT_TEXT_DOMAIN
|
||||||
|
# define pgettext(Msgctxt, Msgid) \
|
||||||
|
pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||||
|
#else
|
||||||
|
# define pgettext(Msgctxt, Msgid) \
|
||||||
|
pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||||
|
#endif
|
||||||
|
#define dpgettext(Domainname, Msgctxt, Msgid) \
|
||||||
|
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
|
||||||
|
#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
|
||||||
|
pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
|
||||||
|
#ifdef DEFAULT_TEXT_DOMAIN
|
||||||
|
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
#else
|
||||||
|
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
#endif
|
||||||
|
#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
|
||||||
|
npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
|
||||||
|
|
||||||
|
static inline const char *
|
||||||
|
pgettext_aux (const char *domain,
|
||||||
|
const char *msg_ctxt_id, const char *msgid,
|
||||||
|
int category)
|
||||||
|
{
|
||||||
|
const char *translation = dcgettext (domain, msg_ctxt_id, category);
|
||||||
|
if (translation == msg_ctxt_id)
|
||||||
|
return msgid;
|
||||||
|
else
|
||||||
|
return translation;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const char *
|
||||||
|
npgettext_aux (const char *domain,
|
||||||
|
const char *msg_ctxt_id, const char *msgid,
|
||||||
|
const char *msgid_plural, unsigned long int n,
|
||||||
|
int category)
|
||||||
|
{
|
||||||
|
const char *translation =
|
||||||
|
dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
|
||||||
|
if (translation == msg_ctxt_id || translation == msgid_plural)
|
||||||
|
return (n == 1 ? msgid : msgid_plural);
|
||||||
|
else
|
||||||
|
return translation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
|
||||||
|
can be arbitrary expressions. But for string literals these macros are
|
||||||
|
less efficient than those above. */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
|
||||||
|
|
||||||
|
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define pgettext_expr(Msgctxt, Msgid) \
|
||||||
|
dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
|
||||||
|
#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
|
||||||
|
dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
|
||||||
|
|
||||||
|
static inline const char *
|
||||||
|
dcpgettext_expr (const char *domain,
|
||||||
|
const char *msgctxt, const char *msgid,
|
||||||
|
int category)
|
||||||
|
{
|
||||||
|
size_t msgctxt_len = strlen (msgctxt) + 1;
|
||||||
|
size_t msgid_len = strlen (msgid) + 1;
|
||||||
|
const char *translation;
|
||||||
|
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
char msg_ctxt_id[msgctxt_len + msgid_len];
|
||||||
|
#else
|
||||||
|
char buf[1024];
|
||||||
|
char *msg_ctxt_id =
|
||||||
|
(msgctxt_len + msgid_len <= sizeof (buf)
|
||||||
|
? buf
|
||||||
|
: (char *) malloc (msgctxt_len + msgid_len));
|
||||||
|
if (msg_ctxt_id != NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
|
||||||
|
msg_ctxt_id[msgctxt_len - 1] = '\004';
|
||||||
|
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
|
||||||
|
translation = dcgettext (domain, msg_ctxt_id, category);
|
||||||
|
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
if (msg_ctxt_id != buf)
|
||||||
|
free (msg_ctxt_id);
|
||||||
|
#endif
|
||||||
|
if (translation != msg_ctxt_id)
|
||||||
|
return translation;
|
||||||
|
}
|
||||||
|
return msgid;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
|
||||||
|
dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
|
||||||
|
|
||||||
|
static inline const char *
|
||||||
|
dcnpgettext_expr (const char *domain,
|
||||||
|
const char *msgctxt, const char *msgid,
|
||||||
|
const char *msgid_plural, unsigned long int n,
|
||||||
|
int category)
|
||||||
|
{
|
||||||
|
size_t msgctxt_len = strlen (msgctxt) + 1;
|
||||||
|
size_t msgid_len = strlen (msgid) + 1;
|
||||||
|
const char *translation;
|
||||||
|
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
char msg_ctxt_id[msgctxt_len + msgid_len];
|
||||||
|
#else
|
||||||
|
char buf[1024];
|
||||||
|
char *msg_ctxt_id =
|
||||||
|
(msgctxt_len + msgid_len <= sizeof (buf)
|
||||||
|
? buf
|
||||||
|
: (char *) malloc (msgctxt_len + msgid_len));
|
||||||
|
if (msg_ctxt_id != NULL)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
|
||||||
|
msg_ctxt_id[msgctxt_len - 1] = '\004';
|
||||||
|
memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
|
||||||
|
translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
|
||||||
|
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
|
if (msg_ctxt_id != buf)
|
||||||
|
free (msg_ctxt_id);
|
||||||
|
#endif
|
||||||
|
if (!(translation == msg_ctxt_id || translation == msgid_plural))
|
||||||
|
return translation;
|
||||||
|
}
|
||||||
|
return (n == 1 ? msgid : msgid_plural);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _LIBGETTEXT_H */
|
||||||
40
m4/.gitignore
vendored
40
m4/.gitignore
vendored
@ -1,40 +0,0 @@
|
|||||||
build-to-host.m4
|
|
||||||
codeset.m4
|
|
||||||
extern-inline.m4
|
|
||||||
fcntl-o.m4
|
|
||||||
gettext.m4
|
|
||||||
glibc2.m4
|
|
||||||
glibc21.m4
|
|
||||||
host-cpu-c-abi.m4
|
|
||||||
iconv.m4
|
|
||||||
intdiv0.m4
|
|
||||||
intl.m4
|
|
||||||
intldir.m4
|
|
||||||
intlmacosx.m4
|
|
||||||
intmax.m4
|
|
||||||
inttypes-pri.m4
|
|
||||||
inttypes_h.m4
|
|
||||||
lcmessage.m4
|
|
||||||
lib-ld.m4
|
|
||||||
lib-link.m4
|
|
||||||
lib-prefix.m4
|
|
||||||
libtool.m4
|
|
||||||
lock.m4
|
|
||||||
longdouble.m4
|
|
||||||
longlong.m4
|
|
||||||
ltoptions.m4
|
|
||||||
ltsugar.m4
|
|
||||||
ltversion.m4
|
|
||||||
lt~obsolete.m4
|
|
||||||
nls.m4
|
|
||||||
po.m4
|
|
||||||
printf-posix.m4
|
|
||||||
progtest.m4
|
|
||||||
size_max.m4
|
|
||||||
stdint_h.m4
|
|
||||||
threadlib.m4
|
|
||||||
uintmax_t.m4
|
|
||||||
ulonglong.m4
|
|
||||||
wchar_t.m4
|
|
||||||
wint_t.m4
|
|
||||||
xsize.m4
|
|
||||||
279
m4/acx_pthread.m4
Normal file
279
m4/acx_pthread.m4
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
##### http://autoconf-archive.cryp.to/acx_pthread.html
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro figures out how to build C programs using POSIX threads.
|
||||||
|
# It sets the PTHREAD_LIBS output variable to the threads library and
|
||||||
|
# linker flags, and the PTHREAD_CFLAGS output variable to any special
|
||||||
|
# C compiler flags that are needed. (The user can also force certain
|
||||||
|
# compiler flags/libs to be tested by setting these environment
|
||||||
|
# variables.)
|
||||||
|
#
|
||||||
|
# Also sets PTHREAD_CC to any special C compiler that is needed for
|
||||||
|
# multi-threaded programs (defaults to the value of CC otherwise).
|
||||||
|
# (This is necessary on AIX to use the special cc_r compiler alias.)
|
||||||
|
#
|
||||||
|
# NOTE: You are assumed to not only compile your program with these
|
||||||
|
# flags, but also link it with them as well. e.g. you should link
|
||||||
|
# with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
|
||||||
|
# $LIBS
|
||||||
|
#
|
||||||
|
# If you are only building threads programs, you may wish to use
|
||||||
|
# these variables in your default LIBS, CFLAGS, and CC:
|
||||||
|
#
|
||||||
|
# LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
# CC="$PTHREAD_CC"
|
||||||
|
#
|
||||||
|
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
|
||||||
|
# constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
|
||||||
|
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
||||||
|
#
|
||||||
|
# ACTION-IF-FOUND is a list of shell commands to run if a threads
|
||||||
|
# library is found, and ACTION-IF-NOT-FOUND is a list of commands to
|
||||||
|
# run it if it is not found. If ACTION-IF-FOUND is not specified, the
|
||||||
|
# default action will define HAVE_PTHREAD.
|
||||||
|
#
|
||||||
|
# Please let the authors know if this macro fails on any platform, or
|
||||||
|
# if you have any other suggestions or comments. This macro was based
|
||||||
|
# on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/)
|
||||||
|
# (with help from M. Frigo), as well as ac_pthread and hb_pthread
|
||||||
|
# macros posted by Alejandro Forero Cuervo to the autoconf macro
|
||||||
|
# repository. We are also grateful for the helpful feedback of
|
||||||
|
# numerous users.
|
||||||
|
#
|
||||||
|
# LAST MODIFICATION
|
||||||
|
#
|
||||||
|
# 2007-07-29
|
||||||
|
#
|
||||||
|
# COPYLEFT
|
||||||
|
#
|
||||||
|
# Copyright (c) 2007 Steven G. Johnson <stevenj@alum.mit.edu>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see
|
||||||
|
# <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
# As a special exception, the respective Autoconf Macro's copyright
|
||||||
|
# owner gives unlimited permission to copy, distribute and modify the
|
||||||
|
# configure scripts that are the output of Autoconf when processing
|
||||||
|
# the Macro. You need not follow the terms of the GNU General Public
|
||||||
|
# License when using or distributing such scripts, even though
|
||||||
|
# portions of the text of the Macro appear in them. The GNU General
|
||||||
|
# Public License (GPL) does govern all other use of the material that
|
||||||
|
# constitutes the Autoconf Macro.
|
||||||
|
#
|
||||||
|
# This special exception to the GPL applies to versions of the
|
||||||
|
# Autoconf Macro released by the Autoconf Macro Archive. When you
|
||||||
|
# make and distribute a modified version of the Autoconf Macro, you
|
||||||
|
# may extend this special exception to the GPL to apply to your
|
||||||
|
# modified version as well.
|
||||||
|
|
||||||
|
AC_DEFUN([ACX_PTHREAD], [
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
AC_LANG_SAVE
|
||||||
|
AC_LANG_C
|
||||||
|
acx_pthread_ok=no
|
||||||
|
|
||||||
|
# We used to check for pthread.h first, but this fails if pthread.h
|
||||||
|
# requires special compiler flags (e.g. on True64 or Sequent).
|
||||||
|
# It gets checked for in the link test anyway.
|
||||||
|
|
||||||
|
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
||||||
|
# etcetera environment variables, and if threads linking works using
|
||||||
|
# them:
|
||||||
|
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
|
||||||
|
save_CFLAGS="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
|
||||||
|
AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
|
||||||
|
AC_MSG_RESULT($acx_pthread_ok)
|
||||||
|
if test x"$acx_pthread_ok" = xno; then
|
||||||
|
PTHREAD_LIBS=""
|
||||||
|
PTHREAD_CFLAGS=""
|
||||||
|
fi
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
CFLAGS="$save_CFLAGS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We must check for the threads library under a number of different
|
||||||
|
# names; the ordering is very important because some systems
|
||||||
|
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
||||||
|
# libraries is broken (non-POSIX).
|
||||||
|
|
||||||
|
# Create a list of thread flags to try. Items starting with a "-" are
|
||||||
|
# C compiler flags, and other items are library names, except for "none"
|
||||||
|
# which indicates that we try without any flags at all, and "pthread-config"
|
||||||
|
# which is a program returning the flags for the Pth emulation library.
|
||||||
|
|
||||||
|
acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
||||||
|
|
||||||
|
# The ordering *is* (sometimes) important. Some notes on the
|
||||||
|
# individual items follow:
|
||||||
|
|
||||||
|
# pthreads: AIX (must check this before -lpthread)
|
||||||
|
# none: in case threads are in libc; should be tried before -Kthread and
|
||||||
|
# other compiler flags to prevent continual compiler warnings
|
||||||
|
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
||||||
|
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
||||||
|
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
||||||
|
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
|
||||||
|
# -pthreads: Solaris/gcc
|
||||||
|
# -mthreads: Mingw32/gcc, Lynx/gcc
|
||||||
|
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
||||||
|
# doesn't hurt to check since this sometimes defines pthreads too;
|
||||||
|
# also defines -D_REENTRANT)
|
||||||
|
# ... -mt is also the pthreads flag for HP/aCC
|
||||||
|
# pthread: Linux, etcetera
|
||||||
|
# --thread-safe: KAI C++
|
||||||
|
# pthread-config: use pthread-config program (for GNU Pth library)
|
||||||
|
|
||||||
|
case "${host_cpu}-${host_os}" in
|
||||||
|
*solaris*)
|
||||||
|
|
||||||
|
# On Solaris (at least, for some versions), libc contains stubbed
|
||||||
|
# (non-functional) versions of the pthreads routines, so link-based
|
||||||
|
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
|
||||||
|
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
|
||||||
|
# a function called by this macro, so we could check for that, but
|
||||||
|
# who knows whether they'll stub that too in a future libc.) So,
|
||||||
|
# we'll just look for -pthreads and -lpthread first:
|
||||||
|
|
||||||
|
acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test x"$acx_pthread_ok" = xno; then
|
||||||
|
for flag in $acx_pthread_flags; do
|
||||||
|
|
||||||
|
case $flag in
|
||||||
|
none)
|
||||||
|
AC_MSG_CHECKING([whether pthreads work without any flags])
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
AC_MSG_CHECKING([whether pthreads work with $flag])
|
||||||
|
PTHREAD_CFLAGS="$flag"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pthread-config)
|
||||||
|
AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
|
||||||
|
if test x"$acx_pthread_config" = xno; then continue; fi
|
||||||
|
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
||||||
|
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
AC_MSG_CHECKING([for the pthreads library -l$flag])
|
||||||
|
PTHREAD_LIBS="-l$flag"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
save_CFLAGS="$CFLAGS"
|
||||||
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
|
||||||
|
# Check for various functions. We must include pthread.h,
|
||||||
|
# since some functions may be macros. (On the Sequent, we
|
||||||
|
# need a special flag -Kthread to make this header compile.)
|
||||||
|
# We check for pthread_join because it is in -lpthread on IRIX
|
||||||
|
# while pthread_create is in libc. We check for pthread_attr_init
|
||||||
|
# due to DEC craziness with -lpthreads. We check for
|
||||||
|
# pthread_cleanup_push because it is one of the few pthread
|
||||||
|
# functions on Solaris that doesn't have a non-functional libc stub.
|
||||||
|
# We try pthread_create on general principles.
|
||||||
|
AC_TRY_LINK([#include <pthread.h>],
|
||||||
|
[pthread_t th; pthread_join(th, 0);
|
||||||
|
pthread_attr_init(0); pthread_cleanup_push(0, 0);
|
||||||
|
pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
|
||||||
|
[acx_pthread_ok=yes])
|
||||||
|
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
CFLAGS="$save_CFLAGS"
|
||||||
|
|
||||||
|
AC_MSG_RESULT($acx_pthread_ok)
|
||||||
|
if test "x$acx_pthread_ok" = xyes; then
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
|
||||||
|
PTHREAD_LIBS=""
|
||||||
|
PTHREAD_CFLAGS=""
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Various other checks:
|
||||||
|
if test "x$acx_pthread_ok" = xyes; then
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
save_CFLAGS="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
|
||||||
|
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
||||||
|
AC_MSG_CHECKING([for joinable pthread attribute])
|
||||||
|
attr_name=unknown
|
||||||
|
for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
||||||
|
AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
|
||||||
|
[attr_name=$attr; break])
|
||||||
|
done
|
||||||
|
AC_MSG_RESULT($attr_name)
|
||||||
|
if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
|
||||||
|
AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
|
||||||
|
[Define to necessary symbol if this constant
|
||||||
|
uses a non-standard name on your system.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if more special flags are required for pthreads])
|
||||||
|
flag=no
|
||||||
|
case "${host_cpu}-${host_os}" in
|
||||||
|
*-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
|
||||||
|
*solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
|
||||||
|
esac
|
||||||
|
AC_MSG_RESULT(${flag})
|
||||||
|
if test "x$flag" != xno; then
|
||||||
|
PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
CFLAGS="$save_CFLAGS"
|
||||||
|
|
||||||
|
# More AIX lossage: must compile with xlc_r or cc_r
|
||||||
|
if test x"$GCC" != xyes; then
|
||||||
|
AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
|
||||||
|
else
|
||||||
|
PTHREAD_CC=$CC
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
PTHREAD_CC="$CC"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(PTHREAD_LIBS)
|
||||||
|
AC_SUBST(PTHREAD_CFLAGS)
|
||||||
|
AC_SUBST(PTHREAD_CC)
|
||||||
|
|
||||||
|
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
||||||
|
if test x"$acx_pthread_ok" = xyes; then
|
||||||
|
ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
|
||||||
|
:
|
||||||
|
else
|
||||||
|
acx_pthread_ok=no
|
||||||
|
$2
|
||||||
|
fi
|
||||||
|
AC_LANG_RESTORE
|
||||||
|
])dnl ACX_PTHREAD
|
||||||
524
m4/ax_pthread.m4
524
m4/ax_pthread.m4
@ -1,524 +0,0 @@
|
|||||||
dnl SPDX-License-Identifier: GPL-3.0-or-later WITH Autoconf-exception-macro
|
|
||||||
|
|
||||||
# ===========================================================================
|
|
||||||
# https://www.gnu.org/software/autoconf-archive/ax_pthread.html
|
|
||||||
# ===========================================================================
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# This macro figures out how to build C programs using POSIX threads. It
|
|
||||||
# sets the PTHREAD_LIBS output variable to the threads library and linker
|
|
||||||
# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
|
|
||||||
# flags that are needed. (The user can also force certain compiler
|
|
||||||
# flags/libs to be tested by setting these environment variables.)
|
|
||||||
#
|
|
||||||
# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is
|
|
||||||
# needed for multi-threaded programs (defaults to the value of CC
|
|
||||||
# respectively CXX otherwise). (This is necessary on e.g. AIX to use the
|
|
||||||
# special cc_r/CC_r compiler alias.)
|
|
||||||
#
|
|
||||||
# NOTE: You are assumed to not only compile your program with these flags,
|
|
||||||
# but also to link with them as well. For example, you might link with
|
|
||||||
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
|
|
||||||
# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
|
|
||||||
#
|
|
||||||
# If you are only building threaded programs, you may wish to use these
|
|
||||||
# variables in your default LIBS, CFLAGS, and CC:
|
|
||||||
#
|
|
||||||
# LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS"
|
|
||||||
# CC="$PTHREAD_CC"
|
|
||||||
# CXX="$PTHREAD_CXX"
|
|
||||||
#
|
|
||||||
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
|
|
||||||
# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
|
|
||||||
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
|
||||||
#
|
|
||||||
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
|
|
||||||
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
|
|
||||||
# PTHREAD_CFLAGS.
|
|
||||||
#
|
|
||||||
# ACTION-IF-FOUND is a list of shell commands to run if a threads library
|
|
||||||
# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
|
|
||||||
# is not found. If ACTION-IF-FOUND is not specified, the default action
|
|
||||||
# will define HAVE_PTHREAD.
|
|
||||||
#
|
|
||||||
# Please let the authors know if this macro fails on any platform, or if
|
|
||||||
# you have any other suggestions or comments. This macro was based on work
|
|
||||||
# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
|
|
||||||
# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
|
|
||||||
# Alejandro Forero Cuervo to the autoconf macro repository. We are also
|
|
||||||
# grateful for the helpful feedback of numerous users.
|
|
||||||
#
|
|
||||||
# Updated for Autoconf 2.68 by Daniel Richard G.
|
|
||||||
#
|
|
||||||
# LICENSE
|
|
||||||
#
|
|
||||||
# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
|
|
||||||
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
|
|
||||||
# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License as published by the
|
|
||||||
# Free Software Foundation, either version 3 of the License, or (at your
|
|
||||||
# option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
||||||
# Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner
|
|
||||||
# gives unlimited permission to copy, distribute and modify the configure
|
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You
|
|
||||||
# need not follow the terms of the GNU General Public License when using
|
|
||||||
# or distributing such scripts, even though portions of the text of the
|
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern
|
|
||||||
# all other use of the material that constitutes the Autoconf Macro.
|
|
||||||
#
|
|
||||||
# This special exception to the GPL applies to versions of the Autoconf
|
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a
|
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
|
||||||
# exception to the GPL to apply to your modified version as well.
|
|
||||||
|
|
||||||
#serial 31
|
|
||||||
|
|
||||||
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
|
|
||||||
AC_DEFUN([AX_PTHREAD], [
|
|
||||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
|
||||||
AC_REQUIRE([AC_PROG_CC])
|
|
||||||
AC_REQUIRE([AC_PROG_SED])
|
|
||||||
AC_LANG_PUSH([C])
|
|
||||||
ax_pthread_ok=no
|
|
||||||
|
|
||||||
# We used to check for pthread.h first, but this fails if pthread.h
|
|
||||||
# requires special compiler flags (e.g. on Tru64 or Sequent).
|
|
||||||
# It gets checked for in the link test anyway.
|
|
||||||
|
|
||||||
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
|
||||||
# etcetera environment variables, and if threads linking works using
|
|
||||||
# them:
|
|
||||||
if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
|
|
||||||
ax_pthread_save_CC="$CC"
|
|
||||||
ax_pthread_save_CFLAGS="$CFLAGS"
|
|
||||||
ax_pthread_save_LIBS="$LIBS"
|
|
||||||
AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
|
|
||||||
AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"])
|
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
|
|
||||||
AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
|
|
||||||
AC_MSG_RESULT([$ax_pthread_ok])
|
|
||||||
if test "x$ax_pthread_ok" = "xno"; then
|
|
||||||
PTHREAD_LIBS=""
|
|
||||||
PTHREAD_CFLAGS=""
|
|
||||||
fi
|
|
||||||
CC="$ax_pthread_save_CC"
|
|
||||||
CFLAGS="$ax_pthread_save_CFLAGS"
|
|
||||||
LIBS="$ax_pthread_save_LIBS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# We must check for the threads library under a number of different
|
|
||||||
# names; the ordering is very important because some systems
|
|
||||||
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
|
|
||||||
# libraries is broken (non-POSIX).
|
|
||||||
|
|
||||||
# Create a list of thread flags to try. Items with a "," contain both
|
|
||||||
# C compiler flags (before ",") and linker flags (after ","). Other items
|
|
||||||
# starting with a "-" are C compiler flags, and remaining items are
|
|
||||||
# library names, except for "none" which indicates that we try without
|
|
||||||
# any flags at all, and "pthread-config" which is a program returning
|
|
||||||
# the flags for the Pth emulation library.
|
|
||||||
|
|
||||||
ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
|
||||||
|
|
||||||
# The ordering *is* (sometimes) important. Some notes on the
|
|
||||||
# individual items follow:
|
|
||||||
|
|
||||||
# pthreads: AIX (must check this before -lpthread)
|
|
||||||
# none: in case threads are in libc; should be tried before -Kthread and
|
|
||||||
# other compiler flags to prevent continual compiler warnings
|
|
||||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
|
||||||
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
|
|
||||||
# (Note: HP C rejects this with "bad form for `-t' option")
|
|
||||||
# -pthreads: Solaris/gcc (Note: HP C also rejects)
|
|
||||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
|
||||||
# doesn't hurt to check since this sometimes defines pthreads and
|
|
||||||
# -D_REENTRANT too), HP C (must be checked before -lpthread, which
|
|
||||||
# is present but should not be used directly; and before -mthreads,
|
|
||||||
# because the compiler interprets this as "-mt" + "-hreads")
|
|
||||||
# -mthreads: Mingw32/gcc, Lynx/gcc
|
|
||||||
# pthread: Linux, etcetera
|
|
||||||
# --thread-safe: KAI C++
|
|
||||||
# pthread-config: use pthread-config program (for GNU Pth library)
|
|
||||||
|
|
||||||
case $host_os in
|
|
||||||
|
|
||||||
freebsd*)
|
|
||||||
|
|
||||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
|
||||||
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
|
||||||
|
|
||||||
ax_pthread_flags="-kthread lthread $ax_pthread_flags"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hpux*)
|
|
||||||
|
|
||||||
# From the cc(1) man page: "[-mt] Sets various -D flags to enable
|
|
||||||
# multi-threading and also sets -lpthread."
|
|
||||||
|
|
||||||
ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
|
|
||||||
;;
|
|
||||||
|
|
||||||
openedition*)
|
|
||||||
|
|
||||||
# IBM z/OS requires a feature-test macro to be defined in order to
|
|
||||||
# enable POSIX threads at all, so give the user a hint if this is
|
|
||||||
# not set. (We don't define these ourselves, as they can affect
|
|
||||||
# other portions of the system API in unpredictable ways.)
|
|
||||||
|
|
||||||
AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
|
|
||||||
[
|
|
||||||
# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
|
|
||||||
AX_PTHREAD_ZOS_MISSING
|
|
||||||
# endif
|
|
||||||
],
|
|
||||||
[AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
|
|
||||||
;;
|
|
||||||
|
|
||||||
solaris*)
|
|
||||||
|
|
||||||
# On Solaris (at least, for some versions), libc contains stubbed
|
|
||||||
# (non-functional) versions of the pthreads routines, so link-based
|
|
||||||
# tests will erroneously succeed. (N.B.: The stubs are missing
|
|
||||||
# pthread_cleanup_push, or rather a function called by this macro,
|
|
||||||
# so we could check for that, but who knows whether they'll stub
|
|
||||||
# that too in a future libc.) So we'll check first for the
|
|
||||||
# standard Solaris way of linking pthreads (-mt -lpthread).
|
|
||||||
|
|
||||||
ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Are we compiling with Clang?
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([whether $CC is Clang],
|
|
||||||
[ax_cv_PTHREAD_CLANG],
|
|
||||||
[ax_cv_PTHREAD_CLANG=no
|
|
||||||
# Note that Autoconf sets GCC=yes for Clang as well as GCC
|
|
||||||
if test "x$GCC" = "xyes"; then
|
|
||||||
AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
|
|
||||||
[/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
|
|
||||||
# if defined(__clang__) && defined(__llvm__)
|
|
||||||
AX_PTHREAD_CC_IS_CLANG
|
|
||||||
# endif
|
|
||||||
],
|
|
||||||
[ax_cv_PTHREAD_CLANG=yes])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
|
|
||||||
|
|
||||||
|
|
||||||
# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
|
|
||||||
|
|
||||||
# Note that for GCC and Clang -pthread generally implies -lpthread,
|
|
||||||
# except when -nostdlib is passed.
|
|
||||||
# This is problematic using libtool to build C++ shared libraries with pthread:
|
|
||||||
# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
|
|
||||||
# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
|
|
||||||
# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
|
|
||||||
# To solve this, first try -pthread together with -lpthread for GCC
|
|
||||||
|
|
||||||
AS_IF([test "x$GCC" = "xyes"],
|
|
||||||
[ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
|
|
||||||
|
|
||||||
# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
|
|
||||||
|
|
||||||
AS_IF([test "x$ax_pthread_clang" = "xyes"],
|
|
||||||
[ax_pthread_flags="-pthread,-lpthread -pthread"])
|
|
||||||
|
|
||||||
|
|
||||||
# The presence of a feature test macro requesting re-entrant function
|
|
||||||
# definitions is, on some systems, a strong hint that pthreads support is
|
|
||||||
# correctly enabled
|
|
||||||
|
|
||||||
case $host_os in
|
|
||||||
darwin* | hpux* | linux* | osf* | solaris*)
|
|
||||||
ax_pthread_check_macro="_REENTRANT"
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix*)
|
|
||||||
ax_pthread_check_macro="_THREAD_SAFE"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
ax_pthread_check_macro="--"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AS_IF([test "x$ax_pthread_check_macro" = "x--"],
|
|
||||||
[ax_pthread_check_cond=0],
|
|
||||||
[ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
|
|
||||||
|
|
||||||
|
|
||||||
if test "x$ax_pthread_ok" = "xno"; then
|
|
||||||
for ax_pthread_try_flag in $ax_pthread_flags; do
|
|
||||||
|
|
||||||
case $ax_pthread_try_flag in
|
|
||||||
none)
|
|
||||||
AC_MSG_CHECKING([whether pthreads work without any flags])
|
|
||||||
;;
|
|
||||||
|
|
||||||
*,*)
|
|
||||||
PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
|
|
||||||
PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
|
|
||||||
AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
|
|
||||||
PTHREAD_CFLAGS="$ax_pthread_try_flag"
|
|
||||||
;;
|
|
||||||
|
|
||||||
pthread-config)
|
|
||||||
AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
|
|
||||||
AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
|
|
||||||
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
|
||||||
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
|
|
||||||
PTHREAD_LIBS="-l$ax_pthread_try_flag"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ax_pthread_save_CFLAGS="$CFLAGS"
|
|
||||||
ax_pthread_save_LIBS="$LIBS"
|
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
|
|
||||||
# Check for various functions. We must include pthread.h,
|
|
||||||
# since some functions may be macros. (On the Sequent, we
|
|
||||||
# need a special flag -Kthread to make this header compile.)
|
|
||||||
# We check for pthread_join because it is in -lpthread on IRIX
|
|
||||||
# while pthread_create is in libc. We check for pthread_attr_init
|
|
||||||
# due to DEC craziness with -lpthreads. We check for
|
|
||||||
# pthread_cleanup_push because it is one of the few pthread
|
|
||||||
# functions on Solaris that doesn't have a non-functional libc stub.
|
|
||||||
# We try pthread_create on general principles.
|
|
||||||
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
|
|
||||||
# if $ax_pthread_check_cond
|
|
||||||
# error "$ax_pthread_check_macro must be defined"
|
|
||||||
# endif
|
|
||||||
static void *some_global = NULL;
|
|
||||||
static void routine(void *a)
|
|
||||||
{
|
|
||||||
/* To avoid any unused-parameter or
|
|
||||||
unused-but-set-parameter warning. */
|
|
||||||
some_global = a;
|
|
||||||
}
|
|
||||||
static void *start_routine(void *a) { return a; }],
|
|
||||||
[pthread_t th; pthread_attr_t attr;
|
|
||||||
pthread_create(&th, 0, start_routine, 0);
|
|
||||||
pthread_join(th, 0);
|
|
||||||
pthread_attr_init(&attr);
|
|
||||||
pthread_cleanup_push(routine, 0);
|
|
||||||
pthread_cleanup_pop(0) /* ; */])],
|
|
||||||
[ax_pthread_ok=yes],
|
|
||||||
[])
|
|
||||||
|
|
||||||
CFLAGS="$ax_pthread_save_CFLAGS"
|
|
||||||
LIBS="$ax_pthread_save_LIBS"
|
|
||||||
|
|
||||||
AC_MSG_RESULT([$ax_pthread_ok])
|
|
||||||
AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
|
|
||||||
|
|
||||||
PTHREAD_LIBS=""
|
|
||||||
PTHREAD_CFLAGS=""
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Clang needs special handling, because older versions handle the -pthread
|
|
||||||
# option in a rather... idiosyncratic way
|
|
||||||
|
|
||||||
if test "x$ax_pthread_clang" = "xyes"; then
|
|
||||||
|
|
||||||
# Clang takes -pthread; it has never supported any other flag
|
|
||||||
|
|
||||||
# (Note 1: This will need to be revisited if a system that Clang
|
|
||||||
# supports has POSIX threads in a separate library. This tends not
|
|
||||||
# to be the way of modern systems, but it's conceivable.)
|
|
||||||
|
|
||||||
# (Note 2: On some systems, notably Darwin, -pthread is not needed
|
|
||||||
# to get POSIX threads support; the API is always present and
|
|
||||||
# active. We could reasonably leave PTHREAD_CFLAGS empty. But
|
|
||||||
# -pthread does define _REENTRANT, and while the Darwin headers
|
|
||||||
# ignore this macro, third-party headers might not.)
|
|
||||||
|
|
||||||
# However, older versions of Clang make a point of warning the user
|
|
||||||
# that, in an invocation where only linking and no compilation is
|
|
||||||
# taking place, the -pthread option has no effect ("argument unused
|
|
||||||
# during compilation"). They expect -pthread to be passed in only
|
|
||||||
# when source code is being compiled.
|
|
||||||
#
|
|
||||||
# Problem is, this is at odds with the way Automake and most other
|
|
||||||
# C build frameworks function, which is that the same flags used in
|
|
||||||
# compilation (CFLAGS) are also used in linking. Many systems
|
|
||||||
# supported by AX_PTHREAD require exactly this for POSIX threads
|
|
||||||
# support, and in fact it is often not straightforward to specify a
|
|
||||||
# flag that is used only in the compilation phase and not in
|
|
||||||
# linking. Such a scenario is extremely rare in practice.
|
|
||||||
#
|
|
||||||
# Even though use of the -pthread flag in linking would only print
|
|
||||||
# a warning, this can be a nuisance for well-run software projects
|
|
||||||
# that build with -Werror. So if the active version of Clang has
|
|
||||||
# this misfeature, we search for an option to squash it.
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
|
|
||||||
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
|
|
||||||
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
|
|
||||||
# Create an alternate version of $ac_link that compiles and
|
|
||||||
# links in two steps (.c -> .o, .o -> exe) instead of one
|
|
||||||
# (.c -> exe), because the warning occurs only in the second
|
|
||||||
# step
|
|
||||||
ax_pthread_save_ac_link="$ac_link"
|
|
||||||
ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
|
|
||||||
ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"`
|
|
||||||
ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
|
|
||||||
ax_pthread_save_CFLAGS="$CFLAGS"
|
|
||||||
for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
|
|
||||||
AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
|
|
||||||
CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
|
|
||||||
ac_link="$ax_pthread_save_ac_link"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
|
|
||||||
[ac_link="$ax_pthread_2step_ac_link"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
|
|
||||||
[break])
|
|
||||||
])
|
|
||||||
done
|
|
||||||
ac_link="$ax_pthread_save_ac_link"
|
|
||||||
CFLAGS="$ax_pthread_save_CFLAGS"
|
|
||||||
AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
|
|
||||||
ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
|
|
||||||
])
|
|
||||||
|
|
||||||
case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
|
|
||||||
no | unknown) ;;
|
|
||||||
*) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
fi # $ax_pthread_clang = yes
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Various other checks:
|
|
||||||
if test "x$ax_pthread_ok" = "xyes"; then
|
|
||||||
ax_pthread_save_CFLAGS="$CFLAGS"
|
|
||||||
ax_pthread_save_LIBS="$LIBS"
|
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
|
||||||
|
|
||||||
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
|
||||||
AC_CACHE_CHECK([for joinable pthread attribute],
|
|
||||||
[ax_cv_PTHREAD_JOINABLE_ATTR],
|
|
||||||
[ax_cv_PTHREAD_JOINABLE_ATTR=unknown
|
|
||||||
for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
|
|
||||||
[int attr = $ax_pthread_attr; return attr /* ; */])],
|
|
||||||
[ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
|
|
||||||
[])
|
|
||||||
done
|
|
||||||
])
|
|
||||||
AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
|
|
||||||
test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
|
|
||||||
test "x$ax_pthread_joinable_attr_defined" != "xyes"],
|
|
||||||
[AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
|
|
||||||
[$ax_cv_PTHREAD_JOINABLE_ATTR],
|
|
||||||
[Define to necessary symbol if this constant
|
|
||||||
uses a non-standard name on your system.])
|
|
||||||
ax_pthread_joinable_attr_defined=yes
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([whether more special flags are required for pthreads],
|
|
||||||
[ax_cv_PTHREAD_SPECIAL_FLAGS],
|
|
||||||
[ax_cv_PTHREAD_SPECIAL_FLAGS=no
|
|
||||||
case $host_os in
|
|
||||||
solaris*)
|
|
||||||
ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
])
|
|
||||||
AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
|
|
||||||
test "x$ax_pthread_special_flags_added" != "xyes"],
|
|
||||||
[PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
|
|
||||||
ax_pthread_special_flags_added=yes])
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
|
|
||||||
[ax_cv_PTHREAD_PRIO_INHERIT],
|
|
||||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
|
|
||||||
[[int i = PTHREAD_PRIO_INHERIT;
|
|
||||||
return i;]])],
|
|
||||||
[ax_cv_PTHREAD_PRIO_INHERIT=yes],
|
|
||||||
[ax_cv_PTHREAD_PRIO_INHERIT=no])
|
|
||||||
])
|
|
||||||
AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
|
|
||||||
test "x$ax_pthread_prio_inherit_defined" != "xyes"],
|
|
||||||
[AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
|
|
||||||
ax_pthread_prio_inherit_defined=yes
|
|
||||||
])
|
|
||||||
|
|
||||||
CFLAGS="$ax_pthread_save_CFLAGS"
|
|
||||||
LIBS="$ax_pthread_save_LIBS"
|
|
||||||
|
|
||||||
# More AIX lossage: compile with *_r variant
|
|
||||||
if test "x$GCC" != "xyes"; then
|
|
||||||
case $host_os in
|
|
||||||
aix*)
|
|
||||||
AS_CASE(["x/$CC"],
|
|
||||||
[x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
|
|
||||||
[#handle absolute path differently from PATH based program lookup
|
|
||||||
AS_CASE(["x$CC"],
|
|
||||||
[x/*],
|
|
||||||
[
|
|
||||||
AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])
|
|
||||||
AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])])
|
|
||||||
],
|
|
||||||
[
|
|
||||||
AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])
|
|
||||||
AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])])
|
|
||||||
]
|
|
||||||
)
|
|
||||||
])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
|
|
||||||
test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
|
|
||||||
|
|
||||||
AC_SUBST([PTHREAD_LIBS])
|
|
||||||
AC_SUBST([PTHREAD_CFLAGS])
|
|
||||||
AC_SUBST([PTHREAD_CC])
|
|
||||||
AC_SUBST([PTHREAD_CXX])
|
|
||||||
|
|
||||||
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
|
||||||
if test "x$ax_pthread_ok" = "xyes"; then
|
|
||||||
ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ax_pthread_ok=no
|
|
||||||
$2
|
|
||||||
fi
|
|
||||||
AC_LANG_POP
|
|
||||||
])dnl AX_PTHREAD
|
|
||||||
121
m4/getopt.m4
121
m4/getopt.m4
@ -1,70 +1,83 @@
|
|||||||
dnl SPDX-License-Identifier: FSFULLR
|
# getopt.m4 serial 13
|
||||||
|
dnl Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||||
# getopt.m4 serial 49 (modified version)
|
|
||||||
dnl Copyright (C) 2002-2006, 2008-2023 Free Software Foundation, Inc.
|
|
||||||
dnl This file is free software; the Free Software Foundation
|
dnl This file is free software; the Free Software Foundation
|
||||||
dnl gives unlimited permission to copy and/or distribute it,
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
dnl with or without modifications, as long as this notice is preserved.
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
# This version has been modified to reduce complexity since we only need
|
# The getopt module assume you want GNU getopt, with getopt_long etc,
|
||||||
# GNU getopt_long and do not care about replacing getopt.
|
# rather than vanilla POSIX getopt. This means your code should
|
||||||
#
|
# always include <getopt.h> for the getopt prototypes.
|
||||||
# Pass gl_replace_getopt=yes (or any non-empty value instead of "yes") as
|
|
||||||
# an argument to configure to force the use of the getopt_long replacement.
|
|
||||||
|
|
||||||
AC_DEFUN([gl_FUNC_GETOPT_GNU],
|
|
||||||
[
|
|
||||||
AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
|
|
||||||
|
|
||||||
if test -n "$gl_replace_getopt"; then
|
|
||||||
gl_GETOPT_SUBSTITUTE
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
|
|
||||||
[
|
|
||||||
if test -z "$gl_replace_getopt"; then
|
|
||||||
AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$gl_replace_getopt"; then
|
|
||||||
AC_CHECK_FUNCS([getopt_long], [], [gl_replace_getopt=yes])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl BSD getopt_long uses a way to reset option processing, that is different
|
|
||||||
dnl from GNU and Solaris (which copied the GNU behavior). We support both
|
|
||||||
dnl GNU and BSD style resetting of getopt_long(), so there's no need to use
|
|
||||||
dnl GNU getopt_long() on BSD due to different resetting style.
|
|
||||||
if test -z "$gl_replace_getopt"; then
|
|
||||||
AC_CHECK_DECL([optreset],
|
|
||||||
[AC_DEFINE([HAVE_OPTRESET], 1,
|
|
||||||
[Define to 1 if getopt.h declares extern int optreset.])],
|
|
||||||
[], [#include <getopt.h>])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl POSIX 2008 does not specify leading '+' behavior, but see
|
|
||||||
dnl http://austingroupbugs.net/view.php?id=191 for a recommendation on
|
|
||||||
dnl the next version of POSIX. We don't use that feature, so this
|
|
||||||
dnl is not a problem for us. Thus, the respective test was removed here.
|
|
||||||
|
|
||||||
dnl Checks for getopt handling '-' as a leading character in an option
|
|
||||||
dnl string were removed, since we also don't use that feature.
|
|
||||||
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([gl_GETOPT_SUBSTITUTE],
|
AC_DEFUN([gl_GETOPT_SUBSTITUTE],
|
||||||
[
|
[
|
||||||
AC_LIBOBJ([getopt])
|
AC_LIBOBJ([getopt])
|
||||||
AC_LIBOBJ([getopt1])
|
AC_LIBOBJ([getopt1])
|
||||||
|
gl_GETOPT_SUBSTITUTE_HEADER
|
||||||
|
gl_PREREQ_GETOPT
|
||||||
|
])
|
||||||
|
|
||||||
AC_CHECK_HEADERS_ONCE([sys/cdefs.h])
|
AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
|
||||||
|
[
|
||||||
|
GETOPT_H=getopt.h
|
||||||
AC_DEFINE([__GETOPT_PREFIX], [[rpl_]],
|
AC_DEFINE([__GETOPT_PREFIX], [[rpl_]],
|
||||||
[Define to rpl_ if the getopt replacement functions and variables
|
[Define to rpl_ if the getopt replacement functions and variables
|
||||||
should be used.])
|
should be used.])
|
||||||
|
|
||||||
GETOPT_H=getopt.h
|
|
||||||
AC_SUBST([GETOPT_H])
|
AC_SUBST([GETOPT_H])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([gl_GETOPT], [gl_FUNC_GETOPT_GNU])
|
AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
|
||||||
|
[
|
||||||
|
if test -z "$GETOPT_H"; then
|
||||||
|
AC_CHECK_HEADERS([getopt.h], [], [GETOPT_H=getopt.h])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$GETOPT_H"; then
|
||||||
|
AC_CHECK_FUNCS([getopt_long_only], [], [GETOPT_H=getopt.h])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl BSD getopt_long uses an incompatible method to reset option processing,
|
||||||
|
dnl and (as of 2004-10-15) mishandles optional option-arguments.
|
||||||
|
if test -z "$GETOPT_H"; then
|
||||||
|
AC_CHECK_DECL([optreset], [GETOPT_H=getopt.h], [], [#include <getopt.h>])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
|
||||||
|
dnl option string (as of 2005-05-05).
|
||||||
|
if test -z "$GETOPT_H"; then
|
||||||
|
AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_gnu_getopt],
|
||||||
|
[AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([#include <getopt.h>],
|
||||||
|
[[
|
||||||
|
char *myargv[3];
|
||||||
|
myargv[0] = "conftest";
|
||||||
|
myargv[1] = "-+";
|
||||||
|
myargv[2] = 0;
|
||||||
|
return getopt (2, myargv, "+a") != '?';
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_gnu_getopt=yes],
|
||||||
|
[gl_cv_func_gnu_getopt=no],
|
||||||
|
[dnl cross compiling - pessimistically guess based on decls
|
||||||
|
dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
|
||||||
|
dnl option string (as of 2005-05-05).
|
||||||
|
AC_CHECK_DECL([getopt_clip],
|
||||||
|
[gl_cv_func_gnu_getopt=no], [gl_cv_func_gnu_getopt=yes],
|
||||||
|
[#include <getopt.h>])])])
|
||||||
|
if test "$gl_cv_func_gnu_getopt" = "no"; then
|
||||||
|
GETOPT_H=getopt.h
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_GETOPT_IFELSE],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
|
||||||
|
AS_IF([test -n "$GETOPT_H"], [$1], [$2])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([gl_GETOPT], [gl_GETOPT_IFELSE([gl_GETOPT_SUBSTITUTE])])
|
||||||
|
|
||||||
|
# Prerequisites of lib/getopt*.
|
||||||
|
AC_DEFUN([gl_PREREQ_GETOPT],
|
||||||
|
[
|
||||||
|
AC_CHECK_DECLS_ONCE([getenv])
|
||||||
|
])
|
||||||
|
|||||||
@ -1,66 +0,0 @@
|
|||||||
dnl SPDX-License-Identifier: FSFULLR
|
|
||||||
|
|
||||||
# posix-shell.m4
|
|
||||||
# serial 1
|
|
||||||
dnl Copyright (C) 2007-2024 Free Software Foundation, Inc.
|
|
||||||
dnl This file is free software; the Free Software Foundation
|
|
||||||
dnl gives unlimited permission to copy and/or distribute it,
|
|
||||||
dnl with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# Find a POSIX-conforming shell.
|
|
||||||
|
|
||||||
# Written by Paul Eggert.
|
|
||||||
|
|
||||||
# If a POSIX-conforming shell can be found, set POSIX_SHELL and
|
|
||||||
# PREFERABLY_POSIX_SHELL to it. If not, set POSIX_SHELL to the
|
|
||||||
# empty string and PREFERABLY_POSIX_SHELL to '/bin/sh'.
|
|
||||||
|
|
||||||
AC_DEFUN([gl_POSIX_SHELL],
|
|
||||||
[
|
|
||||||
AC_CACHE_CHECK([for a shell that conforms to POSIX], [gl_cv_posix_shell],
|
|
||||||
[gl_test_posix_shell_script='
|
|
||||||
func_return () {
|
|
||||||
(exit [$]1)
|
|
||||||
}
|
|
||||||
func_success () {
|
|
||||||
func_return 0
|
|
||||||
}
|
|
||||||
func_failure () {
|
|
||||||
func_return 1
|
|
||||||
}
|
|
||||||
func_ret_success () {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
func_ret_failure () {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
subshell_umask_sanity () {
|
|
||||||
(umask 22; (umask 0); test $(umask) -eq 22)
|
|
||||||
}
|
|
||||||
test "[$](echo foo)" = foo &&
|
|
||||||
func_success &&
|
|
||||||
! func_failure &&
|
|
||||||
func_ret_success &&
|
|
||||||
! func_ret_failure &&
|
|
||||||
(set x && func_ret_success y && test x = "[$]1") &&
|
|
||||||
subshell_umask_sanity
|
|
||||||
'
|
|
||||||
for gl_cv_posix_shell in \
|
|
||||||
"$CONFIG_SHELL" "$SHELL" /bin/sh /bin/bash /bin/ksh /bin/sh5 no; do
|
|
||||||
case $gl_cv_posix_shell in
|
|
||||||
/*)
|
|
||||||
"$gl_cv_posix_shell" -c "$gl_test_posix_shell_script" 2>/dev/null \
|
|
||||||
&& break;;
|
|
||||||
esac
|
|
||||||
done])
|
|
||||||
|
|
||||||
if test "$gl_cv_posix_shell" != no; then
|
|
||||||
POSIX_SHELL=$gl_cv_posix_shell
|
|
||||||
PREFERABLY_POSIX_SHELL=$POSIX_SHELL
|
|
||||||
else
|
|
||||||
POSIX_SHELL=
|
|
||||||
PREFERABLY_POSIX_SHELL=/bin/sh
|
|
||||||
fi
|
|
||||||
AC_SUBST([POSIX_SHELL])
|
|
||||||
AC_SUBST([PREFERABLY_POSIX_SHELL])
|
|
||||||
])
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# TUKLIB_COMMON
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# Common checks for tuklib.
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
AC_DEFUN_ONCE([TUKLIB_COMMON], [
|
|
||||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
|
||||||
AC_REQUIRE([AC_PROG_CC_C99])
|
|
||||||
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
|
||||||
])dnl
|
|
||||||
@ -1,181 +0,0 @@
|
|||||||
# SPDX-License-Identifier: 0BSD
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# SYNOPSIS
|
|
||||||
#
|
|
||||||
# TUKLIB_CPUCORES
|
|
||||||
#
|
|
||||||
# DESCRIPTION
|
|
||||||
#
|
|
||||||
# Check how to find out the number of available CPU cores in the system.
|
|
||||||
# This information is used by tuklib_cpucores.c.
|
|
||||||
#
|
|
||||||
# Supported methods:
|
|
||||||
# - GetSystemInfo(): Windows (including Cygwin)
|
|
||||||
# - sched_getaffinity(): glibc (GNU/Linux, GNU/kFreeBSD)
|
|
||||||
# - cpuset_getaffinity(): FreeBSD
|
|
||||||
# - sysctl(): BSDs, OS/2
|
|
||||||
# - sysconf(): GNU/Linux, Solaris, Tru64, IRIX, AIX, QNX, Cygwin (but
|
|
||||||
# GetSystemInfo() is used on Cygwin)
|
|
||||||
# - pstat_getdynamic(): HP-UX
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Author: Lasse Collin
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
AC_DEFUN_ONCE([TUKLIB_CPUCORES], [
|
|
||||||
AC_REQUIRE([TUKLIB_COMMON])
|
|
||||||
|
|
||||||
# sys/param.h might be needed by sys/sysctl.h.
|
|
||||||
AC_CHECK_HEADERS([sys/param.h])
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([how to detect the number of available CPU cores],
|
|
||||||
[tuklib_cv_cpucores_method], [
|
|
||||||
|
|
||||||
# Maybe checking $host_os would be enough but this matches what
|
|
||||||
# tuklib_cpucores.c does.
|
|
||||||
#
|
|
||||||
# NOTE: IRIX has a compiler that doesn't error out with #error, so use
|
|
||||||
# a non-compilable text instead of #error to generate an error.
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
#if defined(_WIN32) || defined(__CYGWIN__)
|
|
||||||
int main(void) { return 0; }
|
|
||||||
#else
|
|
||||||
compile error
|
|
||||||
#endif
|
|
||||||
]])], [tuklib_cv_cpucores_method=special], [
|
|
||||||
|
|
||||||
# glibc-based systems (GNU/Linux and GNU/kFreeBSD) have sched_getaffinity().
|
|
||||||
# The CPU_COUNT() macro was added in glibc 2.9 so we try to link the
|
|
||||||
# test program instead of merely compiling it. glibc 2.9 is old enough that
|
|
||||||
# if someone uses the code on older glibc, the fallback to sysconf() should
|
|
||||||
# be good enough.
|
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
#include <sched.h>
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
cpu_set_t cpu_mask;
|
|
||||||
sched_getaffinity(0, sizeof(cpu_mask), &cpu_mask);
|
|
||||||
return CPU_COUNT(&cpu_mask);
|
|
||||||
}
|
|
||||||
]])], [tuklib_cv_cpucores_method=sched_getaffinity], [
|
|
||||||
|
|
||||||
# FreeBSD has both cpuset and sysctl. Look for cpuset first because
|
|
||||||
# it's a better approach.
|
|
||||||
#
|
|
||||||
# This test would match on GNU/kFreeBSD too but it would require
|
|
||||||
# -lfreebsd-glue when linking and thus in the current form this would
|
|
||||||
# fail on GNU/kFreeBSD. The above test for sched_getaffinity() matches
|
|
||||||
# on GNU/kFreeBSD so the test below should never run on that OS.
|
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/cpuset.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
cpuset_t set;
|
|
||||||
cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1,
|
|
||||||
sizeof(set), &set);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
]])], [tuklib_cv_cpucores_method=cpuset], [
|
|
||||||
|
|
||||||
# On OS/2, both sysconf() and sysctl() pass the tests in this file,
|
|
||||||
# but only sysctl() works. On QNX it's the opposite: only sysconf() works
|
|
||||||
# (although it assumes that _POSIX_SOURCE, _XOPEN_SOURCE, and _POSIX_C_SOURCE
|
|
||||||
# are undefined or alternatively _QNX_SOURCE is defined).
|
|
||||||
#
|
|
||||||
# We test sysctl() first and intentionally break the sysctl() test on QNX
|
|
||||||
# so that sysctl() is never used on QNX.
|
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
#ifdef __QNX__
|
|
||||||
compile error
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_PARAM_H
|
|
||||||
# include <sys/param.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
#ifdef HW_NCPUONLINE
|
|
||||||
/* This is preferred on OpenBSD, see tuklib_cpucores.c. */
|
|
||||||
int name[2] = { CTL_HW, HW_NCPUONLINE };
|
|
||||||
#else
|
|
||||||
int name[2] = { CTL_HW, HW_NCPU };
|
|
||||||
#endif
|
|
||||||
int cpus;
|
|
||||||
size_t cpus_size = sizeof(cpus);
|
|
||||||
sysctl(name, 2, &cpus, &cpus_size, NULL, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
]])], [tuklib_cv_cpucores_method=sysctl], [
|
|
||||||
|
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
#include <unistd.h>
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
long i;
|
|
||||||
#ifdef _SC_NPROCESSORS_ONLN
|
|
||||||
/* Many systems using sysconf() */
|
|
||||||
i = sysconf(_SC_NPROCESSORS_ONLN);
|
|
||||||
#else
|
|
||||||
/* IRIX */
|
|
||||||
i = sysconf(_SC_NPROC_ONLN);
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
]])], [tuklib_cv_cpucores_method=sysconf], [
|
|
||||||
|
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/pstat.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
struct pst_dynamic pst;
|
|
||||||
pstat_getdynamic(&pst, sizeof(pst), 1, 0);
|
|
||||||
(void)pst.psd_proc_cnt;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
]])], [tuklib_cv_cpucores_method=pstat_getdynamic], [
|
|
||||||
|
|
||||||
tuklib_cv_cpucores_method=unknown
|
|
||||||
])])])])])])])
|
|
||||||
|
|
||||||
case $tuklib_cv_cpucores_method in
|
|
||||||
sched_getaffinity)
|
|
||||||
AC_DEFINE([TUKLIB_CPUCORES_SCHED_GETAFFINITY], [1],
|
|
||||||
[Define to 1 if the number of available CPU cores
|
|
||||||
can be detected with sched_getaffinity()])
|
|
||||||
;;
|
|
||||||
cpuset)
|
|
||||||
AC_DEFINE([TUKLIB_CPUCORES_CPUSET], [1],
|
|
||||||
[Define to 1 if the number of available CPU cores
|
|
||||||
can be detected with cpuset(2).])
|
|
||||||
;;
|
|
||||||
sysctl)
|
|
||||||
AC_DEFINE([TUKLIB_CPUCORES_SYSCTL], [1],
|
|
||||||
[Define to 1 if the number of available CPU cores
|
|
||||||
can be detected with sysctl().])
|
|
||||||
;;
|
|
||||||
sysconf)
|
|
||||||
AC_DEFINE([TUKLIB_CPUCORES_SYSCONF], [1],
|
|
||||||
[Define to 1 if the number of available CPU cores
|
|
||||||
can be detected with sysconf(_SC_NPROCESSORS_ONLN)
|
|
||||||
or sysconf(_SC_NPROC_ONLN).])
|
|
||||||
;;
|
|
||||||
pstat_getdynamic)
|
|
||||||
AC_DEFINE([TUKLIB_CPUCORES_PSTAT_GETDYNAMIC], [1],
|
|
||||||
[Define to 1 if the number of available CPU cores
|
|
||||||
can be detected with pstat_getdynamic().])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
])dnl
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user