Openembedded Core Discussions
 help / color / mirror / Atom feed
* [PATCH 0/1] layerindex.bbclass: Add ability to fetch layers from layer index
@ 2015-01-07  6:35 Chong Lu
  2015-01-07  6:35 ` [PATCH 1/1] " Chong Lu
  0 siblings, 1 reply; 4+ messages in thread
From: Chong Lu @ 2015-01-07  6:35 UTC (permalink / raw)
  To: openembedded-core

How to use this class:

For example:
If you want to build python-nova, first you should know meta-openstack layer includes python-nova.
And then, add meta-openstack to conf/bblayers.conf:

    ...
    BBLAYERS ?= " \
      /buildarea2/clu1/source/poky/meta \
      /buildarea2/clu1/source/poky/meta-yocto \
      /buildarea2/clu1/source/poky/meta-yocto-bsp \
      /buildarea2/clu1/source/poky/meta-cloud-services/meta-openstack \
      "
    ...

And then, run "bitbake python-nova", we will get following error:

    $ bitbake python-nova
    ERROR: Layer 'meta-openstack' depends on layer 'meta-ruby', but this layer is not enabled in your configuration
    Add '/buildarea2/clu1/source/poky/meta-openembedded/meta-ruby' to BBLAYERS. You can check conf/bblayers.conf
    
    Summary: There was 1 ERROR message shown, returning a non-zero exit code.

Check conf/bblayers.conf, the meta-ruby has already added to BBALYERS.

    ...
    BBLAYERS += "/buildarea2/clu1/source/poky/meta-openembedded/meta-ruby"

And then, run "bitbake python-nova", we will get following error:

    $ bitbake python-nova
    ERROR: Layer 'ruby-layer' depends on layer 'openembedded-layer', but this layer is not enabled in your configuration
    
    Summary: There was 1 ERROR message shown, returning a non-zero exit code.

We need add meta-oe to BBLAYERS and continue to run "bitbake python-nova", still error:

    $ bitbake python-nova
    ERROR: Layer 'meta-openstack' depends on layer 'meta-networking', but this layer is not enabled in your configuration
    Add '/buildarea2/clu1/source/poky/meta-openembedded/meta-networking' to BBLAYERS. You can check conf/bblayers.conf
    
    Summary: There was 1 ERROR message shown, returning a non-zero exit code.

Check conf/bblayers.conf, the meta-networking has already added to BBALYERS.

    ...
    BBLAYERS += "/buildarea2/clu1/source/poky/meta-openembedded/meta-networking"

Continue to run, will get error:

    $ bitbake python-nova
    ERROR: Layer 'networking-layer' depends on layer 'meta-python', but this layer is not enabled in your configuration
    
    Summary: There was 1 ERROR message shown, returning a non-zero exit code.

Add meta-python to BBLAYERS manually:

    ...
    BBLAYERS ?= " \
      /buildarea2/clu1/source/poky/meta \
      /buildarea2/clu1/source/poky/meta-yocto \
      /buildarea2/clu1/source/poky/meta-yocto-bsp \
      /buildarea2/clu1/source/poky/meta-cloud-services/meta-openstack \
      /buildarea2/clu1/source/poky/meta-openembedded/meta-oe \
      /buildarea2/clu1/source/poky/meta-openembedded/meta-python \
      "
    ...

Still run "bitbake python-nova", will fetch layer automatically:

    $ bitbake python-nova
    WARNING: Fetch 'meta-virtualization' to '/buildarea2/clu1/source/poky'
    Cloning into '/buildarea2/clu1/source/poky/meta-virtualization'...
    remote: Counting objects: 1461, done.
    remote: Compressing objects: 100% (791/791), done.
    remote: Total 1461 (delta 803), reused 1262 (delta 604)
    Receiving objects: 100% (1461/1461), 303.15 KiB | 158.00 KiB/s, done.
    Resolving deltas: 100% (803/803), done.
    Checking connectivity... done.
    ERROR: Layer 'meta-openstack' depends on layer 'meta-virtualization', but this layer is not enabled in your configuration
    Add '/buildarea2/clu1/source/poky/meta-virtualization' to BBLAYERS. You can check conf/bblayers.conf
    
    Summary: There was 1 WARNING message shown.
    Summary: There was 1 ERROR message shown, returning a non-zero exit code.

Check conf/bblayers.conf, meta-virtualization layer is added to BBLAYERS
Finally, run "bitbake python-nova", recipes are parsed.


The following changes since commit 2674ddb4b0c0645c91d1794cbd9166418b984351:

  dev-manual: Some minor fixes to some text. (2015-01-06 14:27:03 +0000)

are available in the git repository at:

  git://git.pokylinux.org/poky-contrib chonglu/layerindex
  http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=chonglu/layerindex

Chong Lu (1):
  layerindex.bbclass: Add ability to fetch layers from layer index

 meta/classes/layerindex.bbclass | 154 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 154 insertions(+)
 create mode 100644 meta/classes/layerindex.bbclass

-- 
1.9.1



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/1] layerindex.bbclass: Add ability to fetch layers from layer index
  2015-01-07  6:35 [PATCH 0/1] layerindex.bbclass: Add ability to fetch layers from layer index Chong Lu
@ 2015-01-07  6:35 ` Chong Lu
  2015-01-07  9:20   ` Paul Eggleton
  0 siblings, 1 reply; 4+ messages in thread
From: Chong Lu @ 2015-01-07  6:35 UTC (permalink / raw)
  To: openembedded-core

It maybe depends on other layers when one layer is added to BBLAYERS. If define
LAYERDEPENDS variable in this layer, we will get error from bitbake. But
sometimes, we don't have defined. Add a mechanism to fetch layers from layer
index and update bblayers.conf as appropriate. The layer index stores
dependencies of all layers. Query dependency from layer index and fetch layer
repo, then add this layer to BBLAYERS.

[YOCTO #5348]

Signed-off-by: Chong Lu <Chong.Lu@windriver.com>
---
 meta/classes/layerindex.bbclass | 154 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 154 insertions(+)
 create mode 100644 meta/classes/layerindex.bbclass

diff --git a/meta/classes/layerindex.bbclass b/meta/classes/layerindex.bbclass
new file mode 100644
index 0000000..21d4d97
--- /dev/null
+++ b/meta/classes/layerindex.bbclass
@@ -0,0 +1,154 @@
+LAYER_FETCH_DIR ??= "${COREBASE}"
+
+python layerindex_handler() {
+    import bb.event
+    if not e.data:
+        return
+
+    import httplib, urlparse, json
+    import os
+
+    def get_json_data(apiurl = "http://layers.openembedded.org/layerindex/api/"):
+        proxy_settings = os.environ.get("http_proxy", None)
+        conn = None
+        _parsedurl = urlparse.urlparse(apiurl)
+        path = _parsedurl.path
+        query = _parsedurl.query
+        def parse_url(url):
+            parsedurl = urlparse.urlparse(url)
+            try:
+                (host, port) = parsedurl.netloc.split(":")
+            except ValueError:
+                host = parsedurl.netloc
+                port = None
+
+            if port is None:
+                port = 80
+            else:
+                port = int(port)
+            return (host, port)
+
+        if proxy_settings is None:
+            host, port = parse_url(apiurl)
+            conn = httplib.HTTPConnection(host, port)
+            conn.request("GET", path + "?" + query)
+        else:
+            host, port = parse_url(proxy_settings)
+            conn = httplib.HTTPConnection(host, port)
+            conn.request("GET", apiurl)
+
+        r = conn.getresponse()
+        if r.status != 200:
+            bb.fatal("Failed to read " + path + ": %d %s" % (r.status, r.reason))
+        return json.loads(r.read())
+
+    def get_deps_url(name, layeritems, layerbranches, layerdependencies):
+        def layeritems_info(items_name = None, items_id = None):
+            litems = {}
+            for li in layeritems:
+                if li['name'] == items_name:
+                    litems['id'] = li['id']
+                    break
+                if li['id'] == items_id:
+                    litems['vcs_url'] = li['vcs_url']
+                    litems['name'] = li['name']
+                    break
+            return litems
+
+        def layerbranches_info(items_id):
+            lbranch = {}
+            for lb in layerbranches:
+                # branch is master.
+                if lb['layer'] == items_id and lb['branch'] == 1:
+                    lbranch['id'] = lb['id']
+                    lbranch['vcs_subdir'] = lb['vcs_subdir']
+                    break
+            if not lbranch['id']:
+                bb.fatal("The id of layerBranches is not found.")
+            return lbranch
+
+        def layerdependencies_info(lb_id):
+            ld_deps = []
+            for ld in layerdependencies:
+                if ld['layerbranch'] == lb_id and not ld['dependency'] in ld_deps:
+                    ld_deps.append(ld['dependency'])
+            if not ld_deps:
+                bb.fatal("The dependency of layerDependencies is not found.")
+            return ld_deps
+
+        itemsid = layeritems_info(items_name = name)['id']
+        lbid = layerbranches_info(itemsid)['id']
+        layerdict = {}
+        for dependency in layerdependencies_info(lbid):
+            layername = layeritems_info(items_id = dependency)['name']
+            layerurl = layeritems_info(items_id = dependency)['vcs_url']
+            layersubdir = layerbranches_info(dependency)['vcs_subdir']
+            layerdict[layername] = layerurl, layersubdir
+        return layerdict
+
+    import sys
+    import subprocess
+
+    def download_layer(url, subdir):
+        fetchdir = e.data.getVar("LAYER_FETCH_DIR", True)
+        if not fetchdir:
+            bb.fatal("Please set LAYER_FETCH_DIR variable.")
+        if not os.path.exists(fetchdir):
+            os.makedirs(fetchdir)
+        urldir = url.split("/")[-1]
+        if urldir.endswith(".git"):
+            urldir = urldir.split(".")[0]
+        repodir = os.path.join(fetchdir, urldir)
+        if subdir:
+            layerdir = os.path.join(repodir, subdir)
+        else:
+            layerdir = repodir
+        if not os.path.exists(layerdir):
+            bb.warn("Fetch '%s' to '%s'" % (layer, e.data.getVar("LAYER_FETCH_DIR", True)))
+            result = subprocess.call('git clone %s %s' % (url, repodir), shell = True)
+            if result:
+                bb.fatal("Failed to download %s" % url)
+            else:
+                return layerdir
+        else:
+            return layerdir
+
+    def add_layer(name, layerdir, bblayersconf):
+        f = None
+        if not os.path.exists(bblayersconf):
+            bb.fatal("Can't find conf/bblayers.conf")
+        bblayers = e.data.getVar('BBLAYERS', True).split()
+        layer = layerdir.split("/")[-1]
+        if not layerdir in bblayers:
+            if f:
+                f.close()
+            f = open(bblayersconf, 'aw')
+            f.write("BBLAYERS += \"%s\"\n" % layerdir)
+            f.close()
+            bb.fatal("Layer '%s' depends on layer '%s', but this layer is not enabled in your configuration\nAdd '%s' to BBLAYERS. You can check conf/bblayers.conf" % (name, layer, layerdir))
+
+    def get_layer():
+        layers = []
+        bblayers = e.data.getVar('BBLAYERS', True).split()
+        for bblayer in bblayers:
+            layer = bblayer.split("/")[-1]
+            if not layer == "meta":
+                layers.append(layer)
+        return layers
+
+    apilinks = get_json_data()
+    layeritems = get_json_data(apilinks['layerItems'])
+    layerbranches = get_json_data(apilinks['layerBranches'])
+    layerdependencies = get_json_data(apilinks['layerDependencies'])
+    bblayersconf = os.path.join(e.data.getVar('TOPDIR', True), 'conf/bblayers.conf')
+    names = get_layer()
+    for name in names:
+        layerdict = get_deps_url(name, layeritems, layerbranches, layerdependencies)
+        for layer in layerdict:
+            if not layer == "openembedded-core":
+                layerdir = download_layer(layerdict[layer][0], layerdict[layer][1])
+                add_layer(name, layerdir, bblayersconf)
+}
+
+addhandler layerindex_handler
+layerindex_handler[eventmask] = "bb.event.ParseStarted"
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/1] layerindex.bbclass: Add ability to fetch layers from layer index
  2015-01-07  6:35 ` [PATCH 1/1] " Chong Lu
@ 2015-01-07  9:20   ` Paul Eggleton
  2015-01-08  9:18     ` Chong Lu
  0 siblings, 1 reply; 4+ messages in thread
From: Paul Eggleton @ 2015-01-07  9:20 UTC (permalink / raw)
  To: Chong Lu; +Cc: openembedded-core

Hi Chong,

On Wednesday 07 January 2015 14:35:42 Chong Lu wrote:
> It maybe depends on other layers when one layer is added to BBLAYERS. If
> define LAYERDEPENDS variable in this layer, we will get error from bitbake.
> But sometimes, we don't have defined. Add a mechanism to fetch layers from
> layer index and update bblayers.conf as appropriate. The layer index stores
> dependencies of all layers. Query dependency from layer index and fetch
> layer repo, then add this layer to BBLAYERS.

Hmm, this is certainly interesting but not quite what I had in mind - I was 
thinking rather that bitbake-layers would be extended and it would be an 
explicit operation to add a layer from the layer index + all of its 
dependencies. We can of course also have something semi-automatic like this 
class, but the manual tool ought to come first IMHO (which the class could then 
make use of).

Cheers,
Paul

-- 

Paul Eggleton
Intel Open Source Technology Centre


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/1] layerindex.bbclass: Add ability to fetch layers from layer index
  2015-01-07  9:20   ` Paul Eggleton
@ 2015-01-08  9:18     ` Chong Lu
  0 siblings, 0 replies; 4+ messages in thread
