build system enhancements
authorCharles McGarvey <chazmcgarvey@brokenzipper.com>
Tue, 14 Dec 2010 21:44:20 +0000 (14:44 -0700)
committerCharles McGarvey <chazmcgarvey@brokenzipper.com>
Wed, 29 Jun 2011 19:01:56 +0000 (13:01 -0600)
87 files changed:
COPYING
INSTALL
Makefile
README
arch/macosx/bundle.tar.bz2 [deleted file]
arch/macosx/mkbundle.sh.in [deleted file]
arch/win32/makedeps.sh [deleted file]
arch/win32/makepackage.sh [deleted file]
build/arch/archlinux/PKGBUILD [moved from arch/archlinux/PKGBUILD with 81% similarity]
build/arch/gentoo/yoink.ebuild [moved from arch/gentoo/yoink.ebuild with 62% similarity]
build/arch/win32/makedeps.mk [new file with mode: 0644]
build/arch/win32/rules.mk [new file with mode: 0644]
build/arch/win32/setup.ico [moved from arch/win32/setup.ico with 100% similarity]
build/arch/win32/uninstall.ico [moved from arch/win32/uninstall.ico with 100% similarity]
build/arch/win32/unix2dos.sh [moved from arch/win32/unix2dos.sh with 100% similarity]
build/arch/win32/wspiapi.h [moved from arch/win32/wspiapi.h with 100% similarity]
build/arch/win32/yoink.ico [moved from arch/win32/yoink.ico with 100% similarity]
build/arch/win32/yoink.nsi [moved from arch/win32/yoink.nsi with 100% similarity]
build/check.lua [new file with mode: 0644]
build/config.lua [new file with mode: 0644]
build/dialog.c [new file with mode: 0644]
build/utility.lua [new file with mode: 0644]
configure
data/rules.mk
data/textures/AlienWarrior.png
data/textures/BackgroundFar.png
data/textures/BackgroundNear.png
data/textures/BigExplosion.png
data/textures/Bonuses.png
data/textures/Building.png
data/textures/Font.png
data/textures/Heroine.png
data/textures/Jetbot.png
data/textures/Particles.png
data/textures/RobotTrooper.png
data/textures/Scenery.png
data/textures/StatusBars.png
data/textures/TowerBlock1.png
data/textures/Trees.png
data/yoink.desktop.in [moved from data/yoink.desktop with 51% similarity]
doc/Doxyfile [moved from Doxyfile with 100% similarity]
doc/cmloptions.txt [moved from doc/cml_parameters.txt with 100% similarity]
doc/licenses/BSD [deleted file]
doc/licenses/BSD-2 [deleted file]
doc/licenses/Boost-1.0 [deleted file]
doc/licenses/CCPL-Attribution-ShareAlike-NonCommercial-2.5 [deleted file]
doc/licenses/LGPL-2 [deleted file]
doc/licenses/LGPL-2.1 [deleted file]
doc/licenses/MIT [deleted file]
doc/licenses/libpng [deleted file]
doc/licenses/zlib-libpng [deleted file]
doc/rules.mk
doc/screenshot.jpg [deleted file]
doc/yoink.6.in
doc/yoink_install.7 [new file with mode: 0644]
doc/yoink_license.7 [new file with mode: 0644]
doc/yoink_readme.7 [new file with mode: 0644]
doc/yoinkrc.5.in [new file with mode: 0644]
options.lua [new file with mode: 0644]
scripts/cscopedb.sh [new file with mode: 0755]
scripts/man2html.lua [moved from doc/man2html.lua with 93% similarity]
scripts/textureattr.pl [new file with mode: 0755]
src/Main.cc
src/moof/application.cc
src/moof/application.hh
src/moof/image.cc
src/moof/image.hh
src/moof/log.cc
src/moof/log.hh
src/moof/modal_dialog.hh
src/moof/rules.mk
src/moof/runloop.cc
src/moof/runloop.hh
src/moof/sound.cc
src/moof/thread.cc [new file with mode: 0644]
src/moof/thread.hh
src/moof/timer.cc
src/moof/timer.hh
src/moof/video.hh
src/rules.mk
src/stlplus/rules.mk
src/win32.rc [moved from src/yoink.rc with 100% similarity]
tools/compile.lua [deleted file]
tools/config.guess [deleted file]
tools/config.sub [deleted file]
tools/install.lua [deleted file]
tools/link.lua [deleted file]

diff --git a/COPYING b/COPYING
index afe3fe7adf778901b8dd6efc585c198f35f49a19..0b63b1d896486030c6e13e4e5a10db6b763773dc 100644 (file)
--- a/COPYING
+++ b/COPYING
+YOINK_LICENSE(7)       Miscellaneous Information Manual       YOINK_LICENSE(7)
 
-Excluding certain portions of this software as mentioned later in this
-document, the software distributed alongside this file are licensed
-according to the following terms and conditions:
-
-The Simplified BSD License
-
-Copyright (c) 2009-2010, Charles McGarvey 
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
----------------------------------------------------------------------------
-
-Portions of this software are owned by third parties and licensed under
-separate terms and conditions.  These portions, although packaged together
-according to the distribution rights granted by their own individual
-licenses, are used and provided under their separate terms and conditions
-and therefore the above license can not necessarily be applied to such
-portions.  Neither do the terms and conditions associated with the
-following portions necessarily apply to the files released under the above
-license.  The texts of applicable licences can be found in doc/licenses/.
-
-  Portion: cml
-   Source: http://www.cmldev.net/
-Copyright: (c) 2009 Jesse Anders
-  License: Boost-1.0
-
-  Portion: ConvertUTF.{c,h}
-   Source: http://www.unicode.org/Public/PROGRAMS/CVTUTF/
-Copyright: (c) 2000-2004 Unicode, Inc.
-  License: see file comments
-
-  Portion: fastevents.{c,h}
-   Source: http://www.gameprogrammer.com/fastevents/fastevents1.html
-Copyright: (c) 2002 Bob Pendleton
-  License: LGPL-2.1
-
-  Portion: libpng14.dll
-   Source: http://www.libpng.org/pub/png/libpng.html
-Copyright: (c) 2004, 2006-2009 Glenn Randers-Pehrson
-  License: libpng
-
-  Portion: libogg-0.dll, libvorbis-0.dll, libvorbisfile-3.dll
-   Source: http://www.xiph.org/downloads/
-Copyright: (c) 2009 Xiph.Org Foundation
-  License: BSD
-
-  Portion: lua51.dll
-   Source: http://www.lua.org/
-Copyright: (c) 1995-2008 Lua.org, PUC-Rio
-  License: MIT
-
-  Portion: nightfusion.xm
-   Source: http://8bitcollective.com/members/FearofDark/
-Copyright: (c) 2009 Stephen H. Johnston
-  License: CCPL-Attribution-ShareAlike-NonCommercial-2.5
-
-  Portion: OpenAL32.dll
-   Source: http://kcat.strangesoft.net/openal.html
-Copyright: (c) 2009 Chris Robinson
-  License: LGPL-2
-
-  Portion: original image and sound resources
-   Source: http://www.nether.org.uk/bad_mac_code.html
-Copyright: (c) 2003 Neil Carter
-  License: zlib-libpng
-
-  Portion: SDL.dll
-   Source: http://www.libsdl.org/
-Copyright: (c) 2009 Sam Lantinga et al.
-  License: LGPL-2.1
-
-  Portion: stlplus
-   Source: http://stlplus.sourceforge.net/
-Copyright: (c) 1999-2004 Southampton University, 2004-2009 Andy Rushton
-  License: BSD
-
-  Portion: zlib1.dll
-   Source: http://www.zlib.net/
-Copyright: (c) 1995-2005 Jean-loup Gailly and Mark Adler
-  License: zlib-libpng
+NAME
+     yoink_license -- copyright and license terms and conditions
 
