Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 04 Sep 2019 08:58:45 -0600
From:      Ian Lepore <ian@freebsd.org>
To:        Kyle Evans <kevans@freebsd.org>, Enji Cooper <yaneurabeya@gmail.com>
Cc:        Poul-Henning Kamp <phk@phk.freebsd.dk>, current <current@freebsd.org>
Subject:   Re: Weird goings on with make::empty()
Message-ID:  <5ab957620b5e28f1d9de14df12f9fdf60d00fc35.camel@freebsd.org>
In-Reply-To: <CACNAnaE7Gw=r92akmx=tXgGNb=H7GuKm7=iXX2cLtSAxNALikA@mail.gmail.com>
References:  <3843.1567598344@critter.freebsd.dk> <969A062A-A52A-49E3-B4E3-CC9377B08C80@gmail.com> <CACNAnaE7Gw=r92akmx=tXgGNb=H7GuKm7=iXX2cLtSAxNALikA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 2019-09-04 at 09:33 -0500, Kyle Evans wrote:
> On Wed, Sep 4, 2019 at 9:27 AM Enji Cooper <yaneurabeya@gmail.com>
> wrote:
> > 
> > 
> > > On Sep 4, 2019, at 04:59, Poul-Henning Kamp <phk@phk.freebsd.dk>
> > > wrote:
> > > 
> > > On:
> > > 
> > >    Repository Root: svn+ssh://repo.freebsd.org/base
> > >    Repository UUID: ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
> > >    Revision: 351809
> > > 
> > > I built a kernel, but drm-current-kmod did not get compiled
> > > from the new world order in /usr/local/sys/modules
> > > 
> > > Debugging I ended up doing this to src/sys/conf/kern.post.mk:
> > > 
> > >    Index: sys/conf/kern.post.mk
> > >    ==============================================================
> > > =====
> > >    --- sys/conf/kern.post.mk    (revision 351809)
> > >    +++ sys/conf/kern.post.mk    (working copy)
> > >    @@ -77,12 +77,14 @@
> > >            ${target:S/^reinstall$/install/:S/^clobber$/cleandir/}
> > >     .endif
> > >     .for module in ${LOCAL_MODULES}
> > >    -.if !empty(module)
> > >    +    true "XXX A $(module) 2 ${LOCALBASE} 3 ${LOCAL_MODULES} 4
> > > ${MODULES_WITH_WORLD}"
> > >    +#.if !empty(module)
> > >    +    true "XXX B $(module) 2 ${LOCALBASE} 3 ${LOCAL_MODULES} 4
> > > ${MODULES_WITH_WORLD}"
> > >        @${ECHODIR} "===> ${module}
> > > (${target:S/^reinstall$/install/:S/^clobber$/cleandir/})"
> > >        @cd ${LOCAL_MODULES_DIR}/${module}; ${MKMODULESENV}
> > > ${MAKE} \
> > >            DIRPRFX="${module}/" \
> > >            ${target:S/^reinstall$/install/:S/^clobber$/cleandir/}
> > >    -.endif
> > >    +#.endif
> > >     .endfor
> > >     .endif
> > >     .endfor
> > > 
> > > This gives me the expected output from buildkernel:
> > > 
> > >    true "XXX A drm-current-kmod 2 /usr/local 3 drm-current-kmod 4
> > > "
> > >    true "XXX B drm-current-kmod 2 /usr/local 3 drm-current-kmod 4
> > > "
> > > 
> > > If I leave in the ".if !empty(module)" line in, I only get:
> > > 
> > >    true "XXX A drm-current-kmod 2 /usr/local 3 drm-current-kmod 4
> > > "
> > > 
> > > suggestions welcome...
> > 
> > (CCing Kyle)
> > 
> > This behavior change is probably caused by r351799.
> > 
> > I personally think the code before Kyle’s change and after it was
> > buggy. It’s not word splitting LOCAL_MODULES before iterating over
> > it.
> > 
> 
> I've backed out r351799 since it breaks usage of LOCAL_MODULES
> (though
> I really don't understand how empty works, apparently, and that makes
> me sad)... please advise on a correct path forward, because it's not
> clear to me.
> 
> Thanks,
> 
> Kyle Evans
> 

I'm not positive, but I suspect this has to do with when variables are
expanded.  In particular, the loop variable for a .for is expanded on
each loop iteration, but doesn't yet exist during parsing.  I suspect
that the .if is evaluated earlier, during parsing.  For example, this
makefile:

   all:
   .for x in a "" b
   .if empty(x)
   	@echo empty
   .endif
   	@echo ${x}
   .endfor
   	@echo done

gives this output:

   revolution > make -f /tmp/Makefile 
   empty
   a
   empty

   empty
   b
   done

The way I interpret that is that empty(x) is true during parsing, so
the for loop is generated to contain "@echo empty" and "@echo ${x}",
then the for loop actually runs and prints both "empty" and the value
of ${x} on each iteration.

-- Ian





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