mirror of
https://git.mirrors.martin98.com/https://github.com/gulrak/filesystem
synced 2025-06-11 02:36:33 +08:00
Added some checks to hopefully better compile with Android NDK
This commit is contained in:
parent
ede29b0495
commit
3338d968ea
18
README.md
18
README.md
@ -40,15 +40,18 @@ evolved with C++11 and the following standards. Keep on the good work!
|
||||
It should work on any of these with a C++11-capable compiler. I currently
|
||||
don't have a BSD derivate besides macOS, so the preprocessor checks will
|
||||
cry out if you try to use it there, but if there is demand, I can try to
|
||||
help. Still, it shouldn't replace `std::filesystem` where full C++17 is
|
||||
available, it doesn't try to be a "better" `std::filesystem`, just a drop-in
|
||||
if you can't use it.
|
||||
help. Also there are some checks to hopefully better work on Android, but
|
||||
as I currently don't test with the Android NDK, I wouldn't call it a
|
||||
supported platform yet. All in all, I don't see it replacing `std::filesystem`
|
||||
where full C++17 is available, it doesn't try to be a "better"
|
||||
`std::filesystem`, just a drop-in if you can't use it (with the exception
|
||||
of the UTF-8 preference on Windows).
|
||||
|
||||
Tests are currently run with:
|
||||
|
||||
* macOS 10.12: XCode 9.2 (clang-900.0.39.2), GCC 8.1.0, Clang 7.0.0
|
||||
* Windows 10: Visual Studio 2017 15.8.5, MingW GCC 5.3
|
||||
* Linux: Ubuntu 18.04LTS GCC 7.3 & GCC 8.0.1
|
||||
* Linux: Ubuntu 18.04LTS GCC 7.3 & GCC 8.2.0
|
||||
|
||||
|
||||
## Tests
|
||||
@ -72,11 +75,12 @@ make
|
||||
This generates `filesystem_test`, the binary that runs all tests.
|
||||
|
||||
If the default compiler is a GCC 8 or newer, or Clang 7 or newer, it
|
||||
additionally builds a version of the test binary compiled against GCCs/Clangs
|
||||
additionally tries to build a version of the test binary compiled against GCCs/Clangs
|
||||
`std::filesystem` implementation, named `std_filesystem_test`
|
||||
as an additional test of conformance. Ideally all tests should compile and
|
||||
succeed with all filesystem implementations, but in reality, there are
|
||||
some differences in behavior and might be issues in these implementations.
|
||||
some differences in behavior, sometimes due to room for interpretation in
|
||||
in the standard, and there might be issues in these implementations too.
|
||||
|
||||
|
||||
## Usage
|
||||
@ -355,6 +359,8 @@ to the expected behavior.
|
||||
|
||||
* Bugfix for ([#9](https://github.com/gulrak/filesystem/issues/9)), added
|
||||
missing return statement to `ghc::filesystem::path::generic_string()`
|
||||
* Added checks to hopefully better compile against Android NDK. There where
|
||||
no tests run yet, so feedback is needed to actually call this supported.
|
||||
|
||||
### [v1.0.8](https://github.com/gulrak/filesystem/releases/tag/v1.0.8)
|
||||
|
||||
|
@ -21,7 +21,7 @@ std::time_t to_time_t(TP tp)
|
||||
static std::string perm_to_str(fs::perms prms)
|
||||
{
|
||||
std::string result;
|
||||
result.reserve(6);
|
||||
result.reserve(9);
|
||||
for(int i = 0; i < 9; ++i) {
|
||||
result = ((static_cast<int>(prms) & (1<<i)) ? "xwrxwrxwr"[i] : '-') + result;
|
||||
}
|
||||
|
23
filesystem.h
23
filesystem.h
@ -79,6 +79,10 @@
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#if defined(__ANDROID__)
|
||||
#define GHC_OS_ANDROID
|
||||
#include <android/api-level.h>
|
||||
#endif
|
||||
#endif
|
||||
#ifdef GHC_OS_MACOS
|
||||
#include <Availability.h>
|
||||
@ -1276,14 +1280,14 @@ inline std::string systemErrorText(ErrorNumber code = 0)
|
||||
std::string msg = toUtf8(std::wstring((LPWSTR)msgBuf));
|
||||
LocalFree(msgBuf);
|
||||
return msg;
|
||||
#elif defined(GHC_OS_LINUX)
|
||||
#elif defined(GHC_OS_MACOS) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE)) || (defined(GHC_OS_ANDROID) && __ANDROID_API__<23)
|
||||
char buffer[512];
|
||||
int rc = strerror_r(code ? code : errno, buffer, sizeof(buffer));
|
||||
return rc == 0 ? (const char*)buffer : "Error in strerror_r!"
|
||||
#else
|
||||
char buffer[512];
|
||||
char* msg = strerror_r(code ? code : errno, buffer, sizeof(buffer));
|
||||
return msg ? msg : buffer;
|
||||
#elif defined(GHC_OS_MACOS)
|
||||
char buffer[512];
|
||||
int rc = strerror_r(code ? code : errno, buffer, sizeof(buffer));
|
||||
return rc == 0 ? (const char*)buffer : "Error in strerror_r!";
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1679,10 +1683,14 @@ inline u8arguments::u8arguments(int& argc, char**& argv)
|
||||
_isvalid = true;
|
||||
#else
|
||||
std::setlocale(LC_ALL, "");
|
||||
#if defined(__ANDROID__) && __ANDROID_API__ < 26
|
||||
_isvalid = true;
|
||||
#else
|
||||
if (!detail::compare_no_case(::nl_langinfo(CODESET), "UTF-8")) {
|
||||
_isvalid = true;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -3800,13 +3808,16 @@ inline space_info space(const path& p, std::error_code& ec) noexcept
|
||||
return {static_cast<uintmax_t>(-1), static_cast<uintmax_t>(-1), static_cast<uintmax_t>(-1)};
|
||||
}
|
||||
return {static_cast<uintmax_t>(totalNumberOfBytes.QuadPart), static_cast<uintmax_t>(totalNumberOfFreeBytes.QuadPart), static_cast<uintmax_t>(freeBytesAvailableToCaller.QuadPart)};
|
||||
#else
|
||||
#elif !defined(__ANDROID__) || __ANDROID_API__ >= 19
|
||||
struct ::statvfs sfs;
|
||||
if (::statvfs(p.c_str(), &sfs) != 0) {
|
||||
ec = std::error_code(errno, std::system_category());
|
||||
return {static_cast<uintmax_t>(-1), static_cast<uintmax_t>(-1), static_cast<uintmax_t>(-1)};
|
||||
}
|
||||
return {static_cast<uintmax_t>(sfs.f_blocks * sfs.f_frsize), static_cast<uintmax_t>(sfs.f_bfree * sfs.f_frsize), static_cast<uintmax_t>(sfs.f_bavail * sfs.f_frsize)};
|
||||
#else
|
||||
ec = detail::make_error_code(detail::portable_error::not_supported);
|
||||
return {static_cast<uintmax_t>(-1), static_cast<uintmax_t>(-1), static_cast<uintmax_t>(-1)};
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user