+DESCRIPTION
+     Unless otherwise stated, either in this document or in the file's header
+     or metadata section (the latter taking precedence in the case of
+     conflict), the files that make up Yoink are licensed accordingly:
+
+          The Simplified BSD License
+
+          Copyright (C) 2009-2011, Charles McGarvey et al.
+          All rights reserved.
+
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions
+          are met:
+
+          1.   Redistributions of source code must retain the above copyright
+               notice, this list of conditions and the following disclaimer.
+
+          2.   Redistributions in binary form must reproduce the above
+               copyright notice, this list of conditions and the following
+               disclaimer in the documentation and/or other materials provided
+               with the distribution.
+
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+          "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+          LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+          FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+          COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+          INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+          BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+          LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+          CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+          LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+          ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+          POSSIBILITY OF SUCH DAMAGE.
+
+   Boost-1.0 License
+     These components fall under the Boost-1.0 license:
+
+     (C) 2009 Jesse Anders
+                 CML: http://www.cmldev.net/
+
+          Boost Software License - Version 1.0 - August 17th, 2003
+
+          Permission is hereby granted, free of charge, to any person or
+          organization obtaining a copy of the software and accompanying
+          documentation covered by this license (the "Software") to use,
+          reproduce, display, distribute, execute, and transmit the Software,
+          and to prepare derivative works of the Software, and to permit
+          third-parties to whom the Software is furnished to do so, all
+          subject to the following:
+
+          The copyright notices in the Software and this entire statement,
+          including the above license grant, this restriction and the
+          following disclaimer, must be included in all copies of the
+          Software, in whole or in part, and all derivative works of the
+          Software, unless such copies or derivative works are solely in the
+          form of machine-executable object code generated by a source
+          language processor.
+
+          THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+          EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+          MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-
+          INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE
+          DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER
+          LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+          OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+          IN THE SOFTWARE.
+
+   BSD License
+     These components fall under the BSD license:
+
+     (C) 1999-2004 Southampton University, 2004-2009 Andy Rushton
+                 stlplus: http://stlplus.sourceforge.net/
+
+     (C) 2009 Xiph.Org Foundation
+                 libogg, libvorbis: http://www.xiph.org/downloads/
+
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions
+          are met:
+
+          1.   Redistributions of source code must retain the above copyright
+               notice, this list of conditions and the following disclaimer.
+
+          2.   Redistributions in binary form must reproduce the above
+               copyright notice, this list of conditions and the following
+               disclaimer in the documentation and/or other materials provided
+               with the distribution.
+
+          3.   Neither the name of the <ORGANIZATION> nor the names of its
+               contributors may be used to endorse or promote products derived
+               from this software without specific prior written permission.
+
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+          "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+          LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+          FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+          COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+          INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+          BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+          LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+          CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+          LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+          ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+          POSSIBILITY OF SUCH DAMAGE.
+
+   CCPL-BY-NC-SA-3.0
+     These components fall under the CCPL-BY-NC-SA-3.0:
+
+     (C) 2009 Stephen H. Johnston
+                 Night Fusion: http://www.fodxm.co.uk/
+
+          Creative Commons
+
+          Creative Commons Legal Code
+
+          Attribution-NonCommercial-ShareAlike 3.0 Unported
+
+          CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+          LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
+          ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+          INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO
+          WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS
+          LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
+
+          License
+
+          THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
+          CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
+          PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
+          WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
+          PROHIBITED.
+
+          BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
+          AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS
+          LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU
+          THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF
+          SUCH TERMS AND CONDITIONS.
+
+               1. Definitions
+
+                    a. "Adaptation" means a work based upon the Work, or upon
+                    the Work and other pre-existing works, such as a
+                    translation, adaptation, derivative work, arrangement of
+                    music or other alterations of a literary or artistic work,
+                    or phonogram or performance and includes cinematographic
+                    adaptations or any other form in which the Work may be
+                    recast, transformed, or adapted including in any form
+                    recognizably derived from the original, except that a work
+                    that constitutes a Collection will not be considered an
+                    Adaptation for the purpose of this License. For the
+                    avoidance of doubt, where the Work is a musical work,
+                    performance or phonogram, the synchronization of the Work
+                    in timed-relation with a moving image ("synching") will be
+                    considered an Adaptation for the purpose of this License.
+
+                    b. "Collection" means a collection of literary or artistic
+                    works, such as encyclopedias and anthologies, or
+                    performances, phonograms or broadcasts, or other works or
+                    subject matter other than works listed in Section 1(g)
+                    below, which, by reason of the selection and arrangement
+                    of their contents, constitute intellectual creations, in
+                    which the Work is included in its entirety in unmodified
+                    form along with one or more other contributions, each
+                    constituting separate and independent works in themselves,
+                    which together are assembled into a collective whole. A
+                    work that constitutes a Collection will not be considered
+                    an Adaptation (as defined above) for the purposes of this
+                    License.
+
+                    c. "Distribute" means to make available to the public the
+                    original and copies of the Work or Adaptation, as
+                    appropriate, through sale or other transfer of ownership.
+
+                    d. "License Elements" means the following high-level
+                    license attributes as selected by Licensor and indicated
+                    in the title of this License: Attribution, Noncommercial,
+                    ShareAlike.
+
+                    e. "Licensor" means the individual, individuals, entity or
+                    entities that offer(s) the Work under the terms of this
+                    License.
+
+                    f. "Original Author" means, in the case of a literary or
+                    artistic work, the individual, individuals, entity or
+                    entities who created the Work or if no individual or
+                    entity can be identified, the publisher; and in addition
+                    (i) in the case of a performance the actors, singers,
+                    musicians, dancers, and other persons who act, sing,
+                    deliver, declaim, play in, interpret or otherwise perform
+                    literary or artistic works or expressions of folklore;
+                    (ii) in the case of a phonogram the producer being the
+                    person or legal entity who first fixes the sounds of a
+                    performance or other sounds; and, (iii) in the case of
+                    broadcasts, the organization that transmits the broadcast.
+
+                    g. "Work" means the literary and/or artistic work offered
+                    under the terms of this License including without
+                    limitation any production in the literary, scientific and
+                    artistic domain, whatever may be the mode or form of its
+                    expression including digital form, such as a book,
+                    pamphlet and other writing; a lecture, address, sermon or
+                    other work of the same nature; a dramatic or dramatico-
+                    musical work; a choreographic work or entertainment in
+                    dumb show; a musical composition with or without words; a
+                    cinematographic work to which are assimilated works
+                    expressed by a process analogous to cinematography; a work
+                    of drawing, painting, architecture, sculpture, engraving
+                    or lithography; a photographic work to which are
+                    assimilated works expressed by a process analogous to
+                    photography; a work of applied art; an illustration, map,
+                    plan, sketch or three-dimensional work relative to
+                    geography, topography, architecture or science; a
+                    performance; a broadcast; a phonogram; a compilation of
+                    data to the extent it is protected as a copyrightable
+                    work; or a work performed by a variety or circus performer
+                    to the extent it is not otherwise considered a literary or
+                    artistic work.
+
+                    h. "You" means an individual or entity exercising rights
+                    under this License who has not previously violated the
+                    terms of this License with respect to the Work, or who has
+                    received express permission from the Licensor to exercise
+                    rights under this License despite a previous violation.
+
+                    i. "Publicly Perform" means to perform public recitations
+                    of the Work and to communicate to the public those public
+                    recitations, by any means or process, including by wire or
+                    wireless means or public digital performances; to make
+                    available to the public Works in such a way that members
+                    of the public may access these Works from a place and at a
+                    place individually chosen by them; to perform the Work to
+                    the public by any means or process and the communication
+                    to the public of the performances of the Work, including
+                    by public digital performance; to broadcast and
+                    rebroadcast the Work by any means including signs, sounds
+                    or images.
+
+                    j. "Reproduce" means to make copies of the Work by any
+                    means including without limitation by sound or visual
+                    recordings and the right of fixation and reproducing
+                    fixations of the Work, including storage of a protected
+                    performance or phonogram in digital form or other
+                    electronic medium.
+
+               2. Fair Dealing Rights. Nothing in this License is intended to
+               reduce, limit, or restrict any uses free from copyright or
+               rights arising from limitations or exceptions that are provided
+               for in connection with the copyright protection under copyright
+               law or other applicable laws.
+
+               3. License Grant. Subject to the terms and conditions of this
+               License, Licensor hereby grants You a worldwide, royalty-free,
+               non-exclusive, perpetual (for the duration of the applicable
+               copyright) license to exercise the rights in the Work as stated
+               below:
+
+                    a. to Reproduce the Work, to incorporate the Work into one
+                    or more Collections, and to Reproduce the Work as
+                    incorporated in the Collections;
+
+                    b. to create and Reproduce Adaptations provided that any
+                    such Adaptation, including any translation in any medium,
+                    takes reasonable steps to clearly label, demarcate or
+                    otherwise identify that changes were made to the original
+                    Work. For example, a translation could be marked "The
+                    original work was translated from English to Spanish," or
+                    a modification could indicate "The original work has been
+                    modified.";
+
+                    c. to Distribute and Publicly Perform the Work including
+                    as incorporated in Collections; and,
+
+                    d. to Distribute and Publicly Perform Adaptations.
+
+               The above rights may be exercised in all media and formats
+               whether now known or hereafter devised. The above rights
+               include the right to make such modifications as are technically
+               necessary to exercise the rights in other media and formats.
+               Subject to Section 8(f), all rights not expressly granted by
+               Licensor are hereby reserved, including but not limited to the
+               rights described in Section 4(e).
+
+               4. Restrictions. The license granted in Section 3 above is
+               expressly made subject to and limited by the following
+               restrictions:
+
+                    a. You may Distribute or Publicly Perform the Work only
+                    under the terms of this License. You must include a copy
+                    of, or the Uniform Resource Identifier (URI) for, this
+                    License with every copy of the Work You Distribute or
+                    Publicly Perform. You may not offer or impose any terms on
+                    the Work that restrict the terms of this License or the
+                    ability of the recipient of the Work to exercise the
+                    rights granted to that recipient under the terms of the
+                    License.  You may not sublicense the Work. You must keep
+                    intact all notices that refer to this License and to the
+                    disclaimer of warranties with every copy of the Work You
+                    Distribute or Publicly Perform.  When You Distribute or
+                    Publicly Perform the Work, You may not impose any
+                    effective technological measures on the Work that restrict
+                    the ability of a recipient of the Work from You to
+                    exercise the rights granted to that recipient under the
+                    terms of the License. This Section 4(a) applies to the
+                    Work as incorporated in a Collection, but this does not
+                    require the Collection apart from the Work itself to be
+                    made subject to the terms of this License. If You create a
+                    Collection, upon notice from any Licensor You must, to the
+                    extent practicable, remove from the Collection any credit
+                    as required by Section 4(d), as requested. If You create
+                    an Adaptation, upon notice from any Licensor You must, to
+                    the extent practicable, remove from the Adaptation any
+                    credit as required by Section 4(d), as requested.
+
+                    b. You may Distribute or Publicly Perform an Adaptation
+                    only under: (i) the terms of this License; (ii) a later
+                    version of this License with the same License Elements as
+                    this License; (iii) a Creative Commons jurisdiction
+                    license (either this or a later license version) that
+                    contains the same License Elements as this License (e.g.,
+                    Attribution-NonCommercial-ShareAlike 3.0 US) ("Applicable
+                    License"). You must include a copy of, or the URI, for
+                    Applicable License with every copy of each Adaptation You
+                    Distribute or Publicly Perform. You may not offer or
+                    impose any terms on the Adaptation that restrict the terms
+                    of the Applicable License or the ability of the recipient
+                    of the Adaptation to exercise the rights granted to that
+                    recipient under the terms of the Applicable License. You
+                    must keep intact all notices that refer to the Applicable
+                    License and to the disclaimer of warranties with every
+                    copy of the Work as included in the Adaptation You
+                    Distribute or Publicly Perform.  When You Distribute or
+                    Publicly Perform the Adaptation, You may not impose any
+                    effective technological measures on the Adaptation that
+                    restrict the ability of a recipient of the Adaptation from
+                    You to exercise the rights granted to that recipient under
+                    the terms of the Applicable License. This Section 4(b)
+                    applies to the Adaptation as incorporated in a Collection,
+                    but this does not require the Collection apart from the
+                    Adaptation itself to be made subject to the terms of the
+                    Applicable License.
+
+                    c. You may not exercise any of the rights granted to You
+                    in Section 3 above in any manner that is primarily
+                    intended for or directed toward commercial advantage or
+                    private monetary compensation. The exchange of the Work
+                    for other copyrighted works by means of digital file-
+                    sharing or otherwise shall not be considered to be
+                    intended for or directed toward commercial advantage or
+                    private monetary compensation, provided there is no
+                    payment of any monetary compensation in con-nection with
+                    the exchange of copyrighted works.
+
+                    d. If You Distribute, or Publicly Perform the Work or any
+                    Adaptations or Collections, You must, unless a request has
+                    been made pursuant to Section 4(a), keep intact all
+                    copyright notices for the Work and provide, reasonable to
+                    the medium or means You are utilizing: (i) the name of the
+                    Original Author (or pseudonym, if applicable) if supplied,
+                    and/or if the Original Author and/or Licensor designate
+                    another party or parties (e.g., a sponsor institute,
+                    publishing entity, journal) for attribution ("Attribution
+                    Parties") in Licensor's copyright notice, terms of service
+                    or by other reasonable means, the name of such party or
+                    parties; (ii) the title of the Work if supplied; (iii) to
+                    the extent reasonably practicable, the URI, if any, that
+                    Licensor specifies to be associated with the Work, unless
+                    such URI does not refer to the copyright notice or
+                    licensing information for the Work; and, (iv) consistent
+                    with Section 3(b), in the case of an Adaptation, a credit
+                    identifying the use of the Work in the Adaptation (e.g.,
+                    "French translation of the Work by Original Author," or
+                    "Screenplay based on original Work by Original Author").
+                    The credit required by this Section 4(d) may be
+                    implemented in any reasonable manner; provided, however,
+                    that in the case of a Adaptation or Collection, at a
+                    minimum such credit will appear, if a credit for all
+                    contributing authors of the Adaptation or Collection
+                    appears, then as part of these credits and in a manner at
+                    least as prominent as the credits for the other
+                    contributing authors. For the avoidance of doubt, You may
+                    only use the credit required by this Section for the
+                    purpose of attribution in the manner set out above and, by
+                    exercising Your rights under this License, You may not
+                    implicitly or explicitly assert or imply any connection
+                    with, sponsorship or endorsement by the Original Author,
+                    Licensor and/or Attribution Parties, as appropriate, of
+                    You or Your use of the Work, without the separate, express
+                    prior written permission of the Original Author, Licensor
+                    and/or Attribution Parties.
+
+                    e. For the avoidance of doubt:
+
+                         i. Non-waivable Compulsory License Schemes. In those
+                         jurisdictions in which the right to collect royalties
+                         through any statutory or compulsory licensing scheme
+                         cannot be waived, the Licensor reserves the exclusive
+                         right to collect such royalties for any exercise by
+                         You of the rights granted under this License;
+
+                         ii. Waivable Compulsory License Schemes. In those
+                         jurisdictions in which the right to collect royalties
+                         through any statutory or compulsory licensing scheme
+                         can be waived, the Licensor reserves the exclusive
+                         right to collect such royalties for any exercise by
+                         You of the rights granted under this License if Your
+                         exercise of such rights is for a purpose or use which
+                         is otherwise than noncommercial as permitted under
+                         Section 4(c) and otherwise waives the right to
+                         collect royalties through any statutory or compulsory
+                         licensing scheme; and,
+
+                         iii. Voluntary License Schemes. The Licensor reserves
+                         the right to collect royalties, whether individually
+                         or, in the event that the Licensor is a member of a
+                         collecting society that administers voluntary
+                         licensing schemes, via that society, from any
+                         exercise by You of the rights granted under this
+                         License that is for a purpose or use which is
+                         otherwise than noncommercial as permitted under
+                         Section 4(c).
+
+                    f. Except as otherwise agreed in writing by the Licensor
+                    or as may be otherwise permitted by applicable law, if You
+                    Reproduce, Distribute or Publicly Perform the Work either
+                    by itself or as part of any Adaptations or Collections,
+                    You must not distort, mutilate, modify or take other
+                    derogatory action in relation to the Work which would be
+                    prejudicial to the Original Author's honor or reputation.
+                    Licensor agrees that in those jurisdictions (e.g. Japan),
+                    in which any exercise of the right granted in Section 3(b)
+                    of this License (the right to make Adaptations) would be
+                    deemed to be a distortion, mutilation, modification or
+                    other derogatory action prejudicial to the Original
+                    Author's honor and reputation, the Licensor will waive or
+                    not assert, as appropriate, this Section, to the fullest
+                    extent permitted by the applicable national law, to enable
+                    You to reasonably exercise Your right under Section 3(b)
+                    of this License (right to make Adaptations) but not
+                    otherwise.
+
+               5. Representations, Warranties and Disclaimer
+
+               UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING
+               AND TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, LICENSOR
+               OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR
+               WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED,
+               STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION,
+               WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+               PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER
+               DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+               WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW
+               THE EXCLUSION OF IMPLIED WARRANTIES, SO THIS EXCLUSION MAY NOT
+               APPLY TO YOU.
+
+               6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
+               APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON
+               ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL,
+               PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR
+               THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE
+               POSSIBILITY OF SUCH DAMAGES.
+
+               7. Termination
+
+                    a. This License and the rights granted hereunder will
+                    terminate automatically upon any breach by You of the
+                    terms of this License.  Individuals or entities who have
+                    received Adaptations or Collections from You under this
+                    License, however, will not have their licenses terminated
+                    provided such individuals or entities remain in full
+                    compliance with those licenses. Sections 1, 2, 5, 6, 7,
+                    and 8 will survive any termination of this License.
+
+                    b. Subject to the above terms and conditions, the license
+                    granted here is perpetual (for the duration of the
+                    applicable copyright in the Work).  Notwithstanding the
+                    above, Licensor reserves the right to release the Work
+                    under different license terms or to stop distributing the
+                    Work at any time; provided, however that any such election
+                    will not serve to withdraw this License (or any other
+                    license that has been, or is required to be, granted under
+                    the terms of this License), and this License will continue
+                    in full force and effect unless terminated as stated
+                    above.
+
+               8. Miscellaneous
+
+                    a. Each time You Distribute or Publicly Perform the Work
+                    or a Collection, the Licensor offers to the recipient a
+                    license to the Work on the same terms and conditions as
+                    the license granted to You under this License.
+
+                    b. Each time You Distribute or Publicly Perform an
+                    Adaptation, Licensor offers to the recipient a license to
+                    the original Work on the same terms and conditions as the
+                    license granted to You under this License.
+
+                    c. If any provision of this License is invalid or
+                    unenforceable under applicable law, it shall not affect
+                    the validity or enforceability of the remainder of the
+                    terms of this License, and without further action by the
+                    parties to this agreement, such provision shall be
+                    reformed to the minimum extent necessary to make such
+                    provision valid and enforceable.
+
+                    d. No term or provision of this License shall be deemed
+                    waived and no breach consented to unless such waiver or
+                    consent shall be in writing and signed by the party to be
+                    charged with such waiver or consent.
+
+                    e. This License constitutes the entire agreement between
+                    the parties with respect to the Work licensed here. There
+                    are no understandings, agreements or representations with
+                    respect to the Work not specified here. Licensor shall not
+                    be bound by any additional provisions that may appear in
+                    any communication from You. This License may not be
+                    modified without the mutual written agreement of the
+                    Licensor and You.
+
+                    f. The rights granted under, and the subject matter
+                    referenced, in this License were drafted utilizing the
+                    terminology of the Berne Convention for the Protection of
+                    Literary and Artistic Works (as amended on September 28,
+                    1979), the Rome Convention of 1961, the WIPO Copyright
+                    Treaty of 1996, the WIPO Performances and Phonograms
+                    Treaty of 1996 and the Universal Copyright Convention (as
+                    revised on July 24, 1971). These rights and subject matter
+                    take effect in the relevant jurisdiction in which the
+                    License terms are sought to be enforced according to the
+                    corresponding provisions of the implementation of those
+                    treaty provisions in the applicable national law.  If the
+                    standard suite of rights granted under applicable
+                    copyright law includes additional rights not granted under
+                    this License, such additional rights are deemed to be
+                    included in the License; this License is not intended to
+                    restrict the license of any rights under applicable law.
+
+          Creative Commons Notice
+
+          Creative Commons is not a party to this License, and makes no
+          warranty whatsoever in connection with the Work. Creative Commons
+          will not be liable to You or any party on any legal theory for any
+          damages whatsoever, including without limitation any general,
+          special, incidental or consequential damages arising in connection
+          to this license.  Notwithstanding the foregoing two (2) sentences,
+          if Creative Commons has expressly identified itself as the Licensor
+          hereunder, it shall have all rights and obligations of Licensor.
+
+          Except for the limited purpose of indicating to the public that the
+          Work is licensed under the CCPL, Creative Commons does not authorize
+          the use by either party of the trademark "Creative Commons" or any
+          related trademark or logo of Creative Commons without the prior
+          written consent of Creative Commons. Any permitted use will be in
+          compliance with Creative Commons' then-current trademark usage
+          guidelines, as may be published on its website or otherwise made
+          available upon request from time to time. For the avoidance of
+          doubt, this trademark restriction does not form part of this
+          License.
+
+          Creative Commons may be contacted at http://creativecommons.org/.
+
+   LGPL-2
+     These components fall under the LGPL-2:
+
+     (C) 2009 Chris Robinson
+                 openal-soft: http://kcat.strangesoft.net/openal.html
+
+          GNU LIBRARY GENERAL PUBLIC LICENSE
+          Version 2, June 1991
+
+          Copyright (C) 1991 Free Software Foundation, Inc.  59 Temple Place -
+          Suite 330, Boston, MA 02111-1307, USA
+          Everyone is permitted to copy and distribute verbatim copies of this
+          license document, but changing it is not allowed.
+
+          [This is the first released version of the library GPL.  It is
+          numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+          Preamble
+
+          The licenses for most software are designed to take away your
+          freedom to share and change it.  By contrast, the GNU General Public
+          Licenses are intended to guarantee your freedom to share and change
+          free software--to make sure the software is free for all its users.
+
+          This license, the Library General Public License, applies to some
+          specially designated Free Software Foundation software, and to any
+          other libraries whose authors decide to use it.  You can use it for
+          your libraries, too.
+
+          When we speak of free software, we are referring to freedom, not
+          price.  Our General Public Licenses are designed to make sure that
+          you have the freedom to distribute copies of free software (and
+          charge for this service if you wish), that you receive source code
+          or can get it if you want it, that you can change the software or
+          use pieces of it in new free programs; and that you know you can do
+          these things.
+
+          To protect your rights, we need to make restrictions that forbid
+          anyone to deny you these rights or to ask you to surrender the
+          rights.  These restrictions translate to certain responsibilities
+          for you if you distribute copies of the library, or if you modify
+          it.
+
+          For example, if you distribute copies of the library, whether gratis
+          or for a fee, you must give the recipients all the rights that we
+          gave you.  You must make sure that they, too, receive or can get the
+          source code.  If you link a program with the library, you must
+          provide complete object files to the recipients so that they can
+          relink them with the library, after making changes to the library
+          and recompiling it.  And you must show them these terms so they know
+          their rights.
+
+          Our method of protecting your rights has two steps: (1) copyright
+          the library, and (2) offer you this license which gives you legal
+          permission to copy, distribute and/or modify the library.
+
+          Also, for each distributor's protection, we want to make certain
+          that everyone understands that there is no warranty for this free
+          library.  If the library is modified by someone else and passed on,
+          we want its recipients to know that what they have is not the
+          original version, so that any problems introduced by others will not
+          reflect on the original authors' reputations.
+
+          Finally, any free program is threatened constantly by software
+          patents.  We wish to avoid the danger that companies distributing
+          free software will individually obtain patent licenses, thus in
+          effect transforming the program into proprietary software.  To
+          prevent this, we have made it clear that any patent must be licensed
+          for everyone's free use or not licensed at all.
+
+          Most GNU software, including some libraries, is covered by the
+          ordinary GNU General Public License, which was designed for utility
+          programs.  This license, the GNU Library General Public License,
+          applies to certain designated libraries.  This license is quite
+          different from the ordinary one; be sure to read it in full, and
+          don't assume that anything in it is the same as in the ordinary
+          license.
+
+          The reason we have a separate public license for some libraries is
+          that they blur the distinction we usually make between modifying or
+          adding to a program and simply using it.  Linking a program with a
+          library, without changing the library, is in some sense simply using
+          the library, and is analogous to running a utility program or
+          application program.  However, in a textual and legal sense, the
+          linked executable is a combined work, a derivative of the original
+          library, and the ordinary General Public License treats it as such.
+
+          Because of this blurred distinction, using the ordinary General
+          Public License for libraries did not effectively promote software
+          sharing, because most developers did not use the libraries.  We
+          concluded that weaker conditions might promote sharing better.
+
+          However, unrestricted linking of non-free programs would deprive the
+          users of those programs of all benefit from the free status of the
+          libraries themselves.  This Library General Public License is
+          intended to permit developers of non-free programs to use free
+          libraries, while preserving your freedom as a user of such programs
+          to change the free libraries that are incorporated in them.  (We
+          have not seen how to achieve this as regards changes in header
+          files, but we have achieved it as regards changes in the actual
+          functions of the Library.)  The hope is that this will lead to
+          faster development of free libraries.
+
+          The precise terms and conditions for copying, distribution and
+          modification follow.  Pay close attention to the difference between
+          a "work based on the library" and a "work that uses the library".
+          The former contains code derived from the library, while the latter
+          only works together with the library.
+
+          Note that it is possible for a library to be covered by the ordinary
+          General Public License rather than by this special one.
+
+          GNU LIBRARY GENERAL PUBLIC LICENSE
+          TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+          0. This License Agreement applies to any software library which
+          contains a notice placed by the copyright holder or other authorized
+          party saying it may be distributed under the terms of this Library
+          General Public License (also called "this License").  Each licensee
+          is addressed as "you".
+
+          A "library" means a collection of software functions and/or data
+          prepared so as to be conveniently linked with application programs
+          (which use some of those functions and data) to form executables.
+
+          The "Library", below, refers to any such software library or work
+          which has been distributed under these terms.  A "work based on the
+          Library" means either the Library or any derivative work under
+          copyright law: that is to say, a work containing the Library or a
+          portion of it, either verbatim or with modifications and/or
+          translated straightforwardly into another language.  (Hereinafter,
+          translation is included without limitation in the term
+          "modification".)
+
+          "Source code" for a work means the preferred form of the work for
+          making modifications to it.  For a library, complete source code
+          means all the source code for all modules it contains, plus any
+          associated interface definition files, plus the scripts used to
+          control compilation and installation of the library.
+
+          Activities other than copying, distribution and modification are not
+          covered by this License; they are outside its scope.  The act of
+          running a program using the Library is not restricted, and output
+          from such a program is covered only if its contents constitute a
+          work based on the Library (independent of the use of the Library in
+          a tool for writing it).  Whether that is true depends on what the
+          Library does and what the program that uses the Library does.
+
+          1. You may copy and distribute verbatim copies of the Library's
+          complete source code as you receive it, in any medium, provided that
+          you conspicuously and appropriately publish on each copy an
+          appropriate copyright notice and disclaimer of warranty; keep intact
+          all the notices that refer to this License and to the absence of any
+          warranty; and distribute a copy of this License along with the
+          Library.
+
+          You may charge a fee for the physical act of transferring a copy,
+          and you may at your option offer warranty protection in exchange for
+          a fee.
+
+          2. You may modify your copy or copies of the Library or any portion
+          of it, thus forming a work based on the Library, and copy and
+          distribute such modifications or work under the terms of Section 1
+          above, provided that you also meet all of these conditions:
+
+               a) The modified work must itself be a software library.
+
+               b) You must cause the files modified to carry prominent notices
+               stating that you changed the files and the date of any change.
+
+               c) You must cause the whole of the work to be licensed at no
+               charge to all third parties under the terms of this License.
+
+               d) If a facility in the modified Library refers to a function
+               or a table of data to be supplied by an application program
+               that uses the facility, other than as an argument passed when
+               the facility is invoked, then you must make a good faith effort
+               to ensure that, in the event an application does not supply
+               such function or table, the facility still operates, and
+               performs whatever part of its purpose remains meaningful.
+
+               (For example, a function in a library to compute square roots
+               has a purpose that is entirely well-defined independent of the
+               application.  Therefore, Subsection 2d requires that any
+               application-supplied function or table used by this function
+               must be optional: if the application does not supply it, the
+               square root function must still compute square roots.)
+
+          These requirements apply to the modified work as a whole.  If
+          identifiable sections of that work are not derived from the Library,
+          and can be reasonably considered independent and separate works in
+          themselves, then this License, and its terms, do not apply to those
+          sections when you distribute them as separate works.  But when you
+          distribute the same sections as part of a whole which is a work
+          based on the Library, the distribution of the whole must be on the
+          terms of this License, whose permissions for other licensees extend
+          to the entire whole, and thus to each and every part regardless of
+          who wrote it.
+
+          Thus, it is not the intent of this section to claim rights or
+          contest your rights to work written entirely by you; rather, the
+          intent is to exercise the right to control the distribution of
+          derivative or collective works based on the Library.
+
+          In addition, mere aggregation of another work not based on the
+          Library with the Library (or with a work based on the Library) on a
+          volume of a storage or distribution medium does not bring the other
+          work under the scope of this License.
+
+          3. You may opt to apply the terms of the ordinary GNU General Public
+          License instead of this License to a given copy of the Library.  To
+          do this, you must alter all the notices that refer to this License,
+          so that they refer to the ordinary GNU General Public License,
+          version 2, instead of to this License.  (If a newer version than
+          version 2 of the ordinary GNU General Public License has appeared,
+          then you can specify that version instead if you wish.)  Do not make
+          any other change in these notices.
+
+          Once this change is made in a given copy, it is irreversible for
+          that copy, so the ordinary GNU General Public License applies to all
+          subsequent copies and derivative works made from that copy.
+
+          This option is useful when you wish to copy part of the code of the
+          Library into a program that is not a library.
+
+          4. You may copy and distribute the Library (or a portion or
+          derivative of it, under Section 2) in object code or executable form
+          under the terms of Sections 1 and 2 above provided that you
+          accompany it with the complete corresponding machine-readable source
+          code, which must be distributed under the terms of Sections 1 and 2
+          above on a medium customarily used for software interchange.
+
+          If distribution of object code is made by offering access to copy
+          from a designated place, then offering equivalent access to copy the
+          source code from the same place satisfies the requirement to
+          distribute the source code, even though third parties are not
+          compelled to copy the source along with the object code.
+
+          5. A program that contains no derivative of any portion of the
+          Library, but is designed to work with the Library by being compiled
+          or linked with it, is called a "work that uses the Library".  Such a
+          work, in isolation, is not a derivative work of the Library, and
+          therefore falls outside the scope of this License.
+
+          However, linking a "work that uses the Library" with the Library
+          creates an executable that is a derivative of the Library (because
+          it contains portions of the Library), rather than a "work that uses
+          the library".  The executable is therefore covered by this License.
+          Section 6 states terms for distribution of such executables.
+
+          When a "work that uses the Library" uses material from a header file
+          that is part of the Library, the object code for the work may be a
+          derivative work of the Library even though the source code is not.
+          Whether this is true is especially significant if the work can be
+          linked without the Library, or if the work is itself a library.  The
+          threshold for this to be true is not precisely defined by law.
+
+          If such an object file uses only numerical parameters, data
+          structure layouts and accessors, and small macros and small inline
+          functions (ten lines or less in length), then the use of the object
+          file is unrestricted, regardless of whether it is legally a
+          derivative work.  (Executables containing this object code plus
+          portions of the Library will still fall under Section 6.)
+
+          Otherwise, if the work is a derivative of the Library, you may
+          distribute the object code for the work under the terms of Section
+          6.  Any executables containing that work also fall under Section 6,
+          whether or not they are linked directly with the Library itself.
+
+          6. As an exception to the Sections above, you may also compile or
+          link a "work that uses the Library" with the Library to produce a
+          work containing portions of the Library, and distribute that work
+          under terms of your choice, provided that the terms permit
+          modification of the work for the customer's own use and reverse
+          engineering for debugging such modifications.
+
+          You must give prominent notice with each copy of the work that the
+          Library is used in it and that the Library and its use are covered
+          by this License.  You must supply a copy of this License.  If the
+          work during execution displays copyright notices, you must include
+          the copyright notice for the Library among them, as well as a
+          reference directing the user to the copy of this License.  Also, you
+          must do one of these things:
+
+               a) Accompany the work with the complete corresponding machine-
+               readable source code for the Library including whatever changes
+               were used in the work (which must be distributed under Sections
+               1 and 2 above); and, if the work is an executable linked with
+               the Library, with the complete machine-readable "work that uses
+               the Library", as object code and/or source code, so that the
+               user can modify the Library and then relink to produce a
+               modified executable containing the modified Library.  (It is
+               understood that the user who changes the contents of
+               definitions files in the Library will not necessarily be able
+               to recompile the application to use the modified definitions.)
+
+               b) Accompany the work with a written offer, valid for at least
+               three years, to give the same user the materials specified in
+               Subsection 6a, above, for a charge no more than the cost of
+               performing this distribution.
+
+               c) If distribution of the work is made by offering access to
+               copy from a designated place, offer equivalent access to copy
+               the above specified materials from the same place.
+
+               d) Verify that the user has already received a copy of these
+               materials or that you have already sent this user a copy.
+
+          For an executable, the required form of the "work that uses the
+          Library" must include any data and utility programs needed for
+          reproducing the executable from it.  However, as a special
+          exception, the source code distributed need not include anything
+          that is normally distributed (in either source or binary form) with
+          the major components (compiler, kernel, and so on) of the operating
+          system on which the executable runs, unless that component itself
+          accompanies the executable.
+
+          It may happen that this requirement contradicts the license
+          restrictions of other proprietary libraries that do not normally
+          accompany the operating system.  Such a contradiction means you
+          cannot use both them and the Library together in an executable that
+          you distribute.
+
+          7. You may place library facilities that are a work based on the
+          Library side-by-side in a single library together with other library
+          facilities not covered by this License, and distribute such a
+          combined library, provided that the separate distribution of the
+          work based on the Library and of the other library facilities is
+          otherwise permitted, and provided that you do these two things:
+
+               a) Accompany the combined library with a copy of the same work
+               based on the Library, uncombined with any other library
+               facilities.  This must be distributed under the terms of the
+               Sections above.
+
+               b) Give prominent notice with the combined library of the fact
+               that part of it is a work based on the Library, and explaining
+               where to find the accompanying uncombined form of the same
+               work.
+
+          8. You may not copy, modify, sublicense, link with, or distribute
+          the Library except as expressly provided under this License.  Any
+          attempt otherwise to copy, modify, sublicense, link with, or
+          distribute the Library is void, and will automatically terminate
+          your rights under this License.  However, parties who have received
+          copies, or rights, from you under this License will not have their
+          licenses terminated so long as such parties remain in full
+          compliance.
+
+          9. You are not required to accept this License, since you have not
+          signed it.  However, nothing else grants you permission to modify or
+          distribute the Library or its derivative works.  These actions are
+          prohibited by law if you do not accept this License.  Therefore, by
+          modifying or distributing the Library (or any work based on the
+          Library), you indicate your acceptance of this License to do so, and
+          all its terms and conditions for copying, distributing or modifying
+          the Library or works based on it.
+
+          10. Each time you redistribute the Library (or any work based on the
+          Library), the recipient automatically receives a license from the
+          original licensor to copy, distribute, link with or modify the
+          Library subject to these terms and conditions.  You may not impose
+          any further restrictions on the recipients' exercise of the rights
+          granted herein.  You are not responsible for enforcing compliance by
+          third parties to this License.
+
+          11. If, as a consequence of a court judgment or allegation of patent
+          infringement or for any other reason (not limited to patent issues),
+          conditions are imposed on you (whether by court order, agreement or
+          otherwise) that contradict the conditions of this License, they do
+          not excuse you from the conditions of this License.  If you cannot
+          distribute so as to satisfy simultaneously your obligations under
+          this License and any other pertinent obligations, then as a
+          consequence you may not distribute the Library at all.  For example,
+          if a patent license would not permit royalty-free redistribution of
+          the Library by all those who receive copies directly or indirectly
+          through you, then the only way you could satisfy both it and this
+          License would be to refrain entirely from distribution of the
+          Library.
+
+          If any portion of this section is held invalid or unenforceable
+          under any particular circumstance, the balance of the section is
+          intended to apply, and the section as a whole is intended to apply
+          in other circumstances.
+
+          It is not the purpose of this section to induce you to infringe any
+          patents or other property right claims or to contest validity of any
+          such claims; this section has the sole purpose of protecting the
+          integrity of the free software distribution system which is
+          implemented by public license practices.  Many people have made
+          generous contributions to the wide range of software distributed
+          through that system in reliance on consistent application of that
+          system; it is up to the author/donor to decide if he or she is
+          willing to distribute software through any other system and a
+          licensee cannot impose that choice.
+
+          This section is intended to make thoroughly clear what is believed
+          to be a consequence of the rest of this License.
+
+          12. If the distribution and/or use of the Library is restricted in
+          certain countries either by patents or by copyrighted interfaces,
+          the original copyright holder who places the Library under this
+          License may add an explicit geographical distribution limitation
+          excluding those countries, so that distribution is permitted only in
+          or among countries not thus excluded.  In such case, this License
+          incorporates the limitation as if written in the body of this
+          License.
+
+          13. The Free Software Foundation may publish revised and/or new
+          versions of the Library General Public License from time to time.
+          Such new versions will be similar in spirit to the present version,
+          but may differ in detail to address new problems or concerns.
+
+          Each version is given a distinguishing version number.  If the
+          Library specifies a version number of this License which applies to
+          it and "any later version", you have the option of following the
+          terms and conditions either of that version or of any later version
+          published by the Free Software Foundation.  If the Library does not
+          specify a license version number, you may choose any version ever
+          published by the Free Software Foundation.
+
+          14. If you wish to incorporate parts of the Library into other free
+          programs whose distribution conditions are incompatible with these,
+          write to the author to ask for permission.  For software which is
+          copyrighted by the Free Software Foundation, write to the Free
+          Software Foundation; we sometimes make exceptions for this.  Our
+          decision will be guided by the two goals of preserving the free
+          status of all derivatives of our free software and of promoting the
+          sharing and reuse of software generally.
+
+          NO WARRANTY
+
+          15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+          WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+          EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+          OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+          KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+          PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+          PERFORMANCE OF THE LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE
+          DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+          CORRECTION.
+
+          16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+          WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+          AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+          FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+          CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+          LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+          RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+          FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+          SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+          SUCH DAMAGES.
+
+          END OF TERMS AND CONDITIONS
+
+          Appendix: How to Apply These Terms to Your New Libraries
+
+          If you develop a new library, and you want it to be of the greatest
+          possible use to the public, we recommend making it free software
+          that everyone can redistribute and change.  You can do so by
+          permitting redistribution under these terms (or, alternatively,
+          under the terms of the ordinary General Public License).
+
+          To apply these terms, attach the following notices to the library.
+          It is safest to attach them to the start of each source file to most
+          effectively convey the exclusion of warranty; and each file should
+          have at least the "copyright" line and a pointer to where the full
+          notice is found.
+
+               <one line to give the library's name and a brief idea of what
+               it does.>
+               Copyright (C) <year>  <name of author>
+
+               This library 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 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 Library General Public License for more details.
+
+               You should have received a copy of the GNU Library General
+               Public License along with this library; if not, write to the
+               Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+               Boston, MA 02111-1307, USA
+
+          Also add information on how to contact you by electronic and paper
+          mail.
+
+          You should also get your employer (if you work as a programmer) or
+          your school, if any, to sign a "copyright disclaimer" for the
+          library, if necessary.  Here is a sample; alter the names:
+
+               Yoyodyne, Inc., hereby disclaims all copyright interest in the
+               library `Frob' (a library for tweaking knobs) written by James
+               Random Hacker.
+
+               <signature of Ty Coon>, 1 April 1990
+               Ty Coon, President of Vice
+
+          That's all there is to it!
+
+   LGPL-2.1
+     These components fall under the LGPL-2.1:
+
+     (C) 2009 Sam Lantinga et al.
+                 SDL: http://www.libsdl.org/
+
+     (C) 2002 Bob Pendleton
+                 fastevents: http://www.gameprogrammer.com/fastevents/
+
+          GNU LESSER GENERAL PUBLIC LICENSE
+          Version 2.1, February 1999
+
+          Copyright (C) 1991, 1999 Free Software Foundation, Inc.  51 Franklin
+          St, Fifth Floor, Boston, MA  02110-1301  USA
+          Everyone is permitted to copy and distribute verbatim copies of this
+          license document, but changing it is not allowed.
+
+          [This is the first released version of the Lesser GPL.  It also
+          counts as the successor of the GNU Library Public License, version
+          2, hence the version number 2.1.]
+
+          Preamble
+
+          The licenses for most software are designed to take away your
+          freedom to share and change it.  By contrast, the GNU General Public
+          Licenses are intended to guarantee your freedom to share and change
+          free software--to make sure the software is free for all its users.
+
+          This license, the Lesser General Public License, applies to some
+          specially designated software packages--typically libraries--of the
+          Free Software Foundation and other authors who decide to use it.
+          You can use it too, but we suggest you first think carefully about
+          whether this license or the ordinary General Public License is the
+          better strategy to use in any particular case, based on the
+          explanations below.
+
+          When we speak of free software, we are referring to freedom of use,
+          not price.  Our General Public Licenses are designed to make sure
+          that you have the freedom to distribute copies of free software (and
+          charge for this service if you wish); that you receive source code
+          or can get it if you want it; that you can change the software and
+          use pieces of it in new free programs; and that you are informed
+          that you can do these things.
+
+          To protect your rights, we need to make restrictions that forbid
+          distributors to deny you these rights or to ask you to surrender
+          these rights.  These restrictions translate to certain
+          responsibilities for you if you distribute copies of the library or
+          if you modify it.
+
+          For example, if you distribute copies of the library, whether gratis
+          or for a fee, you must give the recipients all the rights that we
+          gave you.  You must make sure that they, too, receive or can get the
+          source code.  If you link other code with the library, you must
+          provide complete object files to the recipients, so that they can
+          relink them with the library after making changes to the library and
+          recompiling it.  And you must show them these terms so they know
+          their rights.
+
+          We protect your rights with a two-step method: (1) we copyright the
+          library, and (2) we offer you this license, which gives you legal
+          permission to copy, distribute and/or modify the library.
+
+          To protect each distributor, we want to make it very clear that
+          there is no warranty for the free library.  Also, if the library is
+          modified by someone else and passed on, the recipients should know
+          that what they have is not the original version, so that the
+          original author's reputation will not be affected by problems that
+          might be introduced by others.
+
+          Finally, software patents pose a constant threat to the existence of
+          any free program.  We wish to make sure that a company cannot
+          effectively restrict the users of a free program by obtaining a
+          restrictive license from a patent holder.  Therefore, we insist that
+          any patent license obtained for a version of the library must be
+          consistent with the full freedom of use specified in this license.
+
+          Most GNU software, including some libraries, is covered by the
+          ordinary GNU General Public License.  This license, the GNU Lesser
+          General Public License, applies to certain designated libraries, and
+          is quite different from the ordinary General Public License.  We use
+          this license for certain libraries in order to permit linking those
+          libraries into non-free programs.
+
+          When a program is linked with a library, whether statically or using
+          a shared library, the combination of the two is legally speaking a
+          combined work, a derivative of the original library.  The ordinary
+          General Public License therefore permits such linking only if the
+          entire combination fits its criteria of freedom.  The Lesser General
+          Public License permits more lax criteria for linking other code with
+          the library.
+
+          We call this license the "Lesser" General Public License because it
+          does Less to protect the user's freedom than the ordinary General
+          Public License.  It also provides other free software developers
+          Less of an advantage over competing non-free programs.  These
+          disadvantages are the reason we use the ordinary General Public
+          License for many libraries.  However, the Lesser license provides
+          advantages in certain special circumstances.
+
+          For example, on rare occasions, there may be a special need to
+          encourage the widest possible use of a certain library, so that it
+          becomes a de-facto standard.  To achieve this, non-free programs
+          must be allowed to use the library.  A more frequent case is that a
+          free library does the same job as widely used non-free libraries.
+          In this case, there is little to gain by limiting the free library
+          to free software only, so we use the Lesser General Public License.
+
+          In other cases, permission to use a particular library in non-free
+          programs enables a greater number of people to use a large body of
+          free software.  For example, permission to use the GNU C Library in
+          non-free programs enables many more people to use the whole GNU
+          operating system, as well as its variant, the GNU/Linux operating
+          system.
+
+          Although the Lesser General Public License is Less protective of the
+          users' freedom, it does ensure that the user of a program that is
+          linked with the Library has the freedom and the wherewithal to run
+          that program using a modified version of the Library.
+
+          The precise terms and conditions for copying, distribution and
+          modification follow.  Pay close attention to the difference between
+          a "work based on the library" and a "work that uses the library".
+          The former contains code derived from the library, whereas the
+          latter must be combined with the library in order to run.
+
+          GNU LESSER GENERAL PUBLIC LICENSE
+          TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+          0. This License Agreement applies to any software library or other
+          program which contains a notice placed by the copyright holder or
+          other authorized party saying it may be distributed under the terms
+          of this Lesser General Public License (also called "this License").
+          Each licensee is addressed as "you".
+
+          A "library" means a collection of software functions and/or data
+          prepared so as to be conveniently linked with application programs
+          (which use some of those functions and data) to form executables.
+
+          The "Library", below, refers to any such software library or work
+          which has been distributed under these terms.  A "work based on the
+          Library" means either the Library or any derivative work under
+          copyright law: that is to say, a work containing the Library or a
+          portion of it, either verbatim or with modifications and/or
+          translated straightforwardly into another language.  (Hereinafter,
+          translation is included without limitation in the term
+          "modification".)
+
+          "Source code" for a work means the preferred form of the work for
+          making modifications to it.  For a library, complete source code
+          means all the source code for all modules it contains, plus any
+          associated interface definition files, plus the scripts used to
+          control compilation and installation of the library.
+
+          Activities other than copying, distribution and modification are not
+          covered by this License; they are outside its scope.  The act of
+          running a program using the Library is not restricted, and output
+          from such a program is covered only if its contents constitute a
+          work based on the Library (independent of the use of the Library in
+          a tool for writing it).  Whether that is true depends on what the
+          Library does and what the program that uses the Library does.
+
+          1. You may copy and distribute verbatim copies of the Library's
+          complete source code as you receive it, in any medium, provided that
+          you conspicuously and appropriately publish on each copy an
+          appropriate copyright notice and disclaimer of warranty; keep intact
+          all the notices that refer to this License and to the absence of any
+          warranty; and distribute a copy of this License along with the
+          Library.
+
+          You may charge a fee for the physical act of transferring a copy,
+          and you may at your option offer warranty protection in exchange for
+          a fee.
+
+          2. You may modify your copy or copies of the Library or any portion
+          of it, thus forming a work based on the Library, and copy and
+          distribute such modifications or work under the terms of Section 1
+          above, provided that you also meet all of these conditions:
+
+               a) The modified work must itself be a software library.
+
+               b) You must cause the files modified to carry prominent notices
+               stating that you changed the files and the date of any change.
+
+               c) You must cause the whole of the work to be licensed at no
+               charge to all third parties under the terms of this License.
+
+               d) If a facility in the modified Library refers to a function
+               or a table of data to be supplied by an application program
+               that uses the facility, other than as an argument passed when
+               the facility is invoked, then you must make a good faith effort
+               to ensure that, in the event an application does not supply
+               such function or table, the facility still operates, and
+               performs whatever part of its purpose remains meaningful.
+
+               (For example, a function in a library to compute square roots
+               has a purpose that is entirely well-defined independent of the
+               application.  Therefore, Subsection 2d requires that any
+               application-supplied function or table used by this function
+               must be optional: if the application does not supply it, the
+               square root function must still compute square roots.)
+
+          These requirements apply to the modified work as a whole.  If
+          identifiable sections of that work are not derived from the Library,
+          and can be reasonably considered independent and separate works in
+          themselves, then this License, and its terms, do not apply to those
+          sections when you distribute them as separate works.  But when you
+          distribute the same sections as part of a whole which is a work
+          based on the Library, the distribution of the whole must be on the
+          terms of this License, whose permissions for other licensees extend
+          to the entire whole, and thus to each and every part regardless of
+          who wrote it.
+
+          Thus, it is not the intent of this section to claim rights or
+          contest your rights to work written entirely by you; rather, the
+          intent is to exercise the right to control the distribution of
+          derivative or collective works based on the Library.
+
+          In addition, mere aggregation of another work not based on the
+          Library with the Library (or with a work based on the Library) on a
+          volume of a storage or distribution medium does not bring the other
+          work under the scope of this License.
+
+          3. You may opt to apply the terms of the ordinary GNU General Public
+          License instead of this License to a given copy of the Library.  To
+          do this, you must alter all the notices that refer to this License,
+          so that they refer to the ordinary GNU General Public License,
+          version 2, instead of to this License.  (If a newer version than
+          version 2 of the ordinary GNU General Public License has appeared,
+          then you can specify that version instead if you wish.)  Do not make
+          any other change in these notices.
+
+          Once this change is made in a given copy, it is irreversible for
+          that copy, so the ordinary GNU General Public License applies to all
+          subsequent copies and derivative works made from that copy.
+
+          This option is useful when you wish to copy part of the code of the
+          Library into a program that is not a library.
+
+          4. You may copy and distribute the Library (or a portion or
+          derivative of it, under Section 2) in object code or executable form
+          under the terms of Sections 1 and 2 above provided that you
+          accompany it with the complete corresponding machine-readable source
+          code, which must be distributed under the terms of Sections 1 and 2
+          above on a medium customarily used for software interchange.
+
+          If distribution of object code is made by offering access to copy
+          from a designated place, then offering equivalent access to copy the
+          source code from the same place satisfies the requirement to
+          distribute the source code, even though third parties are not
+          compelled to copy the source along with the object code.
+
+          5. A program that contains no derivative of any portion of the
+          Library, but is designed to work with the Library by being compiled
+          or linked with it, is called a "work that uses the Library".  Such a
+          work, in isolation, is not a derivative work of the Library, and
+          therefore falls outside the scope of this License.
+
+          However, linking a "work that uses the Library" with the Library
+          creates an executable that is a derivative of the Library (because
+          it contains portions of the Library), rather than a "work that uses
+          the library".  The executable is therefore covered by this License.
+          Section 6 states terms for distribution of such executables.
+
+          When a "work that uses the Library" uses material from a header file
+          that is part of the Library, the object code for the work may be a
+          derivative work of the Library even though the source code is not.
+          Whether this is true is especially significant if the work can be
+          linked without the Library, or if the work is itself a library.  The
+          threshold for this to be true is not precisely defined by law.
+
+          If such an object file uses only numerical parameters, data
+          structure layouts and accessors, and small macros and small inline
+          functions (ten lines or less in length), then the use of the object
+          file is unrestricted, regardless of whether it is legally a
+          derivative work.  (Executables containing this object code plus
+          portions of the Library will still fall under Section 6.)
+
+          Otherwise, if the work is a derivative of the Library, you may
+          distribute the object code for the work under the terms of Section
+          6.  Any executables containing that work also fall under Section 6,
+          whether or not they are linked directly with the Library itself.
+
+          6. As an exception to the Sections above, you may also combine or
+          link a "work that uses the Library" with the Library to produce a
+          work containing portions of the Library, and distribute that work
+          under terms of your choice, provided that the terms permit
+          modification of the work for the customer's own use and reverse
+          engineering for debugging such modifications.
+
+          You must give prominent notice with each copy of the work that the
+          Library is used in it and that the Library and its use are covered
+          by this License.  You must supply a copy of this License.  If the
+          work during execution displays copyright notices, you must include
+          the copyright notice for the Library among them, as well as a
+          reference directing the user to the copy of this License.  Also, you
+          must do one of these things:
+
+               a) Accompany the work with the complete corresponding machine-
+               readable source code for the Library including whatever changes
+               were used in the work (which must be distributed under Sections
+               1 and 2 above); and, if the work is an executable linked with
+               the Library, with the complete machine-readable "work that uses
+               the Library", as object code and/or source code, so that the
+               user can modify the Library and then relink to produce a
+               modified executable containing the modified Library.  (It is
+               understood that the user who changes the contents of
+               definitions files in the Library will not necessarily be able
+               to recompile the application to use the modified definitions.)
+
+               b) Use a suitable shared library mechanism for linking with the
+               Library.  A suitable mechanism is one that (1) uses at run time
+               a copy of the library already present on the user's computer
+               system, rather than copying library functions into the
+               executable, and (2) will operate properly with a modified
+               version of the library, if the user installs one, as long as
+               the modified version is interface-compatible with the version
+               that the work was made with.
+
+               c) Accompany the work with a written offer, valid for at least
+               three years, to give the same user the materials specified in
+               Subsection 6a, above, for a charge no more than the cost of
+               performing this distribution.
+
+               d) If distribution of the work is made by offering access to
+               copy from a designated place, offer equivalent access to copy
+               the above specified materials from the same place.
+
+               e) Verify that the user has already received a copy of these
+               materials or that you have already sent this user a copy.
+
+          For an executable, the required form of the "work that uses the
+          Library" must include any data and utility programs needed for
+          reproducing the executable from it.  However, as a special
+          exception, the materials to be distributed need not include anything
+          that is normally distributed (in either source or binary form) with
+          the major components (compiler, kernel, and so on) of the operating
+          system on which the executable runs, unless that component itself
+          accompanies the executable.
+
+          It may happen that this requirement contradicts the license
+          restrictions of other proprietary libraries that do not normally
+          accompany the operating system.  Such a contradiction means you
+          cannot use both them and the Library together in an executable that
+          you distribute.
+
+          7. You may place library facilities that are a work based on the
+          Library side-by-side in a single library together with other library
+          facilities not covered by this License, and distribute such a
+          combined library, provided that the separate distribution of the
+          work based on the Library and of the other library facilities is
+          otherwise permitted, and provided that you do these two things:
+
+               a) Accompany the combined library with a copy of the same work
+               based on the Library, uncombined with any other library
+               facilities.  This must be distributed under the terms of the
+               Sections above.
+
+               b) Give prominent notice with the combined library of the fact
+               that part of it is a work based on the Library, and explaining
+               where to find the accompanying uncombined form of the same
+               work.
+
+          8. You may not copy, modify, sublicense, link with, or distribute
+          the Library except as expressly provided under this License.  Any
+          attempt otherwise to copy, modify, sublicense, link with, or
+          distribute the Library is void, and will automatically terminate
+          your rights under this License.  However, parties who have received
+          copies, or rights, from you under this License will not have their
+          licenses terminated so long as such parties remain in full
+          compliance.
+
+          9. You are not required to accept this License, since you have not
+          signed it.  However, nothing else grants you permission to modify or
+          distribute the Library or its derivative works.  These actions are
+          prohibited by law if you do not accept this License.  Therefore, by
+          modifying or distributing the Library (or any work based on the
+          Library), you indicate your acceptance of this License to do so, and
+          all its terms and conditions for copying, distributing or modifying
+          the Library or works based on it.
+
+          10. Each time you redistribute the Library (or any work based on the
+          Library), the recipient automatically receives a license from the
+          original licensor to copy, distribute, link with or modify the
+          Library subject to these terms and conditions.  You may not impose
+          any further restrictions on the recipients' exercise of the rights
+          granted herein.  You are not responsible for enforcing compliance by
+          third parties with this License.
+
+          11. If, as a consequence of a court judgment or allegation of patent
+          infringement or for any other reason (not limited to patent issues),
+          conditions are imposed on you (whether by court order, agreement or
+          otherwise) that contradict the conditions of this License, they do
+          not excuse you from the conditions of this License.  If you cannot
+          distribute so as to satisfy simultaneously your obligations under
+          this License and any other pertinent obligations, then as a
+          consequence you may not distribute the Library at all.  For example,
+          if a patent license would not permit royalty-free redistribution of
+          the Library by all those who receive copies directly or indirectly
+          through you, then the only way you could satisfy both it and this
+          License would be to refrain entirely from distribution of the
+          Library.
+
+          If any portion of this section is held invalid or unenforceable
+          under any particular circumstance, the balance of the section is
+          intended to apply, and the section as a whole is intended to apply
+          in other circumstances.
+
+          It is not the purpose of this section to induce you to infringe any
+          patents or other property right claims or to contest validity of any
+          such claims; this section has the sole purpose of protecting the
+          integrity of the free software distribution system which is
+          implemented by public license practices.  Many people have made
+          generous contributions to the wide range of software distributed
+          through that system in reliance on consistent application of that
+          system; it is up to the author/donor to decide if he or she is
+          willing to distribute software through any other system and a
+          licensee cannot impose that choice.
+
+          This section is intended to make thoroughly clear what is believed
+          to be a consequence of the rest of this License.
+
+          12. If the distribution and/or use of the Library is restricted in
+          certain countries either by patents or by copyrighted interfaces,
+          the original copyright holder who places the Library under this
+          License may add an explicit geographical distribution limitation
+          excluding those countries, so that distribution is permitted only in
+          or among countries not thus excluded.  In such case, this License
+          incorporates the limitation as if written in the body of this
+          License.
+
+          13. The Free Software Foundation may publish revised and/or new
+          versions of the Lesser General Public License from time to time.
+          Such new versions will be similar in spirit to the present version,
+          but may differ in detail to address new problems or concerns.
+
+          Each version is given a distinguishing version number.  If the
+          Library specifies a version number of this License which applies to
+          it and "any later version", you have the option of following the
+          terms and conditions either of that version or of any later version
+          published by the Free Software Foundation.  If the Library does not
+          specify a license version number, you may choose any version ever
+          published by the Free Software Foundation.
+
+          14. If you wish to incorporate parts of the Library into other free
+          programs whose distribution conditions are incompatible with these,
+          write to the author to ask for permission.  For software which is
+          copyrighted by the Free Software Foundation, write to the Free
+          Software Foundation; we sometimes make exceptions for this.  Our
+          decision will be guided by the two goals of preserving the free
+          status of all derivatives of our free software and of promoting the
+          sharing and reuse of software generally.
+
+          NO WARRANTY
+
+          15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+          WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+          EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+          OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+          KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+          PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+          PERFORMANCE OF THE LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE
+          DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+          CORRECTION.
+
+          16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+          WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+          AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+          FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+          CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+          LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+          RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+          FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+          SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+          SUCH DAMAGES.
+
+          END OF TERMS AND CONDITIONS
+
+          How to Apply These Terms to Your New Libraries
+
+          If you develop a new library, and you want it to be of the greatest
+          possible use to the public, we recommend making it free software
+          that everyone can redistribute and change.  You can do so by
+          permitting redistribution under these terms (or, alternatively,
+          under the terms of the ordinary General Public License).
+
+          To apply these terms, attach the following notices to the library.
+          It is safest to attach them to the start of each source file to most
+          effectively convey the exclusion of warranty; and each file should
+          have at least the "copyright" line and a pointer to where the full
+          notice is found.
+
+               <one line to give the library's name and a brief idea of what
+               it does.>
+               Copyright (C) <year>  <name of author>
+
+               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.
+
+               You should have received a copy of the GNU Lesser General
+               Public License along with this library; if not, write to the
+               Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+               Boston, MA  02110-1301  USA
+
+          Also add information on how to contact you by electronic and paper
+          mail.
+
+          You should also get your employer (if you work as a programmer) or
+          your school, if any, to sign a "copyright disclaimer" for the
+          library, if necessary.  Here is a sample; alter the names:
+
+               Yoyodyne, Inc., hereby disclaims all copyright interest in the
+               library `Frob' (a library for tweaking knobs) written by James
+               Random Hacker.
+
+               <signature of Ty Coon>, 1 April 1990
+               Ty Coon, President of Vice
+
+          That's all there is to it!
+
+   MIT License
+     These components fall under the MIT license:
+
+     (C) 1995-2008 Lua.org, PUC-Rio
+                 Lua: http://www.lua.org/
+
+          Permission is hereby granted, free of charge, to any person
+          obtaining a copy of this software and associated documentation files
+          (the "Software"), to deal in the Software without restriction,
+          including without limitation the rights to use, copy, modify, merge,
+          publish, distribute, sublicense, and/or sell copies of the Software,
+          and to permit persons to whom the Software is furnished to do so,
+          subject to the following conditions:
+
+          The above copyright notice and this permission notice shall be
+          included in all copies or substantial portions of the Software.
+
+          THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+          EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+          MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+          NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+          BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+          ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+          CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+          SOFTWARE.
+
+   zlib-libpng
+     These components fall under the zlib-libpng license:
+
+     (C) 1995-2010 Jean-loup Gailly and Mark Adler
+                 zlib: http://www.zlib.net/
+
+     (C) 1998-2011 Glenn Randers-Pehrson
+                 libpng: http://www.libpng.org/pub/png/libpng.html
+
+     (C) 2003 Neil Carter
+                 original image and sound resources:
+                 http://www.nether.org.uk/bad_mac_code.html
+
+          This software is provided 'as-is', without any express or implied
+          warranty.  In no event will the authors be held liable for any
+          damages arising from the use of this software.
+
+          Permission is granted to anyone to use this software for any
+          purpose, including commercial applications, and to alter it and
+          redistribute it freely, subject to the following restrictions:
+
+          1.   The origin of this software must not be misrepresented; you
+               must not claim that you wrote the original software. If you use
+               this software in a product, an acknowledgment in the product
+               documentation would be appreciated but is not required.
+
+          2.   Altered source versions must be plainly marked as such, and
+               must not be misrepresented as being the original software.
+
+          3.   This notice may not be removed or altered from any source
+               distribution.
+
+   Uncategorized
+     Some components fall under some other license:
+
+     (C) 2001-2004 Unicode, Inc.
+                 ConvertUTF: http://www.unicode.org/Public/PROGRAMS/CVTUTF/
+
+          Disclaimer
+
+          This source code is provided as is by Unicode, Inc. No claims are
+          made as to fitness for any particular purpose. No warranties of any
+          kind are expressed or implied. The recipient agrees to determine
+          applicability of information provided. If this file has been
+          purchased on magnetic or optical media from Unicode, Inc., the sole
+          remedy for any claim will be exchange of defective media within 90
+          days of receipt.
+
+          Limitations on Rights to Redistribute This Code
+
+          Unicode, Inc. hereby grants the right to freely use the information
+          supplied in this file in the creation of products supporting the
+          Unicode Standard, and to make copies of this file in any form for
+          internal or external distribution as long as this notice remains
+          attached.
+
+SEE ALSO
+     yoink(6)
+
+AUTHORS
+     Charles McGarvey      chaz@dogcows.com
+
+NetBSD 5.1.0_PATCH               June 14, 2011              NetBSD 5.1.0_PATCH
diff --git a/INSTALL b/INSTALL
index a9438a116b123d002a13075ce920f62531dbb09f..b34de476ceb4b355c0ba9ababd494f98e80ad571 100644 (file)
--- a/INSTALL
+++ b/INSTALL
+YOINK_INSTALL(7)       Miscellaneous Information Manual       YOINK_INSTALL(7)
 
