[poky] [PATCH 1/1] create-recipe: create a recipe from source URI
Andrei Gherzan
andrei at gherzan.ro
Fri Feb 17 02:15:38 PST 2012
On 02/17/2012 11:28 AM, Kang Kai wrote:
> This feature is from Yocto 1.2 Bug 1656. create-recipe allows you
> to give an upstream URL then generate a recipe file. It trys to check
> source URI, license files, configure files, rpm spec file .etc to
> get package name, version, description, summary, license and license
> file, build dependecy and so on.
>
> Signed-off-by: Kang Kai<kai.kang at windriver.com>
> ---
> scripts/create-recipe | 769 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 769 insertions(+), 0 deletions(-)
> create mode 100755 scripts/create-recipe
>
> diff --git a/scripts/create-recipe b/scripts/create-recipe
> new file mode 100755
> index 0000000..3034452
> --- /dev/null
> +++ b/scripts/create-recipe
> @@ -0,0 +1,769 @@
> +#!/usr/bin/env python
> +
> +# Copyright (C) 2012, Wind River Systems, Inc. All rights reserved.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License version 2 as
> +# published by the Free Software Foundation.
> +#
> +# 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
> +
> +import os
> +import sys
> +import shutil
> +import re
> +import urllib
> +import sha, md5, hashlib
> +
> +tmpdir = "/tmp/poky_create_recipe.%s" % os.getpid()
> +bbdir = ''
> +bin_file_name = ''
> +pkgname = ''
> +pkgversion = ''
> +summary = ''
> +description = ''
> +homepage = ''
> +license = []
> +unchecked_license_files = []
> +license_files = {}
> +licenses = {}
> +depends = []
> +src_uri = ''
> +is_local_src = False
> +src_uri_md5sum = ''
> +src_uri_sha256sum = ''
> +patches = []
> +inherits = []
> +
> +# support 2 package types: tar and rpm
> +pkgtype = ""
> +
> +def usage():
> + print "This is the bitbake import bb file script. Usage:\n"
> + print "\tbitbake-createbb<SRC_URI> [patch1] [patch2] ...\n"
> +
> +def download(pkg_uri, destdir, issource = False):
> + cwd = os.getcwd()
> + if os.path.isfile(pkg_uri):
> + global is_local_src
> + if issource:
> + is_local_src = True
> + pkg_uri = os.path.realpath(pkg_uri)
> + print 'Copying package: ', pkg_uri, ' to ', destdir
> + os.chdir(destdir)
> + shutil.copy(pkg_uri, '.')
> + os.chdir(cwd)
> + return 0
> + else:
> + print 'Downloading package: ', pkg_uri, ' to ', destdir
> + os.chdir(destdir)
> + ret = os.system("wget --quiet " + pkg_uri)
> + os.chdir(cwd)
> + return ret
> +
> +def guess_name_version_by_uri(uri):
> + global bin_file_name, pkgname, pkgversion, pkgtype
> +
> + # clean the tail something like ';name=xxx'
> + if ';' in uri:
> + uri = uri.split(';', 1)[0]
> +
> + elems = uri.rsplit('/', 1)
> + pkg = bin_file_name = elems[1]
> +
> + if pkg.endswith("tgz"):
> + pkg = re.sub("tgz$", "tar.gz", pkg)
> +
> + match = re.match('(.*?)\-([0-9\.\-\~]+)\.tar', pkg)
> + if match:
> + pkgtype = 'tar'
> + pkgname = match.group(1)
> + pkgversion = match.group(2)
> +
> + match = re.match('(.*?)\-([0-9\.\~]+).*?\.src.rpm', pkg)
> + if match:
> + pkgtype = 'rpm'
> + pkgname = match.group(1)
> + pkgversion = match.group(2)
> +
> +def get_md5_sha256_sum():
> + global src_uri_md5sum, src_uri_sha256sum
> +
> + curdir = os.getcwd()
> + os.chdir(tmpdir)
> +
> + f = file(bin_file_name, 'r')
> + content = f.read()
> + f.close()
> +
> + md_five = md5.new()
> + md_five.update(content)
> + src_uri_md5sum = md_five.hexdigest()
> +
> + sha_256 = hashlib.sha256()
> + sha_256.update(content)
> + src_uri_sha256sum = sha_256.hexdigest()
> +
> + os.chdir(curdir)
> +
> +def unpack_package():
> + global bin_file_name
> +
> + cwd = os.getcwd()
> + os.chdir(tmpdir)
> + if pkgtype == 'rpm':
> + cmdline = "rpm2cpio " + bin_file_name + " | cpio -id"
> + ret = os.system(cmdline)
> + if ret != 0:
> + return ret
> + for item in os.listdir('.'):
> + if re.match(pkgname + '([0-9\.\-\~]*)\.tar', item):
> + bin_file_name = item
> + break
> +
> + cmdline = "tar axf " + bin_file_name
> + ret = os.system(cmdline)
> +
> + os.chdir(cwd)
> + return ret
> +
> +# get the fall-back description when other way fail
> +# check homepage at same time
> +def guess_description_from_readme(readme):
> + global description, homepage
> + f = file(readme)
> + state = 0
> + desc = ''
> +
> + for line in f:
> + if state == 1 and re.match('^\n', line) and len(desc)> 80:
> + state = 2
> + if state == 0 and len(line)> 1:
> + state = 1
> + if state == 1:
> + desc += line
> +
> + match = re.search('(http\:\/\/.*$name.*\.org)', line)
> + if match:
> + url = match.group(1)
> + if re.search('bug') or len(homepage)> 1:
> + pass
> + else:
> + homepage = url
> +
> + f.close()
> + if (len(desc)> 4 and len(description)< 3):
> + description = desc
> +
> +def guess_description_from_freecode(pkgname):
> + global description
> + desc = ''
> + state = 0
> +
> + html = urllib.urlopen("http://freecode.com/projects/" + pkgname)
> + for line in html:
> + if state == 1:
> + desc += line
> + if state == 0 and re.search('\<div class\=\"project-detail\"\>', line):
> + state = 1
> + if state == 1 and re.search('\<\/p\>', line):
> + state = 2
> +
> + # deal the description
> + desc = re.sub('\<p\>', '', desc)
> + desc = re.sub('\<\/p\>', '', desc)
> + desc = re.sub('\r', '', desc)
> + desc = desc.strip()
> + if len(desc)> 10:
> + description = desc
> +
> +# get Summary from pkgconfig file
> +def guess_summary_from_pc(pc):
> + global summary
> +
> + fn = file(pc)
> + for line in fn:
> + match = re.match('Description:\s*(.*)', line)
> + if match and len(summary)< 2:
> + summary = match.group(1)
> + break
> +
> + summary = summary.strip()
> + fn.close()
> +
> +def guess_description(pkgdir):
> + global pkgname, description, summary
> +
> + readmes = []
> + pcs = []
> +
> + for subdir in os.listdir(pkgdir):
> + if re.match('^README$', subdir):
> + readmes.insert(0, os.path.join(pkgdir, subdir))
> + elif re.match('README.*', subdir):
> + readmes.append(os.path.join(pkgdir, subdir))
> + elif re.match('.*\.pc.*', subdir):
> + pcs.insert(0, os.path.join(pkgdir, subdir))
> + elif re.match(pkgname + '\.pc.*', subdir):
> + pcs.insert(0, os.path.join(pkgdir, subdir))
> + elif re.match('.*\.pc', subdir):
> + pcs.append(os.path.join(pkgdir, subdir))
> +
> + for readme in readmes:
> + guess_description_from_readme(os.path.join(pkgdir, readme))
> +
> + if (len(pkgname)> 2):
> + guess_description_from_freecode(pkgname)
> +
> + # clear the 'newline' in description
> + description = re.sub('\n', ' ', description)
> +
> + for pc in pcs:
> + guess_summary_from_pc(pc)
> +
> + # if didn't get summary, use first line of description
> + if len(summary)< 2:
> + summary = description
> + summary = re.sub("\n", " ", summary)
> + summary = re.sub("\s+", " ", summary)
> + match = re.match("(.*?)\.", summary)
> + if match:
> + summary = match.group(1)
> +
> +# the sha1sum values are from autospectacle
> +def setup_licenses():
> + licenses['06877624ea5c77efe3b7e39b0f909eda6e25a4ec'] = "GPLv2"
> + licenses["075d599585584bb0e4b526f5c40cb6b17e0da35a"] = "GPLv2"
> + licenses["10782dd732f42f49918c839e8a5e2894c508b079"] = "GPLv2"
> + licenses["2d29c273fda30310211bbf6a24127d589be09b6c"] = "GPLv2"
> + licenses["4df5d4b947cf4e63e675729dd3f168ba844483c7"] = "LGPLv2.1"
> + licenses["503df7650052cf38efde55e85f0fe363e59b9739"] = "GPLv2"
> + licenses["5405311284eab5ab51113f87c9bfac435c695bb9"] = "GPLv2"
> + licenses["5fb362ef1680e635fe5fb212b55eef4db9ead48f"] = "LGPLv2"
> + licenses["68c94ffc34f8ad2d7bfae3f5a6b996409211c1b1"] = "GPLv2"
> + licenses["66c77efd1cf9c70d4f982ea59487b2eeb6338e26"] = "LGPLv2.1"
> + licenses["74a8a6531a42e124df07ab5599aad63870fa0bd4"] = "GPLv2"
> + licenses["8088b44375ef05202c0fca4e9e82d47591563609"] = "LGPLv2.1"
> + licenses["8624bcdae55baeef00cd11d5dfcfa60f68710a02"] = "GPLv3"
> + licenses["8e57ffebd0ed4417edc22e3f404ea3664d7fed27"] = "MIT"
> + licenses["99b5245b4714b9b89e7584bfc88da64e2d315b81"] = "BSD"
> + licenses["aba8d76d0af67d57da3c3c321caa59f3d242386b"] = "MPLv1.1"
> + licenses["bf50bac24e7ec325dbb09c6b6c4dcc88a7d79e8f"] = "LGPLv2"
> + licenses["caeb68c46fa36651acf592771d09de7937926bb3"] = "LGPLv2.1"
> + licenses["dfac199a7539a404407098a2541b9482279f690d"] = "GPLv2"
> + licenses["e60c2e780886f95df9c9ee36992b8edabec00bcc"] = "LGPLv2.1"
> + licenses["c931aad3017d975b7f20666cde0953234a9efde3"] = "GPLv2"
> +
> +def guess_licenses_from_file(copying, relname):
> + global licenses, license
> +
> + sha1 = sha.new()
> +
> + fn = open(copying)
> + content = fn.read()
> + fn.close()
> +
> + sha1.update(content)
> + digest = sha1.hexdigest()
> +
> + if digest in licenses:
> + license.append(licenses[digest])
> + md_five = md5.new()
> + md_five.update(content)
> + license_files[relname] = md_five.hexdigest()
> +
> +def guess_licenses_from_freecode():
> + global license
> +
> + lic = ''
> + state = 0
> +
> + html = urllib.urlopen("http://freecode.com/projects/" + pkgname)
> + for line in html:
> + if state == 1:
> + lic += line
> + if state == 0 and re.search('<th><span>Licenses</span></th>', line):
> + state = 1
> + if state == 1 and re.search('</a>', line):
> + state = 2
> +
> + # deal the license
> + lic = lic.strip()
> + match = re.search('<a.*?>(.*?)</a>', lic)
> + if match:
> + license.append(match.group(1))
> +
> +def guess_license(pkgdir):
> + global unchecked_license_files
> + licfile = os.path.join(pkgdir, 'LICENSE')
> + if os.path.isfile(licfile):
> + unchecked_license_files.append('LICENSE')
> + guess_licenses_from_file(licfile, 'LICENSE')
> + licfile = os.path.join(pkgdir, 'COPYING')
> + if os.path.isfile(licfile):
> + unchecked_license_files.append('COPYING')
> + guess_licenses_from_file(licfile,'COPYING')
> + licfile = os.path.join(pkgdir, 'COPYING.LIB')
> + if os.path.isfile(licfile):
> + unchecked_license_files.append('COPYING.LIB')
> + guess_licenses_from_file(licfile, 'COPYING.LIB')
> + licfile = os.path.join(pkgdir, 'COPYRIGHT')
> + if os.path.isfile(licfile):
> + unchecked_license_files.append('COPYRIGHT')
> + guess_licenses_from_file(licfile, 'COPYRIGHT')
> +
> +def process_configure(pkgdir):
> + if os.path.isfile(os.path.join(pkgdir, 'autogen.sh')):
> + os.system("cd " + pkgdir + " ; ./autogen.sh&> /dev/null");
> +
> + configure = os.path.join(pkgdir, 'configure')
> + if os.path.isfile(configure):
> + if 'autotools' not in inherits:
> + inherits.append('autotools')
> +
> + global pkgname
> + fn = open(configure)
> + for line in fn:
> + match = re.match('PACKAGE_NAME=\'(.*?)\'', line)
> + if match and len(pkgname) == 0:
> + pkgname = match.group(1)
> +
> + match = re.match('PACKAGE_TARNAME=\'(.*?)\'', line)
> + if match:
> + pkgname = match.group(1)
> +
> + match = re.match('PACKAGE_VERSION=\'(.*?)\'', line)
> + if match:
> + pkgversion = match.group(1)
> +
> + match = re.match('PACKAGE_URL=\'(.*?)\'', line)
> + if match:
> + homepage = match.group(1)
> +
> + fn.close()
> +
> +def push_buildreq(dep):
> + global depends
> +
> + # remove collateral ] ) etc damage in the string
> + dep = re.sub("\"", "", dep)
> + dep = re.sub("\)", "", dep)
> + dep = re.sub("\]", "", dep)
> + dep = re.sub("\[", "", dep)
> +
> + # first, undo the space packing
> + dep = re.sub(">=", ">= ", dep)
> + dep = re.sub(">", "> ", dep)
> + dep = re.sub("<=", "<= ", dep)
> + dep = re.sub("<", "< ", dep)
> +
> + items = dep.split(' ')
> + dep = items[0]
> +
> + # don't show configure variables, we can't deal with them
> + if re.search("\$", dep):
> + return
> + if re.search("AC_SUBST", dep):
> + return
> +
> + if dep not in depends:
> + depends.append(dep)
> +
> +def parse_configure_ac(ac_file):
> + depth = 0
> + clause = ""
> +
> + fac = file(ac_file)
> +
> + for line in fac:
> + line = line.strip()
> + i = 0
> + while i< len(line):
> + if line[i] == '(':
> + depth += 1
> + if line[i] == ')' and depth> 0:
> + depth -= 1
> + clause += line[i]
> + i += 1
> + if depth> 0:
> + continue
> +
> + # remove '\n'
> + clause = re.sub('\n', '', clause)
> + clause = clause.strip()
> +
> + match = re.match('PKG_CHECK_MODULES\((.*)\)', clause)
> + if match:
> + modules = match.group(1)
> + pkg = modules.split(',')[1].strip()
> + match2 = re.match('\[(.*)\]', pkg)
> + if match2:
> + pkg = match2.group(1)
> +
> + # split the build dependencies
> + pkg = pkg.replace('\s+', ' ')
> + pkg = re.sub('\s>\s', '>', pkg)
> + pkg = re.sub('\s>=\s', '>=', pkg)
> + pkg = re.sub('\s=\s', '=', pkg)
> + pkg = re.sub('\s<=\s', '<=', pkg)
> + pkg = re.sub('\s<\s', '<', pkg)
> + pkglist = pkg.split(' ')
> + for dep in pkglist:
> + push_buildreq(dep)
> +
> + match = re.match('PKG_CHECK_EXISTS\((.*)\)', clause)
> + if match:
> + exists = match.group(1)
> + pkg = exists.split(',', 1)[0].strip()
> + match2 = re.match('\[(.*)\]', pkg)
> + if match2:
> + pkg = match2.group(1)
> + pkg = pkg.strip()
> +
> + pkg = re.sub('\s+', ' ', pkg)
> + pkg = re.sub('\s>\s', '>', pkg)
> + pkg = re.sub('\s>=\s', '>=', pkg)
> + pkg = re.sub('\s=\s', '=', pkg)
> + pkg = re.sub('\s<=\s', '<=', pkg)
> + pkg = re.sub('\s<\s', '<', pkg)
> + pkglist = pkg.split(' ')
> + for dep in pkglist:
> + push_buildreq(dep)
> +
> + # these items are from autospectacle.pl
> + if re.search('_PROG_INTLTOOL', clause):
> + push_buildreq("intltool")
> + if re.search('GETTEXT_PACKAGE', clause):
> + push_buildreq('gettext')
> + if re.search('GTK_DOC_CHECK', clause):
> + push_buildreq('gtk-doc')
> + if re.search('GNOME_DOC_INIT', clause):
> + push_buildreq('gnome-doc-utils')
> + if re.search('AM_GLIB_GNU_GETTEXT', clause):
> + push_buildreq('gettext')
> +
> + match = re.search('AC_INIT\((.*)\)', clause)
> + if match:
> + ac_init = match.group(1)
> + ac_init = ac_init.strip()
> + ac_init = re.sub('\s+', ' ', ac_init)
> + items = ac_init.split(',')
> + version = ''
> + if len(items)>= 2:
> + version = items[1].strip()
> +
> + if re.match('\d+(\.\d+)*', version):
> + pkgversion = version
> +
> + match = re.search('AM_INIT_AUTOMAKE\((.*)\)', clause)
> + if match:
> + am_init = match.group(1)
> + am_init = re.sub('\s+', ' ', am_init)
> + items = am_init.split(',')
> + if len(items)>= 2:
> + ver = items[1]
> + ver = re.sub('\[', '', ver)
> + ver = re.sub('\]', '', ver)
> + if re.match('\d(\.\d+)*', ver):
> + pkgversion = ver
> + clause = ''
> + fac.close
> +
> +def process_configure_ac(pkgdir):
> + configure_acs = []
> + for root, dirnames, filenames in os.walk(pkgdir):
> + for f in filenames:
> + if re.match('.*\.ac', f):
> + configure_acs.append(os.path.join(root, f))
> + if 'autotools' not in inherits:
> + inherits.append('autotools')
> +
> + for ac in configure_acs:
> + parse_configure_ac(ac)
> +
> +# check the *.pro files and get build requires from 'PKGCONFIG'
> +def process_qmake_pro(pkgdir):
> + global pkgname
> +
> + pro_files = []
> + depth = 0
> + clause = ''
> + pre_char = ''
> +
> + if os.path.isfile(os.path.join(pkgdir, pkgname + '.pro')) and 'qmake2' not in inherits:
> + inherits.append('qmake2')
> + for root, dirnames, filenames in os.walk(pkgdir):
> + for f in filenames:
> + if f.endswith('.pro'):
> + pro_files.append(os.path.join(root, f))
> +
> + for pro in pro_files:
> + need_next_line = False
> + f = file(pro)
> + for line in f:
> + if line.startswith('#'):
> + continue
> + line = re.sub('\n', '', line)
> + clause += line
> + if line.endswith('\\'):
> + continue
> +
> + clause = clause.strip()
> + match = re.match('PKGCONFIG\s*=(.*)', clause)
> + if match:
> + dep = match.group(1)
> + push_buildreq(dep)
> + match = re.match('PKGCONFIG\s*\+=(.*)', clause)
> + if match:
> + dep = match.group(1)
> + dep = dep.strip()
> + dep = re.sub('\\\\', '', dep)
> + dep = re.sub('\s+', ' ', dep)
> + items = dep.split(' ')
> + for item in items:
> + push_buildreq(item)
> +
> + clause = ''
> +
> + f.close()
> +
> +# spec file has rpm macros, may not so reliable
> +def parse_spec_file(srcdir):
> + # find the spec file first
> + spec_file = ''
> + for item in os.listdir(srcdir):
> + if item.endswith('.spec'):
> + spec_file = os.path.join(srcdir, item)
> + break
> +
> + if len(spec_file) == 0:
> + return 1
> +
> + global pkgname, pkgversion, summary, description, depends
> + global src_uri, homepage
> +
> + f = open(spec_file)
> + for line in f:
> + match = re.match('Summary\s*:(.*)', line)
> + if match:
> + if len(summary) == 0:
> + summary = match.group(1).strip()
> + continue
> + match = re.match('Name\s*:(.*)', line)
> + if match and len(pkgname) == 0:
> + pkgname = match.group(1).strip()
> + continue
> + match = re.match('Version\s*:(.*)', line)
> + if match:
> + version = match.group(1).strip()
> + if re.match('\d+(\.\d+)?', version):
> + pkgversion = version
> + continue
> + match = re.match('License\s*:(.*)', line)
> + if match:
> + license.append(match.group(1).strip())
> + continue
> + match = re.match('URL(?i)\s*:(.*)', line)
> + if match:
> + homepage = match.group(1).strip()
> + continue
> + match = re.match('Source0*\s*:(.*)', line)
> + if match and is_local_src:
> + src_uri = match.group(1).strip()
> + src_uri = re.sub('\%\{name\}', pkgname, src_uri)
> + src_uri = re.sub('\%\{version\}', pkgversion, src_uri)
> + continue
> + match = re.match('BuildRequires\s*:(.*)', line)
> + if match:
> + deps = match.group(1).strip()
> + deps = re.sub(',', ' ', deps)
> + deps = re.sub('\s+', ' ', deps)
> + deps = re.sub('\s*>\s*', '>', deps)
> + deps = re.sub('\s*>=\s*', '>=', deps)
> + deps = re.sub('\s*<\s*', '<', deps)
> + deps = re.sub('\s*<=\s*', '<=', deps)
> + for item in deps.split(' '):
> + push_buildreq(item)
> +
> + match = re.match('%description\s*$', line)
> + if match:
> + for l in f:
> + if l.startswith('%'):
> + break
> + description += l
> + description = re.sub('\n', '', description)
> +
> + f.close()
> +
> +def write_bbfile():
> + if len(pkgname) == 0 or len(pkgversion) == 0:
> + fail_quit("Can't get package name or version.")
> +
> + content = ''
> + content += 'DESCRIPTION = "' + description + '"\n'
> + content += 'SUMMARY = "' + summary + '"\n'
> + if len(homepage)> 0:
> + content += 'HOMEPAGE = "' + homepage + '"\n'
> +
> + content += 'LICENSE = "'
> + for lic in license:
> + content += lic + ' '
> + content += '"\n'
> + content += 'LIC_FILES_CHKSUM = "'
> + indent = ''
> + for key in license_files:
> + content += indent + 'file://' + key + ';md5=' + license_files[key] + ' \\\n';
> + indent = '\t\t'
> + content += indent + '"\n\n';
> +
> + if len(license) == 0:
> + guess_licenses_from_freecode()
> + print '\nCan NOT get license from package itself.'
> + if len(license)> 0:
> + print 'Get license from freecode.com is: '
> + print ' ', license[0]
> + if len(unchecked_license_files)> 0:
> + lic_files = ' '
> + for l_file in unchecked_license_files:
> + lic_files += l_file + ' '
> + print 'Suggest to check license file(s):'
> + print lic_files
> + print 'Please update the license and license file manually.'
> + elif len(license_files) == 0 and len(unchecked_license_files)> 0:
> + print '\nCan NOT find the license file, please check:'
> + for lic_file in unchecked_license_files:
> + print ' ' + lic_file,
> + print
> + print 'Please update the license and license file manually.'
> +
> + if len(depends)> 0:
> + content += 'DEPENDS = "'
> + for dep in depends:
> + content += dep + ' '
> + content += ' "\n'
> +
> + content += 'PR = "r0"\n\n'
> +
> + if is_local_src:
> + print 'You provide a local source package. Please update SRC_URI with repository link.'
> + content += 'SRC_URI = " \\\n'
> + else:
> + content += 'SRC_URI = "' + src_uri + ' \\\n'
> + for patch in patches:
> + items = patch.rsplit('/', 1)
> + content += '\tfile://' + items[1] + ' \\\n'
> + content += '\t"\n'
> + content += 'SRC_URI[md5sum] = "' + src_uri_md5sum + '"\n'
> + content += 'SRC_URI[sha256sum] = "' + src_uri_sha256sum + '"\n'
> +
> + if len(inherits)> 0:
> + content += '\ninherit '
> + for inherit in inherits:
> + content += inherit + ' '
> + content += '\n'
> +
> + cwd = os.getcwd()
> + os.chdir(bbdir)
> + bb_filename = pkgname + '_' + pkgversion + '.bb'
> + bb_file = open(bb_filename, 'w')
> + bb_file.write(content)
> + bb_file.close()
> + os.chdir(cwd)
> + print '\nCreate bb file: %s/%s' % (bbdir, bb_filename)
> +
> +def fail_quit(msg):
> + print msg
> + clean_up()
> + exit(1)
> +
> +def clean_up():
> + shutil.rmtree(tmpdir)
> + pass
> +
> +##########################################################
> +
> +if __name__ == '__main__':
> + if (len(sys.argv)< 2):
> + usage()
> + exit(1)
> +
> + src_uri = sys.argv[1]
> +
> + index = 2
> + while index< len(sys.argv):
> + patches.append(sys.argv[index])
> + index += 1
> +
> + guess_name_version_by_uri(src_uri)
> + if pkgname is None:
> + print "Can't get the package name."
> + exit(1)
> +
> + # create output dir
> + bbdir = os.path.join(os.getcwd(), pkgname)
> + if os.path.exists(bbdir):
> + if not os.path.isdir(bbdir):
> + os.remove(bbdir)
> + else:
> + os.mkdir(bbdir)
> +
> + if os.path.isdir(tmpdir):
> + shutil.rmtree(tmpdir)
> + os.mkdir(tmpdir)
> + ret = download(src_uri, tmpdir, True)
> + if ret != 0:
> + fail_quit('Download package failed. Make sure the SRC_URI is valid.')
> +
> + if unpack_package() != 0:
> + fail_quit('Unpack package failed.')
> +
> + patchdir = os.path.join(bbdir, pkgname + '-' + pkgversion)
> + if len(patches)> 0:
> + if os.path.exists(patchdir):
> + if not os.path.isdir(patchdir):
> + os.remove(patchdir)
> + else:
> + os.mkdir(patchdir)
> +
> + # deal with patches in arguments
> + for patch in patches:
> + ret = download(patch, patchdir)
> + if ret != 0:
> + print 'Patch %s is not valid, omit it.' % patch
> + patches.remove(patch)
> +
> + if pkgtype == 'rpm':
> + parse_spec_file(tmpdir)
> +
> + get_md5_sha256_sum()
> +
> + pkgdir = ''
> + for subdir in os.listdir(tmpdir):
> + subdir = os.path.join(tmpdir, subdir)
> + if os.path.isdir(subdir):
> + pkgdir = subdir
> + break
> + if pkgdir == '':
> + pkgdir = tmpdir
> +
> + if pkgtype == 'tar':
> + parse_spec_file(pkgdir)
> +
> + guess_description(pkgdir)
> + process_configure(pkgdir)
> +
> + setup_licenses()
> + guess_license(pkgdir)
> +
> + process_configure_ac(pkgdir)
> + process_qmake_pro(pkgdir)
> +
> + write_bbfile()
> + clean_up()
Good work.
@g
More information about the poky
mailing list