
XZ Utils Licensing
==================

    Different licenses apply to different files in this package. Here
    is a rough summary of which licenses apply to which parts of this
    package (but check the individual files to be sure!):

      - liblzma is under the BSD Zero Clause License (0BSD).

      - 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.

      - Doxygen-generated HTML version of the liblzma API documentation:
        While Doxygen is under the GNU GPLv2, the license information
        in Doxygen includes the following exception:

            Documents produced by doxygen are derivative works
            derived from the input used in their production;
            they are not affected by this license.

        Note: The JavaScript files (under the MIT license) have
        been removed from the Doxygen output.

      - The XZ logo (xz-logo.png) included in the Doxygen-generated
        documentation is under the Creative Commons BY-SA 4.0 license.

      - 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 contain files that are under various
        free software licenses.

    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://xz.tukaani.org/xz-utils/>.

    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.GPLv2: GNU General Public License version 2
      - COPYING.GPLv3: GNU General Public License version 3
      - COPYING.CC-BY-SA-4.0: Creative Commons Attribution-ShareAlike 4.0
                              International Public License

    A note about old XZ Utils releases:

        XZ Utils releases 5.4.6 and older and 5.5.1alpha have a
        significant amount of code put into the public domain and
        that obviously remains so. The switch from public domain to
        0BSD for newer releases was made in Febrary 2024 because
        public domain has (real or perceived) legal ambiguities in
        some jurisdictions.

        There is very little *practical* difference between public
        domain and 0BSD. The main difference likely is that one
        shouldn't claim that 0BSD-licensed code is in the public
        domain; 0BSD-licensed code is copyrighted but available under
        an extremely permissive license. Neither 0BSD nor public domain
        require retaining or reproducing author, copyright holder, or
        license notices when distributing the software. (Compare to,
        for example, BSD 2-Clause "Simplified" License which does have
        such requirements.)

    If you have questions, don't hesitate to ask for more information.
    The contact information is in the README file.

