kumquat-buildroot/support/scripts
Yann E. MORIN f48c08f0f5 support/graph-depends: detect circular dependencies
Currently, if there is a circular dependency in the packages, the
graph-depends script just errors out with a Python RuntimeError which is
not caught, resulting in a very-long backtrace which does not provide
any hint as what the real issue is (even if "RuntimeError: maximum
recursion depth exceeded" is a pretty good hint at it).

We fix that by recursing the dependency chain of each package, until we
either end up with a package with no dependency, or with a package
already seen along the current dependency chain.

We need to introduce a new function, check_circular_deps(), because we
can't re-use the existing ones:

  - remove_mandatory_deps() does not iterate,

  - remove_transitive_deps() does iterate, but we do not call it for the
    top-level package if it is not 'all'

  - it does not make sense to use those functions anyway, as they were
    not designed to _check_ but to _act_ on the dependency chain.

Since we've had time-related issues in the past, we do not want to
introduce yet another time-hog, so here are timings with the circular
dependency check:

    $ time python -m cProfile -s cumtime support/scripts/graph-depends
    [...]
             28352654 function calls (20323050 primitive calls) in 87.292 seconds

       Ordered by: cumulative time

       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
            1    0.012    0.012   87.292   87.292 graph-depends:24(<module>)
           21    0.000    0.000   73.685    3.509 subprocess.py:473(_eintr_retry_call)
            7    0.000    0.000   73.655   10.522 subprocess.py:768(communicate)
            7   73.653   10.522   73.653   10.522 {method 'read' of 'file' objects}
          5/1    0.027    0.005   43.488   43.488 graph-depends:164(get_all_depends)
            5    0.003    0.001   43.458    8.692 graph-depends:135(get_depends)
            1    0.001    0.001   25.712   25.712 graph-depends:98(get_version)
            1    0.001    0.001   13.457   13.457 graph-depends:337(remove_extra_deps)
         1717    1.672    0.001   13.050    0.008 graph-depends:290(remove_transitive_deps)
    9784086/2672326    5.079    0.000   11.363    0.000 graph-depends:274(is_dep)
    2883343/1980154    2.650    0.000    6.942    0.000 graph-depends:262(is_dep_uncached)
            1    0.000    0.000    4.529    4.529 graph-depends:121(get_targets)
      2883343    1.123    0.000    1.851    0.000 graph-depends:246(is_dep_cache_insert)
      9784086    1.783    0.000    1.783    0.000 graph-depends:255(is_dep_cache_lookup)
      2881580    0.728    0.000    0.728    0.000 {method 'update' of 'dict' objects}
            1    0.001    0.001    0.405    0.405 graph-depends:311(check_circular_deps)
    12264/1717    0.290    0.000    0.404    0.000 graph-depends:312(recurse)
    [...]
    real    1m27.371s
    user    1m15.075s
    sys     0m12.673s

The cumulative time spent in check_circular_deps is just below 0.5s,
which is largely less than 1% of the total run time.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Samuel Martin <s.martin49@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2016-02-07 23:20:38 +01:00
..
apply-patches.sh support/scripts/apply-patches.sh: fix whitespace 2016-01-13 22:09:08 +01:00
check-host-rpath support/check-host-rpath: remove trailing '/' in host dir 2015-12-02 23:28:14 +01:00
check-kernel-headers.sh check-kernel-headers: mktemp --tmpdir not available on RedHat RHEL5 2014-09-28 20:40:57 +02:00
eclipse-register-toolchain eclipse support: document script and add checks 2013-01-14 21:45:09 +01:00
expunge-gconv-modules Change /bin/bash shebangs into /usr/bin/env bash 2014-10-25 01:55:37 +02:00
gen-manual-lists.py docs/manual: fix generation of deprecated list 2015-08-02 19:18:51 +02:00
graph-build-time scripts/graph-build-time: properly warn about missing modules 2014-10-12 17:23:06 +02:00
graph-depends support/graph-depends: detect circular dependencies 2016-02-07 23:20:38 +01:00
kconfiglib.py support: update Kconfiglib to the latest version 2015-06-11 22:10:01 +02:00
mkmakefile Makefile: Remove 'quiet' variable 2015-10-29 00:04:05 +01:00
mkusers support/mkusers: allow comments in users tables 2015-10-18 17:52:21 +02:00
pkg-stats pkg-stats: ignore linux-ext-fbtft.mk and doc-asciidoc.mk 2015-02-15 23:28:55 +01:00
readme.kconfiglib support: update Kconfiglib to the latest version 2015-06-11 22:10:01 +02:00
scancpan scancpan: README as default license file 2015-10-26 22:56:05 +01:00
setlocalversion setlocalversion: sync with Linux kernel version (2.6.34) 2013-09-04 11:58:12 +02:00
size-stats support/scripts/size-stats: fix copy/paste error in ArgumentParser 2016-01-13 16:35:19 +01:00
size-stats-compare support/scripts: add size-stats-compare script 2016-02-07 15:52:25 +01:00
xorg-release trivial: fix typo 'informations' 2014-07-24 22:31:20 +02:00

Readme
======

Kconfiglib
----------

This python module, developped by Ulf Magnusson and released under the ISC
license, is fetched from:

https://github.com/ulfalizer/Kconfiglib
commit: a95f477eafc0b6708c3ce671fce7302ecec4f789

Kconfiglib license
~~~~~~~~~~~~~~~~~~

License (ISC)

Copyright (c) 2011-2013, Ulf Magnusson <ulfalizer@gmail.com>

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.