[PATCHv3] tools build: Make fixdep parsing wait for last target

From: Jiri Olsa
Date: Thu Dec 01 2016 - 08:00:31 EST


On Tue, Nov 29, 2016 at 12:49:04PM -0200, Arnaldo Carvalho de Melo wrote:
> Em Tue, Nov 29, 2016 at 03:39:35PM +0100, Jiri Olsa escreveu:
> > On Tue, Nov 29, 2016 at 12:33:15PM -0200, Arnaldo Carvalho de Melo wrote:
> > > Em Tue, Nov 29, 2016 at 03:28:08PM +0100, Jiri Olsa escreveu:
> > > > On Mon, Nov 28, 2016 at 05:40:46PM -0200, Arnaldo Carvalho de Melo wrote:
> > > >
> > > > SNIP
> > > >
> > > > > CC /tmp/build/perf/builtin-buildid-list.o
> > > > > LD /tmp/build/perf/pmu-events/pmu-events-in.o
> > > > > CC /tmp/build/perf/arch/x86/util/intel-bts.o
> > > > > CC /tmp/build/perf/builtin-buildid-cache.o
> > > > > CC /tmp/build/perf/builtin-list.o
> > > > > LD /tmp/build/perf/arch/x86/util/libperf-in.o
> > > > > MKDIR /tmp/build/perf/arch/x86/tests/
> > > > > CC /tmp/build/perf/arch/x86/tests/regs_load.o
> > > > > /tmp/build/perf/.plugin_jbd2.o.cmd:3: *** empty variable name. Stop.
> > > > > Makefile:192: recipe for target '/tmp/build/perf/plugin_jbd2-in.o' failed
> > > > > make[2]: *** [/tmp/build/perf/plugin_jbd2-in.o] Error 2
> > > > > Makefile.perf:591: recipe for target '/tmp/build/perf/libtraceevent-dynamic-list' failed
> > > > > make[1]: *** [/tmp/build/perf/libtraceevent-dynamic-list] Error 2
> > > > > make[1]: *** Waiting for unfinished jobs....
> > > > > MKDIR /tmp/build/perf/arch/x86/tests/
> > > > > CC /tmp/build/perf/arch/x86/tests/arch-tests.o
> > > > > <SNIP>
> > > > > CC /tmp/build/perf/util/pmu.o
> > > > > CC /tmp/build/perf/util/pmu-flex.o
> > > > > LD /tmp/build/perf/util/libperf-in.o
> > > > > LD /tmp/build/perf/libperf-in.o
> > > > > Makefile:108: recipe for target 'install-bin' failed
> > > > > make: *** [install-bin] Error 2
> > > > > make: Leaving directory '/home/acme/git/linux/tools/perf'
> > > > > [acme@jouet linux]$
> > > >
> > > > how about following fix.. it gets rid of the -Wp,MT option completely
> > > > so it should address Peter's issue.. it also makes fixdep more robust
> > > > and makes it wait for first target before spitting out dependencies
> > >
> > > So this should replace Peter's patch? On top? I'm checking that now...
> >
> > it's replacement.. also I'll put it into 2 patches
>
> Ok, just tested, Peter's patch works if I remove ccache, with your patch
> replacing it, everything works, with and without ccache, on f25, and it
> builds on f24 without ccache, in one of the containers I have.
>

ok, so v3 actually ;-)

the v2 was tricky for the case when fixdep is not available,
so I decided to go with Peter's fix and fixing 'fixdep' tool
to properly parse out the target in case we hit the ccache
error.. we need to be able to do it anyway

please apply this patch before Peter's so we keep clean bisect

thanks,
jirka


---
The fixdep tool among other things replaces the target of
the object in the gcc generated dependency output file.

The parsing code assumes there's only single target in the
rule but this is not always the case as described in here:
https://gcc.gnu.org/ml/gcc-help/2016-11/msg00099.html

Making the fixdep code smart enough to skip all the possible
targets.

Link: http://lkml.kernel.org/n/tip-anlmi1osaky314m1gu3skdnz@xxxxxxxxxxxxxx
Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
---
tools/build/fixdep.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/tools/build/fixdep.c b/tools/build/fixdep.c
index 1521d36cef0d..734d1547cbae 100644
--- a/tools/build/fixdep.c
+++ b/tools/build/fixdep.c
@@ -49,7 +49,7 @@ static void parse_dep_file(void *map, size_t len)
char *end = m + len;
char *p;
char s[PATH_MAX];
- int is_target;
+ int is_target, has_target = 0;
int saw_any_target = 0;
int is_first_dep = 0;

@@ -67,7 +67,8 @@ static void parse_dep_file(void *map, size_t len)
if (is_target) {
/* The /next/ file is the first dependency */
is_first_dep = 1;
- } else {
+ has_target = 1;
+ } else if (has_target) {
/* Save this token/filename */
memcpy(s, m, p-m);
s[p - m] = 0;
--
2.7.4