This should have been tagged with "v2"

Bruce

On Thu, Aug 6, 2020 at 3:57 PM Bruce Ashfield via lists.openembedded.org
<bruce.ashfield=gmail....@lists.openembedded.org> wrote:

> From: Bruce Ashfield <bruce.ashfi...@gmail.com>
>
> Enable the kernel-yocto bbclass to use enhanced capabilities from
> the kern-tools symbol_why.pl.
>
> We bump the kern-tools SRCREV to pickup the reworking of symbol_why,
> which uses Kconfiglib to provide analysis on configuration values.
>
> This is useful for debugging why a symbol specified in a fragment
> did not end up in the final .config.
>
> We introduce two ways to interact with the new symbol_why:
>
>  1) a replacement of the existing kconf_check script
>  2) a dedicated task that is explicitly invoked to dump details
>     on the configuration.
>
> The kconf_check replacement is transparent to the user, and is
> run in exactly the same way as it was previously. But we get better
> output and more detailed diagnostics if there are symbols that
> don't make it into the final .config
>
> The second way to interact with symbol why is via the new task
> do_config_analysis. This is invoked like any other task, and by
> default will provide a full configuration analysis and point the
> user at files to look at for details.
>
> If a more targetted analysis is desired, then specific symbols
> can be set in the CONFIG_ANALYSIS variable. When this variable
> is set, the task will only run for the given symbols and provide
> per-variable links to the user. This variable can be set like
> any other, including specification in the local.conf:
>
>   CONFIG_ANALYSIS_pn-linux-yocto-dev = 'NF_CONNTRACK LOCALVERSION'
>
> Which produces output as follows:
>
>    WARNING: linux-yocto-dev-5.8-rc++gitAUTOINC+d22beb8f8a_8fc484ed37-r0
>    do_config_analysis: Configuration analysis executed, see:
> tmp/work/qemuarm64-poky-linux/linux-yocto-dev/5.8-rc++gitAUTOINC+d22beb8f8a_8fc484ed37-r0/NF_CONNTRACK-config-analysis.txt
> for details
>    WARNING: linux-yocto-dev-5.8-rc++gitAUTOINC+d22beb8f8a_8fc484ed37-r0
>    do_config_analysis: Configuration audit executed, see:
> tmp/work/qemuarm64-poky-linux/linux-yocto-dev/5.8-rc++gitAUTOINC+d22beb8f8a_8fc484ed37-r0/NF_CONNTRACK-config-audit.txt
> for details
>    WARNING: linux-yocto-dev-5.8-rc++gitAUTOINC+d22beb8f8a_8fc484ed37-r0
>    do_config_analysis: Configuration analysis executed, see:
> tmp/work/qemuarm64-poky-linux/linux-yocto-dev/5.8-rc++gitAUTOINC+d22beb8f8a_8fc484ed37-r0/LOCALVERSION-config-analysis.txt
> for details
>    WARNING: linux-yocto-dev-5.8-rc++gitAUTOINC+d22beb8f8a_8fc484ed37-r0
>    do_config_analysis: Configuration audit executed, see:
> work/qemuarm64-poky-linux/linux-yocto-dev/5.8-rc++gitAUTOINC+d22beb8f8a_8fc484ed37-r0/LOCALVERSION-config-audit.txt
> for details
>
> Signed-off-by: Bruce Ashfield <bruce.ashfi...@gmail.com>
> ---
>
> v2: - removed the bb.debug line that RP had to fixup previously
>     - fixed the detection of the .kernel-meta directory. This fixes the
>       meta-arm build issue, and should also help meta-intel.
>
> Note: you'll actually get a configuration warning out of meta-arm when
> you build now, but the warning is accurate and isn't a problem (an
> option goes from =m to =y).
>
> Bruce
>
>  meta/classes/kernel-yocto.bbclass             | 159 ++++++++++++++----
>  .../kern-tools/kern-tools-native_git.bb       |   2 +-
>  meta/recipes-kernel/linux/linux-yocto_5.4.bb  |   2 +-
>  3 files changed, 128 insertions(+), 35 deletions(-)
>
> diff --git a/meta/classes/kernel-yocto.bbclass
> b/meta/classes/kernel-yocto.bbclass
> index 70818cc01c..77849a28c9 100644
> --- a/meta/classes/kernel-yocto.bbclass
> +++ b/meta/classes/kernel-yocto.bbclass
> @@ -405,6 +405,67 @@ do_kernel_configme() {
>  }
>
>  addtask kernel_configme before do_configure after do_patch
> +addtask config_analysis
> +
> +do_config_analysis[depends] = "virtual/kernel:do_configure"
> +do_config_analysis[depends] += "kern-tools-native:do_populate_sysroot"
> +
> +CONFIG_AUDIT_FILE ?= "${WORKDIR}/config-audit.txt"
> +CONFIG_ANALYSIS_FILE ?= "${WORKDIR}/config-analysis.txt"
> +
> +python do_config_analysis() {
> +    import re, string, sys, subprocess
> +
> +    s = d.getVar('S')
> +
> +    env = os.environ.copy()
> +    env['PATH'] = "%s:%s%s" % (d.getVar('PATH'), s, "/scripts/util/")
> +    env['LD'] = d.getVar('KERNEL_LD')
> +    env['CC'] = d.getVar('KERNEL_CC')
> +    env['ARCH'] = d.getVar('ARCH')
> +    env['srctree'] = s
> +
> +    # read specific symbols from the kernel recipe or from local.conf
> +    # i.e.: CONFIG_ANALYSIS_pn-linux-yocto-dev = 'NF_CONNTRACK
> LOCALVERSION'
> +    config = d.getVar( 'CONFIG_ANALYSIS' )
> +    if not config:
> +       config = [ "" ]
> +    else:
> +       config = config.split()
> +
> +    for c in config:
> +        for action in ["analysis","audit"]:
> +            if action == "analysis":
> +                try:
> +                    analysis = subprocess.check_output(['symbol_why.py',
> '--dotconfig',  '{}'.format( d.getVar('B') + '/.config' ), '--blame', c],
> cwd=s, env=env ).decode('utf-8')
> +                except subprocess.CalledProcessError as e:
> +                    bb.fatal( "config analysis failed: %s" %
> e.output.decode('utf-8'))
> +
> +                outfile = d.getVar( 'CONFIG_ANALYSIS_FILE' )
> +
> +            if action == "audit":
> +                try:
> +                    analysis = subprocess.check_output(['symbol_why.py',
> '--dotconfig',  '{}'.format( d.getVar('B') + '/.config' ), '--summary',
> '--extended', '--sanity', c], cwd=s, env=env ).decode('utf-8')
> +                except subprocess.CalledProcessError as e:
> +                    bb.fatal( "config analysis failed: %s" %
> e.output.decode('utf-8'))
> +
> +                outfile = d.getVar( 'CONFIG_AUDIT_FILE' )
> +
> +            if c:
> +                outdir = os.path.dirname( outfile )
> +                outname = os.path.basename( outfile )
> +                outfile = outdir + '/'+ c + '-' + outname
> +
> +            if config and os.path.isfile(outfile):
> +                os.remove(outfile)
> +
> +            with open(outfile, 'w+') as f:
> +                f.write( analysis )
> +
> +            bb.warn( "Configuration {} executed, see: {} for
> details".format(action,outfile ))
> +            if c:
> +                bb.warn( analysis )
> +}
>
>  python do_kernel_configcheck() {
>      import re, string, sys, subprocess
> @@ -414,57 +475,89 @@ python do_kernel_configcheck() {
>      # meta-series for processing
>      kmeta = d.getVar("KMETA") or "meta"
>      if not os.path.exists(kmeta):
> -        kmeta = "." + kmeta
> +        kmeta = subprocess.check_output(['kgit',
> '--meta']).decode('utf-8').rstrip()
>
>      s = d.getVar('S')
>
>      env = os.environ.copy()
>      env['PATH'] = "%s:%s%s" % (d.getVar('PATH'), s, "/scripts/util/")
> -    env['LD'] = "${KERNEL_LD}"
> +    env['LD'] = d.getVar('KERNEL_LD')
> +    env['CC'] = d.getVar('KERNEL_CC')
> +    env['ARCH'] = d.getVar('ARCH')
> +    env['srctree'] = s
>
>      try:
>          configs = subprocess.check_output(['scc', '--configs', '-o', s +
> '/.kernel-meta'], env=env).decode('utf-8')
>      except subprocess.CalledProcessError as e:
>          bb.fatal( "Cannot gather config fragments for audit: %s" %
> e.output.decode("utf-8") )
>
> -    try:
> -        subprocess.check_call(['kconf_check', '--report', '-o',
> -                '%s/%s/cfg' % (s, kmeta), d.getVar('B') + '/.config', s,
> configs], cwd=s, env=env)
> -    except subprocess.CalledProcessError:
> -        # The configuration gathering can return different exit codes, but
> -        # we interpret them based on the KCONF_AUDIT_LEVEL variable, so
> we catch
> -        # everything here, and let the run continue.
> -        pass
> -
>      config_check_visibility = int(d.getVar("KCONF_AUDIT_LEVEL") or 0)
>      bsp_check_visibility = int(d.getVar("KCONF_BSP_AUDIT_LEVEL") or 0)
>
> -    # if config check visibility is non-zero, report dropped
> configuration values
> -    mismatch_file = d.expand("${S}/%s/cfg/mismatch.txt" % kmeta)
> -    if os.path.exists(mismatch_file):
> -        if config_check_visibility:
> -            with open (mismatch_file, "r") as myfile:
> +    # if config check visibility is "1", that's the lowest level of
> audit. So
> +    # we add the --classify option to the run, since classification will
> +    # streamline the output to only report options that could be boot
> issues,
> +    # or are otherwise required for proper operation.
> +    extra_params = ""
> +    if config_check_visibility == 1:
> +       extra_params = "--classify"
> +
> +    # category #1: mismatches
> +    try:
> +        analysis = subprocess.check_output(['symbol_why.py',
> '--dotconfig',  '{}'.format( d.getVar('B') + '/.config' ), '--mismatches',
> extra_params], cwd=s, env=env ).decode('utf-8')
> +    except subprocess.CalledProcessError as e:
> +        bb.fatal( "config analysis failed: %s" % e.output.decode('utf-8'))
> +
> +    if analysis:
> +        outfile = "{}/{}/cfg/mismatch.txt".format( s, kmeta )
> +        if os.path.isfile(outfile):
> +           os.remove(outfile)
> +        with open(outfile, 'w+') as f:
> +            f.write( analysis )
> +
> +        if config_check_visibility and os.stat(outfile).st_size > 0:
> +            with open (outfile, "r") as myfile:
>                  results = myfile.read()
>                  bb.warn( "[kernel config]: specified values did not make
> it into the kernel's final configuration:\n\n%s" % results)
>
> -    if bsp_check_visibility:
> -        invalid_file = d.expand("${S}/%s/cfg/invalid.cfg" % kmeta)
> -        if os.path.exists(invalid_file) and os.stat(invalid_file).st_size
> > 0:
> -            with open (invalid_file, "r") as myfile:
> -                results = myfile.read()
> -                bb.warn( "[kernel config]: This BSP sets config options
> that are not offered anywhere within this kernel:\n\n%s" % results)
> -        errors_file = d.expand("${S}/%s/cfg/fragment_errors.txt" % kmeta)
> -        if os.path.exists(errors_file) and os.stat(errors_file).st_size >
> 0:
> -            with open (errors_file, "r") as myfile:
> +    # category #2: invalid fragment elements
> +    extra_params = ""
> +    if bsp_check_visibility > 1:
> +        extra_params = "--strict"
> +    try:
> +        analysis = subprocess.check_output(['symbol_why.py',
> '--dotconfig',  '{}'.format( d.getVar('B') + '/.config' ), '--invalid',
> extra_params], cwd=s, env=env ).decode('utf-8')
> +    except subprocess.CalledProcessError as e:
> +        bb.fatal( "config analysis failed: %s" % e.output.decode('utf-8'))
> +
> +    if analysis:
> +        outfile = "{}/{}/cfg/invalid.txt".format(s,kmeta)
> +        if os.path.isfile(outfile):
> +           os.remove(outfile)
> +        with open(outfile, 'w+') as f:
> +            f.write( analysis )
> +
> +        if bsp_check_visibility and os.stat(outfile).st_size > 0:
> +            with open (outfile, "r") as myfile:
>                 results = myfile.read()
> -               bb.warn( "[kernel config]: This BSP contains fragments
> with errors:\n\n%s" % results)
> -
> -    # if the audit level is greater than two, we report if a fragment has
> overriden
> -    # a value from a base fragment. This is really only used for new
> kernel introduction
> -    if bsp_check_visibility > 2:
> -        redefinition_file = d.expand("${S}/%s/cfg/redefinition.txt" %
> kmeta)
> -        if os.path.exists(redefinition_file) and
> os.stat(redefinition_file).st_size > 0:
> -            with open (redefinition_file, "r") as myfile:
> +               bb.warn( "[kernel config]: This BSP contains fragments
> with warnings:\n\n%s" % results)
> +
> +    # category #3: redefined options (this is pretty verbose and is debug
> only)
> +    try:
> +        analysis = subprocess.check_output(['symbol_why.py',
> '--dotconfig',  '{}'.format( d.getVar('B') + '/.config' ), '--sanity'],
> cwd=s, env=env ).decode('utf-8')
> +    except subprocess.CalledProcessError as e:
> +        bb.fatal( "config analysis failed: %s" % e.output.decode('utf-8'))
> +
> +    if analysis:
> +        outfile = "{}/{}/cfg/redefinition.txt".format(s,kmeta)
> +        if os.path.isfile(outfile):
> +           os.remove(outfile)
> +        with open(outfile, 'w+') as f:
> +            f.write( analysis )
> +
> +        # if the audit level is greater than two, we report if a fragment
> has overriden
> +        # a value from a base fragment. This is really only used for new
> kernel introduction
> +        if bsp_check_visibility > 2 and os.stat(outfile).st_size > 0:
> +            with open (outfile, "r") as myfile:
>                  results = myfile.read()
>                  bb.warn( "[kernel config]: This BSP has configuration
> options defined in more than one config, with differing values:\n\n%s" %
> results)
>  }
> diff --git a/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
> b/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
> index 4f1af731d6..4402e14754 100644
> --- a/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
> +++ b/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
> @@ -4,7 +4,7 @@ LIC_FILES_CHKSUM =
> "file://tools/kgit;beginline=5;endline=9;md5=9c30e971d435e249
>
>  DEPENDS = "git-native"
>
> -SRCREV = "c66833e1caac25279a5052fceb13213f5e4f79f9"
> +SRCREV = "8b6fa727013daba5e8d72e5fc61d80caed944c6a"
>  PR = "r12"
>  PV = "0.2+git${SRCPV}"
>
> diff --git a/meta/recipes-kernel/linux/linux-yocto_5.4.bb
> b/meta/recipes-kernel/linux/linux-yocto_5.4.bb
> index 7904850317..3f9e6aa480 100644
> --- a/meta/recipes-kernel/linux/linux-yocto_5.4.bb
> +++ b/meta/recipes-kernel/linux/linux-yocto_5.4.bb
> @@ -38,7 +38,7 @@ DEPENDS += "openssl-native util-linux-native"
>  PV = "${LINUX_VERSION}+git${SRCPV}"
>
>  KMETA = "kernel-meta"
> -KCONF_BSP_AUDIT_LEVEL = "2"
> +KCONF_BSP_AUDIT_LEVEL = "1"
>
>  KERNEL_DEVICETREE_qemuarmv5 = "versatile-pb.dtb"
>
> --
> 2.19.1
>
> 
>


-- 
- Thou shalt not follow the NULL pointer, for chaos and madness await thee
at its end
- "Use the force Harry" - Gandalf, Star Trek II
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#141281): 
https://lists.openembedded.org/g/openembedded-core/message/141281
Mute This Topic: https://lists.openembedded.org/mt/76036065/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub  
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to