delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2010/07/06/15:26:23

X-Recipient: archive-cygwin AT delorie DOT com
X-Spam-Check-By: sourceware.org
Date: Tue, 6 Jul 2010 15:59:28 +0200
From: Corinna Vinschen <corinna-cygwin AT cygwin DOT com>
To: cygwin AT cygwin DOT com
Subject: Re: weird behavior regarding case sensitivity of GNU make's $(wildcard) function
Message-ID: <20100706135928.GQ6521@calimero.vinschen.de>
Reply-To: cygwin AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
References: <20100706121100 DOT GA19706 AT sigfpe DOT ibm DOT com>
MIME-Version: 1.0
In-Reply-To: <20100706121100.GA19706@sigfpe.ibm.com>
User-Agent: Mutt/1.5.20 (2009-06-14)
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Unsubscribe: <mailto:cygwin-unsubscribe-archive-cygwin=delorie DOT com AT cygwin DOT com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

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

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019