On Mon, May 02, 2011 at 12:18:06AM +0000, Paul D. Smith wrote:
> CVSROOT:      /sources/make
> Module name:  make
> Changes by:   Paul D. Smith <psmith>  11/05/02 00:18:06
> 
> Modified files:
>       .              : ChangeLog read.c 
> 
> Log message:
>       Avoid invoking glob() unless the filename has potential globbing
>       characters in it, for performance improvements.
> 
> CVSWeb URLs:
> http://cvs.savannah.gnu.org/viewcvs/make/ChangeLog?cvsroot=make&r1=2.428&r2=2.429
> http://cvs.savannah.gnu.org/viewcvs/make/read.c?cvsroot=make&r1=1.198&r2=1.199

This change seems to be breaking how $(wildcard) works for patterns
without glob characters.

For example, I used to check wheter a file exists with

    ifneq ($(wildcard path/to/file),)
        $(info path/to/file exists)
    endif


but now this is triggering all the time, because wildcards does not see
glob characters in the pattern, decides to avoid globbing it,
and just leaves path/to/file in place.

And this seems to be going in contrary with what make's manual says:

---- 8< ----
    @example
    $(wildcard @var{pattern}@dots{})
    @end example
    
    @noindent
    This string, used anywhere in a makefile, is replaced by a
    space-separated list of names of existing files that match one of the
    given file name patterns.  If no existing file name matches a pattern,
    then that pattern is *omitted* from the output of the @code{wildcard}
    function.  Note that this is different from how unmatched wildcards
    behave in rules, where they are used verbatim rather than ignored
    (@pxref{Wildcard Pitfall}).
---- 8< ----

(emphasis added)


This example from the manual

---- 8< ----
    This one is slightly more interesting: it defines a macro to search for
    the first instance of a program in @code{PATH}:
    
    @smallexample
    pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, 
,$(PATH)))))
    
    LS := $(call pathsearch,ls)
    @end smallexample
---- 8< ----

is now broken too, because LS will return first directory from path + ls
regardless of whether ls is there. Try it:

---- 8< ----
    PATH    := /aaa/bbb:$(PATH)
    pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, 
,$(PATH)))))
    
    LS := $(call pathsearch,ls)
    $(info XXX $(LS))
---- 8< ----



Maybe we should turn globbing on for $(wildcard) unconditionally?


Thanks,
Kirill


_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to