Build for CYGWIN

Summary:
Make it build for CYGWIN.
Need to define "-std=gnu++11" instead of "-std=c++11" and use some replacement functions.

Test Plan: Build it and run some unit tests in CYGWIN

Reviewers: yhchiang, rven, anthony, kradhakrishnan, igor

Reviewed By: igor

Subscribers: leveldb, dhruba

Differential Revision: https://reviews.facebook.net/D37605
This commit is contained in:
sdong 2015-04-23 19:17:57 -07:00
parent d01bbb53ae
commit 98a44559d5
14 changed files with 80 additions and 25 deletions

View File

@ -90,7 +90,6 @@ fi
COMMON_FLAGS="$COMMON_FLAGS ${CFLAGS}" COMMON_FLAGS="$COMMON_FLAGS ${CFLAGS}"
CROSS_COMPILE= CROSS_COMPILE=
PLATFORM_CCFLAGS= PLATFORM_CCFLAGS=
PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS ${CXXFLAGS}"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS" PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS"
PLATFORM_SHARED_EXT="so" PLATFORM_SHARED_EXT="so"
PLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl," PLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl,"
@ -156,6 +155,16 @@ case "$TARGET_OS" in
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread" PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread"
# PORT_FILES=port/dragonfly/dragonfly_specific.cc # PORT_FILES=port/dragonfly/dragonfly_specific.cc
;; ;;
Cygwin)
PLATFORM=CYGWIN
PLATFORM_CXXFLAGS="-std=gnu++11"
COMMON_FLAGS="$COMMON_FLAGS -DCYGWIN"
if [ -z "$USE_CLANG" ]; then
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp"
fi
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread -lrt"
# PORT_FILES=port/linux/linux_specific.cc
;;
OS_ANDROID_CROSSCOMPILE) OS_ANDROID_CROSSCOMPILE)
PLATFORM=OS_ANDROID PLATFORM=OS_ANDROID
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX" COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX"
@ -168,6 +177,7 @@ case "$TARGET_OS" in
exit 1 exit 1
esac esac
PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS ${CXXFLAGS}"
JAVA_LDFLAGS="$PLATFORM_LDFLAGS" JAVA_LDFLAGS="$PLATFORM_LDFLAGS"
if [ "$CROSS_COMPILE" = "true" -o "$FBCODE_BUILD" = "true" ]; then if [ "$CROSS_COMPILE" = "true" -o "$FBCODE_BUILD" = "true" ]; then

View File

