diff options
| author | David Nyström <david.c.nystrom@gmail.com> | 2013-02-04 13:32:51 +0100 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-02-06 13:13:01 +0000 |
| commit | bc8150d9d4db81006d1f778dedc4e167f5b89a8d (patch) | |
| tree | f66b566c8c950844c184409b28fe8c33bda9f45e | |
| parent | 5b7c822609a42e58e96a004071978c9ff196e955 (diff) | |
| download | poky-bc8150d9d4db81006d1f778dedc4e167f5b89a8d.tar.gz | |
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>
| -rwxr-xr-x | scripts/create-recipe | 156 |
1 files changed, 124 insertions, 32 deletions
diff --git a/scripts/create-recipe b/scripts/create-recipe index a556e39dd1..1b10e1b591 100755 --- a/scripts/create-recipe +++ b/scripts/create-recipe | |||
| @@ -37,11 +37,14 @@ use File::Basename qw(basename dirname); | |||
| 37 | my $name = ""; | 37 | my $name = ""; |
| 38 | my $predef_version = "TO BE FILLED IN"; | 38 | my $predef_version = "TO BE FILLED IN"; |
| 39 | my $version = $predef_version; | 39 | my $version = $predef_version; |
| 40 | my $pversion = $predef_version; | ||
| 40 | my $description = ""; | 41 | my $description = ""; |
| 41 | my $summary = ""; | 42 | my $summary = ""; |
| 42 | my $url = ""; | 43 | my $url = ""; |
| 43 | my $homepage; | 44 | my $homepage = ""; |
| 45 | my @depends; | ||
| 44 | my @rdepends; | 46 | my @rdepends; |
| 47 | my @rawpythondeps; | ||
| 45 | my $configure = ""; | 48 | my $configure = ""; |
| 46 | my $localename = ""; | 49 | my $localename = ""; |
| 47 | my @sources; | 50 | my @sources; |
| @@ -59,6 +62,7 @@ my $builder = ""; | |||
| 59 | 62 | ||
| 60 | 63 | ||
| 61 | my $oscmode = 0; | 64 | my $oscmode = 0; |
| 65 | my $python = 0; | ||
| 62 | 66 | ||
| 63 | my @banned_pkgconfig; | 67 | my @banned_pkgconfig; |
| 64 | my %failed_commands; | 68 | my %failed_commands; |
| @@ -74,7 +78,7 @@ my %failed_headers; | |||
| 74 | # We store the sha1sum of common COPYING files in an associative array | 78 | # We store the sha1sum of common COPYING files in an associative array |
| 75 | # %licenses. | 79 | # %licenses. |
| 76 | # | 80 | # |
| 77 | # For all matching sha1's in the tarbal, we then push the result | 81 | # For all matching sha1's in the tarball, we then push the result |
| 78 | # in the @license array (which we'll dedupe at the time of printing). | 82 | # in the @license array (which we'll dedupe at the time of printing). |
| 79 | # | 83 | # |
| 80 | 84 | ||
| @@ -135,6 +139,18 @@ sub guess_license_from_file { | |||
| 135 | } | 139 | } |
| 136 | 140 | ||
| 137 | # | 141 | # |
| 142 | # if file is found, and licence of python | ||
| 143 | # package is already aquired, add file. | ||
| 144 | # | ||
| 145 | if ($python == 1 && @license != 0) { | ||
| 146 | my $md5output = `md5sum $copying`; | ||
| 147 | $md5output =~ /^([a-zA-Z0-9]*) /; | ||
| 148 | my $md5 = $1; | ||
| 149 | chomp($md5); | ||
| 150 | $lic_files{$copying} = $md5 | ||
| 151 | } | ||
| 152 | |||
| 153 | # | ||
| 138 | # We also must make sure that the COPYING/etc files | 154 | # We also must make sure that the COPYING/etc files |
| 139 | # end up in the main package as %doc.. | 155 | # end up in the main package as %doc.. |
| 140 | # | 156 | # |
| @@ -1539,10 +1555,14 @@ sub guess_name_from_url { | |||
| 1539 | } | 1555 | } |
| 1540 | my $tarfile = $spliturl[0]; | 1556 | my $tarfile = $spliturl[0]; |
| 1541 | 1557 | ||
| 1558 | # Ensure correct name resolution from .zip&tgz archives | ||
| 1559 | $tarfile =~ s/\.zip/\.tar/; | ||
| 1560 | $tarfile =~ s/\.tgz/\.tar/; | ||
| 1561 | $tarfile =~ s/\_/\-/g; | ||
| 1542 | if ($tarfile =~ /(.*?)\-([0-9\.\-\~]+.*?)\.tar/) { | 1562 | if ($tarfile =~ /(.*?)\-([0-9\.\-\~]+.*?)\.tar/) { |
| 1543 | $name = $1; | 1563 | $name = $1; |
| 1544 | $version = $2; | 1564 | $version = $2; |
| 1545 | $version =~ s/\-/\_/g; | 1565 | $version =~ s/\-/\_/g; |
| 1546 | } | 1566 | } |
| 1547 | } | 1567 | } |
| 1548 | 1568 | ||
| @@ -1678,11 +1698,29 @@ sub write_yaml | |||
| 1678 | 1698 | ||
| 1679 | sub write_bbfile | 1699 | sub write_bbfile |
| 1680 | { | 1700 | { |
| 1701 | my $curdir = `pwd`; | ||
| 1702 | chomp($curdir); | ||
| 1703 | |||
| 1704 | if ($python == 1) { | ||
| 1705 | $name =~ s/python-//; | ||
| 1706 | $name = lc("python-" . $name); | ||
| 1707 | } | ||
| 1708 | |||
| 1709 | if (-e "$curdir/${name}_$version.bb") { | ||
| 1710 | print "Wont overwrite file:"; | ||
| 1711 | print "$curdir/${name}_$version.bb, exiting\n"; | ||
| 1712 | return; | ||
| 1713 | } | ||
| 1681 | open(BBFILE, ">${name}_$version.bb"); | 1714 | open(BBFILE, ">${name}_$version.bb"); |
| 1715 | |||
| 1682 | print BBFILE "SUMMARY = \"$summary\"\n"; | 1716 | print BBFILE "SUMMARY = \"$summary\"\n"; |
| 1683 | print BBFILE "DESCRIPTION = \"$description\"\n"; | 1717 | print BBFILE "DESCRIPTION = \"$description\"\n"; |
| 1684 | print BBFILE "HOMEPAGE = \"$homepage\"\n"; | 1718 | print BBFILE "HOMEPAGE = \"$homepage\"\n"; |
| 1685 | 1719 | ||
| 1720 | if ($python == 1) { | ||
| 1721 | print BBFILE "SRCNAME = \"$summary\"\n"; | ||
| 1722 | } | ||
| 1723 | |||
| 1686 | print BBFILE "LICENSE = \"@license\"\n"; | 1724 | print BBFILE "LICENSE = \"@license\"\n"; |
| 1687 | print BBFILE "LIC_FILES_CHKSUM = \""; | 1725 | print BBFILE "LIC_FILES_CHKSUM = \""; |
| 1688 | foreach (keys %lic_files) { | 1726 | foreach (keys %lic_files) { |
| @@ -1702,10 +1740,18 @@ sub write_bbfile | |||
| 1702 | }; | 1740 | }; |
| 1703 | 1741 | ||
| 1704 | if (@rdepends > 0) { | 1742 | if (@rdepends > 0) { |
| 1705 | print BBFILE "RDEPENDS_\$\{PN\} += \"@rdepends\"\n"; | 1743 | print BBFILE "RDEPENDS_\$\{PN\} += \""; |
| 1744 | foreach (@rdepends) { | ||
| 1745 | print BBFILE "$_ \\\n\t"; | ||
| 1746 | } | ||
| 1747 | print BBFILE "\"\n"; | ||
| 1748 | } | ||
| 1749 | |||
| 1750 | print BBFILE 'PR = "r0"' . "\n"; | ||
| 1751 | if ($python == 1) { | ||
| 1752 | print BBFILE "PV = \"$pversion\"\n\n"; | ||
| 1706 | } | 1753 | } |
| 1707 | 1754 | ||
| 1708 | print BBFILE 'PR = "r0"' . "\n\n"; | ||
| 1709 | print BBFILE "SRC_URI = \""; | 1755 | print BBFILE "SRC_URI = \""; |
| 1710 | foreach (@sources) { | 1756 | foreach (@sources) { |
| 1711 | print BBFILE "$_ \\\n"; | 1757 | print BBFILE "$_ \\\n"; |
| @@ -1713,18 +1759,19 @@ sub write_bbfile | |||
| 1713 | print BBFILE "\"\n\n"; | 1759 | print BBFILE "\"\n\n"; |
| 1714 | print BBFILE "SRC_URI[md5sum] = \"$md5sum\"\n"; | 1760 | print BBFILE "SRC_URI[md5sum] = \"$md5sum\"\n"; |
| 1715 | print BBFILE "SRC_URI[sha256sum] = \"$sha256sum\"\n\n"; | 1761 | print BBFILE "SRC_URI[sha256sum] = \"$sha256sum\"\n\n"; |
| 1762 | if ($python == 1) { | ||
| 1763 | print BBFILE "S = \"\${WORKDIR}/\${SRCNAME}-\${PV}\"\n"; | ||
| 1764 | } | ||
| 1716 | 1765 | ||
| 1717 | if (@inherits) { | 1766 | if (@inherits) { |
| 1718 | print BBFILE "inherit "; | 1767 | print BBFILE "inherit "; |
| 1719 | foreach (@inherits) { | 1768 | foreach (@inherits) { |
| 1720 | print BBFILE "$_ "; | 1769 | print BBFILE "$_ "; |
| 1721 | } | 1770 | } |
| 1771 | print BBFILE "\n"; | ||
| 1722 | } | 1772 | } |
| 1723 | 1773 | ||
| 1724 | close(BBFILE); | 1774 | close(BBFILE); |
| 1725 | |||
| 1726 | my $curdir = `pwd`; | ||
| 1727 | chomp($curdir); | ||
| 1728 | print "Create bb file: $curdir/${name}_$version.bb\n"; | 1775 | print "Create bb file: $curdir/${name}_$version.bb\n"; |
| 1729 | } | 1776 | } |
| 1730 | 1777 | ||
| @@ -1748,10 +1795,18 @@ sub calculate_sums | |||
| 1748 | # | 1795 | # |
| 1749 | 1796 | ||
| 1750 | if ( @ARGV < 1 ) { | 1797 | if ( @ARGV < 1 ) { |
| 1751 | print "Usage: $0 <url-of-source-tarballs>\n"; | 1798 | print "Usage: $0 [-r] <url-of-source-tarballs>\n"; |
| 1752 | exit(1); | 1799 | exit(1); |
| 1753 | } | 1800 | } |
| 1754 | 1801 | ||
| 1802 | # Recusive parsing of python dependencies using | ||
| 1803 | # easy_install | ||
| 1804 | my $recurse_python = 0; | ||
| 1805 | if ($ARGV[0] eq "-r") { | ||
| 1806 | $recurse_python = 1; | ||
| 1807 | shift @ARGV; | ||
| 1808 | } | ||
| 1809 | |||
| 1755 | if (@ARGV > 1) { | 1810 | if (@ARGV > 1) { |
| 1756 | my $i = 1; | 1811 | my $i = 1; |
| 1757 | while ($i < @ARGV) { | 1812 | while ($i < @ARGV) { |
| @@ -1809,7 +1864,7 @@ foreach (@tgzfiles) { | |||
| 1809 | # this is a step backwards in time that is just silly. | 1864 | # this is a step backwards in time that is just silly. |
| 1810 | # | 1865 | # |
| 1811 | 1866 | ||
| 1812 | my @sourcetars = <$orgdir/$outputdir/*\.tar\.bz2 $orgdir/$outputdir/*\.tar\.gz>; | 1867 | my @sourcetars = <$orgdir/$outputdir/*\.tar\.bz2 $orgdir/$outputdir/*\.tar\.gz $orgdir/$outputdir/*\.zip>; |
| 1813 | if ( length @sourcetars == 0) { | 1868 | if ( length @sourcetars == 0) { |
| 1814 | print "Can NOT find source tarball. Exiting...\n"; | 1869 | print "Can NOT find source tarball. Exiting...\n"; |
| 1815 | exit (1); | 1870 | exit (1); |
| @@ -1818,6 +1873,8 @@ if (defined($sourcetars[0]) and $sourcetars[0] =~ ".*\.tar\.bz2") { | |||
| 1818 | system("cd $tmpdir; tar -jxf $sourcetars[0] &>/dev/null"); | 1873 | system("cd $tmpdir; tar -jxf $sourcetars[0] &>/dev/null"); |
| 1819 | } elsif (defined($sourcetars[0]) and $sourcetars[0] =~ ".*\.tar\.gz") { | 1874 | } elsif (defined($sourcetars[0]) and $sourcetars[0] =~ ".*\.tar\.gz") { |
| 1820 | system("cd $tmpdir; tar -zxf $sourcetars[0] &>/dev/null"); | 1875 | system("cd $tmpdir; tar -zxf $sourcetars[0] &>/dev/null"); |
| 1876 | } elsif (defined($sourcetars[0]) and $sourcetars[0] =~ ".*\.zip") { | ||
| 1877 | system("cd $tmpdir; unzip $sourcetars[0] &>/dev/null"); | ||
| 1821 | } | 1878 | } |
| 1822 | 1879 | ||
| 1823 | print "Parsing content ....\n"; | 1880 | print "Parsing content ....\n"; |
| @@ -1830,34 +1887,64 @@ $fulldir = $dir; | |||
| 1830 | 1887 | ||
| 1831 | if ( -e "$dir/setup.py" ) { | 1888 | if ( -e "$dir/setup.py" ) { |
| 1832 | $python = 1; | 1889 | $python = 1; |
| 1833 | push(@inherits, "distutils"); | 1890 | $tmp_stools = `grep -r setuptools $dir/setup.py`; |
| 1834 | 1891 | if (length($tmp_stools) > 2) { | |
| 1835 | system("cd $dir ; python setup.py build sdist &> /dev/null"); | 1892 | push(@inherits, "setuptools"); |
| 1893 | } else { | ||
| 1894 | push(@inherits, "distutils"); | ||
| 1895 | } | ||
| 1836 | 1896 | ||
| 1837 | $templic = `sed '/^License: */!d; s///;q' $dir/*.egg-info/PKG-INFO`; | 1897 | $templic = `cd $dir; python setup.py --license;`; |
| 1838 | chomp($templic); | 1898 | $templic =~ s/[\r\n]+//g; |
| 1839 | push(@license, $templic); | 1899 | push(@license, $templic); |
| 1840 | $summary = `sed '/^Name: */!d; s///;q' $dir/*.egg-info/PKG-INFO`; | 1900 | $summary = `cd $dir; python setup.py --name`; |
| 1841 | chomp($summary); | 1901 | $summary =~ s/[\r\n]+//g; |
| 1842 | $description = `sed '/^Summary: */!d; s///;q' $dir/*.egg-info/PKG-INFO`; | 1902 | $description = `cd $dir; python setup.py --description`; |
| 1843 | chomp($description); | 1903 | $description =~ s/[\r\n]+//g; |
| 1844 | $homepage = `sed '/^Home-page: */!d; s///;q' $dir/*.egg-info/PKG-INFO`; | 1904 | $homepage = `cd $dir; python setup.py --url`; |
| 1845 | chomp($homepage); | 1905 | $homepage =~ s/[\r\n]+//g; |
| 1906 | $pversion = `cd $dir; python setup.py -V`; | ||
| 1907 | $pversion =~ s/[\r\n]+//g; | ||
| 1908 | # $findoutput = `cd $dir; python setup.py --requires`; | ||
| 1909 | # if (length($findoutput) < 3) { | ||
| 1846 | $findoutput = `find $dir/*.egg-info/ -name "requires.txt" 2>/dev/null`; | 1910 | $findoutput = `find $dir/*.egg-info/ -name "requires.txt" 2>/dev/null`; |
| 1911 | # } | ||
| 1847 | @findlist = split(/\n/, $findoutput); | 1912 | @findlist = split(/\n/, $findoutput); |
| 1848 | foreach (@findlist) { | 1913 | foreach (@findlist) { |
| 1849 | # Adding dependency do buildreqs should be removed when | 1914 | push(@rawpythondeps, `sed -e '/^\$/d' "$_" | sed '/^\\[/d'`); |
| 1850 | # distutils is unbroken, i.e. blocks setup.py install from | 1915 | chomp(@rawpythondeps); |
| 1851 | # downloading and installing dependencies. | 1916 | push(@rdepends, `sed -e 's/python-//g' "$_" | sed '/^\\[/d'`); |
| 1852 | push(@buildreqs, `sed 's/[^a-zA-Z]//g' $dir/*.egg-info/requires.txt`); | ||
| 1853 | chomp(@buildreqs); | ||
| 1854 | foreach $item (@buildreqs) { | ||
| 1855 | $item = "python-" . $item | ||
| 1856 | } | ||
| 1857 | push(@rdepends, `sed 's/[^a-zA-Z]//g' $dir/*.egg-info/requires.txt`); | ||
| 1858 | chomp(@rdepends); | 1917 | chomp(@rdepends); |
| 1918 | if ($recurse_python == 1) { | ||
| 1919 | foreach (@rawpythondeps) { | ||
| 1920 | my $ptempdir = tempdir(); | ||
| 1921 | $purl = `easy_install -eb $ptempdir "$_" 2>/dev/null`; | ||
| 1922 | $purl =~ s/#.*//; | ||
| 1923 | @purllist = $purl =~ m/Downloading (http:\/\/.*\n)/g; | ||
| 1924 | chomp(@purllist); | ||
| 1925 | |||
| 1926 | # Remove empty lines | ||
| 1927 | @purllist = grep(/\S/, @purllist); | ||
| 1928 | |||
| 1929 | # Recursively create recipes for dependencies | ||
| 1930 | if (@purllist != 0) { | ||
| 1931 | if (fork) { | ||
| 1932 | # Parent, do nothing | ||
| 1933 | } else { | ||
| 1934 | # child, execute | ||
| 1935 | print "Recursively creating recipe for: $purllist[0]\n"; | ||
| 1936 | exec("cd .. ; create-recipe -r $purllist[0]"); | ||
| 1937 | } | ||
| 1938 | } | ||
| 1939 | } | ||
| 1940 | wait; | ||
| 1941 | } | ||
| 1942 | |||
| 1859 | foreach $item (@rdepends) { | 1943 | foreach $item (@rdepends) { |
| 1860 | $item = "python-" . $item | 1944 | @pyclean = split(/(\=|\<|\>).*/, $item); |
| 1945 | if (defined($pyclean[0])) { | ||
| 1946 | $item = lc("python-" . $pyclean[0]); | ||
| 1947 | } | ||
| 1861 | } | 1948 | } |
| 1862 | } | 1949 | } |
| 1863 | } | 1950 | } |
| @@ -1920,6 +2007,11 @@ if ($uses_configure == 0) { | |||
| 1920 | $configure = "none"; | 2007 | $configure = "none"; |
| 1921 | } | 2008 | } |
| 1922 | 2009 | ||
| 2010 | @files = <$dir/docs/license.txt>; | ||
| 2011 | foreach (@files) { | ||
| 2012 | guess_license_from_file("$_"); | ||
| 2013 | } | ||
| 2014 | |||
| 1923 | @files = <$dir/COPY*>; | 2015 | @files = <$dir/COPY*>; |
| 1924 | foreach (@files) { | 2016 | foreach (@files) { |
| 1925 | guess_license_from_file("$_"); | 2017 | guess_license_from_file("$_"); |
