Initial revision
This commit is contained in:
151
Artistic
Normal file
151
Artistic
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
NAME
|
||||||
|
perlartistic - the Perl Artistic License
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
You can refer to this document in Pod via "L<perlartistic>"
|
||||||
|
Or you can see this document by entering "perldoc perlartistic"
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This is "The Artistic License". It's here so that modules, programs,
|
||||||
|
etc., that want to declare this as their distribution license, can link
|
||||||
|
to it.
|
||||||
|
|
||||||
|
It is also one of the two licenses Perl allows itself to be
|
||||||
|
redistributed and/or modified; for the other one, the GNU General Public
|
||||||
|
License, see the perlgpl.
|
||||||
|
|
||||||
|
The "Artistic License"
|
||||||
|
Preamble
|
||||||
|
The intent of this document is to state the conditions under which a
|
||||||
|
Package may be copied, such that the Copyright Holder maintains some
|
||||||
|
semblance of artistic control over the development of the package, while
|
||||||
|
giving the users of the package the right to use and distribute the
|
||||||
|
Package in a more-or-less customary fashion, plus the right to make
|
||||||
|
reasonable modifications.
|
||||||
|
|
||||||
|
Definitions
|
||||||
|
"Package"
|
||||||
|
refers to the collection of files distributed by the Copyright
|
||||||
|
Holder, and derivatives of that collection of files created through
|
||||||
|
textual modification.
|
||||||
|
|
||||||
|
"Standard Version"
|
||||||
|
refers to such a Package if it has not been modified, or has been
|
||||||
|
modified in accordance with the wishes of the Copyright Holder as
|
||||||
|
specified below.
|
||||||
|
|
||||||
|
"Copyright Holder"
|
||||||
|
is whoever is named in the copyright or copyrights for the package.
|
||||||
|
|
||||||
|
"You"
|
||||||
|
is you, if you're thinking about copying or distributing this
|
||||||
|
Package.
|
||||||
|
|
||||||
|
"Reasonable copying fee"
|
||||||
|
is whatever you can justify on the basis of media cost, duplication
|
||||||
|
charges, time of people involved, and so on. (You will not be
|
||||||
|
required to justify it to the Copyright Holder, but only to the
|
||||||
|
computing community at large as a market that must bear the fee.)
|
||||||
|
|
||||||
|
"Freely Available"
|
||||||
|
means that no fee is charged for the item itself, though there may
|
||||||
|
be fees involved in handling the item. It also means that recipients
|
||||||
|
of the item may redistribute it under the same conditions they
|
||||||
|
received it.
|
||||||
|
|
||||||
|
Conditions
|
||||||
|
1. You may make and give away verbatim copies of the source form of the
|
||||||
|
Standard Version of this Package without restriction, provided that
|
||||||
|
you duplicate all of the original copyright notices and associated
|
||||||
|
disclaimers.
|
||||||
|
|
||||||
|
2. You may apply bug fixes, portability fixes and other modifications
|
||||||
|
derived from the Public Domain or from the Copyright Holder. A
|
||||||
|
Package modified in such a way shall still be considered the
|
||||||
|
Standard Version.
|
||||||
|
|
||||||
|
3. You may otherwise modify your copy of this Package in any way,
|
||||||
|
provided that you insert a prominent notice in each changed file
|
||||||
|
stating how and when you changed that file, and provided that you do
|
||||||
|
at least ONE of the following:
|
||||||
|
|
||||||
|
a) place your modifications in the Public Domain or otherwise make
|
||||||
|
them Freely Available, such as by posting said modifications to
|
||||||
|
Usenet or an equivalent medium, or placing the modifications on
|
||||||
|
a major archive site such as uunet.uu.net, or by allowing the
|
||||||
|
Copyright Holder to include your modifications in the Standard
|
||||||
|
Version of the Package.
|
||||||
|
|
||||||
|
b) use the modified Package only within your corporation or
|
||||||
|
organization.
|
||||||
|
|
||||||
|
c) rename any non-standard executables so the names do not conflict
|
||||||
|
with standard executables, which must also be provided, and
|
||||||
|
provide a separate manual page for each non-standard executable
|
||||||
|
that clearly documents how it differs from the Standard Version.
|
||||||
|
|
||||||
|
d) make other distribution arrangements with the Copyright Holder.
|
||||||
|
|
||||||
|
4. You may distribute the programs of this Package in object code or
|
||||||
|
executable form, provided that you do at least ONE of the following:
|
||||||
|
|
||||||
|
a) distribute a Standard Version of the executables and library
|
||||||
|
files, together with instructions (in the manual page or
|
||||||
|
equivalent) on where to get the Standard Version.
|
||||||
|
|
||||||
|
b) accompany the distribution with the machine-readable source of
|
||||||
|
the Package with your modifications.
|
||||||
|
|
||||||
|
c) give non-standard executables non-standard names, and clearly
|
||||||
|
document the differences in manual pages (or equivalent),
|
||||||
|
together with instructions on where to get the Standard Version.
|
||||||
|
|
||||||
|
d) make other distribution arrangements with the Copyright Holder.
|
||||||
|
|
||||||
|
5. You may charge a reasonable copying fee for any distribution of this
|
||||||
|
Package. You may charge any fee you choose for support of this
|
||||||
|
Package. You may not charge a fee for this Package itself. However,
|
||||||
|
you may distribute this Package in aggregate with other (possibly
|
||||||
|
commercial) programs as part of a larger (possibly commercial)
|
||||||
|
software distribution provided that you do not advertise this
|
||||||
|
Package as a product of your own. You may embed this Package's
|
||||||
|
interpreter within an executable of yours (by linking); this shall
|
||||||
|
be construed as a mere form of aggregation, provided that the
|
||||||
|
complete Standard Version of the interpreter is so embedded.
|
||||||
|
|
||||||
|
6. The scripts and library files supplied as input to or produced as
|
||||||
|
output from the programs of this Package do not automatically fall
|
||||||
|
under the copyright of this Package, but belong to whoever generated
|
||||||
|
them, and may be sold commercially, and may be aggregated with this
|
||||||
|
Package. If such scripts or library files are aggregated with this
|
||||||
|
Package via the so-called "undump" or "unexec" methods of producing
|
||||||
|
a binary executable image, then distribution of such an image shall
|
||||||
|
neither be construed as a distribution of this Package nor shall it
|
||||||
|
fall under the restrictions of Paragraphs 3 and 4, provided that you
|
||||||
|
do not represent such an executable image as a Standard Version of
|
||||||
|
this Package.
|
||||||
|
|
||||||
|
7. C subroutines (or comparably compiled subroutines in other
|
||||||
|
languages) supplied by you and linked into this Package in order to
|
||||||
|
emulate subroutines and variables of the language defined by this
|
||||||
|
Package shall not be considered part of this Package, but are the
|
||||||
|
equivalent of input as in Paragraph 6, provided these subroutines do
|
||||||
|
not change the language in any way that would cause it to fail the
|
||||||
|
regression tests for the language.
|
||||||
|
|
||||||
|
8. Aggregation of this Package with a commercial distribution is always
|
||||||
|
permitted provided that the use of this Package is embedded; that
|
||||||
|
is, when no overt attempt is made to make this Package's interfaces
|
||||||
|
visible to the end user of the commercial distribution. Such use
|
||||||
|
shall not be construed as a distribution of this Package.
|
||||||
|
|
||||||
|
9. The name of the Copyright Holder may not be used to endorse or
|
||||||
|
promote products derived from this software without specific prior
|
||||||
|
written permission.
|
||||||
|
|
||||||
|
10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
The End
|
||||||
|
|
||||||
32
Build.PL
Normal file
32
Build.PL
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Module::Build;
|
||||||
|
|
||||||
|
my $builder = Module::Build->new(
|
||||||
|
module_name => 'cpanspec',
|
||||||
|
license => 'perl',
|
||||||
|
dist_author => 'Steven Pritchard <steve@cpan.org>',
|
||||||
|
dist_version => '1.59',
|
||||||
|
requires => {
|
||||||
|
'Archive::Tar' => 0,
|
||||||
|
'Archive::Zip' => 0,
|
||||||
|
'File::Basename' => 0,
|
||||||
|
'FileHandle' => 0,
|
||||||
|
'Getopt::Long' => 0,
|
||||||
|
'LWP::UserAgent' => 0,
|
||||||
|
'Module::CoreList' => 0,
|
||||||
|
'POSIX' => 0,
|
||||||
|
'Parse::CPAN::Packages' => 0,
|
||||||
|
'Pod::Usage' => 0,
|
||||||
|
'Text::Autoformat' => 0,
|
||||||
|
'YAML' => 0,
|
||||||
|
},
|
||||||
|
script_files => [
|
||||||
|
'cpanspec',
|
||||||
|
'cpanget',
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
$builder->create_build_script();
|
||||||
|
|
||||||
|
# vi: set ai et:
|
||||||
367
COPYING
Normal file
367
COPYING
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
NAME
|
||||||
|
perlgpl - the GNU General Public License, version 2
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
You can refer to this document in Pod via "L<perlgpl>"
|
||||||
|
Or you can see this document by entering "perldoc perlgpl"
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This is "The GNU General Public License, version 2". It's here so that
|
||||||
|
modules, programs, etc., that want to declare this as their distribution
|
||||||
|
license, can link to it.
|
||||||
|
|
||||||
|
It is also one of the two licenses Perl allows itself to be
|
||||||
|
redistributed and/or modified; for the other one, the Perl Artistic
|
||||||
|
License, see the perlartistic.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 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.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your freedom to
|
||||||
|
share and change it. By contrast, the GNU General Public License is
|
||||||
|
intended to guarantee your freedom to share and change free software--to
|
||||||
|
make sure the software is free for all its users. This General Public
|
||||||
|
License applies to most of the Free Software Foundation's software and
|
||||||
|
to any other program whose authors commit to using it. (Some other Free
|
||||||
|
Software Foundation software is covered by the GNU Library General
|
||||||
|
Public License instead.) You can apply it to your programs, 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 software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that you have.
|
||||||
|
You must make sure that they, too, receive or can get the source code.
|
||||||
|
And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, 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 redistributors of a free program will
|
||||||
|
individually obtain patent licenses, in effect making the program
|
||||||
|
proprietary. To prevent this, we have made it clear that any patent must
|
||||||
|
be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains a
|
||||||
|
notice placed by the copyright holder saying it may be distributed under
|
||||||
|
the terms of this General Public License. The "Program", below, refers
|
||||||
|
to any such program or work, and a "work based on the Program" means
|
||||||
|
either the Program or any derivative work under copyright law: that is
|
||||||
|
to say, a work containing the Program or a portion of it, either
|
||||||
|
verbatim or with modifications and/or translated into another language.
|
||||||
|
(Hereinafter, translation is included without limitation in the term
|
||||||
|
"modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of running
|
||||||
|
the Program is not restricted, and the output from the Program is
|
||||||
|
covered only if its contents constitute a work based on the Program
|
||||||
|
(independent of having been made by running the Program). Whether that
|
||||||
|
is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's 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 give any other
|
||||||
|
recipients of the Program a copy of this License along with the Program.
|
||||||
|
|
||||||
|
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 Program or any portion of
|
||||||
|
it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program, 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 Program, 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 Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of a
|
||||||
|
storage or distribution medium does not bring the other work under the
|
||||||
|
scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it, under
|
||||||
|
Section 2) in object code or executable form under the terms of Sections
|
||||||
|
1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) 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; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, 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 executable. 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.
|
||||||
|
|
||||||
|
If distribution of executable or 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 counts as distribution of the source
|
||||||
|
code, even though third parties are not compelled to copy the source
|
||||||
|
along with the object code.
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt otherwise
|
||||||
|
to copy, modify, sublicense or distribute the Program 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.
|
||||||
|
|
||||||
|
5. 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 Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and all
|
||||||
|
its terms and conditions for copying, distributing or modifying the
|
||||||
|
Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program 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.
|
||||||
|
|
||||||
|
7. 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 Program at all. For example, if a patent license would
|
||||||
|
not permit royalty-free redistribution of the Program 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 Program.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program 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.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the 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 Program
|
||||||
|
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 Program does not specify a version
|
||||||
|
number of this License, you may choose any version ever published by the
|
||||||
|
Free Software Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, 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
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "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 PROGRAM IS WITH
|
||||||
|
YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
|
||||||
|
NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. 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 PROGRAM 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 PROGRAM
|
||||||
|
(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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 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 Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these
|
||||||
|
terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. 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 program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, 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.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the
|
||||||
|
appropriate parts of the General Public License. Of course, the commands
|
||||||
|
you use may be called something other than `show w' and `show c'; they
|
||||||
|
could even be mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications
|
||||||
|
with the library. If this is what you want to do, use the GNU Library
|
||||||
|
General Public License instead of this License.
|
||||||
|
|
||||||
|
[End.]
|
||||||
|
|
||||||
7
MANIFEST
Normal file
7
MANIFEST
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Build.PL
|
||||||
|
cpanget
|
||||||
|
cpanspec
|
||||||
|
MANIFEST This list of files
|
||||||
|
META.yml
|
||||||
|
COPYING
|
||||||
|
Artistic
|
||||||
22
META.yml
Normal file
22
META.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
name: cpanspec
|
||||||
|
version: 1.59
|
||||||
|
author:
|
||||||
|
- Steven Pritchard <steve@cpan.org>
|
||||||
|
abstract: ~
|
||||||
|
license: perl
|
||||||
|
requires:
|
||||||
|
Archive::Tar: 0
|
||||||
|
Archive::Zip: 0
|
||||||
|
File::Basename: 0
|
||||||
|
FileHandle: 0
|
||||||
|
Getopt::Long: 0
|
||||||
|
LWP::UserAgent: 0
|
||||||
|
Module::CoreList: 0
|
||||||
|
POSIX: 0
|
||||||
|
Parse::CPAN::Packages: 0
|
||||||
|
Pod::Usage: 0
|
||||||
|
Text::Autoformat: 0
|
||||||
|
YAML: 0
|
||||||
|
provides: {}
|
||||||
|
generated_by: Module::Build version 0.261
|
||||||
23
cpanget
Executable file
23
cpanget
Executable file
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CPAN=${CPAN:-"http://www.cpan.org"}
|
||||||
|
packages=$HOME/.cpan/sources/modules/02packages.details.txt.gz
|
||||||
|
|
||||||
|
mkdir -p $( dirname $packages )
|
||||||
|
|
||||||
|
wget -N -O $packages $CPAN/modules/$( basename $packages )
|
||||||
|
|
||||||
|
for module in "$@" ; do
|
||||||
|
tar=$( zgrep '^'$module' ' $packages | awk '{print $3}' )
|
||||||
|
|
||||||
|
if [ -z "$tar" ] ; then
|
||||||
|
echo "Can't find $module, skipping..." >&2
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
wget -N $CPAN/authors/id/$tar
|
||||||
|
done
|
||||||
|
|
||||||
|
# vi: set ai et:
|
||||||
774
cpanspec
Executable file
774
cpanspec
Executable file
@@ -0,0 +1,774 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# cpanspec - Generate a spec file for a CPAN module
|
||||||
|
#
|
||||||
|
# Copyright (C) 2004-2005 Steven Pritchard <steve@kspei.com>
|
||||||
|
# This program is free software; you can redistribute it
|
||||||
|
# and/or modify it under the same terms as Perl itself.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
#
|
||||||
|
# $Id: cpanspec,v 1.1 2006/02/01 21:46:07 stevenpritchard Exp $
|
||||||
|
|
||||||
|
####
|
||||||
|
#
|
||||||
|
# TODO:
|
||||||
|
#
|
||||||
|
# * FIXME - The script should make a pass through README to look for a
|
||||||
|
# line that matches /^[^[:alnum:]]*DESCRIPTION[^[:alnum:]]*$/i
|
||||||
|
# and use the first paragraph after that, if it exists.
|
||||||
|
#
|
||||||
|
# * It might be a good idea to try to render %description as POD.
|
||||||
|
#
|
||||||
|
# * Add code to get the path to the source from 02packages.details.txt.gz.
|
||||||
|
#
|
||||||
|
# * Planned features (as of 2005-09-19):
|
||||||
|
#
|
||||||
|
# - Find and download dependencies automatically (like CPAN::Unwind).
|
||||||
|
# - Download from CPAN automatically when executed as "cpanspec Foo::Bar".
|
||||||
|
# + DONE!
|
||||||
|
# + Add --download-only or something similar to replace cpanget.
|
||||||
|
#
|
||||||
|
# KNOWN BUGS:
|
||||||
|
#
|
||||||
|
# * This script is known to fail on the following:
|
||||||
|
#
|
||||||
|
# - Cache::Cache 1.02 (Tries to do detection magic in Makefile.PL.)
|
||||||
|
#
|
||||||
|
####
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
cpanspec - Generate a spec file for a CPAN module
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
cpanspec [options] [file [...]]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help -h Help message
|
||||||
|
--old -o Be more compatible with old RHL/FC releases
|
||||||
|
--noprefix -n Don't add perl- prefix to package name
|
||||||
|
--force -f Force overwriting existing spec
|
||||||
|
--packager -p Name and email address of packager (for changelog)
|
||||||
|
--release -r Release of package (defaults to 1)
|
||||||
|
--disttag -d Disttag (defaults to %{?dist})
|
||||||
|
--srpm -s Build a source rpm
|
||||||
|
--build -b Build source and binary rpms
|
||||||
|
--cpan -c CPAN mirror URL
|
||||||
|
--verbose -v Be more verbose
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
B<cpanspec> will generate a spec file to build a rpm from a CPAN-style
|
||||||
|
Perl module distribution.
|
||||||
|
|
||||||
|
=head1 OPTIONS
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item B<-h>, B<--help>
|
||||||
|
|
||||||
|
Print a brief help message and exit.
|
||||||
|
|
||||||
|
=item B<-o>, B<--old>
|
||||||
|
|
||||||
|
Be more compatible with old RHL/FC releases. With this option enabled,
|
||||||
|
the generated spec file
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item *
|
||||||
|
|
||||||
|
Defines perl_vendorlib or perl_vendorarch.
|
||||||
|
|
||||||
|
=item *
|
||||||
|
|
||||||
|
Includes explicit dependencies for core Perl modules.
|
||||||
|
|
||||||
|
=item *
|
||||||
|
|
||||||
|
Uses C<%check || :> instead of just C<%check>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=item B<-n>, B<--noprefix>
|
||||||
|
|
||||||
|
Don't add I<perl-> prefix to the name of the package. This is useful
|
||||||
|
for perl-based applications (such as this one), so that the name of
|
||||||
|
the rpm is simply B<cpanspec> instead of B<perl-cpanspec>.
|
||||||
|
|
||||||
|
=item B<-f>, B<--force>
|
||||||
|
|
||||||
|
Force overwriting an existing spec file. Normally B<cpanspec> will
|
||||||
|
refuse to overwrite an existing spec file for safety. This option
|
||||||
|
removes that safety check. Please use with caution.
|
||||||
|
|
||||||
|
=item B<-p>, B<--packager>
|
||||||
|
|
||||||
|
The name and email address of the packager. Overrides the C<%packager>
|
||||||
|
macro in C<~/.rpmmacros>.
|
||||||
|
|
||||||
|
=item B<-r>, B<--release>
|
||||||
|
|
||||||
|
The release number of the package. Defaults to 1.
|
||||||
|
|
||||||
|
=item B<-d>, B<--disttag>
|
||||||
|
|
||||||
|
Disttag (a string to append to the release number), used to
|
||||||
|
differentiate builds for various releases. Defaults to the
|
||||||
|
semi-standard (for Fedora Extras) string C<%{?dist}>.
|
||||||
|
|
||||||
|
=item B<-s>, B<--srpm>
|
||||||
|
|
||||||
|
Build a source rpm from the generated spec file.
|
||||||
|
|
||||||
|
=item B<-b>, B<--build>
|
||||||
|
|
||||||
|
Build source and binary rpms from the generated spec file.
|
||||||
|
B<Please be aware that this is likely to fail!> Even if it succeeds,
|
||||||
|
the generated rpm will almost certainly need some work to make
|
||||||
|
rpmlint happy.
|
||||||
|
|
||||||
|
=item B<-c>, B<--cpan>
|
||||||
|
|
||||||
|
The URL to a CPAN mirror. If not specified with this option or the
|
||||||
|
B<CPAN> environment variable, defaults to L<http://www.cpan.org/>.
|
||||||
|
|
||||||
|
=item B<-v>, B<--verbose>
|
||||||
|
|
||||||
|
Be more verbose.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
Steven Pritchard <steve@kspei.com>
|
||||||
|
|
||||||
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
L<perl(1)>, L<cpan2rpm(1)>, L<cpanflute2(1)>
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use FileHandle;
|
||||||
|
use Archive::Tar;
|
||||||
|
use Archive::Zip qw(:ERROR_CODES);
|
||||||
|
use POSIX;
|
||||||
|
use Text::Autoformat;
|
||||||
|
use YAML qw(Load);
|
||||||
|
use Module::CoreList;
|
||||||
|
use Getopt::Long;
|
||||||
|
use Pod::Usage;
|
||||||
|
use File::Basename;
|
||||||
|
use LWP::UserAgent;
|
||||||
|
use Parse::CPAN::Packages;
|
||||||
|
# Apparently gets pulled in by another module.
|
||||||
|
#use Cwd;
|
||||||
|
|
||||||
|
our %opt;
|
||||||
|
|
||||||
|
our $help=0;
|
||||||
|
our $compat=0;
|
||||||
|
our $noprefix=0;
|
||||||
|
our $force=0;
|
||||||
|
our $packager;
|
||||||
|
our $release=1;
|
||||||
|
our $disttag='%{?dist}';
|
||||||
|
our $buildsrpm=0;
|
||||||
|
our $buildrpm=0;
|
||||||
|
our $verbose=0;
|
||||||
|
our $cpan=$ENV{'CPAN'} || "http://www.cpan.org/";
|
||||||
|
|
||||||
|
our $home=$ENV{'HOME'} || (getpwuid($<))[7];
|
||||||
|
die "Can't locate home directory. Please define \$HOME.\n"
|
||||||
|
if (!defined($home));
|
||||||
|
|
||||||
|
our $pkgdetails="$home/.cpan/sources/modules/02packages.details.txt.gz";
|
||||||
|
our $updated=0;
|
||||||
|
|
||||||
|
our $packages;
|
||||||
|
|
||||||
|
sub verbose(@) {
|
||||||
|
print STDERR @_, "\n" if ($verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fetch($$) {
|
||||||
|
my ($url, $file)=@_;
|
||||||
|
my @locations=();
|
||||||
|
|
||||||
|
verbose("Fetching $file from $url...");
|
||||||
|
|
||||||
|
my $ua=LWP::UserAgent->new('env_proxy' => 1)
|
||||||
|
or die "LWP::UserAgent->new() failed: $!\n";
|
||||||
|
|
||||||
|
my $request;
|
||||||
|
LOOP: $request=HTTP::Request->new('GET' => $url)
|
||||||
|
or die "HTTP::Request->new() failed: $!\n";
|
||||||
|
|
||||||
|
my @buf=stat($file);
|
||||||
|
$request->if_modified_since($buf[9]) if (@buf);
|
||||||
|
|
||||||
|
# FIXME - Probably should do $ua->request() here and skip loop detection.
|
||||||
|
my $response=$ua->simple_request($request)
|
||||||
|
or die "LWP::UserAgent->simple_request() failed: $!\n";
|
||||||
|
|
||||||
|
push(@locations, $url);
|
||||||
|
if ($response->code eq "301" or $response->code eq "302") {
|
||||||
|
$url=$response->header('Location');
|
||||||
|
die "Redirect loop detected! " . join("\n ", @locations, $url) . "\n"
|
||||||
|
if (grep { $url eq $_ } @locations);
|
||||||
|
goto LOOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($response->is_success) {
|
||||||
|
my $fh=new FileHandle ">$file";
|
||||||
|
print $fh $response->content;
|
||||||
|
$fh->close();
|
||||||
|
|
||||||
|
my $last_modified=$response->last_modified;
|
||||||
|
utime(time, $last_modified, $file) if ($last_modified);
|
||||||
|
} elsif ($response->code eq "304") {
|
||||||
|
verbose("$file is up to date.");
|
||||||
|
} else {
|
||||||
|
die "Failed to get $url: " . $response->status_line . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub mkdir_p($) {
|
||||||
|
my $dir=shift;
|
||||||
|
|
||||||
|
my @path=split '/', $dir;
|
||||||
|
|
||||||
|
for (my $n=0;$n<@path;$n++) {
|
||||||
|
my $partial="/" . join("/", @path[0..$n]);
|
||||||
|
if (!-d $partial) {
|
||||||
|
verbose("mkdir($partial)");
|
||||||
|
mkdir $partial or die "mkdir($partial) failed: $!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub update_packages() {
|
||||||
|
return 1 if ($updated);
|
||||||
|
|
||||||
|
verbose("Updating $pkgdetails...");
|
||||||
|
|
||||||
|
mkdir_p(dirname($pkgdetails)) if (!-d dirname($pkgdetails));
|
||||||
|
|
||||||
|
fetch("$cpan/modules/" . basename($pkgdetails), $pkgdetails);
|
||||||
|
|
||||||
|
$updated=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub build_rpm($) {
|
||||||
|
my $spec=shift;
|
||||||
|
my $dir=getcwd();
|
||||||
|
|
||||||
|
my $rpm=(-x "/usr/bin/rpmbuild" ? "/usr/bin/rpmbuild" : "/usr/bin/rpm");
|
||||||
|
|
||||||
|
verbose("Building " . ($buildrpm ? "rpms" : "source rpm") . " from $spec");
|
||||||
|
|
||||||
|
# From Fedora Extras Makefile.common.
|
||||||
|
if (system($rpm, "--define", "_sourcedir $dir",
|
||||||
|
"--define", "_builddir $dir",
|
||||||
|
"--define", "_srcrpmdir $dir",
|
||||||
|
"--define", "_rpmdir $dir",
|
||||||
|
"--nodeps", ($buildrpm ? "-ba" : "-bs"), $spec) != 0) {
|
||||||
|
if ($? == -1) {
|
||||||
|
die "Failed to execute $rpm: $!\n";
|
||||||
|
} elsif (WIFSIGNALED($?)) {
|
||||||
|
die "$rpm died with signal " . WTERMSIG($?)
|
||||||
|
. (($? & 128) ? ", core dumped\n" : "\n");
|
||||||
|
} else {
|
||||||
|
die "$rpm exited with value " . WEXITSTATUS($?) . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub list_files($$) {
|
||||||
|
my $archive=$_[0];
|
||||||
|
my $type=$_[1];
|
||||||
|
|
||||||
|
if ($type eq 'tar') {
|
||||||
|
return $archive->list_files();
|
||||||
|
} elsif ($type eq 'zip') {
|
||||||
|
return map { $_->fileName(); } $archive->members();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub extract($$$) {
|
||||||
|
my $archive=$_[0];
|
||||||
|
my $type=$_[1];
|
||||||
|
my $filename=$_[2];
|
||||||
|
|
||||||
|
if ($type eq 'tar') {
|
||||||
|
return $archive->get_content($filename);
|
||||||
|
} elsif ($type eq 'zip') {
|
||||||
|
return $archive->contents($filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GetOptions(
|
||||||
|
'help|h' => \$help,
|
||||||
|
'old|o' => \$compat,
|
||||||
|
'noprefix|n' => \$noprefix,
|
||||||
|
'force|f' => \$force,
|
||||||
|
'packager|p=s' => \$packager,
|
||||||
|
'release|r=i' => \$release,
|
||||||
|
'disttag|d=s' => \$disttag,
|
||||||
|
'srpm|s' => \$buildsrpm,
|
||||||
|
'build|b' => \$buildrpm,
|
||||||
|
'cpan|c=s' => \$cpan,
|
||||||
|
'verbose|v' => \$verbose,
|
||||||
|
) or pod2usage({ -exitval => 1, -verbose => 0 });
|
||||||
|
|
||||||
|
pod2usage({ -exitval => 0, -verbose => 1 }) if ($help);
|
||||||
|
pod2usage({ -exitval => 1, -verbose => 0 }) if (!@ARGV);
|
||||||
|
|
||||||
|
my $prefix=$noprefix ? "" : "perl-";
|
||||||
|
|
||||||
|
$packager=$packager || `rpm --eval '\%packager'`;
|
||||||
|
|
||||||
|
chomp $packager;
|
||||||
|
|
||||||
|
if (!$packager or $packager eq "\%packager") {
|
||||||
|
die "\%packager not defined in ~/.rpmmacros."
|
||||||
|
. " Please add or use --packager option.\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
die "Module::CoreList does not support perl version $]!\n"
|
||||||
|
if (!exists($Module::CoreList::version{$]}));
|
||||||
|
|
||||||
|
for my $file (@ARGV) {
|
||||||
|
my ($name,$version,$type);
|
||||||
|
|
||||||
|
if ($file =~ /^(.*)-([^-]+)\.(tar)\.gz$/) {
|
||||||
|
$name=$1;
|
||||||
|
$version=$2;
|
||||||
|
$type=$3;
|
||||||
|
} elsif ($file =~ /^(.*)-([^-]+)\.(zip)$/) {
|
||||||
|
$name=$1;
|
||||||
|
$version=$2;
|
||||||
|
$type=$3;
|
||||||
|
} else {
|
||||||
|
# Look up $file in 02packages.details.txt.
|
||||||
|
update_packages();
|
||||||
|
$packages=Parse::CPAN::Packages->new($pkgdetails)
|
||||||
|
if (!defined($packages));
|
||||||
|
die "Parse::CPAN::Packages->new() failed: $!\n"
|
||||||
|
if (!defined($packages));
|
||||||
|
my ($m,$d);
|
||||||
|
if ($m=$packages->package($file) and $d=$m->distribution()) {
|
||||||
|
my $url=$cpan . "/authors/id/" . $d->prefix();
|
||||||
|
$file=$d->filename();
|
||||||
|
fetch($url, $file);
|
||||||
|
$name=$d->dist();
|
||||||
|
$version=$d->version();
|
||||||
|
if ($file =~ /\.(tar)\.gz$/) {
|
||||||
|
$type=$1;
|
||||||
|
} elsif ($file =~ /\.(zip)$/) {
|
||||||
|
$type=$1;
|
||||||
|
} else {
|
||||||
|
warn "Failed to parse '$file', skipping...\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warn "Failed to parse '$file' or find a module by that name, skipping...\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $module=$name;
|
||||||
|
$module=~s/-/::/g;
|
||||||
|
|
||||||
|
my $archive;
|
||||||
|
if ($type eq 'tar') {
|
||||||
|
$archive=Archive::Tar->new($file, 1)
|
||||||
|
or die "Archive::Tar->new() failed: $!\n";
|
||||||
|
} elsif ($type eq 'zip') {
|
||||||
|
$archive=Archive::Zip->new() or die "Archive::Zip->new() failed: $!\n";
|
||||||
|
die "Read error on $file\n" unless ($archive->read($file) == AZ_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
my @files;
|
||||||
|
|
||||||
|
my $bogus=0;
|
||||||
|
for my $entry (list_files($archive, $type)) {
|
||||||
|
if ($entry !~ /^(?:.\/)?$name-$version\//) {
|
||||||
|
warn "BOGUS PATH DETECTED: $entry\n";
|
||||||
|
$bogus++;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
$entry=~s,^(?:.\/)?$name-$version/,,;
|
||||||
|
next if (!$entry);
|
||||||
|
|
||||||
|
push(@files, $entry);
|
||||||
|
}
|
||||||
|
if ($bogus) {
|
||||||
|
warn "Skipping $file with $bogus path elements!\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $url="http://search.cpan.org/dist/$name/";
|
||||||
|
|
||||||
|
my $vfile=$file;
|
||||||
|
$vfile=~s/$version/\%{version}/;
|
||||||
|
my $source="http://www.cpan.org/modules/by-module/"
|
||||||
|
. ($module=~/::/ ? (split "::", $module)[0] : (split "-", $name)[0])
|
||||||
|
. "/" . $vfile;
|
||||||
|
|
||||||
|
my $description;
|
||||||
|
my $readme=(sort { $a cmp $b } (grep /README/i, @files))[0];
|
||||||
|
if ($readme) {
|
||||||
|
if (my $content=extract($archive, $type, "$name-$version/$readme")) {
|
||||||
|
$content=~s/\r//g; # Why people use DOS text, I'll never understand.
|
||||||
|
for my $string (split "\n\n", $content) {
|
||||||
|
$string=~s/^\n+//;
|
||||||
|
if ((my @tmp=split "\n", $string) > 2
|
||||||
|
and $string !~ /^[#\-=]/) {
|
||||||
|
$description=$string;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warn "Failed to read $readme from $file"
|
||||||
|
. ($type eq 'tar' ? (": " . $archive->error()) : "") . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined($description) and $description) {
|
||||||
|
$description=autoformat $description, { "all" => 1,
|
||||||
|
"left" => 1,
|
||||||
|
"right" => 75,
|
||||||
|
"squeeze" => 0,
|
||||||
|
};
|
||||||
|
$description=~s/\n+$//s;
|
||||||
|
} else {
|
||||||
|
$description="$module Perl module";
|
||||||
|
}
|
||||||
|
|
||||||
|
my @doc=sort { $a cmp $b } grep {
|
||||||
|
!/\//
|
||||||
|
and !/\.(pl|xs|h|c|pm|in|pod)$/i
|
||||||
|
and !/^\./
|
||||||
|
and $_ ne "MANIFEST"
|
||||||
|
and $_ ne "MANIFEST.SKIP"
|
||||||
|
and $_ ne "INSTALL"
|
||||||
|
and $_ ne "SIGNATURE"
|
||||||
|
and $_ ne "META.yml"
|
||||||
|
and $_ ne "configure"
|
||||||
|
and $_ ne "typemap"
|
||||||
|
} @files;
|
||||||
|
|
||||||
|
my $date=strftime("%a %b %d %Y", localtime);
|
||||||
|
|
||||||
|
my $noarch=!grep /\.(c|xs)$/i, @files;
|
||||||
|
my $vendorlib=($noarch ? "vendorlib" : "vendorarch");
|
||||||
|
my $lib="\%{perl_$vendorlib}";
|
||||||
|
|
||||||
|
my $specfile="$prefix$name.spec";
|
||||||
|
my $spec;
|
||||||
|
if ($force) {
|
||||||
|
rename($specfile, "$specfile~") if (-e $specfile);
|
||||||
|
$spec=new FileHandle ">$specfile";
|
||||||
|
} else {
|
||||||
|
$spec=new FileHandle "$specfile", O_WRONLY|O_CREAT|O_EXCL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$spec) {
|
||||||
|
warn "Failed to create $specfile: $!\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
print $spec qq[\%{!?perl_$vendorlib: \%define perl_$vendorlib \%(eval "\`\%{__perl} -V:install$vendorlib\`"; echo \$install$vendorlib)}\n\n]
|
||||||
|
if ($compat);
|
||||||
|
|
||||||
|
my $license="";
|
||||||
|
|
||||||
|
my $scripts=0;
|
||||||
|
my (%build_requires,%requires);
|
||||||
|
my ($yml,$meta);
|
||||||
|
if (grep /^META\.yml$/, @files
|
||||||
|
and $yml=extract($archive, $type, "$name-$version/META.yml")) {
|
||||||
|
# Basic idea borrowed from Module::Depends.
|
||||||
|
my $meta=Load($yml);
|
||||||
|
|
||||||
|
%build_requires=%{$meta->{build_requires}} if ($meta->{build_requires});
|
||||||
|
%requires=%{$meta->{requires}} if ($meta->{requires});
|
||||||
|
if ($meta->{recommends}) {
|
||||||
|
for my $module (keys(%{$meta->{recommends}})) {
|
||||||
|
$requires{$module}=$requires{$module}
|
||||||
|
|| $meta->{recommends}->{$module};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# FIXME - I'm not sure this is sufficient...
|
||||||
|
if ($meta->{script_files} or $meta->{scripts}) {
|
||||||
|
$scripts=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($meta->{license}) {
|
||||||
|
if ($meta->{license} eq "perl") {
|
||||||
|
$license="GPL or Artistic";
|
||||||
|
} elsif ($meta->{license} eq "gpl") {
|
||||||
|
$license="GPL";
|
||||||
|
} elsif ($meta->{license} eq "lgpl") {
|
||||||
|
$license="LGPL";
|
||||||
|
} elsif ($meta->{license} eq "artistic") {
|
||||||
|
$license="Artistic";
|
||||||
|
} elsif ($meta->{license} eq "bsd") {
|
||||||
|
$license="BSD";
|
||||||
|
} elsif ($meta->{license} eq "open_source") {
|
||||||
|
$license="OSI-Approved"; # rpmlint will complain
|
||||||
|
} elsif ($meta->{license} eq "unrestricted") {
|
||||||
|
$license="distributable"; # rpmlint should complain
|
||||||
|
} elsif ($meta->{license} eq "restrictive") {
|
||||||
|
$license="Proprietary";
|
||||||
|
warn "License is 'restrictive'."
|
||||||
|
. " This package should not be redistributed.\n";
|
||||||
|
} else {
|
||||||
|
warn "Unknown license '" . $meta->{license} . "'!\n";
|
||||||
|
$license="CHECK(distributable)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (my @licenses=grep /license|copyright|copying/i, @doc) {
|
||||||
|
if (!$license) {
|
||||||
|
$license="distributable, see @licenses";
|
||||||
|
} elsif ($license=~/^(OSI-Approved|distributable|Proprietary)$/) {
|
||||||
|
$license.=", see @licenses";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$license="CHECK(GPL or Artistic)" if (!$license);
|
||||||
|
|
||||||
|
my $usebuildpl=0;
|
||||||
|
if (grep /^Build\.PL$/, @files) {
|
||||||
|
# FIXME - I need to figure out how to parse Build.PL.
|
||||||
|
$build_requires{'Module::Build'}=0;
|
||||||
|
$usebuildpl=1 if (!grep /^Makefile\.PL$/, @files);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$usebuildpl) {
|
||||||
|
# This is an ugly hack to parse any PREREQ_PM in Makefile.PL.
|
||||||
|
if (open(CHILD, "-|") == 0) {
|
||||||
|
eval {
|
||||||
|
use subs 'WriteMakefile';
|
||||||
|
|
||||||
|
sub WriteMakefile(@) {
|
||||||
|
my %args=@_;
|
||||||
|
|
||||||
|
if (!defined($args{'PREREQ_PM'})) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Versioned BuildRequires aren't reliably honored by
|
||||||
|
# rpmbuild, but we'll include them anyway as a hint to the
|
||||||
|
# packager.
|
||||||
|
for my $module (keys(%{$args{'PREREQ_PM'}})) {
|
||||||
|
print "BuildRequires: $module";
|
||||||
|
print " " . $args{'PREREQ_PM'}->{$module}
|
||||||
|
if ($args{'PREREQ_PM'}->{$module});
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
local $/=undef;
|
||||||
|
|
||||||
|
my $makefilepl=extract($archive, $type, "$name-$version/Makefile.PL")
|
||||||
|
or warn "Failed to extract $name-$version/Makefile.PL";
|
||||||
|
|
||||||
|
open(STDERR, ">/dev/null");
|
||||||
|
eval "no warnings;
|
||||||
|
use subs qw(require die warn eval open close rename);
|
||||||
|
BEGIN { sub require { 1; } }
|
||||||
|
BEGIN { sub die { 1; } }
|
||||||
|
BEGIN { sub warn { 1; } }
|
||||||
|
BEGIN { sub eval { 1; } }
|
||||||
|
BEGIN { sub open { 1; } }
|
||||||
|
BEGIN { sub close { 1; } }
|
||||||
|
BEGIN { sub rename { 1; } }
|
||||||
|
$makefilepl";
|
||||||
|
|
||||||
|
exit 0;
|
||||||
|
} else {
|
||||||
|
while (<CHILD>) {
|
||||||
|
if (/^BuildRequires:\s*(\S+)\s*(\S+)?/) {
|
||||||
|
my $module=$1;
|
||||||
|
my $version=0;
|
||||||
|
$version=$2 if (defined($2));
|
||||||
|
$build_requires{$module}=$version;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print $spec <<END;
|
||||||
|
Name: $prefix$name
|
||||||
|
Version: $version
|
||||||
|
Release: $release$disttag
|
||||||
|
Summary: $module Perl module
|
||||||
|
License: $license
|
||||||
|
Group: Development/Libraries
|
||||||
|
URL: $url
|
||||||
|
Source0: $source
|
||||||
|
BuildRoot: \%{_tmppath}/\%{name}-\%{version}-\%{release}-root-\%(\%{__id_u} -n)
|
||||||
|
END
|
||||||
|
|
||||||
|
printf $spec "%-16s%s\n", "BuildArch:", "noarch" if ($noarch);
|
||||||
|
|
||||||
|
if ($requires{perl}) {
|
||||||
|
$build_requires{perl}=$build_requires{perl} || $requires{perl};
|
||||||
|
delete $requires{perl};
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($build_requires{perl}) {
|
||||||
|
printf $spec "%-16s%s >= %s\n", "BuildRequires:", "perl",
|
||||||
|
(($build_requires{perl} lt "5.6.0" ? "0:" : "1:")
|
||||||
|
. $build_requires{perl});
|
||||||
|
delete $build_requires{perl};
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $module (keys(%requires)) {
|
||||||
|
$build_requires{$module}=$build_requires{$module} || $requires{$module};
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $module (sort(keys(%build_requires))) {
|
||||||
|
next if (!$compat and exists($Module::CoreList::version{$]}{$module}));
|
||||||
|
printf $spec "%-16s%s", "BuildRequires:", "perl($module)";
|
||||||
|
print $spec (" >= " . $build_requires{$module})
|
||||||
|
if ($build_requires{$module});
|
||||||
|
print $spec "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $module (sort(keys(%requires))) {
|
||||||
|
next if (!$compat and exists($Module::CoreList::version{$]}{$module}));
|
||||||
|
printf $spec "%-16s%s", "Requires:", "perl($module)";
|
||||||
|
print $spec (" >= " . $requires{$module}) if ($requires{$module});
|
||||||
|
print $spec "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print $spec <<END;
|
||||||
|
Requires: perl(:MODULE_COMPAT_\%(eval "`\%{__perl} -V:version`"; echo \$version))
|
||||||
|
|
||||||
|
\%description
|
||||||
|
$description
|
||||||
|
|
||||||
|
\%prep
|
||||||
|
\%setup -q@{[($noprefix ? "" : " -n $name-\%{version}")]}
|
||||||
|
|
||||||
|
\%build
|
||||||
|
END
|
||||||
|
|
||||||
|
if ($usebuildpl) {
|
||||||
|
print $spec <<END;
|
||||||
|
perl Build.PL installdirs=vendor@{[$noarch ? '' : ' optimize="$RPM_OPT_FLAGS"']}
|
||||||
|
./Build
|
||||||
|
END
|
||||||
|
} else {
|
||||||
|
print $spec <<END;
|
||||||
|
\%{__perl} Makefile.PL INSTALLDIRS=vendor@{[$noarch ? '' : ' OPTIMIZE="$RPM_OPT_FLAGS"']}
|
||||||
|
END
|
||||||
|
|
||||||
|
print $spec
|
||||||
|
"\%{__perl} -pi -e 's/^\\tLD_RUN_PATH=[^\\s]+\\s*/\\t/' Makefile\n"
|
||||||
|
if (!$noarch);
|
||||||
|
|
||||||
|
print $spec <<END;
|
||||||
|
make \%{?_smp_mflags}
|
||||||
|
END
|
||||||
|
}
|
||||||
|
|
||||||
|
print $spec <<END;
|
||||||
|
|
||||||
|
\%install
|
||||||
|
rm -rf \$RPM_BUILD_ROOT
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
if ($usebuildpl) {
|
||||||
|
print $spec
|
||||||
|
"./Build install destdir=\$RPM_BUILD_ROOT create_packlist=0\n";
|
||||||
|
} else {
|
||||||
|
print $spec <<END;
|
||||||
|
make pure_install PERL_INSTALL_ROOT=\$RPM_BUILD_ROOT
|
||||||
|
|
||||||
|
find \$RPM_BUILD_ROOT -type f -name .packlist -exec rm -f {} \\;
|
||||||
|
END
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$noarch) {
|
||||||
|
print $spec <<END;
|
||||||
|
find \$RPM_BUILD_ROOT -type f -name '*.bs' -size 0 -exec rm -f {} \\;
|
||||||
|
END
|
||||||
|
}
|
||||||
|
|
||||||
|
print $spec <<END;
|
||||||
|
find \$RPM_BUILD_ROOT -type d -depth -exec rmdir {} 2>/dev/null \\;
|
||||||
|
|
||||||
|
chmod -R u+rwX,go+rX,go-w \$RPM_BUILD_ROOT/*
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
if (!grep /copying|artistic|copyright|license/i, @doc) {
|
||||||
|
print $spec <<END;
|
||||||
|
perldoc -t perlgpl > COPYING
|
||||||
|
perldoc -t perlartistic > Artistic
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
push(@doc, "COPYING", "Artistic");
|
||||||
|
}
|
||||||
|
|
||||||
|
print $spec <<END;
|
||||||
|
\%check@{[($compat ? ' || :' : '')]}
|
||||||
|
END
|
||||||
|
if ($usebuildpl) {
|
||||||
|
print $spec "./Build test\n";
|
||||||
|
} else {
|
||||||
|
print $spec "make test\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print $spec <<END;
|
||||||
|
|
||||||
|
\%clean
|
||||||
|
rm -rf \$RPM_BUILD_ROOT
|
||||||
|
|
||||||
|
\%files
|
||||||
|
\%defattr(-,root,root,-)
|
||||||
|
\%doc @doc
|
||||||
|
END
|
||||||
|
|
||||||
|
if ($scripts) {
|
||||||
|
print $spec "\%{_bindir}/*\n";
|
||||||
|
# FIXME - How do we auto-detect man pages?
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($noarch) {
|
||||||
|
print $spec "$lib/*\n";
|
||||||
|
} else {
|
||||||
|
print $spec "$lib/auto/*\n$lib/" . (split /::/, $module)[0] . "*\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print $spec <<END;
|
||||||
|
\%{_mandir}/man3/*
|
||||||
|
|
||||||
|
\%changelog
|
||||||
|
* $date $packager $version-$release
|
||||||
|
- Specfile autogenerated.
|
||||||
|
END
|
||||||
|
|
||||||
|
$spec->close();
|
||||||
|
|
||||||
|
build_rpm($specfile) if ($buildsrpm or $buildrpm);
|
||||||
|
}
|
||||||
|
|
||||||
|
# vi: set ai et:
|
||||||
Reference in New Issue
Block a user