[Starlingx-discuss] Understanding package building order

Cordoba Malibran, Erich erich.cordoba.malibran at intel.com
Wed Jul 25 16:48:07 UTC 2018


Thanks Scott! This was a really good explanation :)


> 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-discus
> > s
> 
> 
> 
> _______________________________________________
> 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