-The quick and dirty instructions:
+NAME
+     yoink_install -- building and installation instructions for yoink
 
- ./configure
- make && make install
+DESCRIPTION
+     Yoink can usually be built and installed in the same way as most other
+     open source packages, using the following commands:
 
+           cd /path/to/yoink
+           ./configure
+           make && make install
 
-The longer, more detailed instructions:
+     Yet, although the build system scripts and makefiles follow standard
+     conventions, they are themselves a little unconventional.  Therefore, if
+     things go wrong, this reference may aid in diagnosing the problem.  The
+     rest of this page is for those for whom the basic steps do not work or
+     for those who have specialized needs, like packagers.
 
-1. Run ./configure --help to see how you can customize the installation.
+   CONFIGURATION
+     A configure script is provided in the package to help prepare the build
+     system to compile and install Yoink on your particular system.  This
+     script supports many of the same options as your typical Autoconf-
+     generated script.  Just use the script's --help flag to see which options
+     are available.
 
-   If this step fails, you probably don't have Lua installed.  Lua is
-   required to configure the build system.  It is also required by the
-   built product.
+     In particular, you may use the --prefix flag to set where Yoink will be
+     installed.  The default directory prefix is /usr/local, which is a good
+     idea in most cases, as long as you have write permissions for that
+     directory.  Otherwise, you might want to set the prefix to be some
+     directory within your home directory.
 
-2. Run ./configure with whatever options you like.  Use --prefix to set the
-   directory where Yoink will be installed.  Use --datadir to set the
-   directory where the resource files will be installed.  Use --host if you
-   want to cross-compile for another type of system--you will need a
-   working cross-compiler toolchain installed.  Use CC and CXX to set the C
-   and C++ compiler commands, respectively.  Use CFLAGS and LDFLAGS to
-   set the compiler and linker flags, respectively.
+     The script also supports the --host flag to allow for cross-compiling.
+     Use this flag to set the triplet of the machine architecture and system
+     software combination for the platform you want Yoink to run on.  Of
+     course, you will need the appropriate toolchain installed.
 
-   If this step fails, make sure you have a working toolchain (including
-   compilers and archivers).  Also make sure you have the required
-   libraries.  You also need pkg-config and all the relevant ``pc'' files
-   for each library dependency.
+     If you have dialog installed, an alternative approach to configuration is
+     to use menuconfig, the interactive menu system built into the configure
+     script.  To use this method, there exists a familiar make target to bring
+     up the menu dialogs:
 
-3. Run make.  If you have a multi-core or multi-processor system, you may
-   also want to use the -j option to perform compilations in parallel.  See
-   make(1) for more information.
+           make menuconfig
 
-   If this step fails, you may need to change your configuration from step
-   2 and try again.  In particular, you may need to change the CFLAGS and
-   LDFLAGS, depending on whether it is the compiler that has a problem or
-   the linker.
+     This is the same as running the configure script with the --interactive
+     flag.  This allows you to browse the various options and make changes to
+     the configuration before it is saved in preparation for building.
 
-4. Run make run to run the program without installing.
+     Regardless of which way configure is run, it will perform various checks
+     and make sure the required dependencies are found.  If all of the checks
+     pass, the configuration file is saved to config.mk, and the script will
+     terminate with an exit code of 0.  If any checks fail, a non-zero exit
+     code will result.  The configuration file, config.mk, can be edited
+     manually if desired.  However, the configure script should be run again
+     afterward to make sure the changes didn't cause any errors, and the
+     script may choose to alter any part of the configuration.
 
-   If this step fails, either step 3 didn't actually complete successfully,
-   or there is a bug in the code that is revealed on your platform.  You
-   may also need to modify LDFLAGS in step 2 and try again, making sure to
-   set the correct rpath so that the shared libraries will be found at
-   runtime.  Note that the linker will be invoked through the compiler.
+     If any part of the configuration fails, make sure you have these basic
+     requirements fulfilled:
 
-5. Run make install to copy the files into the installation directories you
-   have specified in step 2.  You're done!
+     1.   You must have Lua installed.  Much of the configure script is
+          written in Lua, and Yoink requires Lua as a dependency anyway.
 
-   If this step fails, you probably do not have correct filesystem
-   permissions to install to your chosen directory.  Either do the install
-   with elevated privileges, or start at step 2 again and specify --prefix
-   with some directory that you have write access to, such as $HOME/usr.
+     2.   You must have a working toolchain installed.  This usually means you
+          have gcc installed along with its C++ compiler components, libc and
+          binutils.
 
+     3.   You must have pkg-config installed, along with the required library
+          dependencies and ``pc'' files.  Look for these packages with your
+          favorite package manager:
+          o   boost headers
+          o   libpng
+          o   libvorbis
+          o   Lua
+          o   OpenAL
+          o   OpenGL (including GLU)
+          o   SDL
+          o   zlib
+
+   BUILDING
+     Once the build system has been properly configured, it is ready to do
+     some compiling.  This is done simply with an invocation of GNU make,
+     perhaps like this:
+
+           make -j2
+
+     Sometimes the command for GNU make is gmake, although it may also be
+     simply make.  No other variety of make will work, and you need a fairly
+     recent version of GNU make since some older versions have fatal bugs.
+     The -j flag may be used to perform multiple build steps in parallel,
+     decreasing the amount of time the compile takes on multi-core machines.
+     See make(1) for more information.
+
+     Advanced users may choose to override parts of the configuration with
+     additional arguments to make, although it is rarely useful to do so.
+     However, in the event that some error occurs during the process, it often
+     is useful to retry the make command with the V=1 argument (for verbosity)
+     in order to cause make to echo each actual command before it is executed.
+     Users who are familiar with compiler and linker warnings and errors will
+     then be able diagnose the problem, whether it be a problem with the
+     configuration or something else.
+
+   TESTING
+     After the build process has successfully completed, Yoink should now be
+     able to run from within the build directory, as long as you're not cross-
+     compiling to an incompatible platform.  To test this, there is a make
+     target to execute Yoink:
+
+           make run
+
+     If an error occurs and the rest of the build really did complete
+     successfully, the likely problem is that the dynamic libraries could not
+     be found.  This may happen if the libraries are installed to a non-
+     standard location, and the linker wasn't given the appropriate -rpath
+     flag.  This means that pkg-config failed to provide all of the flags we
+     need.  The easiest thing to do in this situation is to reconfigure the
+     build system with the LDFLAGS=-Wl,-rpath=/path/to/lib option set and
+     retry the test (the executable will be rebuilt).
+
+   INSTALLATION
+     Once testing is completed, it is time to copy the Yoink files to their
+     final destinations.  As usual, there is a make target to handle the
+     installation:
+
+           make install
+
+     This will cause the files to be copied with the BSD-compatible install
+     program.  Of course, you may need to elevate your privileges (i.e. with
+     sudo) if you are installing to a directory your user account does not
+     have write access to.
+
+     The installation destination depends on prefix and other configuration
+     variables.  You can override the configuration by passing the arguments
+     directly to make with the install target.  The Makefile also supports
+     staging by using the DESTDIR variable passed to make.
+
+     Any failure during installation is probably a result of simply not having
+     sufficient privileges.  It will also be a problem if you do not have a
+     BSD-compatible version of install.  In the case of the latter, it should
+     be a minor modification to the Makefile to get it working.  The build
+     system is still not compatible in many regards.
+
+FILES
+     configure
+     config.h
+     config.mk
+     config.sed
+     Makefile
+     options.lua
+
+SEE ALSO
+     yoinkrc(5), yoink(6)
+
+AUTHORS
+     Charles McGarvey      chaz@dogcows.com
+
+NetBSD 5.1.0_PATCH               June 13, 2011              NetBSD 5.1.0_PATCH
index 5809c575cb5d2adfb53dd344afbaf0cd909bb646..e104a4ef1710d7c12629c9f3e4ffbb4292e4257d 100644 (file)
--- a/Makefile
+++ b/Makefile
 
 #
 # Yoink
-# Use this file with make to compile and install Yoink.
+# Use this file with GNU make to compile and install Yoink.
 #
-# This makefile supports these targets:
-#   all, install, clean, distclean, run, debug, dist, dist-gzip, dist-bzip2
-#
-# This build system incorporates the ideas written by Emile van Bergen:
-# http://www.xs4all.nl/~evbergen/nonrecursive-make.html
-#
-
-# Set this to `true' to echo each build command in full.
-verbose                := false
 
-# Set this to `false' to avoid installing manual pages.
-install_man    := true
+# Set V to `1' to echo each build command in full.  The default behavior
+# will keep output minimal.
+V              = 0
 
+SHELL  = /bin/sh
 
-#
-# Include the configuration file, config.mk.
-#
 
-SHELL          := /bin/sh
-
-have_config := $(wildcard config.mk)
-ifneq ($(strip $(have_config)),)
-include config.mk
+ifeq (menuconfig,$(MAKECMDGOALS))
+menuconfig:
+       ./configure --interactive
+.PHONY: menuconfig
 else
-$(error You must run the configure script before you can make anything)
-endif
 
+config.h: config.mk
+       $(Q)$(configure) --export-header=$@
 
-#
-# Declare the default targets and implicit rules.
-#
+config.sed: config.mk
+       $(Q)$(configure) --export-terms=$@
 
-.PHONY: all
-all: all_
+config.mk:
+       $(Q)$(configure) --interactive --print-instructions=no
 
-.SUFFIXES:
-.SUFFIXES: .a .c .cc .cpp .in .o .rc
+include config.mk
 
 
 #
 # Define some useful functions.
 #
 
-add_exe_suffix  = $(addsuffix $(EXEEXT),$1)
-remove_silencer = $(1:@%=%)
+DATA_TARGETS   :=
+EXEC_TARGETS   :=
+SUBDIRS                        :=
+
+define include_func =
+ifeq (,$$d)
+dir    := $1
+else
+dir    := $$d/$1
+endif
+sp                             := $$(sp).x
+dirstack_$$(sp)        := $$d
+datstack_$$(sp) := $$(data)
+exestack_$$(sp) := $$(exec)
+d                              := $$(dir)
+data :=
+exec :=
+include $$(dir)/rules.mk
+SUBDIRS += $$d $$b
+data   := $$(sort $$(data) $$(appdir_$$b) $$(mandir_$$b) $$(pkgdatadir_$$b) $$(desktop_$$b))
+exec   := $$(sort $$(exec) $$(bindir_$$b) $$(libdir_$$b))
+deps   := $$(filter %.d,$$(exec:%.o=%.d))
+clean   := $$(clean) $$(deps) $$(exec) $$(data)
+DEPFILE := $$(DEPFILE) $$(deps)
+DATA_TARGETS += $$(data)
+EXEC_TARGETS += $$(exec)
+d              := $$(dirstack_$$(sp))
+data   := $$(datstack_$$(sp))
+exec   := $$(exestack_$$(sp))
+sp     := $$(basename $$(sp))
+endef
+include        = $(foreach i,$1,$(eval $(call include_func,$i)))
+
+targets                = $(EXEC_TARGETS) $(DATA_TARGETS)
+builddir       = build/obj
+b                      = $(builddir)/$(d)
+this           = $(d)/rules.mk
+
+ifeq (gzip,$(manCompression))
+MANEXT=.gz
+else
+ifeq (bzip2,$(manCompression))
+MANEXT=.bz2
+endif
+endif
 
 
 #
 # Include the subdirectories--order is not important.
 #
 
-dir := src
-include $(dir)/rules.mk
-
-dir := data
-include $(dir)/rules.mk
-
-dir := doc
-include $(dir)/rules.mk
+$(call include,src data doc)
+-include build/$(platform)/rules.mk
 
 
 #
 # Define some common rules.
 #
 
-ifeq ($(DEP_TRACKING),true)
-COMPILE                = ./tools/compile.lua
-endif
-
-ifeq ($(DEP_MINIMIZING),true)
-LINK           = ./tools/link.lua
+ifeq (true,$(tracking))
+PKG_CFLAGS     += -MD -MP -MF $(@:%.o=%.d) -MT $@
+-include $(DEPFILE)
 endif
 
-INSTALL                = ./tools/install.lua
-
-# Include current directory to allow sources to #include "config.h".
-CFLAGS            += -I.
-CXXFLAGS          += -I.
-
-COMMAND_CC         = $(COMPILE) $(CC)  $(CFLAGS)    $(CF_TGT) -o $@ -c $<
-COMMAND_CXX        = $(COMPILE) $(CXX) $(CXXFLAGS)  $(CF_TGT) -o $@ -c $<
-COMMAND_LD         = $(LINK)    $(CC)  $(LDFLAGS)   $(LF_TGT) -o $@ $^ $(LL_TGT) $(LIBS)
-COMMAND_LDX        = $(LINK)    $(CXX) $(LDFLAGS)   $(LF_TGT) -o $@ $^ $(LL_TGT) $(LIBS)
-COMMAND_CCLD       = $(COMPILE) $(CC)  $(CFLAGS)    $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS)
-COMMAND_CXXLD      = $(COMPILE) $(CXX) $(CXXFLAGS)  $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS)
-COMMAND_AR         = $(AR) rcs $@ $^;  $(RANLIB)    $@
-COMMAND_RC         = $(WINDRES)        -I.          $(DF_TGT) -o $@ -i $<
-COMMAND_INSTALL    = $(INSTALL) -m $1 $2 $3/
-COMMAND_RM         = rm -f $1
-COMMAND_IN         = sed -f config.sed <"$1" >"$2"
-
-ifeq ($(verbose),true)
-DO_CC              = $(COMMAND_CC)
-DO_CXX             = $(COMMAND_CXX)
-DO_LD              = $(COMMAND_LD)
-DO_LDX             = $(COMMAND_LDX)
-DO_CCLD            = $(COMMAND_CCLD)
-DO_CXXLD           = $(COMMAND_CXXLD)
-DO_AR              = $(COMMAND_AR)
-DO_RC              = $(COMMAND_RC)
-DO_INSTALL         = $(COMMAND_INSTALL)
-DO_RM              = $(COMMAND_RM)
-DO_IN              = $(COMMAND_IN)
-SHELL_LINE_PREFIX  =
+# Include current directory to allow sources to include config.h.
+override CPPFLAGS      += -I.
+TGT_CXXFLAGS           = $(TGT_CFLAGS)
+ARFLAGS                = rc
+INSTALL                = install
+
+tarname                = $(TARNAME)-$(VERSION)
+
+cmd_compile_c  = $(CC) $(PKG_CFLAGS) $(TGT_CFLAGS) $(CFLAGS) $(CPPFLAGS) \
+                                 $(TARGET_ARCH) -c $(OUTPUT_OPTION) $<
+cmd_compile_cc = $(CXX) $(PKG_CXXFLAGS) $(TGT_CXXFLAGS) $(CXXFLAGS) $(CPPFLAGS) \
+                                 $(TARGET_ARCH) -c $(OUTPUT_OPTION) $<
+cmd_link_c             = $(CC) $(PKG_CFLAGS) $(TGT_CFLAGS) $(CFLAGS) $(CPPFLAGS) \
+                                 $(PKG_LDFLAGS) $(TGT_LDFLAGS) $(LDFLAGS) \
+                                 $(TARGET_ARCH) $^ $(LOADLIBES) $(PKG_LDLIBS) $(TGT_LDLIBS) $(LDLIBS) -o $@
+cmd_link_cc            = $(CXX) $(PKG_CXXFLAGS) $(TGT_CXXFLAGS) $(CXXFLAGS) $(CPPFLAGS) \
+                                 $(PKG_LDFLAGS) $(TGT_LDFLAGS) $(LDFLAGS) \
+                                 $(TARGET_ARCH) $^ $(LOADLIBES) $(PKG_LDLIBS) $(TGT_LDLIBS) $(LDLIBS) -o $@
+cmd_ar                 = $(AR) $(ARFLAGS) $@ $^; $(RANLIB) $@
+cmd_compile_rc = $(WINDRES) $(CPPFLAGS) $(TARGET_ARCH) $(OUTPUT_OPTION) -i $<
+cmd_sed                        = sed -f config.sed <$< >$@
+cmd_gzip               = gzip -c $< >$@
+cmd_bzip2              = bzip2 -c $< >$@
+cmd_xxd                        = id=$(subst .,_,$(notdir $<)); \
+                                 printf "\#include <stddef.h>\nsize_t\tdata_%s_size = %d;\nchar\tdata_%s[] = {\n" \
+                                 $$id $$(wc -c <$<) $$id >$@; \
+                                 xxd -i <$< >>$@; \
+                                 printf ", 0x00\n};\n" >>$@
+cmd_configure  = ./configure
+func_install   = mkdir -p $(DESTDIR)$3 && $(INSTALL) -m $1 $2 $(DESTDIR)$3
+func_remove            = rm -f $1
+func_dist              = git archive HEAD --prefix='$(tarname)/' | $1 >"$(tarname).tar.$2" && \
+                                 (md5 "$(tarname).tar.$2" 2>/dev/null || md5sum "$(tarname).tar.$2")
+
+compile_c      = $(call func_print,CC,$@) $(cmd_compile_c)
+compile_cc     = $(call func_print,CXX,$@) $(cmd_compile_cc)
+compile_rc     = $(call func_print,RC,$@) $(cmd_compile_rc)
+link_c         = $(call func_print,LINK,$@) $(cmd_link_c)
+link_cc                = $(call func_print,LINK,$@) $(cmd_link_cc)
+ar                     = $(call func_print,AR,$@) $(cmd_ar)
+sed                    = $(call func_print,SED,$@) $(cmd_sed)
+gzip           = $(call func_print,GZIP,$@) $(cmd_gzip)
+bzip2          = $(call func_print,BZIP2,$@) $(cmd_bzip2)
+xxd                    = $(call func_print,XXD,$@) $(cmd_xxd)
+configure      = $(call func_print,MAKE,$@) $(cmd_configure)
+dist           = $(call func_print,DIST,$1) $(func_dist)
+install                = $(call func_print,CP,$(DESTDIR)$(3:%/=%)/$(notdir $2)) $(func_install)
+remove         = $(call func_print,RM,$1) $(func_remove)
+
+ifeq (1,$V)
+Q                      =
+func_print     =
 else
-DO_CC              = @echo " CC     $@"; $(COMMAND_CC)
-DO_CXX             = @echo " CXX    $@"; $(COMMAND_CXX)
-DO_LD              = @echo " LINK   $@"; $(COMMAND_LD)
-DO_LDX             = @echo " LINK   $@"; $(COMMAND_LDX)
-DO_CCLD            = @echo " LINK   $@"; $(COMMAND_CCLD)
-DO_CXXLD           = @echo " LINK   $@"; $(COMMAND_CXXLD)
-DO_AR              = @echo " AR     $@"; $(COMMAND_AR)
-DO_RC              = @echo " RC     $@"; $(COMMAND_RC)
-DO_INSTALL         = @echo " CP     $2"; $(COMMAND_INSTALL)
-DO_RM              = @echo " RM     $1"; $(COMMAND_RM)
-DO_IN              = @echo " GEN    $2"; $(COMMAND_IN)
-SHELL_LINE_PREFIX  = @
+Q                      = @
+func_print     = printf "\x20\x20$1\t%s\n" $2;
 endif
 
 
@@ -127,96 +159,98 @@ endif
 # Define the implicit rules.
 #
 
-%.o: %.c
-       $(DO_CC)
 %.o: %.cc
-       $(DO_CXX)
+       $(Q)$(compile_cc)
 %.o: %.cpp
-       $(DO_CXX)
+       $(Q)$(compile_cc)
+%.o: %.c
+       $(Q)$(compile_c)
 %.o: %.rc
-       $(DO_RC)
-%$(EXEEXT): %.o
-       $(DO_LD)
-%$(EXEEXT): %.c
-       $(DO_CCLD)
-%$(EXEEXT): %.cc
-       $(DO_CXXLD)
-%$(EXEEXT): %.cpp
-       $(DO_CXXLD)
-%.a: %.o
-       $(DO_AR)
-%: %.in config.sed
-       $(call DO_IN,$<,$@)
+       $(Q)$(compile_rc)
+%: %.in
+       $(Q)$(sed)
+%.gz: %
+       $(Q)$(gzip)
+%.bz2: %
+       $(Q)$(bzip2)
+
+$(builddir)/%.o: %.cc
+       $(Q)$(compile_cc)
+$(builddir)/%.o: %.cpp
+       $(Q)$(compile_cc)
+$(builddir)/%.o: %.c
+       $(Q)$(compile_c)
+$(builddir)/%.o: %.rc
+       $(Q)$(compile_rc)
+$(builddir)/%: %.in
+       $(Q)$(sed)
+$(builddir)/%.gz: %
+       $(Q)$(gzip)
+$(builddir)/%.bz2: %
+       $(Q)$(bzip2)
+$(builddir)/%: %
+       $(Q)if [ -d $< ]; then mkdir -p $@; elif [ -f $< ]; then cp -f $< $@; fi
 
 
 #
 # Define the phony targets.
 #
 
-.PHONY: clean
+.DEFAULT_GOAL :=
+all: $(targets)
+
 clean:
-       $(SHELL_LINE_PREFIX)files='$(CLEAN)'; for file in $$files; \
-       do \
-               $(call remove_silencer,$(call DO_RM,$$file)); \
-       done
+       $(Q)$(foreach f,$(clean),$(call remove,$f);)
+       $(Q)if [ -d $(builddir) ]; then find $(builddir) -type d -empty -delete; fi
 
-.PHONY: distclean
 distclean: clean
-       $(call DO_RM,config.h)
-       $(call DO_RM,config.mk)
-       $(call DO_RM,config.sed)
-
-.PHONY: all_
-all_: $(BINARIES) $(MANPAGES)
-
-.PHONY: install
-install: all
-       $(SHELL_LINE_PREFIX)files='$(DATAFILES)'; for file in $$files; \
-       do \
-               full=`echo "$$file" | cut -d\; -f1`; \
-               base=`echo "$$file" | cut -d\; -f2`; \
-               $(call remove_silencer,$(call DO_INSTALL,644,$$full,$(DESTDIR)$(datadir)$$base)); \
-       done
-       $(SHELL_LINE_PREFIX)files='$(BINARIES)'; for file in $$files; \
-       do \
-               $(call remove_silencer,$(call DO_INSTALL,755,$$file,$(DESTDIR)$(bindir))); \
-       done
-ifeq ($(install_man),true)
-       $(SHELL_LINE_PREFIX)files='$(MANPAGES)'; for file in $$files; \
-       do \
-               $(call remove_silencer,$(call DO_INSTALL,644,$$file,$(DESTDIR)$(mandir))); \
-       done
-endif
+       $(Q)cd build && $(MAKE) clean
+       $(Q)$(call remove,config.h);$(call remove,config.mk);$(call remove,config.sed)
+
+
+install: install-data install-exec
+
+install-data: $(DATA_TARGETS)
+       $(Q)$(foreach d,$(SUBDIRS),$(foreach f,$(pkgdatadir_$d),\
+               $(call install,644,$f,$(dir $(f:$d%=$(pkgdatadir)%)));))
+       $(Q)$(foreach d,$(SUBDIRS),$(foreach f,$(mandir_$d),\
+               $(call install,644,$f,$(dir $(f:$d%=$(mandir)/man$(shell echo "$f" | sed 's/[^.]*\.\([^.]*\).*/\1/')%)));))
+
+install-exec: $(EXEC_TARGETS)
+       $(Q)$(foreach d,$(SUBDIRS),$(foreach f,$(bindir_$d),\
+               $(call install,755,$f,$(dir $(f:$d%=$(bindir)%)));))
+
+install-desktop-entry: $(DATA_TARGETS)
+       $(Q)$(foreach d,$(SUBDIRS),$(foreach f,$(desktop_$d),\
+               $(call install,644,$f,/usr/share/applications);))
+
+
+dist-all: dist-bzip2 dist-gzip dist-lzma dist-xz
 
-.PHONY: uninstall
-uninstall:
-       $(SHELL_LINE_PREFIX)files='$(BINARIES)'; for file in $$files; \
-       do \
-               base="/`basename $$file`"; \
-               $(call remove_silencer,$(call DO_RM,$(DESTDIR)$(bindir)$$base)); \
-       done
-       $(SHELL_LINE_PREFIX)files='$(DATAFILES)'; for file in $$files; \
-       do \
-               full="`echo "$$file" | cut -d\; -f1`"; \
-               base="`echo "$$file" | cut -d\; -f2`/`basename $$full`"; \
-               $(call remove_silencer,$(call DO_RM,$(DESTDIR)$(datadir)$$base)); \
-       done
-
-.PHONY: dist-bzip2
 dist-bzip2:
