[prev in list] [next in list] [prev in thread] [next in thread] 

List:       opensuse-factory
Subject:    Re: some late build chain changes in factory degrades build performance of some packages
From:       Hans-Peter Jansen <hpj () urpla ! net>
Date:       2022-11-12 17:37:07
Message-ID: 14775414.tv2OnDr8pf () xrated
[Download RAW message or body]

Am Samstag, 12. November 2022, 16:56:35 CET schrieb Jan Engelhardt:
> On Friday 2022-11-11 20:56, Hans-Peter Jansen wrote:
> >some late changes in the build chain degrades build performance to a crawl:
> >e.g. a package typically builds in under two minutes:
> >
> >https://build.opensuse.org/package/live_build_log/vdr:plugins/vdr-plugin-li
> >ve/ openSUSE_Tumbleweed/x86_64
> >
> >shows this now:
> >
> >[ 2624s] CC live.o
> >[ 3161s] CC thread.o
> 
> 1. `osc build ...` in one terminal
> 
> 2. Second terminal,
> 
> 	strace -fe execve -p 24582
> 
> 	(pid of make)
> 
> and I observed that make re-runs pkg-config a damn lot.
> 
> What recently changed in openSUSE is the make program (4.3 -> 4.4).
> 
> >From make's changelog, I identify two changes that seem like they
> 
> could be relevant:
> 
> 	https://lists.gnu.org/archive/html/info-gnu/2022-10/msg00008.html
> 
> 	>Previously each target in a explicit grouped target rule was
> 	>considered individually: if the targets needed by the build
> 	>were not out of date the recipe was not run even if other
> 	>targets in the group were out of date
> 
> 	or
> 
> 	>Previously makefile variables marked as export were not
> 	>exported to commands started by the $(shell ...) function.
> 	>Now, all exported variables are exported to $(shell ...).
> 
> Of course, these alone do not constitute problem - we have over 1000
> packages that exercise `make` one way or the other, but they do so
> through a proper means of Makefile generators like configure or cmake
> or something of the sort.
> 
> 3. So we're looking at a shitty Makefile.
> 
> 	vdr$ make -ddd clean
> 	Reading makefile 'Makefile'...
> 	grep: warning: stray \ before #
> 	Makefile:18: not recursively expanding PKGCFG to export to shell 
function
> 	Makefile:18: not recursively expanding PKGCFG to export to shell 
function
> 	Makefile:18: not recursively expanding PKGCFG to export to shell 
function
> 	Makefile:18: not recursively expanding PKGCFG to export to shell 
function
> 	Reading makefile 'global.mk' (search path) (no ~ expansion)...
> 	Makefile:27: not recursively expanding CFLAGS to export to shell 
function
> 	Makefile:18: not recursively expanding PKGCFG to export to shell 
function
> 	Makefile:18: not recursively expanding PKGCFG to export to shell 
function
> 	...
> 
> Just look at the mess:
> 
> 	PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1)
> $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.."
> pkg-config --variable=$(1) vd... LIBDIR = $(call PKGCFG,libdir)
> 	LOCDIR = $(call PKGCFG,locdir)
> 	PLGCFG = $(call PKGCFG,plgcfg)
> 	RESDIR = $(call PKGCFG,resdir)
> 
> 	### The compiler options:
> 	export CFLAGS   = $(call PKGCFG,cflags)
> 	export CXXFLAGS = $(call PKGCFG,cxxflags)
> 
> 	...
> 
> 	ifeq ($(TNTNET-CONFIG),)
> 	TNTVERSION = $(shell pkg-config --modversion tntnet | sed -e's/\.//
g' | sed
> -e's/pre.*//g' | awk '/^..$$/ { print $$1."000"} /^...$$/ { print $$1."00"}
> /^....$ CXXFLAGS  += $(shell pkg-config --cflags tntnet)
> 	LIBS      += $(shell pkg-config --libs tntnet)
> 	else
> 	TNTVERSION = $(shell tntnet-config --version | sed -e's/\.//g' | 
sed
> -e's/pre.*//g' | awk '/^..$$/ { print $$1."000"} /^...$$/ { print $$1."00"}
> /^....$$/ { pr CXXFLAGS  += $(shell tntnet-config --cxxflags)
> 	LIBS      += $(shell tntnet-config --libs)
> 
> So remember what the changelog said: export all variables whenever
> $(shell ..) is run. The irony is that, to set up the environment for
> that shell run, it has to expand PKGCFG, which involves calling
> at least another $(shell ...).
> 
> And that multiplies fast.
> 
> *yuck*

First at all, thanks Jan! Your analysis is much appreciated..

Oh my, wth.

This reveals a bunch of questions:
 * How to address this mess? 
   Probably preparing the environment before in order to avoid those shell
   expansions within the Makefile will cut it
 * The new make behaviour is kind of questionable, 
   * since it can be easily tricked into a DoS, since it might behave like a
     fork bomb now
   * feels like a regression nevertheless

Reminds me of a saying:

You don't understand recursion unless you understand recursion!

Thanks again,
Pete
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic