delorie.com/archives/browse.cgi | search |
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
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |