From: Martin Jansa <martin.jansa@gmail.com>
To: Chen Qi <Qi.Chen@windriver.com>
Cc: openembedded-core@lists.openembedded.org
Subject: Re: [PATCH 1/1] layer_extra_sanity.bbclass: add new bbclass
Date: Thu, 16 Apr 2015 12:31:33 +0200 [thread overview]
Message-ID: <20150416103133.GA2341@jama> (raw)
In-Reply-To: <c1c7339199e08085ed82ffed0d80356d5b177807.1429170493.git.Qi.Chen@windriver.com>
On Thu, Apr 16, 2015 at 03:49:19PM +0800, Chen Qi wrote:
> Add a new bbclass for extra sanity check for layers.
>
> These sanity checks include:
> *) conf/machine and conf/distro don't appear in the same layer.
> The rational is that distro specific changes and BSP specific changes
> should be splitted into different layers for better maintenance.
> The meta layer is an exception.
> *) A BSP layer is not included if MACHINE is not set to any of the conf file
> it provides.
> The rational is that BSP layer, by design, is supposed to make changes
> specific for the BSPs it covers. Including a BSP layer which doesn't contain
> a conf file matching the MACHINE setting might cause potential problem.
This is exactly the opposite of what the manual says.
BSP layer should be written in a way that it has no unwelcome
side-effects for other MACHINES (by proper usage of MACHINE overrides).
> *) Configuration files under conf/machine don't set distro specific variables
> such as DISTRO_FEATURES.
> The rational is that machine configuration files should not set things
> related to machine.
>
> [YOCTO #5427]
>
> Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
> ---
> meta/classes/layer_extra_sanity.bbclass | 91 +++++++++++++++++++++++++++++++++
> 1 file changed, 91 insertions(+)
> create mode 100644 meta/classes/layer_extra_sanity.bbclass
>
> diff --git a/meta/classes/layer_extra_sanity.bbclass b/meta/classes/layer_extra_sanity.bbclass
> new file mode 100644
> index 0000000..17671c3
> --- /dev/null
> +++ b/meta/classes/layer_extra_sanity.bbclass
> @@ -0,0 +1,91 @@
> +# Check conf/distro and conf/machine don't appear in the same layer
> +def check_machine_distro_dir(sanity_data):
> + bblayers = sanity_data.getVar('BBLAYERS', True).split()
> + for bblayer in bblayers:
> + bblayer = bblayer.rstrip('/')
> + # skip checking of the meta layer, it's special
> + if bblayer.endswith('meta'):
> + continue
> + if os.path.exists(bblayer + '/' + 'conf/machine') and os.path.exists(bblayer + '/' + 'conf/distro'):
> + bb.warn("Layer %s is providing both distro configurations and machine configurations. It's recommended that a layer should provide at most one of them." % bblayer)
> +
> +# Check that distro variables such as DISTRO_FEATURES are not being set in machine conf files
> +def check_distro_vars_machine(sanity_data):
> + import re
> +
> + bblayers = sanity_data.getVar('BBLAYERS', True).split()
> + distro_regex = re.compile("^DISTRO_.*=.*")
> + distro_var_match = False
> +
> + for bblayer in bblayers:
> + bblayer = bblayer.rstrip('/')
> + if bblayer.endswith('meta'):
> + continue
> + # Check .inc and .conf files under machine/conf don't set DISTRO_xxx vars
> + for dirpath, dirnames, filenames in os.walk('%s/conf/machine' % bblayer):
> + for f in filenames:
> + fpath = os.path.join(dirpath, f)
> + if fpath.endswith(".inc") or fpath.endswith(".conf"):
> + with open(fpath) as fopen:
> + for line in fopen:
> + if distro_regex.match(line):
> + distro_var_match = True
> + break
> + if distro_var_match:
> + break
> + if distro_var_match:
> + break
> + if distro_var_match:
> + bb.warn("Layer %s is setting distro specific variables in its machine conf files." % bblayer)
> + distro_var_match = False
> +
> +# Check that a disto/bsp layer is being included but MACHINE or DISTRO is not set to any conf
> +# file that it provides.
> +#
> +# The rational here is that if a BSP layer is supposed to have recipes or bbappend files that
> +# are only specific for the BSPs it provides. So if MACHINE is not set to any of the
> +# conf/machine/*.conf file in that layer, very likely the user is accidently including a BSP layer.
> +# The same logic goes for distro layers.
> +def check_unneedded_bsp_distro_layer(sanity_data):
> + machine = sanity_data.getVar('MACHINE', True)
> + distro = sanity_data.getVar('DISTRO', True)
> + bblayers = sanity_data.getVar('BBLAYERS', True).split()
> +
> + for bblayer in bblayers:
> + bblayer = bblayer.rstrip('/')
> + if bblayer.endswith('meta'):
> + continue
> + is_bsp = os.path.exists(bblayer + '/' + 'conf/machine')
> + is_distro = os.path.exists(bblayer + '/' + 'conf/distro')
> + if is_bsp and not is_distro:
> + if not os.path.exists(bblayer + '/' + 'conf/machine/' + machine + '.conf'):
> + bb.warn("BSP layer %s is included but MACHINE is not set to any conf file it provides." % bblayer)
> + elif not is_bsp and is_distro:
> + if not os.path.exists(bblayer + '/' + 'conf/distro/' + distro + '.conf'):
> + bb.warn("Distro layer %s is included but DISTRO is not set to any conf file it provides." % bblayer)
> +
> +# Create a copy of the datastore and finalise it to ensure appends and
> +# overrides are set - the datastore has yet to be finalised at ConfigParsed
> +def copy_data(e):
> + sanity_data = bb.data.createCopy(e.data)
> + sanity_data.finalize()
> + return sanity_data
> +
> +def layer_extra_check_sanity(sanity_data):
> + check_machine_distro_dir(sanity_data)
> + check_unneedded_bsp_distro_layer(sanity_data)
> + check_distro_vars_machine(sanity_data)
> +
> +addhandler check_layer_extra_sanity_eventhandler
> +check_layer_extra_sanity_eventhandler[eventmask] = "bb.event.SanityCheck"
> +python check_layer_extra_sanity_eventhandler() {
> + if bb.event.getName(e) == "SanityCheck":
> + sanity_data = copy_data(e)
> + if e.generateevents:
> + sanity_data.setVar("SANITY_USE_EVENTS", "1")
> + layer_extra_check_sanity(sanity_data)
> + e.data.setVar("BB_INVALIDCONF", False)
> + bb.event.fire(bb.event.SanityCheckPassed(), e.data)
> +
> + return
> +}
> --
> 1.9.1
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
--
Martin 'JaMa' Jansa jabber: Martin.Jansa@gmail.com
next prev parent reply other threads:[~2015-04-16 10:31 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-16 7:49 [PATCH 0/1] layer_extra_sanity.bbclass: add new bbclass Chen Qi
2015-04-16 7:49 ` [PATCH 1/1] " Chen Qi
2015-04-16 10:31 ` Martin Jansa [this message]
2015-04-16 21:26 ` Otavio Salvador
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=20150416103133.GA2341@jama \
--to=martin.jansa@gmail.com \
--cc=Qi.Chen@windriver.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.