-       $(SHELL_LINE_PREFIX)git archive HEAD --prefix='$(TARNAME)/' | bzip2 > "$(TARNAME).tar.bz2"
+       $(Q)$(call dist,bzip2,bz2)
 
-.PHONY: dist-gzip
 dist-gzip:
-       $(SHELL_LINE_PREFIX)git archive HEAD --prefix='$(TARNAME)/' | gzip > "$(TARNAME).tar.gz"
+       $(Q)$(call dist,gzip,gz)
 
-.PHONY: dist
-dist: dist-bzip2
+dist-lzma:
+       $(Q)$(call dist,lzma,lzma)
+
+dist-xz:
+       $(Q)$(call dist,xz,xz)
+
+dist: dist-$(archiveFormat)
 
 
 #
 # Prevent make from removing any build targets.
 #
 
-.SECONDARY:    $(CLEAN)
+.SECONDARY:    $(clean)
+
+.PHONY: all clean distclean install install-data install-exec
+.PHONY: install-desktop-entry
+.PHONY: dist dist-all dist-gzip dist-bzip2 dist-xz dist-lzma
+
+endif  # menuconfig
 
diff --git a/README b/README
index c834a3d451c345b7c4d5f1b341ffc3a85d47e485..0cab8cce8b8e178eba795c62eb7ac3f2b2e4ba76 100644 (file)
--- a/README
+++ b/README
+YOINK_README(7)        Miscellaneous Information Manual        YOINK_README(7)
 
-Yoink - The alien-smashing action game
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+NAME
+     yoink_readme -- general information about yoink
 
-Contents:
+DESCRIPTION
+     Yoink is a game created by Neil Carter for Mac OS.  You play the part of
+     a flying alien heroine who must defend her home on Earth from other
+     airborne alien invaders.
 
-I.   Users
-  a)   General information
-  b)   Requirements
-  c)   Installing
-  d)   License
-II.  Developers and Packagers
-  a)   Notes regarding the code
-  b)   Packaging
-  c)   Sending patches
+     This version of the game uses all new code and modern frameworks to bring
+     this simple, fast-moving action game to a wider audience.
 
+   INSTALLATION
+     Installing Yoink is simple.  You can typically use commands such as
+     these:
 
-I. Users
-========
+           cd /path/to/yoink
+           ./configure
+           make && make install
 
-a) General information
-----------------------
+     This will install Yoink into the /usr/local directory.  To run Yoink,
+     issue the command:
 
-Yoink is a game created by Neil Carter for Mac OS.  You play the part of a
-flying alien heroine who must defend her home on Earth from other airborne
-alien invaders.
+           /usr/local/bin/yoink
 
-This version of the game uses all new code and modern frameworks to bring
-this simple, fast-moving action game to a wider audience.
+     or just yoink if /usr/local/bin is already in your PATH.  See
+     yoink_install(7) for a more detailed discussion about the build system
+     and a list of required packages.
 
-b) Requirements
----------------
+   LICENSE
+     The new code is released under the 2-clause BSD license.  The old code
+     and original resources are provided under the zlib/libpng License.  See
+     the COPYING file for complete details.  The full texts of applicable
+     licenses can be found in doc/licenses within the Yoink package.
 
-boost headers
-libpng
-libvorbis
-Lua
-OpenAL
-OpenGL (including GLU)
-pkg-config
-SDL
+   ABOUT THE CODE
+     The code is a complete rewrite, containing none of the original code.
+     I've made some effort to put the more generic or reusable code into a
+     separate library called libmoof.  I've also made an effort to incorporate
+     3rd-party code that happened to fit well into what I needed.  So,
+     generally, the source code is separated into these three categories:
 
-c) Installing
--------------
+     1.   Yoink-specific code.  This is the code in the src directory.  These
+          classes reside in no explicit namespace.
 
-To build and install Yoink yourself, you should first make sure you have
-all the required libraries.  Then, issue these commands at a command-line
-prompt:
+     2.   Reusable code.  The code is in src/moof, and it is compiled as a
+          convenience library.  These classes and helper functions reside in
+          the moof namespace.  Since I wrote this code alongside the Yoink-
+          specific stuff, there is somewhat of a blurry line between the two
+          categories, unfortunately.
 
- cd /path/to/project
- ./configure
- make && make install
+     3.   Third-party code.  This is made up of free code from other projects
+          or libraries, the licenses of which are also noted in the COPYING
+          file.  This code resides in various namespaces and in various
+          subdirectories of src.
 
-where /path/to/project is the path to the directory where this file is.
+   PACKAGING
+     Here are some tips to help packagers:
 
-That will compile and install Yoink into the /usr/local directory.  To run
-Yoink, issue this command:
+     o   The build scripts are written in Lua, so make sure the Lua
+         interpreter is installed.  That shouldn't be a problem since Yoink
+         depends on the Lua library anyway.
 
- /usr/local/bin/yoink
+     o   The Makefile will only work well with GNU make.  On some systems,
+         this is installed as gmake.
 
-or just ``yoink'' if /usr/loca/bin is already in your PATH.  You can also
-install Yoink to a different directory or change a lot of build options
-using the configure script.  See ./configure --help and the file INSTALL
-for details.
+     o   The configure script supports most of the useful options that an
+         Autoconf-generated script would have, and the Makefile supports
+         DESTDIR.
 
-d) License
-----------
+     See yoink_install(7) for a more detailed discussion about the build
+     system.
 
-The new code is released under the 2-clause BSD license.  The old code and
-original resources are provided under the zlib/libpng License.  See file
-COPYING for complete details.  The full texts of applicable licenses can be
-found in doc/licenses.
+   SENDING PATCHES
+     I'll gladly entertain patches if you want to help out.  Just email me
+     your stuff or tell me where to pull if you use git.  If you're interested
+     in that, please observe the following:
 
+     o   Stick to the coding style of the source code files you edit.  Follow
+         the general style of method and variable naming, as well as white
+         space formatting.  In particular, use literal tabs with an assumed
+         tabstop of 4 characters.  Also, try to limit line lengths to 75
+         characters.
 
-II. Developers and Packagers
-============================
+     o   For legal reasons, don't include other peoples' code with your patch.
+         You must also agree to license your changes according to the same
+         terms and conditions as the files you edit, usually the 2-clause BSD
+         license.
 
-a) Notes regarding the code
----------------------------
+     o   If you want your name and contact information in the AUTHORS file,
+         please make it so in the patch you provide.
 
-The code is a complete rewrite, containing none of the original code.  I've
-made some effort to put the more generic or reusable code into a separate
-library called libmoof.  I've also made an effort to incorporate 3rd-party
-code that happened to fit well into what I needed.  So, generally, the
-source code is separated into these three categories:
+SEE ALSO
+     yoinkrc(5), yoink(6)
 
-1. Yoink-specific code.
-
-This is the code in the directory src.  These classes reside in no explicit
-namespace.
-
-2. Reusable code.
-
-The code is in src/moof, and it is compiled as a convenience library.
-These classes and helper functions reside in the moof namespace.  Since I
-wrote this code alongside the Yoink-specific stuff, there is somewhat of a
-blurry line between the two categories, unfortunately.
-
-3. Third-party code.
-
-This is made up of free code from other projects or libraries (aside from
-the explicit dependencies above), the licenses of which are also noted in
-the file COPYING.  This code resides in various namespaces and in various
-subdirectories of src.
-
-b) Packaging
-------------
-
-Here are some tips to help packagers:
-
-*  The build scripts are written in Lua, so make sure the Lua interpreter
-   is installed.  That shouldn't be a problem since Yoink depends on the
-   Lua library anyway.
-
-*  The makefile will probably only work well with GNU make.  On some
-   systems, this is installed as gmake.
-
-*  The configure script supports most of the useful options that an
-   autoconf-generated script would have, and the makefile supports DESTDIR.
-
-c) Sending patches
-------------------
-
-I'll gladly entertain patches if you want to help out.  Just email me your
-stuff or tell me where to pull if you use git.  If you're interested in
-that, please observe the following:
-
-*  Stick to the coding style of the source code files you edit.  Follow the
-   general style of method and variable naming, as well as white space
-   formatting.  In particular, use literal tabs with an assumed tabstop of
-   4 characters.  Also, try to limit line lengths to 75 characters.
-
-*  For legal reasons, don't include other peoples' code with your patch.
-   You must also agree to license your changes according to the same terms
-   and conditions as the files you edit, usually the 2-clause BSD license.
-
-*  If you want your name and contact information in the file AUTHORS,
-   please make it so in the patch you provide.
+AUTHORS
+     Charles McGarvey      chaz@dogcows.com
 
