From: Haris Okanovic <harisokn@gmail.com>
To: openembedded-core@lists.openembedded.org
Cc: Haris Okanovic <haris.okanovic@ni.com>
Subject: Re: [PATCH 1/2] package.bbclass/package.py: Add do_install_source() task
Date: Tue, 19 Jan 2016 15:51:28 -0600 [thread overview]
Message-ID: <569EAFE0.6050207@gmail.com> (raw)
In-Reply-To: <1450139152-19802-1-git-send-email-haris.okanovic@ni.com>
Are there any other issues with this change?
Andre raised a few several weeks ago, when this was still an RFC*. Those
were all addressed in the initial patch.
* http://thread.gmane.org/gmane.comp.handhelds.openembedded.core/72660
-- Haris
On 12/14/2015 06:25 PM, Haris Okanovic wrote:
> Add do_install_source() task to stage a recipe's SRC_URI files under
> SRC_D.
>
> Dependencies:
> After do_fetch() to ensure SRC_URI files are downloaded
> After do_install() because it resets ${D} that's also used by this task
> Before do_package() to stage files before writing installers
>
> No-ops unless ENABLE_SRC_INSTALL_${PN} = 1, which needs to be set in
> distro config or recipes wanting to use this facility.
>
> This is change is part of a series which add source packages to OE.
> See the following thread for more information:
> http://thread.gmane.org/gmane.comp.handhelds.openembedded.core/72660
>
> Signed-off-by: Haris Okanovic <haris.okanovic@ni.com>
> ---
> meta/classes/package.bbclass | 5 +++
> meta/conf/documentation.conf | 1 +
> meta/lib/oe/package.py | 96 ++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 102 insertions(+)
>
> diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
> index d731757..98f01e5 100644
> --- a/meta/classes/package.bbclass
> +++ b/meta/classes/package.bbclass
> @@ -2079,3 +2079,8 @@ def mapping_rename_hook(d):
> runtime_mapping_rename("RRECOMMENDS", pkg, d)
> runtime_mapping_rename("RSUGGESTS", pkg, d)
>
> +addtask do_install_source after do_fetch after do_install before do_package
> +
> +python do_install_source () {
> + oe.package.do_install_source(d)
> +}
> diff --git a/meta/conf/documentation.conf b/meta/conf/documentation.conf
> index 845559a..0df8a2f 100644
> --- a/meta/conf/documentation.conf
> +++ b/meta/conf/documentation.conf
> @@ -26,6 +26,7 @@ do_fetchall[doc] = "Fetches all remote sources required to build a target"
> do_generate_qt_config_file[doc] = "Writes a qt.conf file for building a Qt-based application"
> do_install[doc] = "Copies files from the compilation directory to a holding area"
> do_install_ptest_base[doc] = "Copies the runtime test suite files from the compilation directory to a holding area"
> +do_install_source[doc] = "Stages source code for packaging"
> do_kernel_checkout[doc] = "Checks out source/meta branches for a linux-yocto style kernel"
> do_kernel_configcheck[doc] = "Validates the kernel configuration for a linux-yocto style kernel"
> do_kernel_configme[doc] = "Assembles the kernel configuration for a linux-yocto style kernel"
> diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
> index ea6feaa..c85aa22 100644
> --- a/meta/lib/oe/package.py
> +++ b/meta/lib/oe/package.py
> @@ -123,3 +123,99 @@ def read_shlib_providers(d):
> shlib_provider[s[0]] = {}
> shlib_provider[s[0]][s[1]] = (dep_pkg, s[2])
> return shlib_provider
> +
> +def archive_dir(dirPath, archivePath):
> + ''' Create tar.bz2 archive at archivePath from dirPath '''
> + import os, oe, bb
> +
> + arDir = os.path.dirname(dirPath)
> + arName = os.path.basename(dirPath)
> +
> + cmd = 'tar -c -I pbzip2 -f \"%s\" -C \"%s\" -p \"%s\"' % (archivePath, arDir, arName)
> + (retval, output) = oe.utils.getstatusoutput(cmd)
> + if retval:
> + bb.fatal('Failed to archive %s --> %s: %s %s' % (dirPath, archivePath, cmd, output))
> +
> +def do_install_source(d):
> + ''' Stage recipe's source for packaging '''
> + import os, oe, bb
> +
> + pn = d.getVar("PN", True)
> +
> + if d.getVar("ENABLE_SRC_INSTALL_%s" % pn, True) != "1":
> + return
> +
> + packages = (d.getVar("PACKAGES", True) or "").split()
> + if ("%s-src" % pn) not in packages:
> + # Some recipes redefine PACKAGES without ${PN}-src. Don't stage
> + # anything in this case to avoid installed-vs-shipped warning.
> + return
> +
> + urls = (d.getVar('SRC_URI', True) or "").split()
> + if len(urls) == 0:
> + return
> +
> + workdir = d.getVar('WORKDIR', True)
> +
> + # TODO rm_work() should clean this up
> + unpackTempDir = os.path.join(workdir, 'install-source-unpack-temp')
> + if os.path.exists(unpackTempDir):
> + bb.utils.remove(unpackTempDir, recurse=True)
> + os.makedirs(unpackTempDir, 0755)
> +
> + src_d = d.getVar("SRC_D", True)
> + if os.path.exists(src_d):
> + bb.warn("SRC_D already exist. Removing.")
> + bb.utils.remove(src_d, recurse=True)
> + os.makedirs(src_d, 0755)
> +
> + fetcher = bb.fetch2.Fetch(urls, d)
> +
> + fileManif = []
> + for url in urls:
> + urlScheme = bb.fetch2.decodeurl(url)[0]
> + srcPath = fetcher.localpath(url)
> + srcName = os.path.basename(srcPath)
> +
> + dstName = srcName
> + if os.path.isdir(srcPath):
> + dstName += '.tar.bz2'
> +
> + dstPath = os.path.join(src_d, dstName)
> +
> + # fetch() doesn't retrieve any actual files from git:// URLs,
> + # so we do an additional unpack() step to get something useful
> + # for these.
> + # TODO: May need to pre-process other revision control schemes
> + if urlScheme == 'git':
> + unpackPath = os.path.join(unpackTempDir, srcName)
> + if os.path.exists(unpackPath):
> + bb.utils.remove(unpackPath, recurse=True)
> + os.makedirs(unpackPath, 0755)
> +
> + fetcher.unpack(unpackPath, [url])
> +
> + # unpack() puts actual source in a 'git' subdir
> + srcPath = os.path.join(unpackPath, 'git')
> +
> + if os.path.exists(dstPath):
> + bb.warn('Duplicate file %s in SRC_URI. Overwriting.' % dstName)
> + bb.utils.remove(dstPath, recurse=True)
> +
> + if not dstName in fileManif:
> + fileManif.append(dstName)
> +
> + if os.path.isdir(srcPath):
> + archive_dir(srcPath, dstPath)
> + else:
> + bb.utils.copyfile(srcPath, dstPath)
> +
> + manifFilePath = os.path.join(src_d, 'manifest')
> + if os.path.exists(manifFilePath):
> + bb.warn('manifest file found in SRC_URI. Overwriting.')
> + bb.utils.remove(manifFilePath, recurse=True)
> +
> + with open(manifFilePath, 'wb') as manif:
> + for fname in fileManif:
> + manif.write(fname)
> + manif.write('\n')
>
prev parent reply other threads:[~2016-01-19 21:51 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-08 20:53 [RFC] Source packages Haris Okanovic
2015-12-09 17:56 ` Andre McCurdy
2015-12-10 18:59 ` Haris Okanovic
2015-12-15 0:25 ` [PATCH 1/2] package.bbclass/package.py: Add do_install_source() task Haris Okanovic
2015-12-15 0:25 ` [PATCH 2/2] bitbake.conf: Define source package, disabled by default Haris Okanovic
2016-01-19 21:51 ` Haris Okanovic
2016-01-19 21:51 ` Haris Okanovic [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=569EAFE0.6050207@gmail.com \
--to=harisokn@gmail.com \
--cc=haris.okanovic@ni.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.