Is Makefile.inc1 in 6 wrong?

Lars Eighner eighner at io.com
Tue Apr 4 22:20:57 UTC 2006


On Tue, 4 Apr 2006, Jung-uk Kim wrote:

> On Tuesday 04 April 2006 05:32 pm, Lars Eighner wrote:
>> On Tue, 4 Apr 2006, Jung-uk Kim wrote:
>>> On Tuesday 04 April 2006 05:14 pm, Lars Eighner wrote:
>>>> It appears to me that either I have a wrong version of awk or
>>>> this Makefile.inc1 is wrong:
>>>>
>>>> #
>>>> # $FreeBSD: src/Makefile.inc1,v 1.499.2.11 2006/04/04 14:24:03
>>>> glebius Exp $ #
>>>>
>>>> <Snippage>
>>>>
>>>> MAKEOBJDIRPREFIX?=	/usr/obj
>>>> .if !defined(OSRELDATE)
>>>> .if exists(/usr/include/osreldate.h)
>>>> OSRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ {
>>>> print $$3 }' \ /usr/include/osreldate.h
>>>> .else
>>>> OSRELDATE=	0
>>>>
>>>>
>>>> In particular with the double dollar sign in the awk statement,
>>>> I get no return, therefore OSRELDATE gets set to 0.  The awk
>>>> statement also fails from the command line.  But if I use only
>>>> one $, the awk statement succeeds.
>>>>
>>>> Is there a reason for the double dollar sign?
>>>
>>> Yes.  See make(1):
>>>
>>>    $   A single dollar sign `$', i.e. `$$' expands to a single
>>> dollar sign.

I think this is wrong for a SINGLE QUOTED argument to be passed
to awk.  The Makefile is wrong.  I am right.

>>
>> Then why does it get the wrong answer?
>
> Because you ran it from command line. ;-)  You can copy and paste the
> same lines to *Makefile* like this:
>
> ------------
> .if !defined(OSRELDATE)
> .if exists(/usr/include/osreldate.h)
> OSRELDATE!=	awk '/^\#define[[:space:]]*__FreeBSD_version/ { print $$3 }' \
> 		/usr/include/osreldate.h
> .else
> OSRELDATE=	0
> .endif
> .endif
>
> all:
> 	@echo "reldate = ${OSRELDATE}"
> ------------
>
> and run make.  You will see something like this (depending on your
> header file):
>
> %make
> reldate = 600034

But it doesn't

Tue Apr 04 17:11:38 bash3.1:ttyp0:eighner
goodwill~$make -V OSRELDATE -f /usr/src/Makefile.inc1
0
Tue Apr 04 17:12:25 bash3.1:ttyp0:eighner
goodwill~$exit
exit

where /usr/include/osreldate.h =

/*-
  * Copyright (c) 1992-2006 The FreeBSD Project.
  * All rights reserved.

<snippage>
  * SUCH DAMAGE.
  *
  */

#ifdef _KERNEL
#error "<osreldate.h> cannot be used in the kernel, use <sys/param.h>"
#else
#undef __FreeBSD_version
#define __FreeBSD_version 504105
#endif



>
>> Also is there a difference when the accent mark is used in front
>> instead of a real single quote?
>
> Where do you see it?

Where you wrote:
>>>    $   A single dollar sign `$', i.e. `$$' expands to a single
>>> dollar sign.

And also in man make.  The ` is an accent key, not a quote key. 
Yes, they are aka backticks and do mean something when they are
paired, but `something' is nonsense so far as I can tell.

Why would make tamper with anything in single quotes that is
passed to a command?  How do you write an argument for a command
so that make won't tamper with it?  What would double quoting
the argument be for?


-- 
Lars Eighner
eighner at io.com  lars at larseighner.com
http://www.larseighner.com/index.html
8800 N IH35 APT 1191 AUSTIN TX 78753-5266



More information about the freebsd-stable mailing list