bugmake - Bugs: bug #20513, # still needs to be escaped in a...

 
 

bug #20513: # still needs to be escaped in a function like $(shell)

Submitter:  Lionel Elie Mamane <lmamane>
Submitted:  Wed 18 Jul 2007 03:50:08 PM UTC
   
 
Severity:  3 - Normal Item Group:  Bug
Status:  Fixed Privacy:  Public
Assigned to:  psmith Open/Closed:  Closed
Component Version:  3.81 Operating System:  POSIX-Based
Fixed Release:  4.3 Triage Status:  Medium Effort
* Mandatory Fields

Add a New Comment Rich Markup
   

Sat 29 Sep 2018 01:32:09 AM UTC, comment #4: 

Back in the day, the Linux kernel makefiles, for example:

/usr/lib/linux-kbuild-3.16/scripts/Makefile.lib

... defined a KBUILD_STR macro with a # escaped like this:


c_flags        = ...
...
                 -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)


Such a # would still need escaping today.  The command line used to compile each .o file is written into a .$(basename).o.cmd file by some code mainly in the like of:

/usr/lib/linux-kbuild-3.16/scripts/Kbuild.include

... which puts the command line through:


make-cmd = $(subst \\,\\\\,$(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))))


The # characters there used to need escaping like that but now the backslashes are being taken literally.  This means that the code looks for \# but only finds #, so doesn't perform the substitution.  The .$(basename).o.cmd file ends up containing an assignment like:


cmd_$(dir)/$(basename).o = cc ... -D"KBUILD_STR(s)=#s" -c $(basename).c -o $(basename).o


That # was supposed to be a \#.  It still needs escaping today.  The rest of the line is treated as a comment and omitted from the assignment.

There's some arg-check code which compares the cmd_ assigned in the .cmd file with the command line that would be run now.  If that command line has changed, then the .o file is rebuilt.  Now the command line always seems to change, because the latter part of the old one has been omitted, so the .o file is always rebuilt.

If you pass some kind of V=2 parameter to the build, you can see that each .o file rebuilds "$(basename).o - due to command line change".

If you pass KBUILD_NOCMDDEP=1, then you skip the arg-check code and get an incremental build as intended.

I think KBUILD_STR disappeared with:

https://github.com/torvalds/linux/commit/b42841b7bb6286da56b4fa79835c27166b7e228b

Perhaps the labels there are telling me that it disappeared as early as 4.7-rc1, so that's gone from Debian by Stretch (linux-image-amd64 4.9).  I think this change in Make isn't yet in Debian.  To be clear: it doesn't break builds of modules for earlier kernels, so we're unlikely to have:

https://savannah.gnu.org/bugs/index.php?33034: "Makefile:23: * mixed implicit and normal rules. Stop." for Linux kernel out of source builds

... all over again.  It just stops them from being incremental.

I imagine no-one will ever notice, but hopefully this post will stop anyone else wasting as much time on it as I did today.

Martin Dorey <mdorey>
Mon 26 Dec 2016 02:34:03 PM UTC, comment #3: 

This is finally fixed.  However, it is a backward-compat break.  We'll have to see how serious it is; it's possible we'll have to introduce some way to recognize both formats for a while, or something.

Paul D. Smith <psmith>
Group administrator
Sat 10 May 2008 10:42:26 PM UTC, comment #2: 

I get the exact same error when building jhbuild:

make[1]: Leaving directory `/home/gezim/projects/jhbuild/po'
make[1]: Entering directory `/home/gezim/projects/jhbuild'
test z"." = z"." && make -f Makefile.plain || true
make[2]: Entering directory `/home/gezim/projects/jhbuild'
Run "make install" to install.
make[2]: Leaving directory `/home/gezim/projects/jhbuild'
make[2]: Entering directory `/home/gezim/projects/jhbuild'
test z"." = z"." && make -f Makefile.plain install || true
make[3]: Entering directory `/home/gezim/projects/jhbuild'
cd po && make -f Makefile.plain install
make[4]: Entering directory `/home/gezim/projects/jhbuild/po'
Makefile.plain:8: * unterminated call to function `shell': missing `)'.  Stop.
make[4]: Leaving directory `/home/gezim/projects/jhbuild/po'
make[3]: * [install] Error 2
make[3]: Leaving directory `/home/gezim/projects/jhbuild'
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/gezim/projects/jhbuild'
make[1]: Leaving directory `/home/gezim/projects/jhbuild'


 make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i486-pc-linux-gnu

On ubuntu 8.04

Gezim <haxhia>
Wed 18 Jul 2007 03:51:07 PM UTC, comment #1: 

Forgot to mention: Debian GNU/Linux sid i386 and amd64.

Lionel Elie Mamane <lmamane>
Wed 18 Jul 2007 03:50:08 PM UTC, original submission:  

The NEWS file says:

Version 3.81

  • WARNING: Backward-incompatibility!

  Some previous versions of GNU make had a bug where "#" in a function
  invocation such as $(shell ...) was treated as a make comment.  A
  workaround was to escape these with backslashes.  This bug has been
  fixed: if your makefile uses "\#" in a function invocation the
  backslash is now preserved, so you'll need to remove it.


But I still get that bug with 3.81 and with CVS HEAD. The following makefile:

FOO:=$(shell echo '#')
foo:
        echo '$(FOO)'

gives:

Makefile:1: * unterminated call to function `shell': missing `)'.  Stop.

while

FOO:=$(shell echo '\#')
foo:
echo '$(FOO)'


works, and the backslash is not passed to the shell.

Lionel Elie Mamane <lmamane>

 

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

Attach Files:
   
   
Comment:
   

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by mdorey (Posted a comment)
  • -email is unavailable- added by psmith (Updated the item)
  • -email is unavailable- added by haxhia (Posted a comment)
  • -email is unavailable- added by lmamane (Submitted the item)
  •  

    There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.

    Only logged-in users can vote.

     

    Follow 6 latest changes.

    Date Changed by Updated Field Previous Value => Replaced by
    2016-12-26 psmith StatusNone Fixed
        Assigned toNone psmith
        Open/ClosedOpen Closed
        Fixed ReleaseNone 4.3
        Triage StatusVerified Medium Effort
    2012-09-10 psmith Triage StatusNone Verified

    Back to the top

    Powered by Savane 3.13-d3ae.
    Corresponding source code