Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Nov 2013 15:08:13 -0500 (EST)
From:      Julio Merino <julio@meroh.net>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/183762: make(1) .undef does not work with variables set to a value
Message-ID:  <201311072008.rA7K8DQj007334@mastodon.meroh.net>
Resent-Message-ID: <201311072020.rA7KK3IY010257@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         183762
>Category:       bin
>Synopsis:       make(1) .undef does not work with variables set to a value
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Nov 07 20:20:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Julio Merino
>Release:        FreeBSD 11.0-CURRENT powerpc
>Organization:
>Environment:
System: FreeBSD mastodon.meroh.net 11.0-CURRENT FreeBSD 11.0-CURRENT #2 r257556M: Sat Nov 2 17:24:33 EDT 2013 jmmv@mastodon.meroh.net:/usr/obj/usr/src/sys/GENERIC64 powerpc


	
>Description:
	The .undef directive of make(1) does not seem to work on a
	variable that has been defined to a value (even if empty) either
	via the environment or a command-line argument to make.  However
	.undef works on variables that have been defined using make's
	-D flag and variables defined in the same Makefile.

	I have found this while debugging build issues in bsd.own.mk.
	Makefile.inc1 has to pass -DNO_* to make in order to explicitly
	disable some features during the build bootstrap.  However, if
	the user explicitly sets WITH_* from the command line (without
	using -D), the build fails because it finds both WITH_* and
	WITHOUT_* defined.

	I believe .undef is buggy and hence the reason for this PR.  And
	if it is not a bug, make(1) probably deserves some note about
	this as well as the build documentation (maybe in src.conf(5))
	to warn about this.

>How-To-Repeat:
	Sample Makefile:

-----
.if defined(DEFINE_VAR_IN_MAKEFILE)
VAR=foo
.endif

.undef VAR

all:
.if defined(VAR)
	@echo defined
.else
	@echo undefined
.endif
-----

	And sample invocations:

-----
$ make
undefined
$ make -DVAR
undefined
$ make -DDEFINE_VAR_IN_MAKEFILE
undefined
$ make VAR=
defined
$ VAR= make
defined
-----

	The last two cases shown above are unexpected behavior to me.
	I would expect the ".undef VAR" to take effect at all times.
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201311072008.rA7K8DQj007334>