> From: l...@gnu.org (Ludovic Courtès) > Date: Mon, 09 Jun 2014 21:42:36 +0200 > > Eli Zaretskii <e...@gnu.org> skribis: > > > 3. load.test fails: > > > > FAIL: load.test: search-path for "foo.scm" yields "dir1/foo.scm" > > > > (The messages are misleading: "yields" should be "should yield".) > > > > The test fails because: > > > > . it compares file names with equal?, which fails when Windows > > file names with mixed forward and backslashes are used, and/or > > when the files differ but for letter case > > > > . the expected result uses a relative file name of temp-dir, while > > search-path returns absolute file names > > > > Fixed by using "/" to create a file name from its parts in load.c: > > > > --- libguile/load.c~ 2014-02-28 23:01:27 +0200 > > +++ libguile/load.c 2014-06-08 13:27:24 +0300 > > @@ -452,11 +452,15 @@ scm_c_string_has_an_ext (char *str, size > > return 0; > > } > > > > +#if 0 > > #ifdef __MINGW32__ > > #define FILE_NAME_SEPARATOR_STRING "\\" > > #else > > #define FILE_NAME_SEPARATOR_STRING "/" > > #endif > > +#else > > +#define FILE_NAME_SEPARATOR_STRING "/" > > +#endif > > > > static int > > is_file_name_separator (SCM c) > > > > I don't see any reasons to use the backslashes when constructing > > Windows file names. Unless someone can tell why using backslashes > > is a good idea, I propose to remove the Windows setting of > > FILE_NAME_SEPARATOR_STRING. > > I’m confused: this was added in 4bab7f01 precisely to support MinGW or > Windows. Similarly, boot-9.scm has ‘file-name-separator-string’ and > related stuff. This was the result of the discussion at > <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=10474#89>.
Sorry, that's my fault: I didn't explain the problem in enough detail. There's nothing wrong with the 4bab7f01 commit per se (and you will see that its only part that I changed is the definition of FILE_NAME_SEPARATOR_STRING for MinGW). The problem is not in that commit, it is elsewhere: in Scheme code, in this case in the test suite, that compares file names as simple strings. Such comparisons fail if the file names differ by the style of directory separators: one uses forward slashes, the other backslashes, or some mix thereof. Now, FILE_NAME_SEPARATOR_STRING is used only for constructing file names from their parts. It is not used for testing a particular file-name character for being a directory separator. Therefore, we can discard the separate definition of FILE_NAME_SEPARATOR_STRING for Windows, and use "/" on all platforms. This makes the problem of comparing file names easier, and in particular lets Guile pass load.test. But it doesn't solve the problem entirely. To solve this problem completely, we need a function that canonicalizes a file name wrt directory separators -- converts all backslashes to forward slashes. Does Guile have such a function? If it does, then comparing the canonicalized file names will work reliably on Windows. I hope I made myself clear this time. Thanks. P.S. Please CC me on your responses, as I'm not subscribed to the list, so I need to download the list archives in order to reply.