bugmake - Bugs: bug #29074, -include target fails to issue...

 
 

bug #29074: -include target fails to issue Error in 3.81

Submitted by:  Hack Lee <hslee9>
Submitted on:  Fri 05 Mar 2010 02:51:27 AM UTC  
 
Severity: 3 - NormalItem Group: Bug
Status: NonePrivacy: Public
Assigned to: NoneOpen/Closed: Open
Component Version: 3.81Operating System: Any
Fixed Release: NoneTriage Status: None

Add a New Comment (Rich MarkupRich Markup):
   

You are not logged in

Please log in, so followups can be emailed to you.

 

(Jump to the original submission Jump to the original submission)

Sat 16 Feb 2013 12:15:30 AM UTC, comment #9:

I thought I'd take a look at the source, so I did a git clone, the INSTALL doc says to do the "standard" ./configure; make ... there is no file configure, there is a configure.bat, what am I missing?

dave kerns <dtkerns>
Fri 15 Feb 2013 11:42:59 PM UTC, comment #8:

one more data point, from the gcc man page:

-MP This option instructs CPP to add a phony target for each dependency other than the main file, causing each to
depend on nothing. These dummy rules work around errors make gives if you remove header files without
updating the Makefile to match.

This is typical output:

test.o: test.c test.h

test.h:

gcc devs thought it was a make bug too, so they added the -MP option

dave kerns <dtkerns>
Wed 13 Feb 2013 04:33:01 PM UTC, comment #7:

well drat, all of my backslashes got eaten ... I'll attach the Makefile

(file #27456)

dave kerns <dtkerns>
Wed 13 Feb 2013 04:30:04 PM UTC, comment #6:

I have a slight variation of this "bug"; when the included file (included with the -include) runs into a rule problem, make silently stops and does nothing. I argue it should give the same error that it does without the "-".

this make file will demonstrate the issue:

to test, do this:

$ make fix # restores all files
$ make # builds correctly
$ make break # remove .h file
$ make # demonstrates silent failure
$ make PRE381=1 # demonstrates desired failure message

<code save_as=Makefile>
CPPFLAGS += -I.

all: app

app: x.o
$(CC) -o $@ $<

%.d: %.c
$(CC) -MM $< | sed -e 's,\($\).o[ :],\1.o $@ : ,g' > $@; test $$? != 0 && $(RM) $@

clean:
$(RM) x.o app

clobber: clean
$(RM) x.?

break: clean
$(RM) x.h

fix: clobber x.c
touch x.h

x.c:
@echo making $@
@printf "#include <stdio.h>\n#include <stdlib.h>\n\n#include \"x.h\"\n\nint main(int argc, char **argv)\n{\n\tprintf(\"hello world\\\\n\");\n}" > x.c

ifneq ($(filter-out fix clean clobber,$(or $(MAKECMDGOALS),all)),)
ifeq ($(PRE381),1)
$(info using include)
include x.d
else
$(info using -include)
-include x.d
endif
endif

</code>

dave kerns <dtkerns>
Sat 03 Dec 2011 12:22:41 PM UTC, comment #5:

I agree with Hack Lee.

There was a bug before 3.81.

You wouldn't want make to fall over on an
-include $(sources:%.c=%.d)
in the Makefile because of a source error when you're actually running
make clean

The behavior of GNUmake 3.81 is correct.

Christian Hujer <cherriedquat>
Tue 16 Mar 2010 12:20:12 AM UTC, comment #4:

Reply to Paul Smith,

So there was a bug before 3.81, since they issued an Error in this case. And the bug was fixed in 3.81. Is that what you are saying?

include done
=> is looking for a file named done and fails since no file named done.

-include done
=> is building a target called done (if no file is found).

Hack Lee <hslee9>
Fri 12 Mar 2010 07:08:59 PM UTC, comment #3:

Quoting from the make 3.81 manual:

<quote>
If you want `make' to simply ignore a makefile which does not exist and cannot be remade, with no error message, use the `-include' directive instead of `include', like this:

-include FILENAMES...

This acts like `include' in every way except that there is no error (not even a warning) if any of the FILENAMES do not exist. For compatibility with some other `make' implementations, `sinclude' is another name for `-include'.
</quote>

The "and cannot be remade" statement could be interpreted in several ways:
1: No rule exists for building the include target.
2: No rule exists for building the include target, or the target rule failed.

I do think it would be useful to have a syntax that supports ignoring include files that do not exist and which have no target rules for building them but which does issue an error if an attempt to rebuild them fails. I would argue that this is typically the desired behavior (and apparently the historical behavior prior to version 3.81).

Tom Honermann <tahonermann>
Fri 12 Mar 2010 06:46:37 PM UTC, comment #2:

The reason you see this is that make will automatically try to rebuild every file that it includes. Here you include "done", and "done" is out of date, so make tries to rebuild it before it is included.

But, the rebuild of "done" fails.

But, you have indicated, by using "-include", that you want to not issue an error if "done" does not exist, so no error is issued.

If you want make to fail when done cannot be built, then you should use "include" instead of "-include".

Paul D. Smith <psmith>
Project Administrator
Fri 12 Mar 2010 05:53:35 PM UTC, comment #1:

It was ok (meaning correctly issue an Error) until 3.81beta1.

We scratched our head wondering why the makefile would not give an error even though there is clearly an error. So it is not backward compatible and we need this to be fixed in 3.81.
Would it be possible to suggest a change in the source code so that we can modify 3.81 for our build system?

all:
@exit 0
done:
@echo $(MAKE_VERSION); exit 1
-include done

3.79.1
make-3.79.1: *** [done] Error 1

3.80
make-3.80: *** [done] Error 1

3.81beta1
make-3.81b1: *** [done] Error 1

3.81beta3

3.81rc2

3.81

Hack Lee <hslee9>
Fri 05 Mar 2010 02:51:27 AM UTC, original submission:

Before 3.81, make issues Error correctly.

all:
exit 1

done:
exit 1

-include done

Hack Lee <hslee9>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach File(s):
   
   
Comment:
   

Attached Files
file #27456:  Makefile added by dtkerns (600B - application/octet-stream)

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -unavailable- added by dtkerns (Posted a comment)
  • -unavailable- added by cherriedquat (Posted a comment)
  • -unavailable- added by tahonermann (Posted a comment)
  • -unavailable- added by psmith (Posted a comment)
  • -unavailable- added by hslee9 (Submitted the item)
  •  

    Do you think this task is very important?
    If so, you can click here to add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.

     

    Please enter the title of George Orwell's famous dystopian book (it's a date):

     

     

    Follows 1 latest change.

    Date Changed By Updated Field Previous Value => Replaced By
    Wed 13 Feb 2013 04:33:01 PM UTCdtkernsAttached File-=>Added Makefile, #27456

    Back to the top


    Powered by Savane 3.1-cleanup