From: Chong Lu @ 2015-01-08  9:18 UTC (permalink / raw)
  To: Paul Eggleton; +Cc: openembedded-core


On 01/07/2015 05:20 PM, Paul Eggleton wrote:
> Hi Chong,
>
> On Wednesday 07 January 2015 14:35:42 Chong Lu wrote:
>> It maybe depends on other layers when one layer is added to BBLAYERS. If
>> define LAYERDEPENDS variable in this layer, we will get error from bitbake.
>> But sometimes, we don't have defined. Add a mechanism to fetch layers from
>> layer index and update bblayers.conf as appropriate. The layer index stores
>> dependencies of all layers. Query dependency from layer index and fetch
>> layer repo, then add this layer to BBLAYERS.
> Hmm, this is certainly interesting but not quite what I had in mind - I was
> thinking rather that bitbake-layers would be extended and it would be an
> explicit operation to add a layer from the layer index + all of its
> dependencies. We can of course also have something semi-automatic like this
> class, but the manual tool ought to come first IMHO (which the class could then
> make use of).
>
> Cheers,
> Paul

Hi Paul,

Thanks for your reply. I will try to extend bitbake-layers.

Best Regards
Chong

>



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-01-08  9:18 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-07  6:35 [PATCH 0/1] layerindex.bbclass: Add ability to fetch layers from layer index Chong Lu
2015-01-07  6:35 ` [PATCH 1/1] " Chong Lu
2015-01-07  9:20   ` Paul Eggleton
2015-01-08  9:18     ` Chong Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox