Short version for non-lawyers:

This work licensed under MIT-like terms.


Long version follows:

The collective work presented here includes packages written
by third parties.  The following third party packages are
included:


* The ISAAC pseudo random number generation package. Code
  for this package is found in the src/rt/isaac directory,
  within this distribution. This package is redistributed
  under the following terms, as noted in its source:

    By Bob Jenkins, 1996, Public Domain


* The ACME large integer package. Code for this package is
  found in the src/rt/bigint directory, within this
  distribution. This package is redistributed under the
  following terms, as noted in its source:

    Copyright © 2000 by Jef Poskanzer <jef@mail.acme.com>.
    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 AUTHOR 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 AUTHOR 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.


* The UTHASH hash table package. Code for this package is
  found in the src/rt/uthash directory within this
  distribution. This package is redistributed under the
  following terms, as noted in its source:

    Copyright (c) 2003-2009, Troy D. Hanson
    http://uthash.sourceforge.net All rights reserved.

    Redistribution and use in source and binary forms, with
    or without modification, are permitted provided that the
    following conditions are met:

        * Redistributions of source code must retain the
          above copyright notice, this list of conditions
          and the following disclaimer.

    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.


* Two header files that are part of the Valgrind
  package. These files are found at src/rt/vg/valgrind.h and
  src/rt/vg/memcheck.h, within this distribution. These files
  are redistributed under the following terms, as noted in
  them:

  for src/rt/vg/valgrind.h:

    This file is part of Valgrind, a dynamic binary
    instrumentation framework.

    Copyright (C) 2000-2010 Julian Seward.  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. 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.

    3. Altered source versions must be plainly marked as
       such, and must not be misrepresented as being the
       original software.

    4. The name of the author may not be used to endorse or
       promote products derived from this software without
       specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.

  for src/rt/vg/memcheck.h:

    This file is part of MemCheck, a heavyweight Valgrind
    tool for detecting memory errors.

    Copyright (C) 2000-2010 Julian Seward.  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. 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.

    3. Altered source versions must be plainly marked as
       such, and must not be misrepresented as being the
       original software.

    4. The name of the author may not be used to endorse or
       promote products derived from this software without
       specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.

* The auxiliary file src/etc/pkg/modpath.iss contains a
  library routine compiled, by Inno Setup, into the Windows
  installer binary. This file is licensed under the LGPL,
  but, in our legal interpretation, this does not affect the
  aggregate "collected work" license of the Rust
  distribution (MIT) nor any other components of it. We
  believe that the terms governing distribution of the
  binary Windows installer built from modpath.iss are
  therefore LGPL, but not the terms governing distribution
  of any of the files installed by such an installer (such
  as the Rust compiler or runtime libraries themselves).

* The libuv asynchronous I/O library. Code for this package
  is found in the src/rt/libuv directory, within this
  distribution. This package is redistributed under the
  following terms, as noted in its source:

    Copyright Joyent, Inc. and other Node contributors. All
    rights reserved.  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.


* Additional libraries included in libuv carry separate
  BSD-compatible licenses. See src/rt/libuv/LICENSE for
  details.


* Additional copyright may be retained by contributors other
  than Mozilla or the parties enumerated in this file. Such
  copyright can be determined on a case-by-case basis by
  examining the author of each portion of a file in the
  revision-control commit records of the project, or by
  consulting representative comments claiming copyright
  ownership for a file.

   For example, the text:

      "Copyright (c) 2011 Google Inc."

   appears in some files, and these files thereby denote
   that their author and copyright-holder is Google Inc.

   In all such cases, the absence of explicit licensing text
   indicates that the contributor chose to license their
   work for distribution under identical terms to those
   Mozilla has chosen for the collective work, enumerated
   below.  The only difference is the retention of copyright
   itself, held by the contributor.


The remaining code and documentation in the collective work
presented here, as well as the collective work itslf, is
distributed under the following terms ("The Rust License"):

    Copyright (c) 2006-2012 Graydon Hoare
    Copyright (c) 2009-2012 Mozilla Foundation

    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.
