scripts/create-recipe: Python improvements for create-recipe.
1. Added ability to parse .zip files. 2. Added optional automatic dependency resolving for python recipes(easy_install wrapper). 3. Fixed a few name/version bugs. Give it a whirl by: create-recipe -r https://launchpad.net/nova/folsom/2012.2.3/+download/nova-2012.2.3.tar.gz Saves me some time unwinding python dependencies, and creating template recipes. (From OE-Core rev: 1a491a4dde0d3618f8815182d12c21f76b64de5a) Signed-off-by: David Nyström <david.nystrom@enea.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
5b7c822609
commit
bc8150d9d4
|
@ -37,11 +37,14 @@ use File::Basename qw(basename dirname);
|
|||
my $name = "";
|
||||
my $predef_version = "TO BE FILLED IN";
|
||||
my $version = $predef_version;
|
||||
my $pversion = $predef_version;
|
||||
my $description = "";
|
||||
my $summary = "";
|
||||
my $url = "";
|
||||
my $homepage;
|
||||
my $homepage = "";
|
||||
my @depends;
|
||||
my @rdepends;
|
||||
my @rawpythondeps;
|
||||
my $configure = "";
|
||||
my $localename = "";
|
||||
my @sources;
|
||||
|
@ -59,6 +62,7 @@ my $builder = "";
|
|||
|
||||
|
||||
my $oscmode = 0;
|
||||
my $python = 0;
|
||||
|
||||
my @banned_pkgconfig;
|
||||
my %failed_commands;
|
||||
|
@ -74,7 +78,7 @@ my %failed_headers;
|
|||
# We store the sha1sum of common COPYING files in an associative array
|
||||
# %licenses.
|
||||
#
|
||||
# For all matching sha1's in the tarbal, we then push the result
|
||||
# For all matching sha1's in the tarball, we then push the result
|
||||
# in the @license array (which we'll dedupe at the time of printing).
|
||||
#
|
||||
|
||||
|
@ -134,6 +138,18 @@ sub guess_license_from_file {
|
|||
$lic_files{$copying} = $md5
|
||||
}
|
||||
|
||||
#
|
||||
# if file is found, and licence of python
|
||||
# package is already aquired, add file.
|
||||
#
|
||||
if ($python == 1 && @license != 0) {
|
||||
my $md5output = `md5sum $copying`;
|
||||
$md5output =~ /^([a-zA-Z0-9]*) /;
|
||||
my $md5 = $1;
|
||||
chomp($md5);
|
||||
$lic_files{$copying} = $md5
|
||||
}
|
||||
|
||||
#
|
||||
# We also must make sure that the COPYING/etc files
|
||||
# end up in the main package as %doc..
|
||||
|
@ -1539,10 +1555,14 @@ sub guess_name_from_url {
|
|||
}
|
||||
my $tarfile = $spliturl[0];
|
||||
|
||||
# Ensure correct name resolution from .zip&tgz archives
|
||||
$tarfile =~ s/\.zip/\.tar/;
|
||||
$tarfile =~ s/\.tgz/\.tar/;
|
||||
$tarfile =~ s/\_/\-/g;
|
||||
if ($tarfile =~ /(.*?)\-([0-9\.\-\~]+.*?)\.tar/) {
|
||||
$name = $1;
|
||||
$version = $2;
|
||||
$version =~ s/\-/\_/g;
|
||||
$version =~ s/\-/\_/g;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1678,11 +1698,29 @@ sub write_yaml
|
|||
|
||||
sub write_bbfile
|
||||
{
|
||||
my $curdir = `pwd`;
|
||||
chomp($curdir);
|
||||
|
||||
if ($python == 1) {
|
||||
$name =~ s/python-//;
|
||||
$name = lc("python-" . $name);
|
||||
}
|
||||
|
||||
if (-e "$curdir/${name}_$version.bb") {
|
||||
print "Wont overwrite file:";
|
||||
print "$curdir/${name}_$version.bb, exiting\n";
|
||||
return;
|
||||
}
|
||||
open(BBFILE, ">${name}_$version.bb");
|
||||
|
||||
print BBFILE "SUMMARY = \"$summary\"\n";
|
||||
print BBFILE "DESCRIPTION = \"$description\"\n";
|
||||
print BBFILE "HOMEPAGE = \"$homepage\"\n";
|
||||
|
||||
if ($python == 1) {
|
||||
print BBFILE "SRCNAME = \"$summary\"\n";
|
||||
}
|
||||
|
||||
print BBFILE "LICENSE = \"@license\"\n";
|
||||
print BBFILE "LIC_FILES_CHKSUM = \"";
|
||||
foreach (keys %lic_files) {
|
||||
|
@ -1702,10 +1740,18 @@ sub write_bbfile
|
|||
};
|
||||
|
||||
if (@rdepends > 0) {
|
||||
print BBFILE "RDEPENDS_\$\{PN\} += \"@rdepends\"\n";
|
||||
print BBFILE "RDEPENDS_\$\{PN\} += \"";
|
||||
foreach (@rdepends) {
|
||||
print BBFILE "$_ \\\n\t";
|
||||
}
|
||||
print BBFILE "\"\n";
|
||||
}
|
||||
|
||||
print BBFILE 'PR = "r0"' . "\n";
|
||||
if ($python == 1) {
|
||||
print BBFILE "PV = \"$pversion\"\n\n";
|
||||
}
|
||||
|
||||
print BBFILE 'PR = "r0"' . "\n\n";
|
||||
print BBFILE "SRC_URI = \"";
|
||||
foreach (@sources) {
|
||||
print BBFILE "$_ \\\n";
|
||||
|
@ -1713,18 +1759,19 @@ sub write_bbfile
|
|||
print BBFILE "\"\n\n";
|
||||
print BBFILE "SRC_URI[md5sum] = \"$md5sum\"\n";
|
||||
print BBFILE "SRC_URI[sha256sum] = \"$sha256sum\"\n\n";
|
||||
if ($python == 1) {
|
||||
print BBFILE "S = \"\${WORKDIR}/\${SRCNAME}-\${PV}\"\n";
|
||||
}
|
||||
|
||||
if (@inherits) {
|
||||
print BBFILE "inherit ";
|
||||
foreach (@inherits) {
|
||||
print BBFILE "$_ ";
|
||||
}
|
||||
print BBFILE "\n";
|
||||
}
|
||||
|
||||
close(BBFILE);
|
||||
|
||||
my $curdir = `pwd`;
|
||||
chomp($curdir);
|
||||
close(BBFILE);
|
||||
print "Create bb file: $curdir/${name}_$version.bb\n";
|
||||
}
|
||||
|
||||
|
@ -1748,10 +1795,18 @@ sub calculate_sums
|
|||
#
|
||||
|
||||
if ( @ARGV < 1 ) {
|
||||
print "Usage: $0 <url-of-source-tarballs>\n";
|
||||
print "Usage: $0 [-r] <url-of-source-tarballs>\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
# Recusive parsing of python dependencies using
|
||||
# easy_install
|
||||
my $recurse_python = 0;
|
||||
if ($ARGV[0] eq "-r") {
|
||||
$recurse_python = 1;
|
||||
shift @ARGV;
|
||||
}
|
||||
|
||||
if (@ARGV > 1) {
|
||||
my $i = 1;
|
||||
while ($i < @ARGV) {
|
||||
|
@ -1809,7 +1864,7 @@ foreach (@tgzfiles) {
|
|||
# this is a step backwards in time that is just silly.
|
||||
#
|
||||
|
||||
my @sourcetars = <$orgdir/$outputdir/*\.tar\.bz2 $orgdir/$outputdir/*\.tar\.gz>;
|
||||
my @sourcetars = <$orgdir/$outputdir/*\.tar\.bz2 $orgdir/$outputdir/*\.tar\.gz $orgdir/$outputdir/*\.zip>;
|
||||
if ( length @sourcetars == 0) {
|
||||
print "Can NOT find source tarball. Exiting...\n";
|
||||
exit (1);
|
||||
|
@ -1818,6 +1873,8 @@ if (defined($sourcetars[0]) and $sourcetars[0] =~ ".*\.tar\.bz2") {
|
|||
system("cd $tmpdir; tar -jxf $sourcetars[0] &>/dev/null");
|
||||
} elsif (defined($sourcetars[0]) and $sourcetars[0] =~ ".*\.tar\.gz") {
|
||||
system("cd $tmpdir; tar -zxf $sourcetars[0] &>/dev/null");
|
||||
} elsif (defined($sourcetars[0]) and $sourcetars[0] =~ ".*\.zip") {
|
||||
system("cd $tmpdir; unzip $sourcetars[0] &>/dev/null");
|
||||
}
|
||||
|
||||
print "Parsing content ....\n";
|
||||
|
@ -1830,34 +1887,64 @@ $fulldir = $dir;
|
|||
|
||||
if ( -e "$dir/setup.py" ) {
|
||||
$python = 1;
|
||||
push(@inherits, "distutils");
|
||||
|
||||
system("cd $dir ; python setup.py build sdist &> /dev/null");
|
||||
$tmp_stools = `grep -r setuptools $dir/setup.py`;
|
||||
if (length($tmp_stools) > 2) {
|
||||
push(@inherits, "setuptools");
|
||||
} else {
|
||||
push(@inherits, "distutils");
|
||||
}
|
||||
|
||||
$templic = `sed '/^License: */!d; s///;q' $dir/*.egg-info/PKG-INFO`;
|
||||
chomp($templic);
|
||||
$templic = `cd $dir; python setup.py --license;`;
|
||||
$templic =~ s/[\r\n]+//g;
|
||||
push(@license, $templic);
|
||||
$summary = `sed '/^Name: */!d; s///;q' $dir/*.egg-info/PKG-INFO`;
|
||||
chomp($summary);
|
||||
$description = `sed '/^Summary: */!d; s///;q' $dir/*.egg-info/PKG-INFO`;
|
||||
chomp($description);
|
||||
$homepage = `sed '/^Home-page: */!d; s///;q' $dir/*.egg-info/PKG-INFO`;
|
||||
chomp($homepage);
|
||||
$summary = `cd $dir; python setup.py --name`;
|
||||
$summary =~ s/[\r\n]+//g;
|
||||
$description = `cd $dir; python setup.py --description`;
|
||||
$description =~ s/[\r\n]+//g;
|
||||
$homepage = `cd $dir; python setup.py --url`;
|
||||
$homepage =~ s/[\r\n]+//g;
|
||||
$pversion = `cd $dir; python setup.py -V`;
|
||||
$pversion =~ s/[\r\n]+//g;
|
||||
# $findoutput = `cd $dir; python setup.py --requires`;
|
||||
# if (length($findoutput) < 3) {
|
||||
$findoutput = `find $dir/*.egg-info/ -name "requires.txt" 2>/dev/null`;
|
||||
# }
|
||||
@findlist = split(/\n/, $findoutput);
|
||||
foreach (@findlist) {
|
||||
# Adding dependency do buildreqs should be removed when
|
||||
# distutils is unbroken, i.e. blocks setup.py install from
|
||||
# downloading and installing dependencies.
|
||||
push(@buildreqs, `sed 's/[^a-zA-Z]//g' $dir/*.egg-info/requires.txt`);
|
||||
chomp(@buildreqs);
|
||||
foreach $item (@buildreqs) {
|
||||
$item = "python-" . $item
|
||||
}
|
||||
push(@rdepends, `sed 's/[^a-zA-Z]//g' $dir/*.egg-info/requires.txt`);
|
||||
push(@rawpythondeps, `sed -e '/^\$/d' "$_" | sed '/^\\[/d'`);
|
||||
chomp(@rawpythondeps);
|
||||
push(@rdepends, `sed -e 's/python-//g' "$_" | sed '/^\\[/d'`);
|
||||
chomp(@rdepends);
|
||||
if ($recurse_python == 1) {
|
||||
foreach (@rawpythondeps) {
|
||||
my $ptempdir = tempdir();
|
||||
$purl = `easy_install -eb $ptempdir "$_" 2>/dev/null`;
|
||||
$purl =~ s/#.*//;
|
||||
@purllist = $purl =~ m/Downloading (http:\/\/.*\n)/g;
|
||||
chomp(@purllist);
|
||||
|
||||
# Remove empty lines
|
||||
@purllist = grep(/\S/, @purllist);
|
||||
|
||||
# Recursively create recipes for dependencies
|
||||
if (@purllist != 0) {
|
||||
if (fork) {
|
||||
# Parent, do nothing
|
||||
} else {
|
||||
# child, execute
|
||||
print "Recursively creating recipe for: $purllist[0]\n";
|
||||
exec("cd .. ; create-recipe -r $purllist[0]");
|
||||
}
|
||||
}
|
||||
}
|
||||
wait;
|
||||
}
|
||||
|
||||
foreach $item (@rdepends) {
|
||||
$item = "python-" . $item
|
||||
@pyclean = split(/(\=|\<|\>).*/, $item);
|
||||
if (defined($pyclean[0])) {
|
||||
$item = lc("python-" . $pyclean[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1920,6 +2007,11 @@ if ($uses_configure == 0) {
|
|||
$configure = "none";
|
||||
}
|
||||
|
||||
@files = <$dir/docs/license.txt>;
|
||||
foreach (@files) {
|
||||
guess_license_from_file("$_");
|
||||
}
|
||||
|
||||
@files = <$dir/COPY*>;
|
||||
foreach (@files) {
|
||||
guess_license_from_file("$_");
|
||||
|
|
Loading…
Reference in New Issue