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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox