[Starlingx-discuss] Understanding package building order

Scott Little scott.little at windriver.com
Tue Jul 24 16:57:29 UTC 2018


The default behaviour when building pkg A, is to also build anything in 
the BuildRequires of pkg A, and the requires of those packages, 
transitively until it has a full set.  It then adds packages that have a 
direct BuildRequires on A.

We do this to protect compiles in languages like C/C++ where a include 
file change in one package can have major impacts on the compile of 
other packages that uses the .h

Paranoia by default

e.g.

  A BuildRequires B and C, and C requires D, and E and F requires A

E F
\ /
  A
/ \
B C
   |
   D


so the build set is: D B C A E F.  This would also be the default build 
order for this simple case
A, E and F as cleaned to force a rebuild.
D, B and C are only built it not already built.

The unfortunate part is that RPM BuildRequires doesn't distinguish a 
source code requirement from a tool requirement.  So some packages could 
probably be excluded.  An advisory in build_srpm.data to ignore some 
dependencies is a future enhancement I've been pondering.  Another 
possibility is to only follow dependencies with -dev in the name.... not 
sure if that is 100% correct though.

BuildRequires/Requires are also littered with dependency loops. This can 
play havoc with trying to find an optimal build order. Some times it's a 
case of try to build something, and if it fails, try something else and 
circle back with a second or third iteration if at least one package 
built ok.   There were a dependency cache files in cgts-tis-repo that 
helped find good build orders, but StarlingX dropped that content last 
time I looked.  Without it, I expect the iteration counts to get quite 
large, wasting a lot of time.

One of nastiest dependency loops includes bash and the linux kernel.

To exclude E and F from our hypothetical build ...
    build-pkgs --no-descendants  A

To exclude B C D from our hypothetical build ...
    build-pkgs  --no-required  A

Finally we always add 'build-info' to the build list, and it may have 
descendants.  To suppress this ...
    build-pkgs --no-build-info A

Put it all together, for a fast build of A when dependencies are not a 
concern ... (e.g. resolving build issues internal to pkg A) ...
    build-pkgs --no-descendants --no-required --no-build-info A



On 18-07-24 12:11 PM, Cordoba Malibran, Erich wrote:
> Hi all,
>
> I'm trying to understand how the build system decides what to build on
> specific scenarios. Let's say we have a complete build and then we run:
>
> $ build-pkgs bash
>
> This will rebuild the bash package, but also the build system decides to
> delete and rebuild a set of packages that I don't understand why are
> being rebuild, for example:
>
> iptables-1.4.21-18.0.1.el7.tis.3.x86_64.rpm
> kernel-3.10.0-862.6.3.el7.35.tis.x86_64.rpm
> qemu-kvm-common-ev-2.10.0-0.tis.0.x86_64.rpm
> sm-common-libs-1.0.0-19.tis.x86_64.rpm
>
> and a big list of packages. So, the main question here is why the build system
> decides to rebuild a kernel (taking an example) in order to rebuild bash.
>
> Thank you,
>
> -Erich
> _______________________________________________
> Starlingx-discuss mailing list
> Starlingx-discuss at lists.starlingx.io
> http://lists.starlingx.io/cgi-bin/mailman/listinfo/starlingx-discuss





More information about the Starlingx-discuss mailing list