
On Wed, Aug 18, 2004 at 02:09:56PM -0400, Jeremy Maitin-Shepard wrote:
The standard Windows path handling code in boost.filesystem treats the ("portable" format) path /usr as the Windows path "\usr", namely the usr subdirectory of the root directory of the current drive/volume.
Sure. That is what I said. On windows, "/usr" would in effect be expanded to "letter:/usr" where <letter> is the (current) drive/volume root directory. That isn't different from what it does now. Only on cygwin the behaviour would change, and "/usr" would refer to "C:/cygwin/usr" rather than "C:/usr". If someone really wanted to specify a path that is a WINDOWS path (rather non-portable) then he has to make sure that path is complete before using it. For example, he could use "C:/Program Files" and would just access that directory, while using "/Program Files" would not work (anymore). I don't consider that a problem however. People who want to specify windows paths on cygwin might as well use complete paths - it is more important that one can ALSO use POSIX paths (like "/usr"). [...]
If it followed these semantics, there would be no reason to define BOOST_POSIX when compiling Boost for cygwin, since the only effect would be that certain paths become illegal, no new paths become legal, and all legal paths refer to the same files.
Not entirely true - the result of 'current_path()' would still change from "C:/cygwin" to "/".
Consider, however, these alternate semantics for boost filesystem path handling on Cygwin:
When compiled with BOOST_WINDOWS:
"/" refers to the root directory of the current drive/volume
"letter:/" refers to the <letter> drive/volume root directory
When compiled with BOOST_POSIX:
"/" refers to the Cygwin root directory
"letter:/" refers to the <letter> drive/volume root directory
My problem with this is that the behaviour of boost::filesystem then depends on how it was compiled; that means in at least that no shared library (or dll) may be produced: it should always be a static library. Otherwise a program can work on one machine and fail on the next because the filesystem lib uses different semantics. More over, relying on "/" to refer to the root directory of the current drive/volume, on a multi-root system SHOULD be deprecated, because it is 'kinky' to use the term used in the documentation of boost::filesystem. A programmer should always use either complete paths or paths relative to the initial directory (the working directory at program start). Using "/" is not safe. My proposal would be to have this behaviour: Whether compiled with BOOST_WINDOWS or BOOST_POSIX: "/" refers to the root directory of single root systems. If the system is not a single-root system then it should throw. However, if the system is cygwin, then it should be the cygwin root. "letter:/" refers to the <letter> drive/volume root directory on multi-root systems. If the system is not a multi-root system then it should throw*) On cygwin this would be the windows path. *) When being used for an operation; not when handling a 'path'. -- Carlo Wood <carlo@alinoe.com>