weird behavior regarding case sensitivity of GNU make's $(wildcard) function

Corinna Vinschen corinna-cygwin@cygwin.com
Tue Jul 6 15:32:00 GMT 2010


On Jul  6 14:11, Robert Schiele wrote:
> Hi!
> 
> I found the following (in my optinion weird) behavior of the $(wildcard)
> function of GNU make when running on Cygwin:
> 
> I have a place in a makefile that checks for existence of a file (let's call
> it "/cygdrive/c/path/to/file") with $(wildcard /cygdrive/c/path/to/file).
> Unfortunately the vendor of this file refers to this file with different case
> letters than it is materialized on disk.  On the disk the file is actually
> stored as "C:\Path\to\File" which translates to the Cygwin style name
> "/cygdrive/c/Path/to/File".  Since Windows is supposed to be case-insensitive
> this should be fine but in Cygwin's GNU make binary (current version as of
> today) I observed the following behavior:
> 
> 1. "$(wildcard /cygdrive/c/path/to/file)" does not match anything and thus
>    returns an empty string.
> 
> 2. "$(wildcard /cygdrive/c/Path/to/File)" does match the file and thus returns
>    "/cygdrive/c/Path/to/File" as expected.
> 
> 3. "$(wildcard /cygdrive/c/Path/to/file)" does not match anything and thus
>    returns an empty string.
> 
> 4. "$(wildcard /cygdrive/c/path/to/File)" does match the file and thus returns
>    "/cygdrive/c/path/to/File".
> 
> More generic inspection reveals that apparently the $(wildcard) function seems
> to be case-insensitive on the directory part but case-sensitive on the file
> name part of the absolute path given.
> 
> Is this kind of expected behavior or does this point to a bug in the GNU make
> implementation (or even further down in a Cygwin library)?

It looks like this is expected behaviour due to the way make evaluates
the path in the wildcard function.  The strace shows that it simply
checks for the existence of the parent dir /cygdrive/c/path/to.  This
works, because /cygdrive paths are case-insensitive by default.  Next,
it calls opendir and readdir in a loop to check each file in the
directory for a match.  However, the matching algorithm is case-sensitive
by default.  This explains the above observation.

> Does anyone know of a reasonable workaround?  Is there a way to make the
> $(wildcard) function case-insensitive completely (like by setting a special
> option of flag)?  Or is there probably a better replacement function that does
> basically the same but in a case-insensitive way?

Can't answer that one.  Maybe `info make' is your friend...

> If this doesn't work is there probably some function that converts filename
> strings to a representation that is exactly how a file is stored on the disk,
> i.e. I give it "/cygdrive/c/path/to/file" and it returns
> "/cygdrive/c/Path/to/File"?
> 
> Any better ideas?

As a workaround using Cygwin's case-sensitive path handling works.  I
tested it.  See the fine User's Guide at
http://cygwin.com/cygwin-ug-net/using-specialnames.html#pathnames-casesensitive

I'd suggest to put your build paths under explicit Cygwin mount points,
rather than to change the /cygdrive prefix to posix=1.  The description
in the aforementioned section should explain the problem sufficiently.


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list