@ -118,7 +118,11 @@ class ColumnFamilyTest : public testing::Test {
int GetProperty(int cf, std::string property) { int GetProperty(int cf, std::string property) {
std::string value; std::string value;
EXPECT_TRUE(dbfull()->GetProperty(handles_[cf], property, &value)); EXPECT_TRUE(dbfull()->GetProperty(handles_[cf], property, &value));
#ifndef CYGWIN
return std::stoi(value); return std::stoi(value);
#else
return std::strtol(value.c_str(), 0);
#endif
} }
void Destroy() { void Destroy() {

View File

@ -20,6 +20,7 @@
#define STORAGE_ROCKSDB_INCLUDE_SLICE_H_ #define STORAGE_ROCKSDB_INCLUDE_SLICE_H_
#include <assert.h> #include <assert.h>
#include <cstdio>
#include <stddef.h> #include <stddef.h>
#include <string.h> #include <string.h>
#include <string> #include <string>

View File

@ -5,7 +5,8 @@
// //
#include "port/stack_trace.h" #include "port/stack_trace.h"
#if defined(ROCKSDB_LITE) || !(defined(OS_LINUX) || defined(OS_MACOSX)) #if defined(ROCKSDB_LITE) || !(defined(OS_LINUX) || defined(OS_MACOSX)) || \
defined(CYGWIN)
// noop // noop

View File

@ -13,6 +13,7 @@
#include "db/dbformat.h" #include "db/dbformat.h"
#include "rocksdb/filter_policy.h" #include "rocksdb/filter_policy.h"
#include "util/coding.h" #include "util/coding.h"
#include "util/string_util.h"
namespace rocksdb { namespace rocksdb {
@ -59,7 +60,7 @@ void AppendItem(std::string* props, const std::string& key,
template <class TKey> template <class TKey>
void AppendItem(std::string* props, const TKey& key, const std::string& value) { void AppendItem(std::string* props, const TKey& key, const std::string& value) {
std::string key_str = std::to_string(key); std::string key_str = rocksdb::ToString(key);
AppendItem(props, key_str, value); AppendItem(props, key_str, value);
} }
} // namespace } // namespace
@ -236,7 +237,7 @@ std::string BlockBasedFilterBlockReader::ToString() const {
result.reserve(1024); result.reserve(1024);
std::string s_bo("Block offset"), s_hd("Hex dump"), s_fb("# filter blocks"); std::string s_bo("Block offset"), s_hd("Hex dump"), s_fb("# filter blocks");
AppendItem(&result, s_fb, std::to_string(num_)); AppendItem(&result, s_fb, rocksdb::ToString(num_));
AppendItem(&result, s_bo, s_hd); AppendItem(&result, s_bo, s_hd);
for (size_t index = 0; index < num_; index++) { for (size_t index = 0; index < num_; index++) {
@ -244,7 +245,7 @@ std::string BlockBasedFilterBlockReader::ToString() const {
uint32_t limit = DecodeFixed32(offset_ + index * 4 + 4); uint32_t limit = DecodeFixed32(offset_ + index * 4 + 4);
if (start != limit) { if (start != limit) {
result.append(" filter block # " + std::to_string(index + 1) + "\n"); result.append(" filter block # " + rocksdb::ToString(index + 1) + "\n");
Slice filter = Slice(data_ + start, limit - start); Slice filter = Slice(data_ + start, limit - start);
AppendItem(&result, start, filter.ToString(true)); AppendItem(&result, start, filter.ToString(true));
} }

View File

@ -1586,7 +1586,7 @@ Status BlockBasedTable::DumpDataBlocks(WritableFile* out_file) {
} }
out_file->Append("Data Block # "); out_file->Append("Data Block # ");
out_file->Append(std::to_string(block_id)); out_file->Append(rocksdb::ToString(block_id));
out_file->Append(" @ "); out_file->Append(" @ ");
out_file->Append(blockhandles_iter->value().ToString(true).c_str()); out_file->Append(blockhandles_iter->value().ToString(true).c_str());
out_file->Append("\n"); out_file->Append("\n");

View File

@ -18,6 +18,7 @@
#include "util/compression.h" #include "util/compression.h"
#include "util/crc32c.h" #include "util/crc32c.h"
#include "util/perf_context_imp.h" #include "util/perf_context_imp.h"
#include "util/string_util.h"
#include "util/xxhash.h" #include "util/xxhash.h"
namespace rocksdb { namespace rocksdb {
@ -196,15 +197,15 @@ std::string Footer::ToString() const {
if (legacy) { if (legacy) {
result.append("metaindex handle: " + metaindex_handle_.ToString() + "\n "); result.append("metaindex handle: " + metaindex_handle_.ToString() + "\n ");
result.append("index handle: " + index_handle_.ToString() + "\n "); result.append("index handle: " + index_handle_.ToString() + "\n ");
result.append("table_magic_number: " + std::to_string(table_magic_number_) + result.append("table_magic_number: " +
"\n "); rocksdb::ToString(table_magic_number_) + "\n ");
} else { } else {
result.append("checksum: " + std::to_string(checksum_) + "\n "); result.append("checksum: " + rocksdb::ToString(checksum_) + "\n ");
result.append("metaindex handle: " + metaindex_handle_.ToString() + "\n "); result.append("metaindex handle: " + metaindex_handle_.ToString() + "\n ");
result.append("index handle: " + index_handle_.ToString() + "\n "); result.append("index handle: " + index_handle_.ToString() + "\n ");
result.append("footer version: " + std::to_string(version_) + "\n "); result.append("footer version: " + rocksdb::ToString(version_) + "\n ");
result.append("table_magic_number: " + std::to_string(table_magic_number_) + result.append("table_magic_number: " +
"\n "); rocksdb::ToString(table_magic_number_) + "\n ");
} }
return result; return result;
} }

View File

@ -192,7 +192,7 @@ vector<string> GetTestKeys(size_t size) {
int index = 0; int index = 0;
for (auto& key : keys) { for (auto& key : keys) {
key = "item-" + to_string(index++); key = "item-" + rocksdb::ToString(index++);
} }
return keys; return keys;
} }

View File

@ -66,7 +66,7 @@
// For non linux platform, the following macros are used only as place // For non linux platform, the following macros are used only as place
// holder. // holder.
#ifndef OS_LINUX #if !(defined OS_LINUX) && !(defined CYGWIN)
#define POSIX_FADV_NORMAL 0 /* [MC1] no further special treatment */ #define POSIX_FADV_NORMAL 0 /* [MC1] no further special treatment */
#define POSIX_FADV_RANDOM 1 /* [MC1] expect random page refs */ #define POSIX_FADV_RANDOM 1 /* [MC1] expect random page refs */
#define POSIX_FADV_SEQUENTIAL 2 /* [MC1] expect sequential page refs */ #define POSIX_FADV_SEQUENTIAL 2 /* [MC1] expect sequential page refs */
@ -186,7 +186,11 @@ class PosixSequentialFile: public SequentialFile {
Status s; Status s;
size_t r = 0; size_t r = 0;
do { do {
#ifndef CYGWIN
r = fread_unlocked(scratch, 1, n, file_); r = fread_unlocked(scratch, 1, n, file_);
#else
r = fread(scratch, 1, n, file_);
#endif
} while (r == 0 && ferror(file_) && errno == EINTR); } while (r == 0 && ferror(file_) && errno == EINTR);
IOSTATS_ADD(bytes_read, r); IOSTATS_ADD(bytes_read, r);
*result = Slice(scratch, r); *result = Slice(scratch, r);

View File

@ -17,9 +17,11 @@
#include "rocksdb/table_properties.h" #include "rocksdb/table_properties.h"
#include "util/coding.h" #include "util/coding.h"
#include "util/sst_dump_tool_imp.h" #include "util/sst_dump_tool_imp.h"
#include "util/string_util.h"
#include "util/scoped_arena_iterator.h" #include "util/scoped_arena_iterator.h"
#include "utilities/ttl/db_ttl_impl.h" #include "utilities/ttl/db_ttl_impl.h"
#include <cstdlib>
#include <ctime> #include <ctime>
#include <dirent.h> #include <dirent.h>
#include <limits> #include <limits>
@ -192,7 +194,11 @@ bool LDBCommand::ParseIntOption(const map<string, string>& options,
map<string, string>::const_iterator itr = option_map_.find(option); map<string, string>::const_iterator itr = option_map_.find(option);
if (itr != option_map_.end()) { if (itr != option_map_.end()) {
try { try {
#if defined(CYGWIN)
value = strtol(itr->second.c_str(), 0, 10);
#else
value = stoi(itr->second); value = stoi(itr->second);
#endif
return true; return true;
} catch(const invalid_argument&) { } catch(const invalid_argument&) {
exec_state = exec_state =
@ -897,7 +903,11 @@ DBDumperCommand::DBDumperCommand(const vector<string>& params,
itr = options.find(ARG_MAX_KEYS); itr = options.find(ARG_MAX_KEYS);
if (itr != options.end()) { if (itr != options.end()) {
try { try {
#if defined(CYGWIN)
max_keys_ = strtol(itr->second.c_str(), 0, 10);
#else
max_keys_ = stoi(itr->second); max_keys_ = stoi(itr->second);
#endif
} catch(const invalid_argument&) { } catch(const invalid_argument&) {
exec_state_ = LDBCommandExecuteResult::Failed(ARG_MAX_KEYS + exec_state_ = LDBCommandExecuteResult::Failed(ARG_MAX_KEYS +
" has an invalid value"); " has an invalid value");
@ -1104,7 +1114,7 @@ vector<string> ReduceDBLevelsCommand::PrepareArgs(const string& db_path,
vector<string> ret; vector<string> ret;
ret.push_back("reduce_levels"); ret.push_back("reduce_levels");
ret.push_back("--" + ARG_DB + "=" + db_path); ret.push_back("--" + ARG_DB + "=" + db_path);
ret.push_back("--" + ARG_NEW_LEVELS + "=" + to_string(new_levels)); ret.push_back("--" + ARG_NEW_LEVELS + "=" + rocksdb::ToString(new_levels));
if(print_old_level) { if(print_old_level) {
ret.push_back("--" + ARG_PRINT_OLD_LEVELS); ret.push_back("--" + ARG_PRINT_OLD_LEVELS);
} }
@ -1656,7 +1666,11 @@ ScanCommand::ScanCommand(const vector<string>& params,
itr = options.find(ARG_MAX_KEYS); itr = options.find(ARG_MAX_KEYS);
if (itr != options.end()) { if (itr != options.end()) {
try { try {
#if defined(CYGWIN)
max_keys_scanned_ = strtol(itr->second.c_str(), 0, 10);
#else
max_keys_scanned_ = stoi(itr->second); max_keys_scanned_ = stoi(itr->second);
#endif
} catch(const invalid_argument&) { } catch(const invalid_argument&) {
exec_state_ = LDBCommandExecuteResult::Failed(ARG_MAX_KEYS + exec_state_ = LDBCommandExecuteResult::Failed(ARG_MAX_KEYS +
" has an invalid value"); " has an invalid value");

View File

@ -5,6 +5,7 @@
#include <cassert> #include <cassert>
#include <cctype> #include <cctype>
#include <cstdlib>
#include <unordered_set> #include <unordered_set>
#include "rocksdb/cache.h" #include "rocksdb/cache.h"
#include "rocksdb/filter_policy.h" #include "rocksdb/filter_policy.h"
@ -14,6 +15,7 @@
#include "rocksdb/table.h" #include "rocksdb/table.h"
#include "rocksdb/utilities/convenience.h" #include "rocksdb/utilities/convenience.h"
#include "table/block_based_table_factory.h" #include "table/block_based_table_factory.h"
#include "util/logging.h"
#include "util/options_helper.h" #include "util/options_helper.h"
namespace rocksdb { namespace rocksdb {
@ -73,7 +75,13 @@ bool ParseBoolean(const std::string& type, const std::string& value) {
uint64_t ParseUint64(const std::string& value) { uint64_t ParseUint64(const std::string& value) {
size_t endchar; size_t endchar;
#ifndef CYGWIN
uint64_t num = std::stoull(value.c_str(), &endchar); uint64_t num = std::stoull(value.c_str(), &endchar);
#else
char* endptr;
uint64_t num = std::strtoul(value.c_str(), &endptr, 0);
endchar = endptr - value.c_str();
#endif
if (endchar < value.length()) { if (endchar < value.length()) {
char c = value[endchar]; char c = value[endchar];
@ -105,7 +113,13 @@ uint32_t ParseUint32(const std::string& value) {
int ParseInt(const std::string& value) { int ParseInt(const std::string& value) {
size_t endchar; size_t endchar;
#ifndef CYGWIN
int num = std::stoi(value.c_str(), &endchar); int num = std::stoi(value.c_str(), &endchar);
#else
char* endptr;
int num = std::strtoul(value.c_str(), &endptr, 0);
endchar = endptr - value.c_str();
#endif
if (endchar < value.length()) { if (endchar < value.length()) {
char c = value[endchar]; char c = value[endchar];
@ -121,7 +135,11 @@ int ParseInt(const std::string& value) {
} }
double ParseDouble(const std::string& value) { double ParseDouble(const std::string& value) {
#ifndef CYGWIN
return std::stod(value); return std::stod(value);
#else
return std::strtod(value.c_str(), 0);
#endif
} }
CompactionStyle ParseCompactionStyle(const std::string& type) { CompactionStyle ParseCompactionStyle(const std::string& type) {

View File

@ -14,10 +14,10 @@ extern std::vector<std::string> StringSplit(const std::string& arg, char delim);
template <typename T> template <typename T>
inline std::string ToString(T value) { inline std::string ToString(T value) {
#ifndef OS_ANDROID #if !(defined OS_ANDROID) && !(defined CYGWIN)
return std::to_string(value); return std::to_string(value);
#else #else
// Andorid doesn't support all of C++11, std::to_string() being // Andorid or cygwin doesn't support all of C++11, std::to_string() being
// one of the not supported features. // one of the not supported features.
std::ostringstream os; std::ostringstream os;
os << value; os << value;

View File

@ -14,6 +14,7 @@
#include "util/coding.h" #include "util/coding.h"
#include "util/crc32c.h" #include "util/crc32c.h"
#include "util/logging.h" #include "util/logging.h"
#include "util/string_util.h"
#include "rocksdb/transaction_log.h" #include "rocksdb/transaction_log.h"
#ifndef __STDC_FORMAT_MACROS #ifndef __STDC_FORMAT_MACROS
@ -251,7 +252,7 @@ class BackupEngineImpl : public BackupEngine {
bool tmp = false, bool tmp = false,
const std::string& file = "") const { const std::string& file = "") const {
assert(file.size() == 0 || file[0] != '/'); assert(file.size() == 0 || file[0] != '/');
return GetPrivateDirRel() + "/" + std::to_string(backup_id) + return GetPrivateDirRel() + "/" + rocksdb::ToString(backup_id) +
(tmp ? ".tmp" : "") + "/" + file; (tmp ? ".tmp" : "") + "/" + file;
} }
inline std::string GetSharedFileRel(const std::string& file = "", inline std::string GetSharedFileRel(const std::string& file = "",
@ -270,8 +271,8 @@ class BackupEngineImpl : public BackupEngine {
assert(file.size() == 0 || file[0] != '/'); assert(file.size() == 0 || file[0] != '/');
std::string file_copy = file; std::string file_copy = file;
return file_copy.insert(file_copy.find_last_of('.'), return file_copy.insert(file_copy.find_last_of('.'),
"_" + std::to_string(checksum_value) "_" + rocksdb::ToString(checksum_value) + "_" +
+ "_" + std::to_string(file_size)); rocksdb::ToString(file_size));
} }
inline std::string GetFileFromChecksumFile(const std::string& file) const { inline std::string GetFileFromChecksumFile(const std::string& file) const {
assert(file.size() == 0 || file[0] != '/'); assert(file.size() == 0 || file[0] != '/');
@ -287,7 +288,7 @@ class BackupEngineImpl : public BackupEngine {
return GetAbsolutePath("meta"); return GetAbsolutePath("meta");
} }
inline std::string GetBackupMetaFile(BackupID backup_id) const { inline std::string GetBackupMetaFile(BackupID backup_id) const {
return GetBackupMetaDir() + "/" + std::to_string(backup_id); return GetBackupMetaDir() + "/" + rocksdb::ToString(backup_id);
} }
Status GetLatestBackupFileContents(uint32_t* latest_backup); Status GetLatestBackupFileContents(uint32_t* latest_backup);
@ -402,7 +403,7 @@ BackupEngineImpl::BackupEngineImpl(Env* db_env,
Log(options_.info_log, "Detected backup %s", file.c_str()); Log(options_.info_log, "Detected backup %s", file.c_str());
BackupID backup_id = 0; BackupID backup_id = 0;
sscanf(file.c_str(), "%u", &backup_id); sscanf(file.c_str(), "%u", &backup_id);
if (backup_id == 0 || file != std::to_string(backup_id)) { if (backup_id == 0 || file != rocksdb::ToString(backup_id)) {
if (!read_only_) { if (!read_only_) {
Log(options_.info_log, "Unrecognized meta file %s, deleting", Log(options_.info_log, "Unrecognized meta file %s, deleting",
file.c_str()); file.c_str());
@ -1264,7 +1265,7 @@ Status BackupEngineImpl::BackupMeta::LoadFromFile(
line.remove_prefix(checksum_prefix.size()); line.remove_prefix(checksum_prefix.size());
checksum_value = static_cast<uint32_t>( checksum_value = static_cast<uint32_t>(
strtoul(line.data(), nullptr, 10)); strtoul(line.data(), nullptr, 10));
if (line != std::to_string(checksum_value)) { if (line != rocksdb::ToString(checksum_value)) {
return Status::Corruption("Invalid checksum value for " + filename + return Status::Corruption("Invalid checksum value for " + filename +
" in " + meta_filename_); " in " + meta_filename_);
} }

View File

@ -206,8 +206,8 @@ Status GeoDBImpl::SearchRadial(const GeoPosition& pos,
std::string GeoDBImpl::MakeKey1(const GeoPosition& pos, Slice id, std::string GeoDBImpl::MakeKey1(const GeoPosition& pos, Slice id,
std::string quadkey) { std::string quadkey) {
std::string lat = std::to_string(pos.latitude); std::string lat = rocksdb::ToString(pos.latitude);
std::string lon = std::to_string(pos.longitude); std::string lon = rocksdb::ToString(pos.longitude);
std::string key = "p:"; std::string key = "p:";
key.reserve(5 + quadkey.size() + id.size() + lat.size() + lon.size()); key.reserve(5 + quadkey.size() + id.size() + lat.size() + lon.size());
key.append(quadkey); key.append(quadkey);