Fix build with GNU Make 3.81

Message ID AM0PR08MB371457ACA4789DFC701C088EE4570@AM0PR08MB3714.eurprd08.prod.outlook.com
State New, archived
Headers

Commit Message

Bernd Edlinger Dec. 14, 2019, 8:15 a.m. UTC
  Hi,

I have a minor problem with building the gdbserver, alloc-ipa.o
on ubuntu 14.04 which still uses GNU Make 3.81.

Since several quirks for this GNU Make version exist, I suppose
this version is still intended to be supported.

This patch fixes the build with this make version, and works
also for newer versions.


Thanks
Bernd.
gdb/gdbserver:
2019-12-14  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* Makefile.in: Fix build with GNU Make 3.81
  

Comments

Simon Marchi Dec. 14, 2019, 6:21 p.m. UTC | #1
On 2019-12-14 3:15 a.m., Bernd Edlinger wrote:
> Hi,
> 
> I have a minor problem with building the gdbserver, alloc-ipa.o
> on ubuntu 14.04 which still uses GNU Make 3.81.
> 
> Since several quirks for this GNU Make version exist, I suppose
> this version is still intended to be supported.
> 
> This patch fixes the build with this make version, and works
> also for newer versions.
> 
> 
> Thanks
> Bernd.
> 

Hi Bernd,

The intention was to support make >= 3.82, since this commit:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c6bdbeb7c468489da9468445057d245929c3d91c

Though it's possible that (stale) references and tweaks for make 3.81
are left.

I don't mind if we merge simple fixes like that, as long as it doesn't compromise
building with newer versions.  Like, if there was a super-duper cool feature of
make 3.82 that would really simplify our lives, we would still prefer using that
over keeping compatibility with make 3.81.

I'll let Tom decide, since he introduced that new file.

Simon
  
Tom Tromey Dec. 19, 2019, 5:29 p.m. UTC | #2
>>>>> "Simon" == Simon Marchi <simark@simark.ca> writes:

Simon> I don't mind if we merge simple fixes like that, as long as it doesn't compromise
Simon> building with newer versions.  Like, if there was a super-duper cool feature of
Simon> make 3.82 that would really simplify our lives, we would still prefer using that
Simon> over keeping compatibility with make 3.81.

Sounds reasonable to me.

Simon> I'll let Tom decide, since he introduced that new file.

The patch looks ok to me.  Thanks.

Tom
  
Joel Brobecker Dec. 23, 2019, 7:30 a.m. UTC | #3
> Simon> I don't mind if we merge simple fixes like that, as long as it doesn't compromise
> Simon> building with newer versions.  Like, if there was a super-duper cool feature of
> Simon> make 3.82 that would really simplify our lives, we would still prefer using that
> Simon> over keeping compatibility with make 3.81.
> 
> Sounds reasonable to me.

FWIW: Same here.
  

Patch

From 324a036bd552186baa9ea16d7ac0072d74220f35 Mon Sep 17 00:00:00 2001
From: Bernd Edlinger <bernd.edlinger@hotmail.de>
Date: Fri, 13 Dec 2019 17:21:21 +0100
Subject: [PATCH] Fix build with GNU Make 3.81

GNU Make 3.81 is apparently confused when the same
source file is processed by a pattern rule and an
explicit rule at the same time with different output file.
The pattern %.o: ../%.c and alloc-ipa.o: ../alloc.c
both have the source ../alloc.c but two independent
object files alloc.o and alloc-ipa.o, so
while building gdbserver I see the following message:

make[4]: Circular alloc-ipa.o <- ../alloc.c dependency dropped.
  CXX    alloc-ipa.o
g++: warning: '-x c++' after last input file has no effect
g++: fatal error: no input files
compilation terminated.

In the make debug output I see the pattern is first correct:

alloc-ipa.o: ../alloc.c | config.h build-gnulib-gdbserver/import/string.h
        $(IPAGENT_COMPILE) $(WARN_CFLAGS_NO_FORMAT) $<
        $(POSTCOMPILE)

But after the "Circular" dependency is dropped, the pattern
is changed to:

alloc-ipa.o: | config.h build-gnulib-gdbserver/import/string.h
        $(IPAGENT_COMPILE) $(WARN_CFLAGS_NO_FORMAT) $<
        $(POSTCOMPILE)

So indeed now $< is empty, and the build step fails.

This happens only when alloc.o needs to be built, when alloc.o
was already built, the build succeeds, but it takes often
several attempts until the build succeeds.
By rewriting the alloc-ipa.c: ../alloc.c rule into a pattern
rule, the problem goes away.

While already at it, this patch removes also the
$(WARN_CFLAGS_NO_FORMAT) from the build rule, which is just a
copy/paste thing that is not necessary for alloc.c at all.
---
 gdb/gdbserver/Makefile.in | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 10e0040..9e8c213 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -580,10 +580,6 @@  ax.o: ax.c
 	$(COMPILE) $(WARN_CFLAGS_NO_FORMAT) $<
 	$(POSTCOMPILE)
 
-alloc-ipa.o: ../alloc.c
-	$(IPAGENT_COMPILE) $(WARN_CFLAGS_NO_FORMAT) $<
-	$(POSTCOMPILE)
-
 # Rules for objects that go in the in-process agent.
 
 arch/%-ipa.o: ../arch/%.c
@@ -602,6 +598,10 @@  gdbsupport/%-ipa.o: ../gdbsupport/%.c
 	$(IPAGENT_COMPILE) $<
 	$(POSTCOMPILE)
 
+%-ipa.o: ../%.c
+	$(IPAGENT_COMPILE) $<
+	$(POSTCOMPILE)
+
 # Note: Between two matching pattern rules, GNU Make 3.81 chooses the first one.
 # Therefore, this one needs to be before "%.o: %.c" for it to be considered for
 # files such as linux-amd64-ipa.o generated from linux-amd64-ipa.c.
-- 
1.9.1