Opened 18 years ago
Closed 17 years ago
#297 closed Bugs (Fixed)
boost::filesystem::exists is broken on cygwin
| Reported by: | libcw | Owned by: | beman_dawes |
|---|---|---|---|
| Milestone: | Component: | None | |
| Version: | None | Severity: | |
| Keywords: | Cc: |
Description
Compile the following code snippet:
#include <iostream>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
int main()
{
boost::filesystem::path p = "/usr";
if (!boost::filesystem::exists(p))
std::cerr << p.string() << " doesn't exist
according to boost::filesystem" << std::endl;
}
$ uname -a
CYGWIN_NT-5.0 vmware 1.5.10(0.116/4/2) 2004-05-25 22:07
i686 unknown unknown Cygwin
$ g++ -g -I"/usr/src/install/3.3.1/include/boost-1_31"
test.cc -L"/usr/src/install/3.3.1/lib"
-lboost_filesystem-gcc-d-1_31
$ ./a.exe
/usr doesn't exist according to boost::filesystem
Needless to say that /usr does exist:
$ ls -ld /usr
drwxrwxrwx+ 18 carlo Gebruike 4096 Aug 8 14:49
/usr
Change History (4)
comment:2 by , 18 years ago
Logged In: YES user_id=780 Yes bjam was build with cygwin, as follows: tar xzf boost-jam-3.1.10.tgz cd boost-jam-3.1.10 ./build.sh cp bin.cygwinx86/bjam.exe "$INSTALL_PREFIX/bin" And that is done with the following environment (in case that matters) TOOLS=gcc PYTHON_ROOT=/usr PYTHON_VERSION=2.3 GXX="$CXX" GCC="$CC" BOOST_SITE_CONFIG=/usr/src/boost/boost/boost/config/user.hpp export TOOLS PYTHON_ROOT PYTHON_VERSION GXX GCC BOOST_SITE_CONFIG Other, more general environment variables are set too (like CC, CXX and INSTALL_PREFIX). I don't entirely understand your remark however, because the boost code explicitely contains this code: # if !defined( BOOST_WINDOWS ) && !defined( BOOST_POSIX ) # if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__) # define BOOST_WINDOWS # else # define BOOST_POSIX # endif # endif at several place in the code, setting BOOST_WINDOWS explicitely for __CYGWIN__.
comment:3 by , 17 years ago
Logged In: YES user_id=51042 I've finally tracked this down. It is a bug in the Boost.Filesystem code. To get the desired cygwin behavior, two things are required. The cygwin supplied POSIX API has to be used, and slash (rather than back-slash) has to be given as the root directory. IOW, cygwin gives different meanings to root paths depending on the initial character. Since the Boost code converts slashes to back-slashes, the cygwin libraries never see the slash. The problem has now been fixed in the i18n branch code that will be the basis for 1.34.0. Fixing it in the pre-i18n code from 1.33.1 is difficult because the changes would need to be spread between the class declaration in the header and the implementation in the library. That is a recipe for disaster since a crash would result if user code defined the controlling macro one way but the library was built with it defined the other way. So I won't make any change to the 1.33.x codebase. The branch code is scheduled to be merged into the main trunk next week in any case. --Beman
comment:4 by , 17 years ago
| Status: | assigned → closed |
|---|
Note:
See TracTickets
for help on using tickets.