+NetBSD 5.1.0_PATCH               June 14, 2011              NetBSD 5.1.0_PATCH
diff --git a/arch/macosx/bundle.tar.bz2 b/arch/macosx/bundle.tar.bz2
deleted file mode 100644 (file)
index 46446ab..0000000
Binary files a/arch/macosx/bundle.tar.bz2 and /dev/null differ
diff --git a/arch/macosx/mkbundle.sh.in b/arch/macosx/mkbundle.sh.in
deleted file mode 100644 (file)
index c71ac8c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-
-#
-# Yoink
-# Run this script to create a macosx app bundle.
-#
-
-# Anchor paths
-ROOT_DIR="$PWD/.."
-
-# Extract the bundle skeleton
-tar xjf bundle.tar.bz2
-
-sed -i -e 's/\@VERSION\@/@VERSION@/g' Yoink.app/Contents/Info.plist
-
-# Prepare the binary
-${STRIP:-strip} "$ROOT_DIR/src/yoink"
-cp "$ROOT_DIR/src/yoink" Yoink.app/Contents/MacOS
-
-cp -r "$ROOT_DIR/data" Yoink.app/Contents/Resources/data
-
diff --git a/arch/win32/makedeps.sh b/arch/win32/makedeps.sh
deleted file mode 100755 (executable)
index cc8a8bf..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-#!/bin/sh
-
-#
-# Yoink
-# Run this script to download and cross-compile dependencies for win32.
-#
-# A directory named deps will be created and/or populated in the current
-# directory.  Upon successful completion (be patient), the compiled
-# dependencies will be packaged into an archive named deps.tar.bz2 in the
-# current directory.  To install the dependencies, execute this command:
-#
-# tar xjf deps.tar.bz2 -C $PREFIX
-# 
-# where $PREFIX is the path to your mingw32 toolchain.  If problems occur,
-# check stdout and stderr for clues.  You may be able to easily determine
-# the problem and make the necessary corrections.  These packages will be
-# downloaded and built:
-#
-# SDL 1.2.14
-# boost 1.43.0 (headers only)
-# libogg 1.2.0
-# libpng 1.4.2
-# libvorbis 1.3.1
-# lua 5.1.4
-# openal-soft 1.12.854
-# zlib 1.2.5
-#
-# This script requires a working mingw32 toolchain and other basic tools.
-#
-# Example usage:
-#   ./makedeps.sh -H i486-mingw32 -p /usr/i486-mingw32 -m "-j8"
-#
-# Bugs: Each time the script is run, all of the dependencies will be
-# rebuilt, even the ones which were already built successfully.
-#
-
-showhelp()
-{
-       echo "Usage: $0 [-h] [-m makeopts] -H host -p prefix"
-       echo "  Downloads and cross-compiles dependencies for win32."
-       echo ""
-       echo "  -H  Specify the name of your toolchain, like i486-mingw32."
-       echo "  -h  Show this help an exit."
-       echo "  -m  Specify options to be passed to make."
-       echo "  -p  Specify the path to your toolchain installation."
-}
-
-while getopts ":H:hm:p:" opt
-do
-       case $opt in
-               H)
-                       HOST="$OPTARG"
-                       ;;
-               h)
-                       showhelp
-                       exit 0
-                       ;;
-               m)
-                       MAKEOPTS="$OPTARG"
-                       ;;
-               p)
-                       PREFIX="$OPTARG"
-                       ;;
-               \?)
-                       echo "Invalid option: -$OPTARG" >&2
-                       showhelp
-                       exit 1
-                       ;;
-       esac
-done
-
-if test x$HOST = x || test x$PREFIX = x
-then
-       showhelp
-       exit 1
-fi
-
-
-die()
-{
-       echo "die:" $@
-       exit 1
-}
-
-DESTDIR="`pwd`/deps"
-mkdir -p "$DESTDIR"
-rm -f "$DESTDIR/README"
-rm -rf "$DESTDIR/$PREFIX"
-
-
-PACKAGE="boost_1_43_0"
-VERSION="1.43.0"
-cd $DESTDIR
-test ! -f $PACKAGE.tar.bz2 && (wget "http://sourceforge.net/projects/boost/files/boost/$VERSION/$PACKAGE.tar.bz2/download" || die "downloading $PACKAGE")
-(md5sum -c <<"EOL"
-dd49767bfb726b0c774f7db0cef91ed1  boost_1_43_0.tar.bz2
-EOL
-) || die "verifying $PACKAGE"
-rm -rf $PACKAGE
-tar xjf $PACKAGE.tar.bz2 || die "unpackaging $PACKAGE"
-(mkdir -p $DESTDIR/$PREFIX/include && \
-rm -rf $DESTDIR/$PREFIX/include/boost && \
-cp -r $PACKAGE/boost $DESTDIR/$PREFIX/include/boost) || die "installing $PACKAGE"
-
-
-PACKAGE="SDL-1.2.14"
-cd $DESTDIR
-test ! -f $PACKAGE.tar.gz && (wget "http://www.libsdl.org/release/$PACKAGE.tar.gz" || die "downloading $PACKAGE")
-(md5sum -c <<"EOL"
-e52086d1b508fa0b76c52ee30b55bec4  SDL-1.2.14.tar.gz
-EOL
-) || die "verifying $PACKAGE"
-rm -rf $PACKAGE
-tar xzf $PACKAGE.tar.gz || die "unpackaging $PACKAGE"
-cd $PACKAGE
-./configure --host=$HOST --prefix=$PREFIX --disable-stdio-redirect || die "configuring $PACKAGE"
-make $MAKEOPTS || die "making $PACKAGE"
-make DESTDIR=$DESTDIR install || die "installing $PACKAGE"
-
-
-PACKAGE="libogg-1.2.0"
-cd $DESTDIR
-test ! -f $PACKAGE.tar.gz && (wget "http://downloads.xiph.org/releases/ogg/$PACKAGE.tar.gz" || die "downloading $PACKAGE")
-(md5sum -c <<"EOL"
-c95b73759acfc30712beef6ce4e88efa  libogg-1.2.0.tar.gz
-EOL
-) || die "verifying $PACKAGE"
-rm -rf $PACKAGE
-tar xzf $PACKAGE.tar.gz || die "unpackaging $PACKAGE"
-cd $PACKAGE
-./configure --host=$HOST --prefix=$PREFIX || die "configuring $PACKAGE"
-make $MAKEOPTS || die "making $PACKAGE"
-make DESTDIR=$DESTDIR install || die "installing $PACKAGE"
-
-
-PACKAGE="libvorbis-1.3.1"
-cd $DESTDIR
-test ! -f $PACKAGE.tar.gz && (wget "http://downloads.xiph.org/releases/vorbis/$PACKAGE.tar.gz" || die "downloading $PACKAGE")
-(md5sum -c <<"EOL"
-016e523fac70bdd786258a9d15fd36e9  libvorbis-1.3.1.tar.gz
-EOL
-) || die "verifying $PACKAGE"
-rm -rf $PACKAGE
-tar xzf $PACKAGE.tar.gz || die "unpackaging $PACKAGE"
-cd $PACKAGE
-./configure --host=$HOST --prefix=$PREFIX \
-CPPFLAGS="-I$DESTDIR/$PREFIX/include" \
-LDFLAGS="-L$DESTDIR/$PREFIX/lib" || die "configuring $PACKAGE"
-make $MAKEOPTS || die "making $PACKAGE"
-make DESTDIR=$DESTDIR install || die "installing $PACKAGE"
-
-
-PACKAGE="openal-soft-1.12.854-bin"
-cd $DESTDIR
-test ! -f $PACKAGE.zip && (wget "http://kcat.strangesoft.net/$PACKAGE.zip" || die "downloading $PACKAGE")
-(md5sum -c <<"EOL"
-a0d92a959895fa9d0981b39089897a01  openal-soft-1.12.854-bin.zip
-EOL
-) || die "verifying $PACKAGE"
-rm -rf $PACKAGE
-unzip $PACKAGE.zip || die "unpackaging $PACKAGE"
-cd $PACKAGE
-(mkdir -p $DESTDIR/$PREFIX/{lib/pkgconfig,include/AL} && \
-install -p -m 0644 include/AL/* $DESTDIR/$PREFIX/include/AL/ && \
-install -p -m 0755 Win32/soft_oal.dll $DESTDIR/$PREFIX/bin/OpenAL32.dll && \
-install -p -m 0755 openal-info.exe $DESTDIR/$PREFIX/bin/ && \
-install -p -m 0755 lib/Win32/libOpenAL32.dll.a $DESTDIR/$PREFIX/lib/ && \
-cat >$DESTDIR/$PREFIX/lib/pkgconfig/openal.pc <<EOL
-prefix=$PREFIX
-exec_prefix=\${prefix}
-libdir=\${exec_prefix}/lib
-includedir=\${prefix}/include
-
-Name: OpenAL
-Description: OpenAL is a cross-platform 3D audio API
-Requires: 
-Version: 1.11.753
-Libs: -L\${libdir} -lOpenAL32
-Cflags: -I\${includedir}
-EOL
-) || die "installing $PACKAGE"
-
-
-PACKAGE="zlib-1.2.5"
-cd $DESTDIR
-test ! -f $PACKAGE.zip && (wget "http://www.zlib.net/$PACKAGE.tar.gz" || die "downloading $PACKAGE")
-(md5sum -c <<"EOL"
-c735eab2d659a96e5a594c9e8541ad63  zlib-1.2.5.tar.gz
-EOL
-) || die "verifying $PACKAGE"
-rm -rf $PACKAGE
-tar xf $PACKAGE.tar.gz || die "unpackaging $PACKAGE"
-cd $PACKAGE
-cp win32/Makefile.gcc Makefile && \
-make $MAKEOPTS prefix="$PREFIX" PREFIX="$HOST-" || die "making $PACKAGE"
-(install -p -m 0644 zconf.h $DESTDIR/$PREFIX/include/ && \
-install -p -m 0644 zlib.h $DESTDIR/$PREFIX/include/ && \
-install -p -m 0755 zlib1.dll $DESTDIR/$PREFIX/bin/ && \
-install -p -m 0755 libzdll.a $DESTDIR/$PREFIX/lib/ && \
-cd $DESTDIR/$PREFIX/lib && \
-ln -fs libzdll.a libz.dll.a) || die "installing $PACKAGE"
-
-
-PACKAGE="libpng-1.4.2"
-cd $DESTDIR
-test ! -f $PACKAGE.tar.gz && (wget "http://prdownloads.sourceforge.net/libpng/$PACKAGE.tar.gz?download" || die "downloading $PACKAGE")
-(md5sum -c <<"EOL"
-89fd334dc5fc84ff146b9269c4fa452f  libpng-1.4.2.tar.gz
-EOL
-) || die "verifying $PACKAGE"
-rm -rf $PACKAGE
-tar xzf $PACKAGE.tar.gz || die "unpackaging $PACKAGE"
-cd $PACKAGE
-cp scripts/makefile.mingw Makefile && \
-make $MAKEOPTS prefix="$PREFIX" CC="$HOST-gcc" AR="$HOST-ar" RANLIB="$HOST-ranlib" \
-ZLIBINC="$DESTDIR/$PREFIX/include" \
-ZLIBLIB="$DESTDIR/$PREFIX/lib" libpng.a libpng14.dll || die "making $PACKAGE"
-make DESTDIR=$DESTDIR install prefix="$PREFIX" || die "installing $PACKAGE"
-
-
-PACKAGE="lua-5.1.4"
-cd $DESTDIR
-test ! -f $PACKAGE.tar.gz && (wget "http://www.lua.org/ftp/$PACKAGE.tar.gz" || die "downloading $PACKAGE")
-(md5sum -c <<"EOL"
-d0870f2de55d59c1c8419f36e8fac150  lua-5.1.4.tar.gz
-EOL
-) || die "verifying $PACKAGE"
-rm -rf $PACKAGE
-tar xzf $PACKAGE.tar.gz || die "unpackaging $PACKAGE"
-cd $PACKAGE
-patch -p1 <<"EOL"
-diff -ur lua-5.1.4.orig/Makefile lua-5.1.4/Makefile
---- lua-5.1.4.orig/Makefile    2008-08-11 18:40:48.000000000 -0600
-+++ lua-5.1.4/Makefile 2010-03-03 23:11:41.673472345 -0700
-@@ -13,7 +13,8 @@
- INSTALL_BIN= $(INSTALL_TOP)/bin
- INSTALL_INC= $(INSTALL_TOP)/include
- INSTALL_LIB= $(INSTALL_TOP)/lib
--INSTALL_MAN= $(INSTALL_TOP)/man/man1
-+INSTALL_MAN= $(INSTALL_TOP)/share/man/man1
-+INSTALL_PC=  $(INSTALL_LIB)/pkgconfig
- #
- # You probably want to make INSTALL_LMOD and INSTALL_CMOD consistent with
- # LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h (and also with etc/lua.pc).
-@@ -41,10 +42,11 @@
- PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris
- # What to install.
--TO_BIN= lua luac
-+TO_BIN= lua.exe luac.exe lua51.dll
- TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp
--TO_LIB= liblua.a
-+TO_LIB= liblua.a liblua.dll.a
- TO_MAN= lua.1 luac.1
-+TO_PC=  lua.pc
- # Lua version and release.
- V= 5.1
-@@ -59,11 +61,12 @@
-       src/lua test/hello.lua
- install: dummy
--      cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD)
-+      cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_PC) $(INSTALL_LMOD) $(INSTALL_CMOD)
-       cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN)
-       cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC)
-       cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB)
-       cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN)
-+      cd etc && $(INSTALL_DATA) $(TO_PC)  $(INSTALL_PC)
- ranlib:
-       cd src && cd $(INSTALL_LIB) && $(RANLIB) $(TO_LIB)
-diff -ur lua-5.1.4.orig/src/Makefile lua-5.1.4/src/Makefile
---- lua-5.1.4.orig/src/Makefile        2008-01-19 12:37:58.000000000 -0700
-+++ lua-5.1.4/src/Makefile     2010-03-03 22:45:47.101159854 -0700
-@@ -105,7 +105,7 @@
- mingw:
-       $(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \
--      "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
-+      "AR=$(CC) -shared -Wl,--out-implib,liblua.dll.a -o" "RANLIB=strip --strip-unneeded" \
-       "MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe
-       $(MAKE) "LUAC_T=luac.exe" luac.exe
-EOL
-patch -p1 <<EOL
-diff -ur lua-5.1.4.orig/etc/lua.pc lua-5.1.4/etc/lua.pc
---- lua-5.1.4.orig/etc/lua.pc  2008-08-08 06:46:11.000000000 -0600
-+++ lua-5.1.4/etc/lua.pc       2010-03-03 22:46:49.160471491 -0700
-@@ -8,7 +8,7 @@
- R= 5.1.4
- # grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/'
--prefix= /usr/local
-+prefix= $PREFIX
- INSTALL_BIN= \${prefix}/bin
- INSTALL_INC= \${prefix}/include
- INSTALL_LIB= \${prefix}/lib
-EOL
-make $MAKEOPTS CC="$HOST-gcc" RANLIB="$HOST-ranlib" mingw || die "making $PACKAGE"
-make INSTALL_TOP=$DESTDIR/$PREFIX install || die "installing $PACKAGE"
-chmod 755 $DESTDIR/$PREFIX/lib/liblua.dll.a
-
-
-# libopengl32 and libglu32 pc files
-mkdir -p $DESTDIR/$PREFIX/lib/pkgconfig
-cat >$DESTDIR/$PREFIX/lib/pkgconfig/gl.pc <<EOL
-prefix=$PREFIX
-exec_prefix=\${prefix}
-libdir=\${exec_prefix}/lib
-includedir=\${prefix}/include
-
-Name: gl
-Description: OpenGL library
-Requires: 
-Version: 
-Libs: -L\${libdir} -lopengl32
-Cflags: -I\${includedir} 
-EOL
-cat >$DESTDIR/$PREFIX/lib/pkgconfig/glu.pc <<EOL
-prefix=$PREFIX
-exec_prefix=\${prefix}
-libdir=\${exec_prefix}/lib
-includedir=\${prefix}/include
-
-Name: glu
-Description: OpenGL Utility library
-Requires: gl
-Version: 
-Libs: -L\${libdir} -lglu32
-Cflags: -I\${includedir} 
-EOL
-
-
-# wspiapi.h header file
-install -p -m 0644 $DESTDIR/../wspiapi.h $DESTDIR/$PREFIX/include/ || die "installing wspiapi.h"
-
-
-cd $DESTDIR/$PREFIX
-cat >README <<EOL
-
-Yoink Win32 Dependencies
-Created `date +"%d %b %Y"`
-
-These dependencies were generated automatically by makedeps.sh, a script
-available in the Yoink repository.  You should find here all the header
-files, DLL's, implibs, and pkgconfig files required to build Yoink that are
-not provided with the standard mingw32 toolchain.  Yoink itself can be
-built with mingw32 and these installed dependencies like this:
-
-./configure --host=$HOST --prefix=$PREFIX \\
-            PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
-make installer
-
-These files are licensed such that their general distribution under
-reasonable conditions is allowable.  The copyrights of these binaries go to
-their various respective owners.  Look up the specific library for specific
-terms and conditions, or see the file COPYING in the Yoink package.
-
-EOL
-tar cjf deps.tar.bz2 * || die "archiving dependencies"
-mv deps.tar.bz2 $DESTDIR/..
-
-echo "Done!"
-echo "The dependencies are packed into the archive deps.tar.bz2."
-
diff --git a/arch/win32/makepackage.sh b/arch/win32/makepackage.sh
deleted file mode 100755 (executable)
index 2c8a8c4..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/bin/sh
-
-#
-# Yoink
-# Run this script to create a win32 package.
-#
-# You should typically only run this through the "portable" and "installer"
-# makes targets in the package root directory.  The build system will take
-# care to pass the correct arguments.
-#
-
-showhelp()
-{
-       echo "Usage: $0 [-h] [-i makensis] [-s strip] -d assets -V version -p prefix"
-       echo "  Creates a portable win32 package or installer."
-       echo ""
-       echo "  -V  Specify the version of the program to be packaged"
-       echo "  -d  Specify the game assets to be included."
-       echo "  -h  Show this help an exit."
-       echo "  -i  To make an installer, specify the makensis program."
-       echo "  -p  Specify the path to your toolchain installation."
-       echo "  -s  To strip the binaries, specify the strip program."
-}
-
-while getopts ":V:hd:i:p:s:" opt
-do
-       case $opt in
-               V)
-                       VERSION="$OPTARG"
-                       ;;
-               d)
-                       ASSETS="$OPTARG"
-                       ;;
-               h)
-                       showhelp
-                       exit 0
-                       ;;
-               i)
-                       MAKENSIS="$OPTARG"
-                       ;;
-               p)
-                       PREFIX="$OPTARG"
-                       ;;
-               s)
-                       STRIP="$OPTARG"
-                       ;;
-               \?)
-                       echo "Invalid option: -$OPTARG" >&2
-                       showhelp
-                       exit 1
-                       ;;
-       esac
-done
-
-if test "x$ASSETS" = x || test "x$VERSION" = x || test "x$PREFIX" = x
-then
-       showhelp
-       exit 1
-fi
-
-die()
-{
-       rm -rf "$BUILD"
-       echo "die:" $@
-       exit 1
-}
-
-ROOT="$PWD"
-BUILD=`mktemp -d "$ROOT/tmp-XXXXXXXX"`
-DIRECTORY="yoink-$VERSION"
-ARCHIVE="$BUILD/$DIRECTORY"
-
-MAN2HTML="lua $ROOT/doc/man2html.lua"
-UNIX2DOS="$ROOT/arch/win32/unix2dos.sh"
-
-DLLS="libogg-0 libpng14 libvorbis-0 libvorbisfile-3 lua51 OpenAL32 SDL zlib1"
-
-
-if test ! -f "src/version.c"
-then
-       echo "Run the script from the repository root directory."
-       exit 1
-fi
-
-if test ! -d "$BUILD"
-then
-       "The temp directory $BUILD could not be created."
-       exit 1
-fi
-mkdir -p "$ARCHIVE"
-
-
-cp -f "$ROOT/src/yoink.exe" "$ARCHIVE" || die "copying yoink.exe"
-test "x$STRIP" != x && "$STRIP" "$ARCHIVE/yoink.exe"
-
-for dll in $DLLS
-do
-       cp -f "$PREFIX/bin/$dll.dll" "$ARCHIVE" || die "copying $dll"
-       test "x$STRIP" != x && "$STRIP" "$ARCHIVE/$dll.dll"
-done
-
-for asset in $ASSETS
-do
-       cp -f --parents "data/$asset" "$ARCHIVE"
-done
-
-for doc in AUTHORS ChangeLog COPYING README TODO
-do
-       "$UNIX2DOS" "$doc" "$ARCHIVE/$doc.txt" || die "unix2dos $doc"
-done
-
-$MAN2HTML -o "$ARCHIVE/Manual.html"
-$UNIX2DOS "$ARCHIVE/Manual.html"
-
-cp -rf "$ROOT/doc/licenses" "$ARCHIVE" || die "copying doc/licenses"
-cd "$ARCHIVE/licenses"
-for license in $(ls)
-do
-       (mv "$license" "$license.txt" && "$UNIX2DOS" "$license.txt") \
-               || die "moving and unix2dos $license"
-done
-cd "$ROOT"
-
-
-if test "x$MAKENSIS" = x
-then
-# build portable archive
-       echo "No valid makensis executable passed;"
-       echo "making portable package instead..."
-       NAME="$DIRECTORY.zip"
-       cd "$BUILD"
-       zip -r "$NAME" "$DIRECTORY" || die "zipping portable archive"
-       cd "$ROOT"
-       mv "$BUILD/$NAME" .
-       echo "Done! Package saved to $NAME."
-else
-# build an installer
-       NAME="yoinksetup-$VERSION.exe"
-       cd "$BUILD"
-       cp "$ROOT/arch/win32/yoink.nsi" .
-       "$MAKENSIS" -DROOTPATH="$ROOT" -DINSTALLFILES="$ARCHIVE" \
-               -DVERSION="$VERSION" -DOUTFILE="$NAME" yoink.nsi \
-               || die "running '$MAKENSIS'"
-       cd "$ROOT"
-       mv "$BUILD/$NAME" .
-       echo "Done! Installer saved to $NAME."
-fi
-
-
-rm -rf "$BUILD"
-
similarity index 81%
rename from arch/archlinux/PKGBUILD
rename to build/arch/archlinux/PKGBUILD
index 9d174c2e5d592462355e5304d12d002a0b5fd846..721eb004abd42f305ef2bcbcd8e97b70851818c3 100644 (file)
@@ -16,14 +16,14 @@ replaces=()
 backup=()
 options=()
 install=
-source=(http://www.dogcows.com/yoink/chrome/site/$pkgname-$pkgver.tar.bz2)
+source=(ftp://www.dogcows.com/pub/$pkgname/$pkgname-$pkgver.tar.xz)
 noextract=()
 md5sums=('@CHECKSUM@')
 
 build() {
   cd "$srcdir/$pkgname-$pkgver"
 
-  ./configure --prefix=/usr
+  ./configure --prefix=/usr --with-man-compression=gzip
   make || return 1
   make DESTDIR="$pkgdir/" install
 }
similarity index 62%
rename from arch/gentoo/yoink.ebuild
rename to build/arch/gentoo/yoink.ebuild
index 6e167d0bf3daa0424232b349e463145f3e0104e8..b27524e9e5a489a9409349ce7da70430863cda77 100644 (file)
@@ -2,18 +2,16 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Header: $
 
-EAPI=2
-
+EAPI=3
 inherit eutils games
 
 DESCRIPTION="Alien-smashing action game"
-HOMEPAGE="http://www.dogcows.com/yoink/"
-SRC_URI="http://www.dogcows.com/yoink/chrome/site/${P}.tar.bz2
-       http://eng.utah.edu/~mcgarvey/yoink/${P}.tar.bz2"
+HOMEPAGE="http://www.dogcows.com/yoink"
+SRC_URI="ftp://ftp.dogcows.com/yoink/${P}.tar.bz2"
 
 LICENSE="BSD-2 BSD LGPL-2.1 ZLIB"
 SLOT="0"
-KEYWORDS="amd64 x86"
+KEYWORDS="amd64 ~ppc x86"
 IUSE="debug double-precision gtk hotload qt4 threads"
 
 RDEPEND="dev-lang/lua
@@ -30,8 +28,9 @@ DEPEND="${RDEPEND}
        dev-util/pkgconfig"
 
 src_configure() {
-       egamesconf \
-               --disable-dependency-tracking \
+       egamesconf --disable-dependency-tracking \
+               --install-icon=no \
+               --print-instructions=no \
                $(use_enable debug) \
                $(use_enable double-precision) \
                $(use_enable hotload) \
@@ -41,10 +40,9 @@ src_configure() {
 }
 
 src_install() {
-       emake DESTDIR="${D}" install_man=no install || die "emake failed"
-       dodoc AUTHORS COPYING README TODO
-       doman doc/yoink.6
-       doicon data/yoink.png
-       make_desktop_entry ${PN} Yoink
+       emake DESTDIR="${D}" install || die "Install failed"
+       dodoc AUTHORS COPYING README TODO || die "Install docs failed"
+       doicon data/yoink.png || die "Install icon failed"
+       make_desktop_entry yoink Yoink || die "Install destop entry failed"
        prepgamesdirs
 }
diff --git a/build/arch/win32/makedeps.mk b/build/arch/win32/makedeps.mk
new file mode 100644 (file)
index 0000000..fbdbecd
--- /dev/null
@@ -0,0 +1,334 @@
+#
+# Yoink
+# Use this with make to download and cross-compile dependencies for win32.
+#
+# boost_1_46_1
+# libogg-1.2.2
+# libpng-1.5.2
+# libvorbis-1.3.2
+# lua-5.1.4
+# openal-soft-1.12.854-bin
+# SDL-1.2.14
+# zlib-1.2.5
+#
+# This requires GNU make, curl, openssl, tar, unzip, patch, and a working
+# mingw32 toolchain.  Just set host and prefix and away you go!
+#
+# Example usage:
+#   make -f deps.mk -j2 host=i486-mingw32 prefix=/usr/i486-mingw32
+#   sudo make install
+#
+# A lot of temporary files and directories are downloaded or extracted to
+# the current directory, so you may want to make from a clean directory.
+#
+
+
+host   = i686-mingw32
+prefix = /usr/i686-mingw32/usr
+
+
+###########################################################################
+ECONF          = ./configure --host=$(host) --prefix=$(prefix)
+MAKEINST       = $(MAKE) -j1 install
+
+getdist                = curl -L -o $1 "$2"
+checkdist      = test "MD5($1)= $2" = "$$(openssl md5 $1)"
+patch          = echo "$$$1" | patch -p1
+mkdirinst      = mkdir -p $(addprefix $(DESTDIR)$(prefix)/,$1)
+installdir     = cp -pR $1 $(DESTDIR)$(prefix)/$2
+install                = install -p -m $1 $2 $(DESTDIR)$(prefix)/$3
+installvar     = echo "$$$1" >$(DESTDIR)$(prefix)/$2
+
+
+.PHONY: all
+all: __package__
+
+ifneq ($(strip $(wildcard .saved)),)
+host   = $(shell sed -n 1p .saved)
+prefix = $(shell sed -n 2p .saved)
+endif
+
+
+###########################################################################
+BOOST                  = boost_1_46_1
+BOOST_CKSUM            = 7375679575f4c8db605d426fc721d506
+BOOST_EXT              = .tar.bz2
+BOOST_VERSION  = 1.46.1
+
+$(BOOST)$(BOOST_EXT):
+       $(call getdist,$@,http://sourceforge.net/projects/boost/files/boost/$(BOOST_VERSION)/$@/download)
+       $(call checkdist,$@,$(BOOST_CKSUM)) || rm -f $@
+
+.PHONY: $(BOOST) install-$(BOOST)
+$(BOOST): $(BOOST)$(BOOST_EXT)
+
+install-$(BOOST): $(BOOST)$(BOOST_EXT)
+       tar -xjf $<
+       $(call mkdirinst,include)
+       $(call installdir,$(BOOST)/boost,include/boost)
+
+
+###########################################################################
+SDL                    = SDL-1.2.14
+SDL_CKSUM      = e52086d1b508fa0b76c52ee30b55bec4
+SDL_EXT                = .tar.gz
+
+$(SDL)$(SDL_EXT):
+       $(call getdist,$@,http://www.libsdl.org/release/$@)
+       $(call checkdist,$@,$(SDL_CKSUM)) || rm -f $@
+
+$(SDL)/build/.libs/SDL.dll: $(SDL)$(SDL_EXT)
+       tar -xzf $<
+       cd $(SDL) && $(ECONF) --disable-stdio-redirect && $(MAKE)
+
+.PHONY: $(SDL) install-$(SDL)
+$(SDL): $(SDL)/build/.libs/SDL.dll
+
+install-$(SDL): $(SDL)
+       cd $(SDL) && $(MAKEINST)
+
+
+###########################################################################
+LIBOGG                 = libogg-1.2.2
+LIBOGG_CKSUM   = 5a9fcabc9a1b7c6f1cd75ddc78f36c56
+LIBOGG_EXT             = .tar.gz
+
+$(LIBOGG)$(LIBOGG_EXT):
+       $(call getdist,$@,http://downloads.xiph.org/releases/ogg/$@)
+       $(call checkdist,$@,$(LIBOGG_CKSUM)) || rm -f $@
+
+$(LIBOGG)/src/.libs/libogg-0.dll: $(LIBOGG)$(LIBOGG_EXT)
+       tar -xzf $<
+       cd $(LIBOGG) && $(ECONF) && $(MAKE) && $(MAKEINST) DESTDIR=$$PWD
+
+.PHONY: $(LIBOGG) install-$(LIBOGG)
+$(LIBOGG): $(LIBOGG)/src/.libs/libogg-0.dll
+
+install-$(LIBOGG): $(LIBOGG)
+       cd $(LIBOGG) && $(MAKEINST)
+
+
+###########################################################################
+LIBVORBIS              = libvorbis-1.3.2
+LIBVORBIS_CKSUM        = c870b9bd5858a0ecb5275c14486d9554
+LIBVORBIS_EXT  = .tar.gz
+
+$(LIBVORBIS)$(LIBVORBIS_EXT):
+       $(call getdist,$@,http://downloads.xiph.org/releases/vorbis/$@)
+       $(call checkdist,$@,$(LIBVORBIS_CKSUM)) || rm -f $@
+
+$(LIBVORBIS)/lib/.libs/libvorbis-0.dll: $(LIBVORBIS)$(LIBVORBIS_EXT)
+       tar -xzf $<
+       cd $(LIBVORBIS) && $(ECONF) --with-ogg=$(PWD)/$(LIBOGG)$(prefix) && $(MAKE)
+
+.PHONY: $(LIBVORBIS) install-$(LIBVORBIS)
+$(LIBVORBIS): $(LIBOGG) $(LIBVORBIS)/lib/.libs/libvorbis-0.dll
+
+install-$(LIBVORBIS): $(LIBVORBIS) install-$(LIBOGG)
+       cd $(LIBVORBIS) && $(MAKEINST)
+
+
+###########################################################################
+OPENAL                 = openal-soft-1.13-bin
+OPENAL_CKSUM   = b545d3ebb8138cc581cd67f988638f43
+OPENAL_EXT             = .zip
+OPENAL_VERSION = 1.13
+
+define OPENAL_PCFILE
+prefix=$(prefix)
+exec_prefix=$${prefix}
+libdir=$${exec_prefix}/lib
+includedir=$${prefix}/include
+
+Name: OpenAL
+Description: OpenAL is a cross-platform 3D audio API
+Requires:
+Version: $(OPENAL_VERSION)
+Libs: -L$${libdir} -lOpenAL32
+Cflags: -I$${includedir}
+endef
+export OPENAL_PCFILE
+
+$(OPENAL)$(OPENAL_EXT):
+       $(call getdist,$@,http://kcat.strangesoft.net/$@)
+       $(call checkdist,$@,$(OPENAL_CKSUM)) || rm -f $@
+
+.PHONY: $(OPENAL) install-$(OPENAL)
+$(OPENAL): $(OPENAL)$(OPENAL_EXT)
+
+install-$(OPENAL): $(OPENAL)$(OPENAL_EXT)
+       $(call mkdirinst,bin include/AL lib/pkgconfig)
+       unzip -o $<
+       $(call install,0644,$(OPENAL)/include/AL/*,include/AL)
+       $(call install,0755,$(OPENAL)/Win32/soft_oal.dll,bin/OpenAL32.dll)
+       $(call install,0755,$(OPENAL)/openal-info.exe,bin)
+       $(call install,0755,$(OPENAL)/lib/Win32/libOpenAL32.dll.a,lib)
+       $(call installvar,OPENAL_PCFILE,lib/pkgconfig/openal.pc)
+
+
+###########################################################################
+ZLIB                   = zlib-1.2.5
+ZLIB_CKSUM             = c735eab2d659a96e5a594c9e8541ad63
+ZLIB_EXT               = .tar.gz
+ZLIB_VERSION   = 1.2.5
+
+define ZLIB_PCFILE
+prefix=$(prefix)
+exec_prefix=$${prefix}
+libdir=$${exec_prefix}/lib
+includedir=$${prefix}/include
+
+Name: zlib
+Description: zlib compression library
+Version: $(ZLIB_VERSION)
+Requires:
+Libs: -L$${libdir} -lz
+Cflags: -I$${includedir} 
+endef
+export ZLIB_PCFILE
+
+$(ZLIB)$(ZLIB_EXT):
+       $(call getdist,$@,http://www.zlib.net/$@)
+       $(call checkdist,$@,$(ZLIB_CKSUM)) || rm -f $@
+
+$(ZLIB)/zlib1.dll: $(ZLIB)$(ZLIB_EXT)
+       tar -xzf $<
+       cd $(ZLIB) && $(MAKE) -f win32/Makefile.gcc PREFIX="$(host)-"
+
+.PHONY: $(ZLIB) install-$(ZLIB)
+$(ZLIB): $(ZLIB)/zlib1.dll
+
+install-$(ZLIB): $(ZLIB)
+       $(call mkdirinst,bin include lib/pkgconfig)
+       $(call install,0644,$(ZLIB)/zconf.h $(ZLIB)/zlib.h,include)
+       $(call install,0755,$(ZLIB)/zlib1.dll,bin)
+       $(call install,0755,$(ZLIB)/libzdll.a,lib)
+       $(call installvar,ZLIB_PCFILE,lib/pkgconfig/zlib.pc)
+       cd $(DESTDIR)$(prefix)/lib && ln -fs libzdll.a libz.dll.a
+
+
+###########################################################################
+LIBPNG                 = libpng-1.5.2
+LIBPNG_CKSUM   = 31d448eb93a1646359a23f1b23434ab3
+LIBPNG_EXT             = .tar.gz
+
+define LIBPNG_PATCH
+diff -ur libpng-1.5.2.orig/configure.pc libpng-1.5.2/configure.pc
+--- libpng-1.5.2.orig/configure.ac     2011-06-03 14:01:39.174626747 -0600
++++ libpng-1.5.2/configure.ac  2011-06-03 14:02:05.427642561 -0600
+@@ -85,9 +85,9 @@
+                   [prefix that may have been used in installed zlib]),
+                   [ZPREFIX=$${withval}],
+                   [ZPREFIX='z_'])
+-AC_CHECK_LIB(z, zlibVersion, ,
+-    AC_CHECK_LIB(z, $${ZPREFIX}zlibVersion, ,
+-                 AC_ERROR([zlib not installed])))
++LIBS="$$LIBS -lz"
++CPPFLAGS="$$CPPFLAGS -I../$(ZLIB)"
++LDFLAGS="$$LDFLAGS -L../$(ZLIB) -avoid-version"
+ LIBPNG_DEFINES=-DPNG_CONFIGURE_LIBPNG
+endef
+export LIBPNG_PATCH
+
+$(LIBPNG)$(LIBPNG_EXT):
+       $(call getdist,$@,http://prdownloads.sourceforge.net/libpng/$@?download)
+       $(call checkdist,$@,$(LIBPNG_CKSUM)) || rm -f $@
+
+$(LIBPNG)/.libs/libpng15.dll: $(LIBPNG)$(LIBPNG_EXT)
+       tar -xzf $<
+       cd $(LIBPNG) && $(call patch,LIBPNG_PATCH) && ./autogen.sh && $(ECONF) && $(MAKE)
+
+.PHONY: $(LIBPNG) install-$(LIBPNG)
+$(LIBPNG): $(ZLIB) $(LIBPNG)/.libs/libpng15.dll
+
+install-$(LIBPNG): $(LIBPNG) install-$(ZLIB)
+       cd $(LIBPNG) && $(MAKEINST)
+
+
+###########################################################################
+LUA                    = lua-5.1.4
+LUA_CKSUM      = d0870f2de55d59c1c8419f36e8fac150
+LUA_EXT                = .tar.gz
+
+$(LUA)$(LUA_EXT):
+       $(call getdist,$@,http://www.lua.org/ftp/$@)
+       $(call checkdist,$@,$(LUA_CKSUM)) || rm -f $@
+
+$(LUA)/src/lua51.dll: $(LUA)$(LUA_EXT)
+       tar -xzf $<
+       cd $(LUA) && $(MAKE) CC=$(host)-gcc RANLIB=$(host)-ranlib mingw
+
+.PHONY: $(LUA) install-$(LUA)
+$(LUA): $(LUA)/src/lua51.dll
+
+install-$(LUA): $(LUA)
+       $(call mkdirinst,bin include lib/pkgconfig)
+       $(call install,0644,$(addprefix $(LUA)/src/,lua.h lualib.h luaconf.h lauxlib.h) $(LUA)/etc/lua.hpp,include)
+       $(call install,0755,$(LUA)/src/liblua.a,lib/liblua.dll.a)
+       $(call install,0755,$(LUA)/src/*.exe $(LUA)/src/lua51.dll,bin)
+       sed 's!/usr/local!$(prefix)!' $(LUA)/etc/lua.pc >$(DESTDIR)$(prefix)/lib/pkgconfig/lua.pc
+
+
+############################################################################
+# libopengl32 and libglu32 pkgconfig files
+define GL_PCFILE
+prefix=$(prefix)
+exec_prefix=$${prefix}
+libdir=$${exec_prefix}/lib
+includedir=$${prefix}/include
+
+Name: gl
+Description: OpenGL library
+Version:
+Requires:
+Libs: -L$${libdir} -lopengl32
+Cflags: -I$${includedir} 
+endef
+export GL_PCFILE
+
+.PHONY: install-gl.pc
+install-gl.pc:
+       $(call mkdirinst,lib/pkgconfig)
+       $(call installvar,GL_PCFILE,lib/pkgconfig/gl.pc)
+
+define GLU_PCFILE
+prefix=$(prefix)
+exec_prefix=$${prefix}
+libdir=$${exec_prefix}/lib
+includedir=$${prefix}/include
+
+Name: glu
+Description: OpenGL Utility library
+Version:
+Requires: gl
+Libs: -L$${libdir} -lglu32
+Cflags: -I$${includedir} 
+endef
+export GLU_PCFILE
+
+.PHONY: install-glu.pc
+install-glu.pc:
+       $(call mkdirinst,lib/pkgconfig)
+       $(call installvar,GLU_PCFILE,lib/pkgconfig/glu.pc)
+
+
+###########################################################################
+# wspiapi.h header file
+install-wspiapi.h:
+       $(call install,0644,wspiapi.h,include)
+
+
+###########################################################################
+ALL    = $(BOOST) $(SDL) $(LIBOGG) $(LIBVORBIS) $(OPENAL) $(ZLIB) $(LIBPNG) $(LUA)
+__package__: $(ALL)
+       printf "$(host)\n$(prefix)\n" >.saved
+       @echo "All done!"
+
+install: $(addprefix install-,$(ALL)) install-gl.pc install-glu.pc
+       @echo "All done!"
+
+.NOTPARALLEL:
+# For readability, the recipes in this file should not run in parallel.
+
diff --git a/build/arch/win32/rules.mk b/build/arch/win32/rules.mk
new file mode 100644 (file)
index 0000000..0f5eae5
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# Yoink
+# Run this script to create a win32 package.
+#
+# You should typically only run this through the "portable" and "installer"
+# makes targets in the package root directory.  The build system will take
+# care to pass the correct arguments.
+#
+
+docs           = AUTHORS COPYING README TODO
+libraries      = libogg-0 libpng15 libvorbis-0 libvorbisfile-3 lua51 OpenAL32 SDL zlib1
+
+MAN2HTML       = lua doc/man2html.lua
+UNIX2DOS       = arch/win32/unix2dos.sh
+MAKENSIS       = makensis
+
+stagedir       = $(builddir)/$(tarname)
+zipfile                = $(tarname).zip
+installer      = $(TARNAME)setup-$(VERSION)$(EXEEXT)
+
+__prepackage__: all
+       rm -rf $(stagedir) && mkdir -p $(stagedir)
+       cp -f $(builddir)/src/yoink$(EXEEXT) $(stagedir)
+       $(foreach l,$(libraries),cp -f $(bindir)/$l.dll $(stagedir);)
+       $(foreach d,$(SUBDIRS),$(foreach f,$(datadir_$(d)),\
+               mkdir -p $(dir $(f:$(d)%=$(stagedir)/data%)) && cp -f $(f) $(dir $(f:$(d)%=$(stagedir)/data%));))
+       $(MAN2HTML) -o $(stagedir)/Manual.html && $(UNIX2DOS) $(stagedir)/Manual.html
+       $(foreach f,$(docs),$(UNIX2DOS) $f $(stagedir)/$f.txt;)
+
+package: __prepackage__
+       cd $(builddir) && zip -r $(zipfile) $(tarname)
+       rm -rf $(stagedir)
+       mv -f $(builddir)/$(zipfile) $(zipfile)
+
+installer: __prepackage__
+       cp -f arch/win32/yoink.nsi $(builddir)/yoink.nsi
+       cd $(builddir) && $(MAKENSIS) -DROOTPATH=$(PWD) -DINSTALLFILES=$(PWD)/$(stagedir) \
+               -DVERSION=$(VERSION) -DOUTFILE=$(installer) yoink.nsi
+       rm -rf $(builddir)/yoink.nsi $(stagedir)
+       mv -f $(builddir)/$(installer) $(installer) && chmod +x $(installer)
+
+.PHONY: __prepackage__ package installer
+
diff --git a/build/check.lua b/build/check.lua
new file mode 100644 (file)
index 0000000..609cbfa
--- /dev/null
@@ -0,0 +1,170 @@
+--
+-- Yoink Build System
+-- A collection of Lua functions for performing checks.
+--
+-- Copyright (c) 2011, Charles McGarvey
+-- Distributable under the terms and conditions of the 2-clause BSD
+-- license; see the file COPYING for a complete text of the license.
+--
+
+local M = {}
+
+
+local util = require "utility"
+local print_check = util.printer("checking for %s... ")
+
+-- TODO: Should have check for toolset triplet, compiling arbitrary code,
+-- headers, libraries.
+
+
+local CC  = ""
+local CXX = ""
+
+
+local compile
+do
+       local cache = {}
+       compile = function(compiler, ext, flags, code)
+               if type(compiler) ~= "table" then compiler = {compiler} end
+               local key = util.concat(compiler, "&") .. ext .. code
+               if cache[key] then return cache[key], "cached value" end
+               local tmpdir = util.make_tempdir("config.XXXXXX")
+               if tmpdir
+               then
+                       local fd, err = io.open(tmpdir .. "/test." .. ext, "w")
+                       if not fd then die("failed to create temporary file", fd) end
+                       fd:write(code)
+                       fd:close()
+                       --util.print_log("code to be compiled:\n" .. code)
+                       compiler = util.find_command(compiler, "test." .. ext, tmpdir)
+                       os.execute("rm -rf " .. tmpdir)
+               else
+                       die("failed to create temporary directory", tmpdir)
+               end
+               cache[key] = compiler
+               if compiler == nil then return nil, "test program could not be compiled" end
+               return compiler
+       end
+end
+
+
+do
+       local cache = {}
+       local function cc(...)
+               local arg = util.copy(arg, "v", tostring)
+               local key = util.concat(arg)
+               if cache[key] then return cache[key], "cached value" end
+               --print_check("C compiler")
+               local cc, err = compile(arg, "c", "", "int main() { return 0; }")
+               --if cc then util.print(cc) else util.print("no") end
+               cache[key] = cc
+               --util.print_info("cccheck:", key, cc)
+               if cc == nil then return nil, err end
+               return cc
+       end
+       M.cc = cc
+
+       local function native_cc(triplet)
+               local ccenv = os.getenv("CC")
+               if ccenv
+               then
+                       local result = cc(ccenv)
+                       if result then return result end
+               end
+               if type(triplet) ~= "string" then triplet = util.exec("config.guess") end
+               return cc(triplet .. "-gcc", "cc", "gcc")
+       end
+       M.native_cc = native_cc
+
+       local function cross_cc(triplet)
+               return cc(triplet .. "-gcc")
+       end
+       M.cross_cc = cross_cc
+end
+
+do
+       local cache = {}
+       local function cxx(...)
+               local arg = util.copy(arg, "v", tostring)
+               local key = util.concat(arg)
+               if cache[key] then return cache[key], "cached value" end
+               --print_check("C++ compiler")
+               local cxx, err = compile(arg, "c++", "", "int main() { return 0; }")
+               --if cxx then util.print(cxx) else util.print("no") end
+               cache[key] = cxx
+               CXX = cxx
+               --util.print_info("cxxcheck:", key, cxx)
+               if cxx == nil then return nil, err end
+               return cxx
+       end
+       M.cxx = cxx
+
+       local function native_cxx(triplet)
+               if type(triplet) ~= "string" then triplet = util.exec("config.guess") end
+               return cxx(os.getenv("CXX"), "g++", "c++")
+       end
+       M.native_cxx = native_cxx
+
+       local function cross_cxx(triplet)
+               return cxx(triplet .. "-g++")
+       end
+       M.cross_cxx = cross_cxx
+end
+
+do
+       local cache = {}
+       local function lib(...)
+               --local key = util.concat(arg, ", ")
+               --if cache[key] then return cache[key] end
+               --print_check(key)
+               --local code = ""
+               --local result = false
+               --for _,header in ipairs(arg)
+               --do
+                       --code = string.format("%s#include <%s>\n", code, header)
+               --end
+               --code = code .. "int main() { return 0; }\n"
+               --if compile({CC}, "c", "", code) or compile({CC}, "c++", "", code)
+               --then
+                       --result = true
+                       --util.print("yes")
+               --else
+                       --util.print("no")
+               --end
+               --cache[key] = result
+               --return key
+               return true
+       end
+       M.lib = lib
+end
+
+do
+       local cache = {}
+       local function header(...)
+               local CC = M.native_cc()
+               local key = util.concat(arg, ", ")
+               if cache[key] then return cache[key] end
+               --print_check(key)
+               local code = ""
+               local result = false
+               for _,header in util.npairs(arg)
+               do
+                       code = string.format("%s#include <%s>\n", code, header)
+               end
+               code = code .. "int main() { return 0; }\n"
+               if compile({CC}, "c", "", code) or compile({CC}, "c++", "", code)
+               then
+                       result = true
+                       --util.print("yes")
+               else
+                       --util.print("no")
+               end
+               cache[key] = result
+               return key
+       end
+       M.header = header
+end
+
+
+return M
+
diff --git a/build/config.lua b/build/config.lua
new file mode 100644 (file)
index 0000000..fa522cf
--- /dev/null
@@ -0,0 +1,998 @@
+--
+-- Yoink Build System
+-- Execute this script with Lua to prepare the project for compiling.
+--
+-- Copyright (c) 2011, Charles McGarvey
+-- Distributable under the terms and conditions of the 2-clause BSD
+-- license; see the file COPYING for a complete text of the license.
+--
+
+
+--local function trace(event, line)
+       --local s = debug.getinfo(2).short_src
+       --print(s .. ":" .. line)
+--end
+--debug.sethook(trace, "l")
+
+
+-- Convert the arguments into standard form.  Each argument should be a
+-- string.  A table is returned with the arguments' standard form as keys.
+-- If an argument has a value, it will correspond to the appropriate key in
+-- the table.  This function supports autoconf-style arguments, including:
+-- 1. -h, --help produce a --help key with a value of true.
+-- 2. --enable-feature=[yes|no|whatever], --disable-feature produce a
+--    --enable-feature key with a value of true, false, or a string.
+-- 3. --with-package=[yes|no|whatever], --without-feature produce a
+--    --with-package key with a value of true, false, or a string.
+-- 4. SYMBOL=VALUE produce a SYMBOL key with VALUE as the string value.
+-- 5. Anything else will appear as a key in the table as-is with a value of
+--    true.
+-- If multiple arguments mapping to the same key are present in the
+-- argument list, the last one is used.
+local function parseArguments(...)
+       local result = {}
+       local filters = {}
+
+       local function setPair(key, value) result[key] = value end
+       local function setTrue(key) result[key] = true end
+       local function addLibrarySearchPath(path)
+               package.path  = path .. "/?.lua;" .. package.path
+               package.cpath = path .. "/?.so;" .. package.cpath
+       end
+
+       table.insert(filters, {"^-h$", function() result["--help"] = true end})
+       table.insert(filters, {"^-L(.*)$", addLibrarySearchPath})
+
+       table.insert(filters, {"^(--enable%-[%w_-]+)=?(.*)$", setPair})
+       table.insert(filters, {"^--disable%-([%w_-]+)$", function(feature)
+               setPair("--enable-" .. feature, "no")
+       end})
+
+       table.insert(filters, {"^(--with%-[%w_-]+)=?(.*)$", setPair})
+       table.insert(filters, {"^--without%-([%w_-]+)$", function(package)
+               setPair("--with-" .. package, "no")
+       end})
+       
+       table.insert(filters, {"^([%w_-]+)=(.*)$", setPair})
+       table.insert(filters, {"^([%w_-]+)$", setTrue})
+
+       for _,a in ipairs(arg)
+       do
+               for _,filter in pairs(filters)
+               do
+                       local matches = {a:match(filter[1])}
+                       if matches[1] then filter[2](unpack(matches)) break end
+               end
+       end
+
+       return result
+end
+
+
+local arguments                = parseArguments(unpack(arg))
+local interactive      = arguments["--interactive"]
+local rules                    = arguments["--rules"]      or "options.lua"
+local configfile       = arguments["--configfile"] or "config.mk"
+local printendmsg      = arguments["--print-instructions"]
+local exportHeader     = arguments["--export-header"]
+local exportTerms      = arguments["--export-terms"]
+
+
+local util = require "utility"
+util.logfile = "config.log"
+
+
+local printInfo = util.printer("%s - %s\n")
+local printWarning = util.printer("\a%s - %s\n", "33")
+local printError = util.printer("\a%s - %s\n", "31")
+local function beginProcess(title, caption)
+       print(string.format("%s:\n", title))
+       local updater = util.printer("  [%3d%%] %s\n")
+       updater(0, caption)
+       return function(progress, caption)
+               if progress ~= nil
+               then
+                       if 0.0 <= progress and progress <= 1.0 then progress = progress * 100 end
+                       return updater(progress, caption)
+               end
+               print()
+               return 0
+       end
+end
+
+local function loadDialog(name, configfile)
+       local dialog
+       local result, err = pcall(function() dialog = require "dialog" end)
+       if not result
+       then
+               printWarning(err)
+               return nil
+       end
+       dialog.title = string.format("%s - %s Configuration", configfile, name)
+       printInfo = dialog.msgbox
+       printWarning = dialog.msgbox
+       printError = dialog.msgbox
+       beginProcess = dialog.gauge
+       return dialog
+end
+
+
+local function topologicalSort(lookup)
+       local dependants = util.copy(lookup, "v", {v = function() return 0 end})
+       for _,option in pairs(lookup)
+       do
+               for _,dep in ipairs(option:getDirectDependants())
+               do
+                       dependants[dep] = dependants[dep] + 1
+               end
+       end
+
+       local sorted = {}
+       local queued = {}
+       for symbol,count in pairs(dependants)
+       do
+               if count == 0 then table.insert(queued, symbol) end
+       end
+       while 0 < #queued
+       do
+               local symbol = table.remove(queued)
+               table.insert(sorted, symbol)
+               for _,dep in ipairs(lookup[symbol]:getDirectDependants())
+               do
+                       dependants[dep] = dependants[dep] - 1
+                       if dependants[dep] == 0 then table.insert(queued, dep) end
+               end
+       end
+
+       local remaining = {}
+       for symbol,count in pairs(dependants)
+       do
+               if 0 < count then table.insert(remaining, symbol) end
+       end
+       if 0 < #remaining
+       then
+               printWarning("Q.A. Notice", "One or more circular dependencies were detected involving these symbols: "
+                       .. table.concat(remaining, ", "))
+               for _,symbol in ipairs(remaining) do table.insert(sorted, symbol) end
+       end
+
+       return sorted
+end
+
+local function checkSymbols(symbols)
+       local check = topologicalSort(symbols)
+       local isErr = false
+       local updateTask = function() end
+       if 1 < #check
+       then
+               updateTask = beginProcess("Checking Symbols", "Resolving dependencies...", 6, 65)
+       end
+       for i = 1, #check
+       do
+               local option = symbols[check[i]]
+               if option:validate() == nil then isErr = true end
+               updateTask(i / #check,
+                       (option:getSymbol() .. ": " .. option:toExpandedString()):truncate(60))
+       end
+       updateTask()
+       if isErr then return nil end
+       return true
+end
+
+
+---------------------------------------------------------------------------
+local Option = util.class()
+---------------------------------------------------------------------------
+
+function Option:__init(rule, lookup, objects)
+       self.name               = rule.name
+       self.caption    = rule.caption
+       self.help               = rule.help
+       self.value              = rule.value
+       self.symbol             = rule.symbol
+       self.cmdline    = rule.cmdline
+       self.config             = rule.config
+       self.export             = rule.export
+       self.visible    = rule.visible
+       self.check              = rule.check
+       self.temp               = rule.temp
+       self.before             = rule.before   
+       self.after              = rule.after    
+       self.lookup             = lookup or {}
+       self.objects    = objects or {}
+
+       if type(self.check) == "function"   then setfenv(self.check, self.lookup) end
+       if type(self.visible) == "function" then setfenv(self.visible, self.lookup) end
+
+       if self.symbol ~= nil
+       then
+               if self.lookup[self.symbol] ~= nil
+               then
+                       printWarning("duplicate symbol defined:", self.symbol)
+               end
+               self.lookup[self.symbol] = self.value
+               self.objects[self.symbol] = self
+       end
+end
+
+-- Get the symbol of the option.  The symbol is used as a reference in the
+-- string values of other options.  It must be unique.
+function Option:getSymbol()
+       return self.symbol
+end
+
+-- Get the argument of the option.
+function Option:getArg()
+       return self.cmdline
+end
+
+-- Get the value of the option as a string.
+function Option:toString()
+       return tostring(self.lookup[self.symbol])
+end
+
+-- Get the value of the option as an expanded string.  For most types of
+-- options, this is the same as Option:toString().
+function Option:toExpandedString()
+       return self:toString()
+end
+
+function Option:getDirectDependants()
+       return self.before or {}
+end
+
+function Option:getUnsortedDependants(dependants)
+       dependants = dependants or {}
+       if dependants[self.symbol] then return dependants end
+       dependants[self.symbol] = self
+       if self.before
+       then
+               for _,dep in ipairs(self.before)
+               do
+                       local option = self.objects[dep]
+                       if option
+                       then
+                               dependants = option:getUnsortedDependants(dependants)
+                       else
+                               printWarning("invalid dependency: " .. dep)
+                       end
+               end
+       end
+       return dependants
+end
+
+function Option:addDependant(dependency)
+       self.before = self.before or {}
+       table.insert(self.before, dependency)
+end
+
+function Option:convertDependenciesToDependants()
+       if self.after
+       then
+               local dep = table.remove(self.after)
+               while dep ~= nil
+               do
+                       local option = self.objects[dep]
+                       if option
+                       then
+                               option:addDependant(self.symbol)
+                       else
+                               printWarning("invalid dependency: " .. dep)
+                       end
+                       dep = table.remove(self.after)
+               end
+       end
+end
+
+function Option:getObjects()
+       return self.objects
+end
+
+-- Check the value of the option for validity.
+-- Returns a valid value based on the given value, or nil (with an error
+-- message) if the value is invalid and could not be converted to a valid
+-- value.
+function Option:validate(value)
+       local err
+       if value == nil then value = self.lookup[self.symbol] end
+       self.problem = nil
+       if type(self.check) == "function"
+       then
+               value, err = self.check(value)
+               if value == nil then self.problem = err return nil, err end
+       end
+       self.lookup[self.symbol] = value
+       return value, err
+end
+
+-- Set the value of the option to the value in a new lookup table.
+function Option:applyTable(lookup)
+end
+
+-- Set the value of the option based on a table of argument flags.
+function Option:applyArguments()
+end
+
+-- Set the value of the option.
+function Option:set(value)
+       self.lookup[self.symbol] = value
+       if checkSymbols(self:getUnsortedDependants())
+       then
+               return self.lookup[self.symbol]
+       end
+end
+
+-- Write the symbol and current value to the config file.
+function Option:writeSymbol(fd)
+       if self.symbol ~= nil and not self.temp
+       then
+               fd:write(util.align(self.symbol, "= " .. tostring(self.lookup[self.symbol]), 16) .. "\n")
+               --fd:write(string.format("%s\t= %s\n", self.symbol, tostring(self.lookup[self.symbol])))
+       end
+end
+
+-- Write the option value to the config header file.
+function Option:writeCppLine(fd)
+end
+
+-- Write the option value as a string replacement to the sed file.
+function Option:writeSedLine(fd)
+       if self.export
+       then
+               local value     = self:toExpandedString():gsub("/", "\\/")
+               local function writeLine(key)
+                       key = tostring(key):gsub("/", "\\/")
+                       fd:write(string.format("s/@%s@/%s/g\n", key, value))
+               end
+               if type(self.export) == "table"
+               then
+                       for _,key in ipairs(self.export) do writeLine(key) end
+               else
+                       writeLine(self.export)
+               end
+       end
+end
+
+-- Run an interactive menu with the given dialog context.  The type of menu
+-- run will depend on the type of option.
+function Option:showMenu(dialog)
+end
+
+-- Get whether or not there is a problem with the current value of the
+-- option.
+function Option:isValid()
+       return type(self.problem) ~= "string"
+end
+
+-- Get a human-readable description of the problem(s) this option faces
+-- before it can be considered valid.
+function Option:getProblem()
+       return self.problem
+end
+
+-- Get the name to be used for this option in the interactive menu.
+function Option:getMenuItem()
+       if not self:isValid() then return self.name .. " <!>" end
+       return self.name
+end
+
+-- Get the label used to represent this option in a menu.
+function Option:getLabel()
+       return ""
+end
+
+-- Get whether or not this option should be visible in a menu of options.
+-- Returns true if option is visible, false otherwise.
+function Option:isVisible()
+       if type(self.visible) == "function" then return self.visible() end
+       return true
+end
+
+-- If the option has an argument flag, print out a line with information
+-- about the purpose of this option.
+function Option:printHelpLine()
+       if self.cmdline ~= nil
+       then
+               print(util.align("  " .. self:getArg(), self.caption, 32))
+       end
+end
+
+function Option:getHelpText()
+       local value             = self:toString()
+       local help              = self.help or "No help available.\n"
+       local name              = self.name or "Unnamed"
+       local symbol    = self:getSymbol() or "None"
+       local arg               = self:getArg() or "None"
+
+       local problem   = self:getProblem()
+       if problem then problem = "\nProblem(s):\n" .. problem
+       else problem = "" end
+
+       return [[
+       
+]] .. help .. [[
+
+   Option Name: ]] .. name .. [[
+
+        Symbol: ]] .. symbol .. [[
+
+ Current Value: ]] .. value .. [[
+
+      Argument: ]] .. arg .. [[
+
+]] .. problem
+end
+
+
+---------------------------------------------------------------------------
+local StringOption = util.class(Option)
+---------------------------------------------------------------------------
+
+-- Get the expanded option value.  Symbols which begin with dollar signs
+-- will be substituted for their values.
+function StringOption:toExpandedString()
+       local function expand(value)
+               _, value, count = pcall(string.gsub, value, "%$%(([%w_]+)%)", self.lookup)
+               if not count then count = 0 end
+               return value, count
+       end
+       local value = self.lookup[self.symbol]
+       local iterations = 0
+       while iterations < 8
+       do
+               local count = 0
+               value, count = expand(value)
+               if count == 0 then return value end
+               iterations = iterations + 1
+       end
+       return value
+end
+
+function StringOption:applyTable(lookup)
+       local value = lookup[self.symbol]
+       if type(value) == "string" then self.lookup[self.symbol] = tostring(value) end
+end
+
+function StringOption:applyArguments(args)
+       local value = args[self.cmdline]
+       if value ~= nil then self:validate(tostring(value)) end
+end
+
+function StringOption:writeCppLine(fd)
+       if self.config
+       then
+               local value     = self:toExpandedString()
+               local function writeLine(key)
+                       if type(self.value) == "string"
+                       then
+                               fd:write(string.format("#define %s %q\n", key, value))
+                       else
+                               fd:write(string.format("#define %s %s\n", key, value))
+                       end
+               end
+               if type(self.config) == "table"
+               then
+                       for _,key in ipairs(self.config) do writeLine(key) end
+               else
+                       writeLine(self.config)
+               end
+       end
+end
+
+function StringOption:showMenu(dialog)
+       local code, item = dialog.inputbox(self.name, self.caption, self.lookup[self.symbol])
+       if code == 0 and item ~= self.lookup[self.symbol]
+       then
+               return self:set(item)
+       end
+end
+
+function StringOption:getLabel()
+       return self:toExpandedString()
+end
+
+
+---------------------------------------------------------------------------
+local EnumOption = util.class(StringOption)
+---------------------------------------------------------------------------
+
+-- An enumeration option is like a string, but it can only hold certain
+-- pre-determined values.  In a rule, it is distinguished by its value key
+-- which refers to an array of the possible (string) values.
+function EnumOption:__init(rule, lookup, objects)
+       Option.__init(self, rule, lookup, objects)
+       self.lookup[self.symbol] = self.value[1]
+end
+
+function EnumOption:getArg()
+       if self.cmdline == nil then return nil end
+       return self.cmdline .. "=[" .. table.concat(self.value, "|") .. "]"
+end
+
+function EnumOption:validate(str)
+       str = str or self.lookup[self.symbol]
+       for _,value in ipairs(self.value)
+       do
+               if value == str then return Option.validate(self, str) end
+       end
+       self.problem = "The assigned value (" .. str .. ") is not a valid option."
+       return nil, self.problem
+end
+
+function EnumOption:applyArguments(args)
+       -- Just like applying arguments for strings, but if the argument is
+       -- false, assume the first value should be assigned.
+       local value = args[self.cmdline]
+       if value == false then self:validate(self.value[1]) return end
+       StringOption.applyArguments(self, args)
+end
+
+function EnumOption:writeCppLine(fd)
+       if self.config
+       then
+               local value     = self:toString():upper()
+               local function writeLine(key)
+                       key = tostring(key) .. "_" .. value
+                       fd:write(string.format("#define %s 1\n", key))
+               end
+               if type(self.config) == "table"
+               then
+                       for _,key in ipairs(self.config) do writeLine(key) end
+               else
+                       writeLine(self.config)
+               end
+       end
+end
+
+function EnumOption:showMenu(dialog)
+       local menuitems = {}
+       for _,value in ipairs(self.value)
+       do
+               table.insert(menuitems, {value, ""})
+       end
+       local code, item = dialog.menu(
+               self.name,
+               self.caption,
+               menuitems,
+               self.lookup[self.symbol],
+               {["--ok-label"] = "Select"}
+       )
+       if code == 0 and item ~= self.lookup[self.symbol]
+       then
+               return self:set(item)
+       end
+end
+
+function EnumOption:getLabel()
+       return "[" .. StringOption.getLabel(self) .. "]"
+end
+
+
+---------------------------------------------------------------------------
+local BooleanOption = util.class(Option)
+---------------------------------------------------------------------------
+
+function BooleanOption:toString()
+       if self.lookup[self.symbol] then return "Yes" else return "No" end
+end
+
+function BooleanOption:applyTable(lookup)
+       local value = lookup[self.symbol]
+       if type(value) == "boolean" then self.lookup[self.symbol] = value end
+end
+
+function BooleanOption:applyArguments(args)
+       local value = args[self.cmdline]
+       if value == "yes" or value == "" then value = true end
+       if value == "no" then value = false end
+       if type(value) == "boolean" then self:validate(value) end
+end
+
+function BooleanOption:writeCppLine(fd)
+       if self.config
+       then
+               local value     = self.lookup[self.symbol]
+               local function writeLine(key)
+                       -- Reverse the value if key starts with a bang.
+                       local value = value
+                       if key:byte(1) == 33 then key = key:sub(2) value = not value end
+                       if value
+                       then
+                               fd:write("#define " .. key .. " 1\n")
+                       else
+                               fd:write("/* #undef " .. key .. " */\n")
+                       end
+               end
+               if type(self.config) == "table"
+               then
+                       for _,key in ipairs(self.config) do writeLine(key) end
+               else
+                       writeLine(self.config)
+               end
+       end
+end
+
+function BooleanOption:showMenu(dialog)
+       local item = not self.lookup[self.symbol]
+       return self:set(item)
+end
+
+function BooleanOption:getLabel()
+       if self.lookup[self.symbol] then return "[X]" else return "[ ]" end
+end
+
+
+---------------------------------------------------------------------------
+local NullOption = util.class(Option)
+---------------------------------------------------------------------------
+
+-- Null options don't really hold any useful information; they just
+-- translate to a blank line in the menuconfig.  Any non-table object in a
+-- rule will become this type of option.
+function NullOption:__init()
+       self.name = ""
+       self.lookup = {}
+end
+
+function NullOption:validate()
+       return true
+end
+function NullOption:isVisible()
+       return true
+end
+
+
+---------------------------------------------------------------------------
+local GroupOption = util.class(Option)
+---------------------------------------------------------------------------
+
+local function optionFactory(rule, lookup, objects)
+       local jump = setmetatable({
+               string  = StringOption,
+               number  = StringOption,
+               table   = EnumOption,
+               boolean = BooleanOption
+       }, {
+               __index = function() return GroupOption end
+       })
+       if type(rule) == "table"
+       then
+               return jump[type(rule.value)](rule, lookup, objects)
+       else
+               -- If the rule is not a table, just insert a placeholder option for
+               -- a blank line.
+               return NullOption()
+       end
+end
+
+-- A GroupOption is not really an option itself, but a group of options.
+function GroupOption:__init(rule, lookup, objects)
+       Option.__init(self, rule, lookup, objects)
+       self.children = {}
+
+       for _,child in ipairs(rule)
+       do
+               table.insert(self.children, optionFactory(child, self.lookup, self.objects))
+       end
+end
+
+function GroupOption:toString()
+       return "n/a"
+end
+
+-- Call the method with an arbitrary number of arguments to each
+-- sub-option.
+function GroupOption:recurse(method, ...)
+       for _,child in ipairs(self.children)
+       do
+               child[method](child, unpack(arg))
+       end
+end
+
+function GroupOption:convertDependenciesToDependants()
+       self:recurse("convertDependenciesToDependants")
+end
+
+-- Validate each sub-option in order.  The validation will short-circuit
+-- and return nil (with an error message) upon the first failed validation.
+function GroupOption:validate()
+       for _,child in ipairs(self.children)
+       do
+               local result, err = child:validate()
+               if result == nil then return result, err end
+       end
+       return true
+end
+
+function GroupOption:isValid()
+       for _,child in ipairs(self.children)
+       do
+               if not child:isValid() then return false end
+       end
+       return true
+end
+
+function GroupOption:getProblem()
+       local problems = ""
+       for _,child in ipairs(self.children)
+       do
+               local problem = child:getProblem()
+               if problem
+               then
+                       local symbol = child:getSymbol()
+                       if symbol
+                       then
+                               problems = problems .. util.align(symbol .. ":", problem, 16) .. "\n"
+                       else
+                               problems = problems .. problem .. "\n"
+                       end
+                       util.align(symbol, problem, 16)
+               end
+       end
+       if problems == "" then return nil end
+       return util.trim(problems)
+end
+
+function GroupOption:applyTable(lookup)
+       self:recurse("applyTable", lookup)
+end
+
+function GroupOption:applyArguments(args)
+       self:recurse("applyArguments", args)
+end
+
+function GroupOption:writeSymbol(fd)
+       if self.name ~= nil then
+               fd:write(string.format("\n# %s\n", self.name))
+               self:recurse("writeSymbol", fd)
+       end
+end
+
+function GroupOption:writeCppLine(fd)
+       self:recurse("writeCppLine", fd)
+end
+
+function GroupOption:writeSedLine(fd)
+       self:recurse("writeSedLine", fd)
+end
+
+
+function GroupOption:showMenu(dialog)
+       local running, dirty, selected = true
+       while running
+       do
+               local menuitems = {}
+               for _,value in ipairs(self.children)
+               do
+                       if type(value) ~= "table"
+                       then
+                               table.insert(menuitems, value)
+                       elseif type(value.name) == "string" and value:isVisible()
+                       then
+                               local name = value:getMenuItem()
+                               local label = value:getLabel()
+                               local caption = ""
+                               if type(value.caption) == "string"
+                               then
+                                       caption = value.caption
+                                       menuitems["HELP " .. value.caption] = value
+                               end
+                               menuitems[name] = value
+                               table.insert(menuitems, {name, label, caption})
+                       end
+               end
+
+               local code, item = dialog.menu(
+                       self.name,
+                       self.caption,
+                       menuitems,
+                       selected,
+                       {
+                               ["--ok-label"] = "Select",
+                               ["--cancel-label"] = "Exit",
+                               ["--item-help"] = true,
+                               ["--help-button"] = true
+                       }
+               )
+
+               if code == 0
+               then
+                       local value = menuitems[item]
+                       if type(value) == "table"
+                       then
+                               if value:showMenu(dialog) ~= nil then dirty = "changed" end
+                               selected = value:getMenuItem()
+                       else
+                               selected = value
+                       end
+               elseif code == 2
+               then
+                       local value = menuitems[item]
+                       if value
+                       then
+                               dialog.msgbox(value.name, value:getHelpText(), {["--no-collapse"] = true})
+                               selected = value:getMenuItem()
+                       else
+                               dialog.msgbox("No Help",
+                                                         "Sorry, no help is available for this option.")
+                       end
+               else
+                       running = false
+               end
+       end
+       return dirty
+end
+
+function GroupOption:getLabel()
+       return "-->"
+end
+
+function GroupOption:printHelpLine()
+       if self:isVisible() and self.name ~= nil then
+               print(string.format("\n%s:", self.name))
+               self:recurse("printHelpLine")
+       end
+end
+
+
+-- Print arguments and usage information for all of the sub-options.
+function GroupOption:printHelp(name)
+       print([[
+
+This script prepares ]] .. name .. [[ for building on your system.
+Usage: ./configure [OPTION]... [VAR=VALUE]...]])
+
+       self:printHelpLine()
+       print()
+end
+
+-- Set values of the sub-options based on a table that is loaded from a
+-- file.  The table is formatted as one or more lines with keys and values
+-- separated by an equal sign.  The pound sign (#) serves to start a
+-- comment on the line.  The first equal sign on a line is used as the
+-- separator, so keys cannot have an equal sign.
+function GroupOption:loadFromFile(filepath)
+       local lookup = {}
+       local fd = io.open(filepath)
+       if fd
+       then
+               for line in fd:lines()
+               do
+                       if not line:find("^%s*#")
+                       then
+                               key, value = line:match("^%s*(%S.-)%s*=%s*(.*)%s*")
+                               if value
+                               then
+                                       if value:upper() == "TRUE" then value = true
+                                       elseif value:upper() == "FALSE" then value = false end
+                               end
+                               if key then lookup[key] = value end
+                       end
+               end
+               fd:close()
+       end
+       self:applyTable(lookup)
+end
+
+-- Save a table with the current values of the sub-options to a file.  The
+-- file can be reloaded with GroupOption:loadFromFile.
+function GroupOption:saveToFile(filepath)
+       local fd = io.open(filepath, "w")
+       if fd
+       then
+               fd:write(string.format("\n# Auto-generated: %s", os.date()))
+               self:writeSymbol(fd)
+               fd:write("\n")
+       else
+               printError("couldn't save config file to:", filepath)
+       end
+end
+
+-- Exports the config header file.  The key-value pairs of sub-options with
+-- "config" defined will be written to the file.
+function GroupOption:exportHeader(filepath)
+       local fd = io.open(filepath, "w")
+       self:writeCppLine(fd)
+       fd:close()
+end
+
+-- Exports the search 'n replace file.  The key-value pairs of sub-options
+-- with "export" defined will be written to the file.
+function GroupOption:exportTerms(filepath)
+       local fd = io.open(filepath, "w")
+       self:writeSedLine(fd)
+       fd:close()
+end
+
+-- Run menuconfig.  This is different from showMenu in that this method
+-- tracks changes and returns an action: save, cancel, nochange or error.
+function GroupOption:runMenu()
+       local result, dirty = nil, false
+       while result == nil
+       do
+               if self:showMenu(dialog) ~= nil then dirty = true end
+               if not self:isValid()
+               then
+                       local code = dialog.yesno("Oh drat!",
+                       "There is at least one problem with the configuration, marked with <!>, and the configuration will not be saved.  Do you really want to exit without saving?",
+                       {
+                               ["--extra-button"] = false,
+                               ["--ok-label"] = "Exit",
+                               ["--cancel-label"] = "Back"
+                       })
+                       if code == 0 or code == 255 then result = "error" end
+               elseif dirty
+               then
+                       local code = dialog.yesno("Save Changes?",
+                       "Your configuration has been altered.  Do you want to save the changes?",
+                       {
+                               ["--ok-label"] = "Save",
+                               ["--cancel-label"] = "Back",
+                               ["--extra-button"] = true,
+                               ["--extra-label"] = "Exit"
+                       })
+                       if code == 0 then result = "save"
+                       elseif code == 3 or code == 255 then result = "cancel" end
+               else
+                       result = "nochange"
+               end
+       end
+       return result
+end
+
+
+local loadFn = assert(loadfile(rules))
+local name, rules = loadFn()
+
+local options = optionFactory(rules)
+if arguments["--help"] then options:printHelp(name) os.exit() end
+
+options:loadFromFile(configfile)
+if exportHeader or exportTerms
+then
+       if exportHeader then options:exportHeader(exportHeader) end
+       if exportTerms then options:exportTerms(exportTerms) end
+       os.exit()
+end
+
+print()
+printInfo(name, "Preparing for building and installation on your system.\n")
+options:applyArguments(arguments)
+
+if interactive then loadDialog(name, configfile) end
+
+options:convertDependenciesToDependants()
+checkSymbols(options:getObjects())
+
+if dialog
+then
+       local action = options:runMenu()
+       if action == "exit" or action == "error"
+       then
+               print("configuration aborted by user request")
+               os.exit(1)
+       else
+               options:saveToFile(configfile)
+               print("configuration saved to " .. configfile)
+       end
+elseif options:isValid()
+then
+       options:saveToFile(configfile)
+else
+       printError("Uh oh!", [[
+There is at least one unresolved problem with the configuration.
+]] .. options:getProblem() .. "\n")
+       os.exit(2)
+end
+
+if printendmsg ~= "no"
+then
+       printInfo("Configuration complete!", [[
+To finish the installation, type:
+  make
+  make install
+]])
+end
+
+-- vi:ts=4 sw=4 tw=75
+
diff --git a/build/dialog.c b/build/dialog.c
new file mode 100644 (file)
index 0000000..ee8a2a8
--- /dev/null
@@ -0,0 +1,578 @@
+
+/*]  Copyright (c) 2011, Charles McGarvey  [*******************************
+**]  All rights reserved.
+*
+* vi:ts=4 sw=4 tw=75
+*
+* Distributable under the terms and conditions of the 2-clause BSD license;
+* see the file COPYING for a complete text of the license.
+*
+**************************************************************************/
+
+#define LUA_DIALOG_NAME                "dialog"
+#define LUA_DIALOG_VERSION     "1.0"
+
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/wait.h>
+#include <unistd.h>
+
+#define LUA_LIB
+#include "lua.h"
+#include "lauxlib.h"
+
+
+#ifdef NDEBUG
+#define printarray(A)
+#else
+#include <stdio.h>
+static void printarray(const char* argv[])
+{
+       printf("%s", argv[0]);
+       int i; for (i = 1; argv[i]; ++i) printf(" %s", argv[i]);
+}
+#endif
+
+
+/**
+ * Fork and execute a command with arguments and optionally get a file
+ * descriptor connected to one of the child's own file descriptors.  The
+ * process id of the child is returned, or -1 on error.  If fd is not NULL,
+ * a pipe will be created and connected to *fd.  If *fd is 0, then *fd will
+ * be set to a write file descriptor connected to the child's standard
+ * input.  If *fd is not 0, then *fd will be set to a read file descriptor
+ * set connected to the specified file descriptor of the child.  In either
+ * case, the caller has the responsibility to close fd when it is no longer
+ * needed.
+ */
+static pid_t myexec(const char* command, char* const argv[], int* fd) 
+{
+       int parentFd = -1;
+       int p[2];
+       pid_t child;
+
+       if (fd)
+       {
+               if (pipe(p) != 0) return -1;
+               parentFd = (*fd == 0);
+       }
+       if (!(child = fork()))
+       {
+               if (fd)
+               {
+                       close(p[parentFd]);
+                       if (dup2(p[!parentFd], *fd) == -1) _exit(127);
+               }
+               execv(command, argv);
+               _exit(127);
+       }
+       if (child == -1)
+       {
+               if (parentFd != -1)
+               {
+                       close(p[0]); close(p[1]);
+               }
+               return -1;
+       }
+       if (parentFd != -1)
+       {
+               close(p[!parentFd]);
+               *fd = p[parentFd];
+       }
+       return child;
+}
+
+/**
+ * Wait on a child process.  Returns the exit status of the process if the
+ * child terminates normally, or -1 on error or abnormal child termination.
+ */
+static int mywait(pid_t pid)
+{
+       int status;
+       if (waitpid(pid, &status, 0) == -1 || !WIFEXITED(status)) return -1;
+       return WEXITSTATUS(status);
+}
+
+
+/**
+ * Read from a file descriptor until EOF and push contents to the top of
+ * the Lua stack.  Closes the file descriptor afterward.
+ */
+static void pushstream(lua_State* L, int fd)
+{
+       luaL_Buffer B;
+       luaL_buffinit(L, &B);
+
+       char buffer[BUFSIZ];
+       ssize_t bytes;
+       while ((bytes = read(fd, buffer, sizeof(buffer))))
+       {
+               if (bytes == -1) break;
+               luaL_addlstring(&B, buffer, bytes);
+       }
+
+       close(fd);
+       luaL_pushresult(&B);
+}
+
+/**
+ * Write some arbitrary bytes to a file descriptor, appending a newline.
+ */
+static void writelstring(int fd, const char* str, size_t len)
+{
+       ssize_t bytes;
+       while ((bytes = write(fd, str, len)))
+       {
+               if (bytes == -1) break;
+               str += bytes;
+               len -= bytes;
+       }
+       bytes = write(fd, "\n", 1);
+}
+
+/**
+ * Write a NULL-terminate string to a file descriptor.  Uses writelstring.
+ */
+static void writestring(int fd, const char* str)
+{
+       writelstring(fd, str, strlen(str));
+}
+
+/**
+ * Write a Lua value, that is able to be converted to a string, to a file
+ * descriptor.
+ */
+static void tostream(lua_State* L, int index, int fd)
+{
+       size_t len = 0;
+       const char* buffer = lua_tolstring(L, index, &len);
+       writelstring(fd, buffer, len);
+}
+
+
+/**
+ * Add one or more strings to the end of a NULL-terminated array of
+ * strings.  The parameter list itself should also be terminated with a
+ * NULL.  The terminating NULL of the array of strings will be moved back
+ * as needed.  It is the responsibility of the caller to assert there is
+ * enough room in the array so that an overflow doesn't occur.  Strings are
+ * not duplicated as they are added to the array.
+ */
+static void addstrings(const char* argv[], ...)
+{
+       va_list ap;
+       int i; for (i = 0; argv[i]; ++i);
+       va_start(ap, argv);
+       const char* arg = va_arg(ap, const char*);
+       while (arg)
+       {
+               argv[i++] = arg;
+               arg = va_arg(ap, const char*);
+       }
+       va_end(ap);
+       argv[i] = NULL;
+}
+
+/**
+ * Search an array of strings for a particular string, returning the index
+ * where the first equivalent string is found or -1 if it wasn't found.
+ */
+static int searchstrings(const char* argv[], const char* str)
+{
+       int i; for (i = 0; argv[i]; ++i) if (strcmp(argv[i], str) == 0) return i;
+       return -1;
+}
+
+
+/**
+ * Add the command and backtitle to the argument list from the Lua state.
+ */
+static void addcommand(lua_State* L, const char* argv[])
+{
+       lua_getglobal(L, LUA_DIALOG_NAME);
+       lua_getfield(L, -1, "command");
+       lua_getfield(L, -2, "title");
+       addstrings(argv, lua_tostring(L, -2), NULL);
+       if (lua_isstring(L, -1))
+       {
+               addstrings(argv, "--backtitle", lua_tostring(L, -1), NULL);
+       }
+       lua_pop(L, 3);
+}
+
+/**
+ * Add the height and width to the argument list from the Lua state.
+ */
+static int addsize(lua_State* L, const char* argv[], int extra, int n)
+{
+       int m = n;
+       lua_getglobal(L, LUA_DIALOG_NAME);
+       if (lua_isnumber(L, m)) lua_pushvalue(L, m++);
+       else lua_getfield(L, -1, "height");
+       if (lua_isnumber(L, m)) lua_pushvalue(L, m++);
+       else lua_getfield(L, -2, "width");
+       addstrings(argv, lua_tostring(L, -2), lua_tostring(L, -1), NULL);
+       if (extra) addstrings(argv, lua_tostring(L, -2), NULL);
+       lua_pop(L, 3);
+       return m - n;
+}
+
+/**
+ * Add the dialog title to the argument list from the Lua state.  The title
+ * should be at index 1 on the stack, and an error is thrown if it is not
+ * found.
+ */
+static void addtitle(lua_State* L, const char* argv[])
+{
+       addstrings(argv, "--title", luaL_checkstring(L, 1), NULL);
+}
+
+/**
+ * Add the caption to the argument list from the Lua state.  The caption
+ * should be at index 2 on the stack, and an error is thrown if it is not
+ * found.
+ */
+static void addcaption(lua_State* L, const char* argv[])
+{
+       addstrings(argv, luaL_optstring(L, 2, ""), NULL);
+}
+
+/**
+ * Get the string found at a certain index on the Lua stack, returned in
+ * the text argument.  Returns whether the text was set.
+ */
+static int getstring(lua_State* L, const char* argv[], int n, const char** text)
+{
+       if (lua_type(L, n) != LUA_TSTRING) return 0;
+       *text = lua_tostring(L, n);
+       return 1;
+}
+
+/**
+ * Add extra arguments to the argument list from the Lua state.  The extra
+ * arguments exist in a table where the key is a flag and its value (if it
+ * is a string) is added as a flag option.
+ */
+static int addextra(lua_State* L, const char* argv[], int n)
+{
+       if (!lua_istable(L, n)) return 0;
+       lua_pushnil(L);
+       while (lua_next(L, n))
+       {
+               addstrings(argv, lua_tostring(L, -2), NULL);
+               if (lua_isstring(L, -1)) addstrings(argv, lua_tostring(L, -1), NULL);
+               lua_pop(L, 1);
+       }
+       return 1;
+}
+
+/**
+ * Add the default item to the argument list from the Lua stack for a menu
+ * command.  Returns whether or not the arguments were found and added.  If
+ * the value on the stack is nil, no arguments are added to the list, but
+ * the return value is still 1.
+ */
+static int addselected(lua_State* L, const char* argv[], int n)
+{
+       if (lua_isnil(L, n)) return 1;
+       if (!lua_isstring(L, n)) return 0;
+       addstrings(argv, "--default-item", lua_tostring(L, n), NULL);
+       return 1;
+}
+
+/**
+ * Add menu items to the argument list from the Lua stack.  They should
+ * exist in a table at index 3 of a menu command.  Each item should be a
+ * table itself with two or three strings, depending on whether --item-help
+ * exists in the argument list.
+ */
+static void addmenuitems(lua_State* L, const char* argv[])
+{
+       int fields = 2;
+       if (searchstrings(argv, "--item-help") != -1) fields = 3;
+
+       if (!lua_istable(L, 3)) luaL_argerror(L, 3, "menu items");
+       int i; for (i = 1;; ++i)
+       {
+               lua_pushinteger(L, i);
+               lua_gettable(L, 3);
+               if (lua_isnil(L, -1))
+               {
+                       lua_pop(L, 1);
+                       break;
+               }
+               else if (lua_istable(L, -1))
+               {
+                       int subtable = lua_gettop(L);
+                       lua_pushnil(L);
+                       int j; for (j = 0; j < fields; ++j)
+                       {
+                               if (!lua_next(L, subtable)) luaL_argerror(L, 3, "not enough fields");
+                               addstrings(argv, lua_tostring(L, -1), NULL);
+                               lua_pop(L, 1);
+                       }
+                       lua_pop(L, 1);
+               }
+               else
+               {
+                       if (fields == 2) addstrings(argv, "", "", NULL);
+                       else addstrings(argv, "", "", "", NULL);
+               }
+               lua_pop(L, 1);
+       }
+}
+
+/**
+ * Fill out the argument list from the Lua state according to the standard
+ * 3 or 4 argument dialog command format.
+ */
+static void addargs(lua_State* L, const char* command, int nargs, const char* argv[])
+{
+       assert((nargs == 3 || nargs == 4) && "nargs should be 3 or 4");
+
+       addcommand(L, argv);
+       addtitle(L, argv);
+       const char* text = NULL;
+       int n = 3;
+       if (nargs == 4) n += getstring(L, argv, n, &text);
+       n += addextra(L, argv, n);
+       addstrings(argv, command, NULL);
+       addcaption(L, argv);
+       addsize(L, argv, 0, n);
+       if (text) addstrings(argv, text, NULL);
+}
+
+
+/**
+ * Close a gauge dialog if one is running.  If a gauge is in progress, the
+ * status code will be pushed onto the stack and 1 is returned; otherwise,
+ * 0 is returned.
+ */
+static void closegauge(lua_State* L)
+{
+       lua_getfield(L, LUA_REGISTRYINDEX, "dialog_gauge_pid");
+       lua_getfield(L, LUA_REGISTRYINDEX, "dialog_gauge_fd");
+       if (!lua_isnumber(L, -2) || !lua_isnumber(L, -1))
+       {
+               lua_pop(L, 2);
+               return;
+       }
+       pid_t pid = lua_tointeger(L, -2);
+       int fd = lua_tointeger(L, -1);
+       lua_pop(L, 2);
+
+       lua_pushnil(L);
+       lua_setfield(L, LUA_REGISTRYINDEX, "dialog_gauge_pid");
+       lua_pushnil(L);
+       lua_setfield(L, LUA_REGISTRYINDEX, "dialog_gauge_fd");
+
+       close(fd);
+       int code = mywait(pid);
+       if (code == -1) luaL_error(L, "dialog killed abnormally");
+}
+
+/**
+ * Updates the progress of a gauge dialog.  Takes a number argument in the
+ * range of 0-100 or 0.0-1.0 as the progress.  Optionally takes a string as
+ * the second argument which causes the caption to change.  The last call
+ * to this function should be with no arguments to end the gauge dialog.
+ * Returns nothing except the last call which returns the status code of
+ * the dialog which should always be OK.
+ */
+static int updategauge(lua_State* L)
+{
+       if (!lua_isnumber(L, 1))
+       {
+               closegauge(L);
+               return 0;
+       }
+
+       lua_getfield(L, LUA_REGISTRYINDEX, "dialog_gauge_fd");
+       if (!lua_isnumber(L, -1)) return 0;
+       int fd = lua_tointeger(L, -1);
+
+       lua_Number percent = lua_tonumber(L, 1);
+       if (0.0 <= percent && percent <= 1.0) percent *= 100.0;
+       lua_pushinteger(L, (lua_Integer)percent);
+       lua_replace(L, 1);
+       if (lua_isstring(L, 2))
+       {
+               writestring(fd, "XXX");
+               tostream(L, 1, fd);
+               tostream(L, 2, fd);
+               writestring(fd, "XXX");
+       }
+       else
+       {
+               tostream(L, 1, fd);
+       }
+       return 0;
+}
+
+/**
+ * Display a gauge dialog.  Required arguments are dialog title and
+ * caption.  Optional arguments include a table of extra flags.  Returns a
+ * new function which can be used to update the progress.
+ */
+static int dialog_gauge(lua_State* L)
+{
+       const char* argv[40] = {NULL};
+       closegauge(L);
+       addargs(L, "--gauge", 3, argv);
+
+       int fd = 0;
+       pid_t pid = myexec(argv[0], (char* const*)argv, &fd);
+       if (pid == -1) luaL_error(L, "dialog failed to execute");
+       lua_pushinteger(L, pid);
+       lua_setfield(L, LUA_REGISTRYINDEX, "dialog_gauge_pid");
+       lua_pushinteger(L, fd);
+       lua_setfield(L, LUA_REGISTRYINDEX, "dialog_gauge_fd");
+       lua_pushcfunction(L, updategauge);
+       return 1;
+}
+/**
+ * Display a menu dialog.  Required arguments are dialog title, caption,
+ * and table of menu items.  Optional arguments are selected item and table
+ * of extra flags.
+ */
+static int dialog_menu(lua_State* L)
+{
+       const char* argv[1024] = {NULL};
+       closegauge(L);
+
+       addcommand(L, argv);
+       addtitle(L, argv);
+       int n = 4;
+       n += addselected(L, argv, n);
+       n += addextra(L, argv, n);
+       addstrings(argv, "--menu", NULL);
+       addcaption(L, argv);
+       addsize(L, argv, 1, n);
+       addmenuitems(L, argv);
+
+       printarray(argv);
+
+       int fd = 2;
+       pid_t pid = myexec(argv[0], (char* const*)argv, &fd);
+       if (pid == -1) luaL_error(L, "dialog failed to execute");
+       int code = mywait(pid);
+       if (code == -1) luaL_error(L, "dialog killed abnormally");
+       lua_pushinteger(L, code);
+       pushstream(L, fd);
+       return 2;
+}
+
+/**
+ * Display a message dialog.  Required arguments are dialog title and
+ * caption.  Optional arguments include a table of extra flags.
+ */
+static int dialog_msgbox(lua_State* L)
+{
+       const char* argv[40] = {NULL};
+       closegauge(L);
+       addargs(L, "--msgbox", 3, argv);
+
+       pid_t pid = myexec(argv[0], (char* const*)argv, NULL);
+       if (pid == -1) luaL_error(L, "dialog failed to execute");
+       int code = mywait(pid);
+       if (code == -1) luaL_error(L, "dialog killed abnormally");
+       lua_pushinteger(L, code);
+       return 1;
+}
+
+/**
+ * Display an input dialog.  Required arguments are dialog title and
+ * caption.  Optional arguments are the default text and a table of extra
+ * flags.
+ */
+static int dialog_inputbox(lua_State* L)
+{
+       const char* argv[40] = {NULL};
+       closegauge(L);
+       addargs(L, "--inputbox", 4, argv);
+
+       int fd = 2;
+       pid_t pid = myexec(argv[0], (char* const*)argv, &fd);
+       if (pid == -1) luaL_error(L, "dialog failed to execute");
+       int code = mywait(pid);
+       if (code == -1) luaL_error(L, "dialog killed abnormally");
+       lua_pushinteger(L, code);
+       pushstream(L, fd);
+       return 2;
+}
+
+/**
+ * Display a yes/no dialog.  Required arguments are dialog title and
+ * caption.  Optional arguments include a table of extra flags.
+ */
+static int dialog_yesno(lua_State* L)
+{
+       const char* argv[40] = {NULL};
+       closegauge(L);
+       addargs(L, "--yesno", 3, argv);
+
+       pid_t pid = myexec(argv[0], (char* const*)argv, NULL);
+       if (pid == -1) luaL_error(L, "dialog failed to execute");
+       int code = mywait(pid);
+       if (code == -1) luaL_error(L, "dialog killed abnormally");
+       lua_pushinteger(L, code);
+       return 1;
+}
+
+
+/**
+ * Register the module functions and find a dialog command in the path.
+ */
+LUALIB_API int luaopen_dialog(lua_State* L)
+{
+       const struct luaL_Reg dialog_funcs[] = {
+               {"gauge",               dialog_gauge},
+               {"inputbox",    dialog_inputbox},
+               {"menu",                dialog_menu},
+               {"msgbox",              dialog_msgbox},
+               {"yesno",               dialog_yesno},
+               {NULL, NULL}
+       };
+       luaL_register(L, LUA_DIALOG_NAME, dialog_funcs);
+
+       const char* names[] = {getenv("DIALOG"), "dialog", "cdialog"};
+       int i; for (i = 0; i < 3; ++i)
+       {
+               if (names[i])
+               {
+                       char* path = strdup(getenv("PATH"));
+                       char* token; char** paths = &path;
+                       while ((token = strsep(paths, ":")))
+                       {
+                               luaL_Buffer B;
+                               luaL_buffinit(L, &B);
+                               luaL_addstring(&B, token);
+                               luaL_addstring(&B, "/");
+                               luaL_addstring(&B, names[i]);
+                               luaL_pushresult(&B);
+                               if (access(lua_tostring(L, -1), X_OK) == 0)
+                               {
+                                       lua_setfield(L, -2, "command");
+                                       goto break2;
+                               }
+                               lua_pop(L, 1);
+                       }
+                       free(path);
+               }
+       }
+    luaL_error(L, "cannot find dialog executable in the path; set DIALOG");
+
+break2:
+
+       lua_pushinteger(L, 0);
+       lua_setfield(L, -2, "height");
+       lua_pushinteger(L, 0);
+       lua_setfield(L, -2, "width");
+
+       return 1;
+}
+
diff --git a/build/utility.lua b/build/utility.lua
new file mode 100644 (file)
index 0000000..b94a7ec
--- /dev/null
@@ -0,0 +1,424 @@
+--
+-- Yoink Build System
+-- A pseudo-random collection of useful Lua functions.
+--
+-- Copyright (c) 2011, Charles McGarvey
+-- Distributable under the terms and conditions of the 2-clause BSD
+-- license; see the file COPYING for a complete text of the license.
+--
+
+local M = {
+       logfile = "config.log"
+}
+
+
+-- Sometimes it is useful to iterate over an array with gaps or sections of
+-- nil values, skipping over such empty sections.  This function, like the
+-- standard ipairs, creates an iterator, except the iterator will look n
+-- indices past any nil key it finds.  The argument n should be given as
+-- the largest possible number of consecutive nils; it defaults to 4.  This
+-- function can typically serve as a drop-in replacement for ipairs.
+local function npairs(t, n)
+       n = tonumber(n) or 4
+       return function(t, k)
+               for i = k + 1, k + n
+               do
+                       local v = t[i]
+                       if v ~= nil then return i, v end
+               end
+       end, t, 0
+end
+M.npairs = npairs
+
+
+-- Makes a copy of an object.  For most objects, this just returns the
+-- object that was passed.  For tables, a new table will be created and the
+-- contents of the original object will either be assigned or copied over,
+-- depending on the mode.  The mode enables deep copies; it is a string
+-- which may be empty or contain any combination of subsets of "k", "v",
+-- and "m" for copying keys, values and metatables, respectively.  The
+-- default behavior is to deep copy only the values.  The subcopy argument
+-- is the function to be called when making subcopies during a deep copy.
+-- It may also be a table with keys equal to one or more of the copy modes
+-- and values set as the subcopy function to use for the type of object
+-- represented by the copy mode character identifier.
+local function copy(object, mode, subcopy)
+       if type(object) ~= "table" then return object end
+       mode = mode or "v"
+       local copykey = function(object) return object end
+       local copyvalue, copymetatable = copykey, copykey
+       if type(subcopy) == "table"
+       then
+               if mode:find("k") and type(subcopy.k) == "function"
+               then
+                       copykey = subcopy.k
+               end
+               if mode:find("v") and type(subcopy.v) == "function"
+               then
+                       copyvalue = subcopy.v
+               end
+               if mode:find("m") and type(subcopy.m) == "function"
+               then
+                       copymetatable = subcopy.m
+               end
+       else
+               if type(subcopy) ~= "function" then subcopy = copy end
+               if mode:find("k") then copykey = subcopy end
+               if mode:find("v") then copyvalue = subcopy end
+               if mode:find("m") then copymetatable = subcopy end
+       end
+       local new = {}
+       for key,value in pairs(object) do
+               new[copykey(key, mode)] = copyvalue(value, mode)
+       end
+       return setmetatable(new, copymetatable(getmetatable(object), mode))
+end
+M.copy = copy
+
+
+-- Like the standard table.concat function in all respects except values
+-- are transformed by an optional function given; the function defaults to
+-- tostring, so tables with objects for which the concatenate operator
+-- cannot apply do not cause an error to be thrown.
+local function concat(t, s, i, j, f)
+       f = f or tostring
+       return table.concat(copy(t, "v", f), s, i, j)
+end
+M.concat = concat
+
+-- Escape the argument, preparing it for passage through a shell parse.
+local function escape(str)
+       return string.format("%q", tostring(str))
+end
+M.escape = escape
+
+-- Run the test command with the given arguments.  If the test passes,
+-- returns true; false if the test fails.
+local function test(...)
+       return os.execute(string.format("test %s", concat(arg, " ", 1, #arg, escape))) == 0
+end
+M.test = test
+
+
+-- Format a string with two pieces of text; the first bit of text is
+-- printed as-is, and the next bit of text is printed left-justified with
+-- an indent.  The second bit of text is pushed to the right if the first
+-- bit of text is too big.
+local function align(text1, text2, indent)
+       text1 = text1 or ""
+       text2 = text2 or ""
+       indent = indent or 8
+       local numSpaces = math.max(indent - #text1 - 1, 0)
+       for i = 0, numSpaces do text2 = " " .. text2 end
+       return text1 .. text2
+end
+M.align = align
+
+
+-- Remove the whitespace surrounding a string.
+local function trim(str)
+       return (str:gsub("^%s*(.-)%s*$", "%1"))
+end
+M.trim = trim
+
+-- Trim the string and convert all sequences of whitespace to a single
+-- space.
+local function compact(str)
+       return trim(str:gsub("%s+", " "))
+end
+M.compact = compact
+
+
+-- Execute a command and return its output or nil if the command failed to
+-- run.  Use capture to specify which file descriptor to return.  The exit
+-- code of the command is also returned.
+local function exec(command, capture)
+       capture = capture or ""
+       local tmpname = os.tmpname()
+       local full = string.format("%s %s>%q", command, tostring(capture), tmpname)
+       local code = os.execute(full)
+       local fd = io.open(tmpname)
+       local output = ""
+       if fd then output = fd:read("*a") fd:close() end
+       os.remove(tmpname)
+       if M.logfile
+       then
+               local fd = io.open(M.logfile, "a")
+               fd:write("\n# ", command, "\n", output, "# exit: ", code, "\n")
+               fd:close()
+       end
+       return trim(output), code
+end
+M.exec = exec
+
+-- Try to execute a command and return true if the command finished
+-- successfully (with an exit code of zero).
+local function try_run(command, dir)
+       if type(dir) == "string" then dir = string.format("cd %q && ", dir) else dir = "" end
+       local output, code= exec(string.format("%s%s", dir, command))
+       return code == 0
+end
+M.try_run = try_run
+
+-- Look for a command from a list that can complete successfully (with exit
+-- code zero) given some arguments.  Returns nil and an error string if
+-- none were successful.
+local function find_command(commands, args, dir)
+       if type(commands) ~= "table" then commands = {commands} end
+       if type(args) ~= "string" then args = "" end
+       local paths = os.getenv("PATH")
+       local found = false
+       for _,command in npairs(commands)
+       do
+               if command:byte() == 0x2F
+               then
+                       if test("-x", command)
+                       then
+                               if try_run(command .. " " .. args, dir) then return command end
+                               found = true
+                       end
+               else
+                       for path in paths:gmatch("([^:]*)")
+                       do
+                               local command = path .. "/" .. command
+                               if test("-x", command)
+                               then
+                                       if try_run(command .. " " .. args, dir) then return command end
+                                       found = true
+                               end
+                       end
+               end
+               if found then return nil, "command failed" end
+               return nil, "command not found"
+       end
+end
+M.find_command = find_command
+
+
+local function make_tempdir(template)
+       local dir, code = exec(string.format("mktemp -d ${TMPDIR:-/tmp}/%q", template))
+       if code == 0 then return dir end
+end
+M.make_tempdir = make_tempdir
+
+
+local function pkgfind(libs, libdir)
+       local cmd = "pkg-config"
+       if type(libdir) == "string" and libdir ~= ""
+       then
+               cmd = string.format("PKG_CONFIG_PATH=%s/pkgconfig:$PKG_CONFIG_PATH %s", libdir, cmd)
+       end
+       local function invoke(package) return exec(cmd .. " " .. package) end
+       local packages, missing = {}, {}
+       for _,list in ipairs(libs:split("%S+"))
+       do
+               list = list:split("[^|]+")
+               local found = false
+               for _,package in ipairs(list)
+               do
+                       local flags,code = invoke(package)
+                       if code == 0
+                       then
+                               table.insert(packages, package)
+                               found = true
+                               break
+                       end
+               end
+               if not found then table.insert(missing, list[1]) end
+       end
+       if #missing == 0 then return  concat(packages, " ") end
+       return nil, "One or more required packages are missing: " .. concat(missing, ", ") .. ".  Please install them."
+end
+M.pkgfind = pkgfind
+
+-- A wrapper function for a call out to pkg-config.  The first argument is
+-- a string signifying what kind of flags to get, either CFLAGS, LIBS, or
+-- LDFLAGS.  The second argument is the list of libraries.  Finally, the
+-- last argument can be given as a path to libdir; it is used to add a new
+-- path to PKG_CONFIG_PATH when searching for "pc" files.
+local function pkgconfig(what, libs, libdir)
+       local cmd = "pkg-config"
+       if type(libdir) == "string" and libdir ~= ""
+       then
+               cmd = string.format("PKG_CONFIG_PATH=%s/pkgconfig:$PKG_CONFIG_PATH %s", libdir, cmd)
+       end
+       if what == "CFLAGS" or what == "CXXFLAGS"
+       then
+               return exec(cmd .. " --cflags " .. libs)
+       elseif what == "LIBS"
+       then
+               return exec(cmd .. " --libs-only-l " .. libs)
+       elseif what == "LDFLAGS"
+       then
+               local output, code = exec(cmd .. " --libs " .. libs)
+               output = output:gsub("%s%-l%S*", ""):gsub("^%-l%S*%s*", "")
+               return output, code
+       end
+       return exec(cmd .. " " .. libs)
+end
+M.pkgconfig = pkgconfig
+
+
+-- Escape special characters of a pattern string.
+local function escapePattern(str)
+       str = str:gsub("%%", "%%%%")
+       str = str:gsub("%^", "%%^")
+       str = str:gsub("%$", "%%$")
+       str = str:gsub("%(", "%%(")
+       str = str:gsub("%)", "%%)")
+       str = str:gsub("%.", "%%.")
+       str = str:gsub("%[", "%%[")
+       str = str:gsub("%]", "%%[")
+       str = str:gsub("%*", "%%*")
+       str = str:gsub("%+", "%%+")
+       str = str:gsub("%-", "%%-")
+       str = str:gsub("%?", "%%?")
+       return str
+end
+
+-- A basic split function for strings.  Give a pattern of a sequence which
+-- should be matched and returns a table of matches.
+function string:split(pattern)
+       local t = {}
+       self:gsub(pattern, function(seq) table.insert(t, seq) end)
+       return t
+end
+
+-- Truncates a string to a certain length, appending an ellipsis if any
+-- part of the string had to be chopped.
+function string:truncate(length)
+       if length < #self then return self:sub(1, length - 3) .. "..." end
+       return self
+end
+
+
+-- Append a word (i.e. flag) to the end of the string.
+function string:appendFlag(...)
+       for _,flag in ipairs(arg)
+       do
+               if self == "" then self = flag
+               else self = string.format("%s %s", self, flag) end
+       end
+       return self
+end
+
+-- Set the flag by appending it to the end of the string unless it already
+-- exists somewhere else in the string.  Note: The command line isn't
+-- parsed; a simple search is used to determined if a flag is set.
+function string:setFlag(...)
+       for _,flag in ipairs(arg)
+       do
+               local escaped = escapePattern(flag)
+               if not self:match(escaped) then self = self:appendFlag(flag) end
+       end
+       return self
+end
+
+-- Remove all matching flags from a string.  Note: The command line isn't
+-- parsed; a simple search and replace is used to determine where a flag is
+-- set.
+function string:unsetFlag(...)
+       for _,flag in ipairs(arg)
+       do
+               flag = escapePattern(flag)
+               self = self:gsub("^"..flag.."$", "")
+               self = self:gsub("^"..flag.."%s", "")
+               self = self:gsub("%s"..flag.."$", "")
+               self = self:gsub("%s"..flag, "")
+       end
+       return self
+end
+
+-- Replace all matching flags from a string with a new flag.  The old flag
+-- is parsed as a pattern, just like a substitution.  Each flag matching
+-- the pattern is replaced by the new flag, but if no replacements are
+-- made, the new flag is appended to the string.
+function string:replaceFlag(old, new)
+       local count
+       self, count = self:gsub(old, new)
+       if count < 1 then self = self:appendFlag(new) end
+       return self
+end
+
+
+do
+       local colorCount = exec("tput colors")
+       local isTTY = test("-t", 1)
+
+       -- The logging facility is exported by way of this printer generator.
+       -- Pass a format and attribute string and get a function to print to
+       -- stdout.  Attributes will only be used if stdout is a terminal with
+       -- at least eight colors.  All arguments are optional; the default
+       -- format mimics the return print function regarding only the first
+       -- argument.
+       local function printer(format, attrib)
+               format = tostring(format or "%s\n")
+               if type(attrib) == "string" and isTTY and 8 <= tonumber(colorCount)
+               then
+                       return function(...)
+                               io.write(string.format("\e[%sm%s\e[0m", attrib, string.format(format, ...)))
+                       end
+               else
+                       return function(...)
+                               io.write(string.format(format, ...))
+                       end
+               end
+       end
+       M.printer = printer
+end
+
+
+-- Symbolize a name; that is, convert a string such that it would make a
+-- good filename.  The string is converted to lower case and series of
+-- non-alphanumeric characters are converted to hyphens.
+local function symbolize(name)
+       return name:lower():gsub("%W+", "-")
+end
+M.symbolize = symbolize
+
+-- Take a standard version number with three parts and separate the parts
+-- into major, minor, and revision components.
+local function splitVersion(version)
+       local vmajor, vminor, vrevis = version:match("^(%d*)%.?(%d*)%.?(%d*)")
+       vmajor = tonumber(vmajor) or 0
+       vminor = tonumber(vminor) or 0
+       vrevis = tonumber(vrevis) or 0
+       return vmajor, vminor, vrevis
+end
+M.splitVersion = splitVersion
+
+
+-- Create a new class type.  Pass one or more parent classes for
+-- inheritence.
+local function class(...)
+       local c = {__init = function() end}
+       local s = {}
+       for _,super in ipairs(arg)
+       do
+               for key,value in pairs(super) do c[key] = value end
+               table.insert(s, super)
+       end
+       c.__index = c
+       c.__super = s
+       local m = {}
+       function m:__call(...)
+               local o = setmetatable({}, c) o:__init(...) return o
+       end
+       function c:isa(c)
+               local function recurse(a, b)
+                       if a == b then return true end
+                       for _,super in ipairs(a.__super)
+                       do
+                               if recurse(super, b) then return true end
+                       end
+                       return false
+               end
+               return recurse(getmetatable(self), c)
+       end
+       return setmetatable(c, m)
+end
+M.class = class
+
+
+return M
+
index 8cc0b0d183071963c2c32602c3d19421f49f83fd..09df45fdf580bdfd3bfddbca3e903027fe9e7db3 100755 (executable)
--- a/configure
+++ b/configure
-#!/usr/bin/env lua
+#!/bin/sh
 
---
--- Yoink
--- Execute this file to configure the build system.
---
+#
+# Yoink
+# Execute this file to configure the build system.
+#
 
--- Define project, version, tarname, website, and contact.
-project                = "Yoink"
-version                = "0.1"
-tarname                = project:lower():gsub("%s+", "-")
-website                = "http://www.dogcows.com/yoink"
-contact                = "onefriedrice@brokenzipper.com"
-
-
--- This script will create three different config files from three tables
--- with values determined by the host and configuration options:
---
--- The table `config' contains key-value pairs to be written to the file
--- `config.h' which is included by sources files.  Boolean values will
--- either #define or #undef the key with no associated values.  String
--- values will be defined as quoted strings while any other value,
--- particularly numbers, will be defined unquoted.
---
--- The table `define' contains key-value pairs to be written to the file
--- `config.mk' which is included by the Makefile.  Values are assigned to
--- their keys as they are, unquoted.
---
--- The table `export' contains key-value pairs to be written to the file
--- `config.sed' which is used by sed to perform search-and-replace on files
--- containing @REPLACE_ME@-style keywords.  When used with sed, such
--- keyworded keys will be replaced by their values as they are, unquoted.
-
-
-function show_help()
-       print([[
-
-This script prepares ]]..project..[[ for building on your system.
-Usage: ./configure [OPTION]... [VAR=VALUE]...
-
-This is NOT an autoconf-generated configure script, though it was written
-to be familiar by supporting many of the same options.
-
-Basic configuration:
-  -h, --help              display this help and exit
-      --host=HOST         cross-compile the program to run on HOST
-
-      --prefix=DIR        base directory to install programs to
-      --bindir=DIR        directory to install executables
-      --datadir=DIR       directory to install shared data files
-      --mandir=DIR        directory to install manual pages
-
-      --disable-dependency-tracking  speed up one-time builds (maybe)
-      --disable-special-linking      do not use direct dependency minimizer
-      --enable-profile    compile in gprof profiling instructions
-
-Program options:
-      --enable-clock_gettime         use a very accurate timing function
-      --enable-debug      compile in assertion checks and other debug helps
-      --enable-double-precision      use larger floating-point numbers
-      --enable-hotload    automatically reload modified game assets
-      --enable-threads    use threads for concurrency where appropriate
-
-      --with-gtk          use the gtk2 toolkit (overrides --with-qt4)
-      --with-qt4          use the qt4 gui toolkit
-]])
-end
-
-
---
--- Setup a temporary file to collect error messages.
---
-
-config_log = "config.log"
-os.remove(config_log)
-
-
---
--- Define some useful functions.
---
-
--- Return true if a file exists, false otherwise.
-function file_exists(path)
-       return os.execute(string.format("test -f %q", path)) == 0
-end
-
--- Print an error message and exit with an error.
-function die(...)
-       for i,value in ipairs(arg) do
-               print("fatal: "..tostring(value))
-       end
-       if file_exists(config_log) then
-               print()
-               print("Look through the file `config.log' for more information:\n")
-               os.execute("tail "..config_log)
-       end
-       os.exit(1)
-end
-
--- Execute a command and return its output or nil if the command failed to
--- run.
-function backtick_run(command)
-       os.execute("echo '# "..command.."' >>"..config_log)
-       local fd = io.popen(command.." 2>>"..config_log)
-       if fd then
-               local stdout = fd:read("*l")
-               fd:close()
-               return stdout
-       end
-       return nil
-end
-
--- Try to execute a command and return true if the command finished
--- successfully (with an exit code of zero).
-function try_run(command)
-       os.execute("echo '# "..command.."' >>"..config_log)
-       return os.execute(command.." >/dev/null 2>>"..config_log) == 0
-end
-
--- Remove the whitespace surrounding a string.
-function trim(str)
-       str  = str:gsub("^%s+", "")
-       return str:gsub("%s+$", "")
-end
-
--- Trim the string and convert all sequences of whitespace to a single
--- space.
-function reduce_whitespace(str)
-       str = str:gsub("%s+", " ")
-       return trim(str)
-end
-
--- Get the CFLAGS from pkg-config for the passed libraries.
-function pkg_config_cflags(libs)
-       local env = "PKG_CONFIG_PATH="..libdir.."/pkgconfig:$PKG_CONFIG_PATH"
-       local cmd = env.." pkg-config"
-       return backtick_run(cmd.." --cflags "..libs)
-end
-
--- Get the LDFLAGS from pkg-config for the passed libraries.
-function pkg_config_ldflags(libs)
-       local env = "PKG_CONFIG_PATH="..libdir.."/pkgconfig:$PKG_CONFIG_PATH"
-       local cmd = env.." pkg-config"
-       return (" "..backtick_run(cmd.." --libs "..libs)):gsub("%s%-l%S*", "")
-end
-
--- Get the LIBS flags from pkg-config for the passed libraries.
-function pkg_config_libs(libs)
-       local env = "PKG_CONFIG_PATH="..libdir.."/pkgconfig:$PKG_CONFIG_PATH"
-       local cmd = env.." pkg-config"
-       return backtick_run(cmd.." --libs-only-l "..libs)
-end
-
--- Add a flag to the CFLAGS and CXXFLAGS variables.
-function add_cflag(flag)
-       if CFLAGS == "" then
-               CFLAGS = flag
-       else
-               CFLAGS = string.format("%s %s", CFLAGS, flag)
-       end
-       if CXXFLAGS == "" then
-               CXXFLAGS = flag
-       else
-               CXXFLAGS = string.format("%s %s", CXXFLAGS, flag)
-       end
-end
-
--- Replace a flag in the CFLAGS and CXXFLAGS variables.
-function set_cflag(flag)
-       local cflag_set, cxxflag_set = false, false
-       CFLAGS = CFLAGS:gsub("%"..flag:sub(1, 2).."%S+", function()
-               cflag_set = true
-               return flag
-       end)
-       CXXFLAGS = CXXFLAGS:gsub("%"..flag:sub(1, 2).."%S+", function()
-               cxxflag_set = true
-               return flag
-       end)
-       if not cflag_set or not cxxflag_set then add_cflag(flag) end
-end
-
--- Look for a command from a list that can complete successfully (with exit
--- code zero) given some arguments.  Returns nil if none were successful.
-function find_command(commands, args)
-       if not args then args = "" end
-       for i,command in ipairs(commands) do
-               if try_run(command.." "..args) then return command end
-       end
-       return nil
-end
-
-
---
--- Perform a quick sanity check.
---
-
-if not file_exists("configure") or not file_exists("Makefile") then
-       -- This script doesn't support out-of-tree builds.
-       die("You must `cd' to the project root where the Makefile is.")
-end
-
-
---
--- Parse the command-line options.
---
-
--- This script supports many of the options provided by autoconf-generated
--- scripts.  In particular, all the directory-related options are
--- supported, including --prefix, --exec-prefix, and all the --dirDIR
--- options for configuring installation paths.  If passed, the option
--- parsing routine below will place these options in the global namespace
--- (i.e. prefix, eprefix, bindir, datadir, etc).
---
--- Feature and package options are also supported.  The value of any option
--- of the form --enable-OPT= and --with-OPT= can be obtained with the
--- functions get_feature and get_package, respectively.  Like
--- autoconf-generated scripts, passing --disable-OPT or --without-OPT is
--- equivalent to passing --enable-OPT=no and --without-OPT=no,
--- respectively.  Values that are either yes or no are interpreted as
--- booleans.  Any other values are interpreted as strings.
---
--- Definitions of the form KEY=VALUE are also supported.  If passed, the
--- option parsing routine below will place these options in the global
--- namespace.
---
--- Finally, the options -h, --help, and --host are also supported, the
--- former two calling the show_help function and the latter setting the
--- host global variable.
-
-do
-       local features = {}
-       local packages = {}
-       local handlers = {}
-
-
-       -- Define the option-parsing rules and handlers.
-
-       handlers["--help"]                                              = function()
-               show_help()
-               os.exit(0)
-       end
-       handlers["-h"]                                                  = handlers["--help"]
-
-       handlers["--host=(.+)"]                                 = function(triplet)
-               host = triplet
-               cross_compile = true
-       end
-
-       local add_feature                                               = function(feature, value)
-               if value == "yes" or value == "" then value = true end
-               if value == "no" then value = false end
-               features[feature] = value
-       end
-       handlers["--enable%-([%w_-]+)=?(.*)"]   = add_feature
-       handlers["--disable%-([%w_-]+)"]                = function(feature)
-               add_feature(feature, "no")
-       end
-
-       local add_package                                               = function(package, value)
-               if value == "yes" or value == "" then value = true end
-               if value == "no" then value = false end
-               packages[package] = value
-       end
-       handlers["--with%-([%w_-]+)=?(.*)"]             = add_package
-       handlers["--without%-([%w_-]+)"]                = function(package)
-               add_package(package, "no")
-       end
-
-       handlers["--(%l+)dir=(.+)"]                             = function(dir, path)
-               _G[dir.."dir"] = path
-       end
-       handlers["--prefix=(.+)"]                               = function(path)
-               prefix = path
-       end
-       handlers["--exec-prefix=(.+)"]                  = function(path)
-               eprefix = path
-       end
-
-       handlers["([%w_]+)=(.*)"]                               = function(key, value)
-               _G[key] = value
-       end
-
-
-       -- Define the feature and package accessors.
-
-       function get_feature(feature) return features[feature] end
-       function get_package(package) return packages[package] end
-
-       
-       -- Now read and parse the command-line options.
-       
-       local function parse_arg(arg)
-               for key,value in pairs(handlers) do
-                       local matches = {arg:match(key)}
-                       if matches[1] then value(unpack(matches)) return end
-               end
-               print("warning: unknown or incomplete argument "..arg)
-       end
-
-       for i,arg in ipairs(arg) do
-               parse_arg(arg)
-       end
-
-
-       -- Define default values for significant variables.
-       
-       local function define(symbol, value)
-               if not _G[symbol] then _G[symbol] = value end
-       end
-
-       define("CC",                    "")
-       define("CXX",                   "")
-       define("AR",                    "")
-       define("RANLIB",                "")
-       define("WINDRES",               "")
-
-       define("CFLAGS",                "-g -O2")
-       define("CXXFLAGS",              CFLAGS)
-       define("LDFLAGS",               "")
-       define("LIBS",                  "")
-
-       define("host",                  backtick_run("tools/config.guess"))
-       define("alt_host",              backtick_run("tools/config.sub "..host))
-
-       define("prefix",                "/usr/local")
-       define("eprefix",               prefix)
-       define("bindir",                eprefix.."/bin")
-       define("sbindir",               eprefix.."/sbin")
-       define("libexecdir",    eprefix.."/libexec")
-       define("sysconfdir",    prefix.."/etc")
-       define("localstatedir", prefix.."/var")
-       define("libdir",                eprefix.."/lib")
-       define("includedir",    prefix.."/include")
-       define("datarootdir",   prefix.."/share")
-       define("datadir",               datarootdir.."/"..tarname)
-       define("infodir",               datarootdir.."/info")
-       define("localedir",             datarootdir.."/locale")
-       define("mandir",                datarootdir.."/man")
-       define("docdir",                datarootdir.."/doc/"..tarname)
-
-       if features["dependency-tracking"] == nil then
-               features["dependency-tracking"] = true
-       end
-       
-       if features["special-linking"] == nil then
-               features["special-linking"] = true
-       end
-       
-       define("config",                {})
-       define("define",                {})
-       define("export",                {})
-end
-
-
---
--- Determine special target platforms.
---
-
--- Win32 has some special cases related to its resource file, src/yoinkrc.
-if host:match("mingw32") then platform = "win32" end
-
-
---
--- Look for a working toolchain.
---
-
-print("Please wait...")
-
--- Check for CC.
-tmpname                        = os.tmpname()..".c"
-tmpfile, err   = io.open(tmpname, "w")
-if tmpfile then
-       tmpfile:write([[
-#include <stdio.h>
-int main()
-{
-       printf("Hello world!\n");
-       return 0;
+die () {
+       while read line; do echo $line; done && exit ${1:-127}
 }
-]])
-       tmpfile:close()
-
-       function extra() if not cross_compile then return "gcc", "cc" end end
-       CC = find_command({
-               CC,
-               host.."-gcc", host.."-cc",
-               alt_host.."-gcc", alt_host.."-cc",
-               extra()}, tmpname.." -o "..tmpname..".tmp")
-       os.remove(tmpname)
-       os.remove(tmpname..".tmp")
-       if not CC then die("Can't find a working C compiler.") end
-else
-       die("failed to create temporary file: "..err)
-end
-
--- Check for CXX.
-tmpname                        = os.tmpname()..".cpp"
-tmpfile, err   = io.open(tmpname, "w")
-if tmpfile then
-       tmpfile:write([[
-#include <iostream>
-int main()
-{
-       std::cout << "Hello world!" << std::endl;
-       return 0;
-}
-]])
-       tmpfile:close()
-
-       function extra() if not cross_compile then return "g++", "c++" end end
-       CXX = find_command({
-               CXX,
-               host.."-g++", host.."-c++",
-               alt_host.."-g++", alt_host.."-c++",
-               extra()}, tmpname.." -o "..tmpname..".tmp")
-       os.remove(tmpname)
-       os.remove(tmpname..".tmp")
-       if not CXX then die("Can't find a working C++ compiler.") end
-else
-       die("failed to create temporary file: "..err)
-end
-
--- Check for AR.
-do
-       function extra() if not cross_compile then return "ar" end end
-       AR = find_command({
-               AR,
-               host.."-ar",
-               alt_host.."-ar",
-               extra()}, "--version")
-       if not AR then die("Can't find a working archiver.") end
-end
-
--- Check for RANLIB.
-do
-       function extra() if not cross_compile then return "ranlib" end end
-       RANLIB = find_command({
-               RANLIB,
-               host.."-ranlib",
-               alt_host.."-ranlib",
-               extra()}, "--version")
-       if not RANLIB then die("Can't find a working library indexer.") end
-end
-
--- Check for WINDRES.
-if platform == "win32" then
-       function extra() if not cross_compile then return "windres" end end
-       WINDRES = find_command({
-               WINDRES,
-               host.."-windres",
-               alt_host.."-windres",
-               extra()}, "--version")
-       if not WINDRES then die("Can't find a working resource compiler.") end
-end
-
-
---
--- Configure the features and packages.
---
-
-if get_feature("debug") then
-       set_cflag("-O0")
-       add_cflag("-Wall -Wno-uninitialized")
-       config.DEBUG = true
-else
-       config.NDEBUG = true
-end
-
-config.ENABLE_CLOCK_GETTIME            = get_feature("clock_gettime")
-config.ENABLE_DOUBLE_PRECISION = get_feature("double-precision")
-config.ENABLE_HOTLOADING               = get_feature("hotload")
-config.ENABLE_THREADS                  = get_feature("threads")
-if get_feature("profile") then
-       config.ENABLE_PROFILING = true
-       add_cflag("-pg")
-       LDFLAGS = LDFLAGS .. "-pg"
-end
-
-if get_package("gtk") then config.WITH_GTK = true end
-if get_package("qt4") then config.WITH_QT4 = true end
-
-
---
--- Check for the libraries we need.
---
-
-do
-       local dependencies      = "sdl gl glu libpng openal vorbisfile lua"
-
-       if get_package("gtk") then
-               dependencies = dependencies.." gtk+-2.0"
-       elseif get_package("qt4") then
-               dependencies = dependencies.." QtGui"
-       end
-
-       add_cflag(pkg_config_cflags(dependencies))
-       LDFLAGS         = LDFLAGS       .." "..pkg_config_ldflags(dependencies)
-       LIBS            = LIBS          .." "..pkg_config_libs(dependencies)
-
-       if platform == "win32" then
-               LIBS = LIBS.." -lws2_32"
-               exe_extension = ".exe"
-       else
-               exe_extension = ""
-       end
-end
-
-
---
--- Define the exports and definitions.
---
-
-if platform == "win32" then
-       -- These are used in src/yoink.rc.
-       local vmajor, vminor, vrevis = version:match("^(%d*)%.?(%d*)%.?(%d*)")
-       config.VERSION_MAJOR    = tonumber(vmajor) or 0
-       config.VERSION_MINOR    = tonumber(vminor) or 0
-       config.VERSION_REVISION = tonumber(vrevis) or 0
-end
-
-config.PACKAGE                         = tarname
-config.PACKAGE_NAME                    = project
-config.PACKAGE_VERSION         = version
-config.PACKAGE_STRING          = project.." "..version
-config.PACKAGE_TARNAME         = tarname
-config.PACKAGE_URL                     = website
-config.PACKAGE_BUGREPORT       = contact
-config.YOINK_GITHEAD           = backtick_run("git describe master")
-config.YOINK_DATADIR           = datadir
-
-define.PACKAGE                         = project
-define.TARNAME                         = tarname.."-"..version
-define.TARGET                          = host
-define.PLATFORM                                = platform
-define.CC                                      = CC
-define.CXX                                     = CXX
-define.AR                                      = AR
-define.RANLIB                          = RANLIB
-define.WINDRES                         = WINDRES
-define.CFLAGS                          = reduce_whitespace(CFLAGS)
-define.CXXFLAGS                                = reduce_whitespace(CXXFLAGS)
-define.LDFLAGS                         = reduce_whitespace(LDFLAGS)
-define.LIBS                                    = reduce_whitespace(LIBS)
-define.prefix                          = prefix
-define.bindir                          = bindir
-define.datadir                         = datadir
-define.mandir                          = mandir
-define.EXEEXT                          = exe_extension
-define.DEP_TRACKING                    = get_feature("dependency-tracking")
-define.DEP_MINIMIZING          = get_feature("special-linking")
-
-export.datadir                         = datadir               -- Used in doc/yoink.6.in.
-export.PACKAGE_BUGREPORT       = contact               -- Used in doc/yoink.6.in.
-
-
---
--- All done; output the configuration files.
---
-
--- Output the program options.
-output = io.open("config.h", "w")
-for key,value in pairs(config) do
-       key = tostring(key)
-       if type(value) == "boolean" then
-               if value then
-                       output:write("#define "..key.." 1")
-               else
-                       output:write("#undef "..key)
-               end
-       elseif type(value) == "string" then
-               output:write(string.format("#define %s %q", key, tostring(value)))
-       else
-               output:write(string.format("#define %s %s", key, tostring(value)))
-       end
-       output:write("\n")
-end
-output:close()
-
--- Output the make definitions.
-output = io.open("config.mk", "w")
-for key,value in pairs(define) do
-       key             = tostring(key)
-       value   = tostring(value)
-       output:write(string.format("%s = %s\n", key, value))
-end
-output:close()
-
 
--- Output the exported variables.
-output = io.open("config.sed", "w")
-for key,value in pairs(export) do
-       key             = key:gsub("/", "\\/")
-       value   = value:gsub("/", "\\/")
-       output:write(string.format("s/@%s@/%s/g\n", key, value))
-end
-output:close()
+[ -f build/config.lua ] || die 1 <<"END"
+You must first `cd' to the project directory root where the Makefile is.
+There is no support for out-of-tree builds.
+END
 
+LUA=${LUA:-lua}
+"$LUA" -v >/dev/null 2>&1 || die 2 <<END
+Can't find a Lua interpreter in your PATH.  Make sure Lua is installed, or
+set the LUA variable in the environment to the path of lua.
+END
 
-print([[
+unset MAKEFLAGS
+echo "$@" | grep -w -e --interactive >/dev/null && \
+       ! (cd build && ${MAKE:-make} dialog) && die 3 <<END
+The dialog module cannot be built and so the configure script cannot be
+used interactively.  Run the configure script non-interactively.
+END
 
- Configuration complete!  You can review your configuration in `config.mk'.
+export PATH="./build:$PATH"
+exec "$LUA" build/config.lua "$@" -L./build
 
- To finish the installation, type:
-  make
-  make install
-]])
+# vi:ts=4
 
index a2cfff81e63d27da63a8cda8e3e8b746888e5ab6..1968532d47411594a74f912ef6e4a6d52a573cb1 100644 (file)
@@ -1,26 +1,15 @@
 
-#########################
-sp             := $(sp).x
-dirstack_$(sp) := $(d)
-d              := $(dir)
-#########################
-
 #
 # Define rules and targets for data files.
 #
 
-ASSETS_$(d) := $(shell find $(d) -name "*.lua" \
+pkgdatadir_$d := $(shell find $d -name "*.ac"  \
+                                 -o -name "*.lua" \
+                              -o -name "*.gz"  \
                               -o -name "*.ogg" \
-                              -o -name "*.png" | sed -e 's=^$(d)\(.*\)/.*=&;\1=g') $(d)/yoinkrc;
-
-DATAFILES   := $(DATAFILES) $(ASSETS_$(d))
-
-# TODO: Also need to install yoink.desktop and the pixmap.
-
+                              -o -name "*.png") $d/yoinkrc
+# Install resource files to pkgdatadir.
 
-#######################
--include $(DEPS_$(d))
-d  := $(dirstack_$(sp))
-sp := $(basename $(sp))
-#######################
+desktop_$b := $b/yoink.desktop         # Install desktop entry file.
+$(desktop_$b): config.sed | $b
 
index c93ee69e9891c01c1303b4c16a82cb380047b263..8b880d3b012f3aac523744789b7f579a70680a85 100644 (file)
Binary files a/data/textures/AlienWarrior.png and b/data/textures/AlienWarrior.png differ
index 486c19126e0a2c664579e13a76815db8ccb885ed..091850bdfe70c774044dddb01e5d92dffa014c9f 100644 (file)
Binary files a/data/textures/BackgroundFar.png and b/data/textures/BackgroundFar.png differ
index 94e674727402fd7b3e35973b0ccc320dc7afcc32..68bedd27a472799b90ac17c1d8ade69f62d0ea9b 100644 (file)
Binary files a/data/textures/BackgroundNear.png and b/data/textures/BackgroundNear.png differ
index 58bfe0df355a512a928548a6a83d6fddb4dddcfb..7681d1bfd4a21a003c1e199360c6719655e08f48 100644 (file)
Binary files a/data/textures/BigExplosion.png and b/data/textures/BigExplosion.png differ
index 2ab194e73427ebeb2580e7635655ce6f88e1c558..5fc78c91bd51adfadf6f215ce8baa2024b3534f4 100644 (file)
Binary files a/data/textures/Bonuses.png and b/data/textures/Bonuses.png differ
index 5cb2a63f4d7c0e118f01ea9bd48d1cf3ec98b763..1965bd11551ff2103d8b46fb79a2e14c4c37ad61 100644 (file)
Binary files a/data/textures/Building.png and b/data/textures/Building.png differ
index dd90aa517bb6d554639c18d0d783798e4efa6472..e216f7b0040ab9a34e65fdd8aa40ade941fa7154 100644 (file)
Binary files a/data/textures/Font.png and b/data/textures/Font.png differ
index b08bf9ac34e1162634d947661d59c770a53a70c2..7085e2aaddbc235edfce6cbbaa0addbee52162bd 100644 (file)
Binary files a/data/textures/Heroine.png and b/data/textures/Heroine.png differ
index c1c6b0a431f0421947b31307deea8a3608ac8da1..7cb3725020a423d2a7bf12f3efd8bc7a95b16efd 100644 (file)
Binary files a/data/textures/Jetbot.png and b/data/textures/Jetbot.png differ
index 0fae414d5e494a2db373bd9f75f6697c57e6fed4..bcc011c449e1dc8d333d6f53a8918ef83e227c07 100644 (file)
Binary files a/data/textures/Particles.png and b/data/textures/Particles.png differ
index e5cf0cae7a31d878b7db0a3e1994ff774214b024..d7b4c1f483725bc9d8dd8913faa78c91f0a5c760 100644 (file)
Binary files a/data/textures/RobotTrooper.png and b/data/textures/RobotTrooper.png differ
index b2fe47c53f3cc748ca1aefdcc3a4383f5b70f75b..6d7e254846576a18c697f30ac20f07dc53c1cd99 100644 (file)
Binary files a/data/textures/Scenery.png and b/data/textures/Scenery.png differ
index 904ea4c8e452841f4bbbf2c2b29b53ae84b84247..2f120b0bec1aa13611738e7fb1d1d66177bcdee7 100644 (file)
Binary files a/data/textures/StatusBars.png and b/data/textures/StatusBars.png differ
index 677aa21ac9accdd6d5c1f6225bf3433e3c88be35..4bb9b3594654eea13c60e0fe2fc3a07baca41c82 100644 (file)
Binary files a/data/textures/TowerBlock1.png and b/data/textures/TowerBlock1.png differ
index fc9fc35189de544451170532449a06e610bb2e91..f64646fce5e5f613a8bd9d570976b26bfd92f6bb 100644 (file)
Binary files a/data/textures/Trees.png and b/data/textures/Trees.png differ
similarity index 51%
rename from data/yoink.desktop
rename to data/yoink.desktop.in
index fc9e68c4510f7f31f1181243698b3b497a1216c1..d9e48a47f0758109d8311c9021387e551748aae2 100644 (file)
@@ -1,10 +1,9 @@
 [Desktop Entry]
-Encoding=UTF-8
 Version=1.0
-Name=Yoink
+Name=@PACKAGE@
 Type=Application
 Comment=Alien-smashing action game
-Exec=yoink
-TryExec=yoink
-Icon=yoink
+Exec=@projectName@@EXEEXT@
+TryExec=@projectName@@EXEEXT@
+Icon=@pkgdatadir@/yoink.png
 Categories=Game;ActionGame;
similarity index 100%
rename from Doxyfile
rename to doc/Doxyfile
similarity index 100%
rename from doc/cml_parameters.txt
rename to doc/cmloptions.txt
diff --git a/doc/licenses/BSD b/doc/licenses/BSD
deleted file mode 100644 (file)
index 45f4d9a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright (c) <YEAR>, <OWNER>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the <ORGANIZATION> nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/doc/licenses/BSD-2 b/doc/licenses/BSD-2
deleted file mode 100644 (file)
index a995d54..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright (c) <YEAR>, <OWNER>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/doc/licenses/Boost-1.0 b/doc/licenses/Boost-1.0
deleted file mode 100644 (file)
index 1dad8e9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-Boost Software License - Version 1.0 - August 17th, 2003\r
-\r
-Permission is hereby granted, free of charge, to any person or organization\r
-obtaining a copy of the software and accompanying documentation covered by\r
-this license (the "Software") to use, reproduce, display, distribute,\r
-execute, and transmit the Software, and to prepare derivative works of the\r
-Software, and to permit third-parties to whom the Software is furnished to\r
-do so, all subject to the following:\r
-\r
-The copyright notices in the Software and this entire statement, including\r
-the above license grant, this restriction and the following disclaimer,\r
-must be included in all copies of the Software, in whole or in part, and\r
-all derivative works of the Software, unless such copies or derivative\r
-works are solely in the form of machine-executable object code generated by\r
-a source language processor.\r
-\r
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
-DEALINGS IN THE SOFTWARE.\r
diff --git a/doc/licenses/CCPL-Attribution-ShareAlike-NonCommercial-2.5 b/doc/licenses/CCPL-Attribution-ShareAlike-NonCommercial-2.5
deleted file mode 100644 (file)
index 2610a73..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-Creative Commons Legal Code
-
-*Attribution-NonCommercial-ShareAlike 2.5*
-
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
-LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
-ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION
-ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE
-INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
-ITS USE.
-
-/License/
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
-COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE
-RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS
-AND CONDITIONS.
-
-*1. Definitions*
-
-   1. *"Collective Work"* means a work, such as a periodical issue,
-      anthology or encyclopedia, in which the Work in its entirety in
-      unmodified form, along with a number of other contributions,
-      constituting separate and independent works in themselves, are
-      assembled into a collective whole. A work that constitutes a
-      Collective Work will not be considered a Derivative Work (as
-      defined below) for the purposes of this License.
-   2. *"Derivative Work"* means a work based upon the Work or upon the
-      Work and other pre-existing works, such as a translation, musical
-      arrangement, dramatization, fictionalization, motion picture
-      version, sound recording, art reproduction, abridgment,
-      condensation, or any other form in which the Work may be recast,
-      transformed, or adapted, except that a work that constitutes a
-      Collective Work will not be considered a Derivative Work for the
-      purpose of this License. For the avoidance of doubt, where the
-      Work is a musical composition or sound recording, the
-      synchronization of the Work in timed-relation with a moving image
-      ("synching") will be considered a Derivative Work for the purpose
-      of this License.
-   3. *"Licensor"* means the individual or entity that offers the Work
-      under the terms of this License.
-   4. *"Original Author"* means the individual or entity who created the
-      Work.
-   5. *"Work"* means the copyrightable work of authorship offered under
-      the terms of this License.
-   6. *"You"* means an individual or entity exercising rights under this
-      License who has not previously violated the terms of this License
-      with respect to the Work, or who has received express permission
-      from the Licensor to exercise rights under this License despite a
-      previous violation.
-   7. *"License Elements"* means the following high-level license
-      attributes as selected by Licensor and indicated in the title of
-      this License: Attribution, Noncommercial, ShareAlike.
-
-*2. Fair Use Rights.* Nothing in this license is intended to reduce,
-limit, or restrict any rights arising from fair use, first sale or other
-limitations on the exclusive rights of the copyright owner under
-copyright law or other applicable laws.
-
-*3. License Grant.* Subject to the terms and conditions of this License,
-Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
-perpetual (for the duration of the applicable copyright) license to
-exercise the rights in the Work as stated below:
-
-   1. to reproduce the Work, to incorporate the Work into one or more
-      Collective Works, and to reproduce the Work as incorporated in the
-      Collective Works;
-   2. to create and reproduce Derivative Works;
-   3. to distribute copies or phonorecords of, display publicly, perform
-      publicly, and perform publicly by means of a digital audio
-      transmission the Work including as incorporated in Collective Works;
-   4. to distribute copies or phonorecords of, display publicly, perform
-      publicly, and perform publicly by means of a digital audio
-      transmission Derivative Works;
-
-The above rights may be exercised in all media and formats whether now
-known or hereafter devised. The above rights include the right to make
-such modifications as are technically necessary to exercise the rights
-in other media and formats. All rights not expressly granted by Licensor
-are hereby reserved, including but not limited to the rights set forth
-in Sections 4(e) and 4(f).
-
-*4. Restrictions.*The license granted in Section 3 above is expressly
-made subject to and limited by the following restrictions:
-
-   1. You may distribute, publicly display, publicly perform, or
-      publicly digitally perform the Work only under the terms of this
-      License, and You must include a copy of, or the Uniform Resource
-      Identifier for, this License with every copy or phonorecord of the
-      Work You distribute, publicly display, publicly perform, or
-      publicly digitally perform. You may not offer or impose any terms
-      on the Work that alter or restrict the terms of this License or
-      the recipients' exercise of the rights granted hereunder. You may
-      not sublicense the Work. You must keep intact all notices that
-      refer to this License and to the disclaimer of warranties. You may
-      not distribute, publicly display, publicly perform, or publicly
-      digitally perform the Work with any technological measures that
-      control access or use of the Work in a manner inconsistent with
-      the terms of this License Agreement. The above applies to the Work
-      as incorporated in a Collective Work, but this does not require
-      the Collective Work apart from the Work itself to be made subject
-      to the terms of this License. If You create a Collective Work,
-      upon notice from any Licensor You must, to the extent practicable,
-      remove from the Collective Work any credit as required by clause
-      4(d), as requested. If You create a Derivative Work, upon notice
-      from any Licensor You must, to the extent practicable, remove from
-      the Derivative Work any credit as required by clause 4(d), as
-      requested.
-   2. You may distribute, publicly display, publicly perform, or
-      publicly digitally perform a Derivative Work only under the terms
-      of this License, a later version of this License with the same
-      License Elements as this License, or a Creative Commons iCommons
-      license that contains the same License Elements as this License
-      (e.g. Attribution-NonCommercial-ShareAlike 2.5 Japan). You must
-      include a copy of, or the Uniform Resource Identifier for, this
-      License or other license specified in the previous sentence with
-      every copy or phonorecord of each Derivative Work You distribute,
-      publicly display, publicly perform, or publicly digitally perform.
-      You may not offer or impose any terms on the Derivative Works that
-      alter or restrict the terms of this License or the recipients'
-      exercise of the rights granted hereunder, and You must keep intact
-      all notices that refer to this License and to the disclaimer of
-      warranties. You may not distribute, publicly display, publicly
-      perform, or publicly digitally perform the Derivative Work with
-      any technological measures that control access or use of the Work
-      in a manner inconsistent with the terms of this License Agreement.
-      The above applies to the Derivative Work as incorporated in a
-      Collective Work, but this does not require the Collective Work
-      apart from the Derivative Work itself to be made subject to the
-      terms of this License.
-   3. You may not exercise any of the rights granted to You in Section 3
-      above in any manner that is primarily intended for or directed
-      toward commercial advantage or private monetary compensation. The
-      exchange of the Work for other copyrighted works by means of
-      digital file-sharing or otherwise shall not be considered to be
-      intended for or directed toward commercial advantage or private
-      monetary compensation, provided there is no payment of any
-      monetary compensation in connection with the exchange of
-      copyrighted works.
-   4. If you distribute, publicly display, publicly perform, or publicly
-      digitally perform the Work or any Derivative Works or Collective
-      Works, You must keep intact all copyright notices for the Work and
-      provide, reasonable to the medium or means You are utilizing: (i)
-      the name of the Original Author (or pseudonym, if applicable) if
-      supplied, and/or (ii) if the Original Author and/or Licensor
-      designate another party or parties (e.g. a sponsor institute,
-      publishing entity, journal) for attribution in Licensor's
-      copyright notice, terms of service or by other reasonable means,
-      the name of such party or parties; the title of the Work if
-      supplied; to the extent reasonably practicable, the Uniform
-      Resource Identifier, if any, that Licensor specifies to be
-      associated with the Work, unless such URI does not refer to the
-      copyright notice or licensing information for the Work; and in the
-      case of a Derivative Work, a credit identifying the use of the
-      Work in the Derivative Work (e.g., "French translation of the Work
-      by Original Author," or "Screenplay based on original Work by
-      Original Author"). Such credit may be implemented in any
-      reasonable manner; provided, however, that in the case of a
-      Derivative Work or Collective Work, at a minimum such credit will
-      appear where any other comparable authorship credit appears and in
-      a manner at least as prominent as such other comparable authorship
-      credit.
-   5.
-
-      For the avoidance of doubt, where the Work is a musical composition:
-
-         1. *Performance Royalties Under Blanket Licenses*. Licensor
-            reserves the exclusive right to collect, whether
-            individually or via a performance rights society (e.g.
-            ASCAP, BMI, SESAC), royalties for the public performance or
-            public digital performance (e.g. webcast) of the Work if
-            that performance is primarily intended for or directed
-            toward commercial advantage or private monetary compensation.
-         2. *Mechanical Rights and Statutory Royalties*. Licensor
-            reserves the exclusive right to collect, whether
-            individually or via a music rights agency or designated
-            agent (e.g. Harry Fox Agency), royalties for any phonorecord
-            You create from the Work ("cover version") and distribute,
-            subject to the compulsory license created by 17 USC Section
-            115 of the US Copyright Act (or the equivalent in other
-            jurisdictions), if Your distribution of such cover version
-            is primarily intended for or directed toward commercial
-            advantage or private monetary compensation.
-   6. *Webcasting Rights and Statutory Royalties*. For the avoidance of
-      doubt, where the Work is a sound recording, Licensor reserves the
-      exclusive right to collect, whether individually or via a
-      performance-rights society (e.g. SoundExchange), royalties for the
-      public digital performance (e.g. webcast) of the Work, subject to
-      the compulsory license created by 17 USC Section 114 of the US
-      Copyright Act (or the equivalent in other jurisdictions), if Your
-      public digital performance is primarily intended for or directed
-      toward commercial advantage or private monetary compensation. 
-
-*5. Representations, Warranties and Disclaimer*
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
-OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
-KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
-INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
-FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
-LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
-EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
-APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
-THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
-DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
-LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-*7. Termination*
-
-   1. This License and the rights granted hereunder will terminate
-      automatically upon any breach by You of the terms of this License.
-      Individuals or entities who have received Derivative Works or
-      Collective Works from You under this License, however, will not
-      have their licenses terminated provided such individuals or
-      entities remain in full compliance with those licenses. Sections
-      1, 2, 5, 6, 7, and 8 will survive any termination of this License.
-   2. Subject to the above terms and conditions, the license granted
-      here is perpetual (for the duration of the applicable copyright in
-      the Work). Notwithstanding the above, Licensor reserves the right
-      to release the Work under different license terms or to stop
-      distributing the Work at any time; provided, however that any such
-      election will not serve to withdraw this License (or any other
-      license that has been, or is required to be, granted under the
-      terms of this License), and this License will continue in full
-      force and effect unless terminated as stated above.
-
-*8. Miscellaneous*
-
-   1. Each time You distribute or publicly digitally perform the Work or
-      a Collective Work, the Licensor offers to the recipient a license
-      to the Work on the same terms and conditions as the license
-      granted to You under this License.
-   2. Each time You distribute or publicly digitally perform a
-      Derivative Work, Licensor offers to the recipient a license to the
-      original Work on the same terms and conditions as the license
-      granted to You under this License.
-   3. If any provision of this License is invalid or unenforceable under
-      applicable law, it shall not affect the validity or enforceability
-      of the remainder of the terms of this License, and without further
-      action by the parties to this agreement, such provision shall be
-      reformed to the minimum extent necessary to make such provision
-      valid and enforceable.
-   4. No term or provision of this License shall be deemed waived and no
-      breach consented to unless such waiver or consent shall be in
-      writing and signed by the party to be charged with such waiver or
-      consent.
-   5. This License constitutes the entire agreement between the parties
-      with respect to the Work licensed here. There are no
-      understandings, agreements or representations with respect to the
-      Work not specified here. Licensor shall not be bound by any
-      additional provisions that may appear in any communication from
-      You. This License may not be modified without the mutual written
-      agreement of the Licensor and You.
-
-Creative Commons is not a party to this License, and makes no warranty
-whatsoever in connection with the Work. Creative Commons will not be
-liable to You or any party on any legal theory for any damages
-whatsoever, including without limitation any general, special,
-incidental or consequential damages arising in connection to this
-license. Notwithstanding the foregoing two (2) sentences, if Creative
-Commons has expressly identified itself as the Licensor hereunder, it
-shall have all rights and obligations of Licensor.
-
-Except for the limited purpose of indicating to the public that the Work
-is licensed under the CCPL, neither party will use the trademark
-"Creative Commons" or any related trademark or logo of Creative Commons
-without the prior written consent of Creative Commons. Any permitted use
-will be in compliance with Creative Commons' then-current trademark
-usage guidelines, as may be published on its website or otherwise made
-available upon request from time to time.
-
-Creative Commons may be contacted at http://creativecommons.org/
-<http://creativecommons.org>.
diff --git a/doc/licenses/LGPL-2 b/doc/licenses/LGPL-2
deleted file mode 100644 (file)
index 161a3d1..0000000
+++ /dev/null
@@ -1,482 +0,0 @@
-                 GNU LIBRARY GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL.  It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it.  You can use it for
-your libraries, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if
-you distribute copies of the library, or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library.  If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, so that any problems introduced by others will not reflect on
-the original authors' reputations.
-\f
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software.  To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
-  Most GNU software, including some libraries, is covered by the ordinary
-GNU General Public License, which was designed for utility programs.  This
-license, the GNU Library General Public License, applies to certain
-designated libraries.  This license is quite different from the ordinary
-one; be sure to read it in full, and don't assume that anything in it is
-the same as in the ordinary license.
-
-  The reason we have a separate public license for some libraries is that
-they blur the distinction we usually make between modifying or adding to a
-program and simply using it.  Linking a program with a library, without
-changing the library, is in some sense simply using the library, and is
-analogous to running a utility program or application program.  However, in
-a textual and legal sense, the linked executable is a combined work, a
-derivative of the original library, and the ordinary General Public License
-treats it as such.
-
-  Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries.  We
-concluded that weaker conditions might promote sharing better.
-
-  However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves.  This Library General Public License is intended to
-permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them.  (We have not seen how to achieve
-this as regards changes in header files, but we have achieved it as regards
-changes in the actual functions of the Library.)  The hope is that this
-will lead to faster development of free libraries.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, while the latter only
-works together with the library.
-
-  Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
-\f
-                 GNU LIBRARY GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library which
-contains a notice placed by the copyright holder or other authorized
-party saying it may be distributed under the terms of this Library
-General Public License (also called "this License").  Each licensee is
-addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-\f
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-\f
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-\f
-  6. As an exception to the Sections above, you may also compile or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    c) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    d) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the source code distributed need not include anything that is normally
-distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-\f
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-\f
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Library General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-\f
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                           NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-\f
-     Appendix: How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library 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 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
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public
-    License along with this library; if not, write to the Free
-    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
-    MA 02111-1307, USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
diff --git a/doc/licenses/LGPL-2.1 b/doc/licenses/LGPL-2.1
deleted file mode 100644 (file)
index 8add30a..0000000
+++ /dev/null
@@ -1,504 +0,0 @@
-                 GNU LESSER GENERAL PUBLIC LICENSE
-                      Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-\f
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are