Merge pull request #2848 from xfxyjwf/freebsd

Fix freebsd build.
pull/2850/merge
Feng Xiao 8 years ago committed by GitHub
commit c0871aa49c
  1. 46
      src/google/protobuf/compiler/cpp/cpp_file.cc
  2. 9
      src/google/protobuf/compiler/cpp/cpp_file.h
  3. 6
      src/google/protobuf/compiler/plugin.pb.h
  4. 2
      src/google/protobuf/stubs/stringpiece_unittest.cc

@ -54,6 +54,39 @@ namespace google {
namespace protobuf { namespace protobuf {
namespace compiler { namespace compiler {
namespace cpp { namespace cpp {
namespace {
// The list of names that are defined as macros on some platforms. We need to
// #undef them for the generated code to compile.
const char* kMacroNames[] = {"major", "minor"};
bool IsMacroName(const string& name) {
// Just do a linear search as the number of elements is very small.
for (int i = 0; i < GOOGLE_ARRAYSIZE(kMacroNames); ++i) {
if (name == kMacroNames[i]) return true;
}
return false;
}
void CollectMacroNames(const Descriptor* message, vector<string>* names) {
for (int i = 0; i < message->field_count(); ++i) {
const FieldDescriptor* field = message->field(i);
if (IsMacroName(field->name())) {
names->push_back(field->name());
}
}
for (int i = 0; i < message->nested_type_count(); ++i) {
CollectMacroNames(message->nested_type(i), names);
}
}
void CollectMacroNames(const FileDescriptor* file, vector<string>* names) {
for (int i = 0; i < file->message_type_count(); ++i) {
CollectMacroNames(file->message_type(i), names);
}
}
} // namespace
// =================================================================== // ===================================================================
@ -103,10 +136,23 @@ FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options)
FileGenerator::~FileGenerator() {} FileGenerator::~FileGenerator() {}
void FileGenerator::GenerateMacroUndefs(io::Printer* printer) {
vector<string> names_to_undef;
CollectMacroNames(file_, &names_to_undef);
for (int i = 0; i < names_to_undef.size(); ++i) {
printer->Print(
"#ifdef $name$\n"
"#undef $name$\n"
"#endif\n",
"name", names_to_undef[i]);
}
}
void FileGenerator::GenerateHeader(io::Printer* printer) { void FileGenerator::GenerateHeader(io::Printer* printer) {
printer->Print( printer->Print(
"// @@protoc_insertion_point(includes)\n"); "// @@protoc_insertion_point(includes)\n");
GenerateMacroUndefs(printer);
GenerateForwardDeclarations(printer); GenerateForwardDeclarations(printer);

@ -133,6 +133,15 @@ class FileGenerator {
void GenerateProto2NamespaceEnumSpecializations(io::Printer* printer); void GenerateProto2NamespaceEnumSpecializations(io::Printer* printer);
// Sometimes the names we use in a .proto file happen to be defined as macros
// on some platforms (e.g., macro/minor used in plugin.proto are defined as
// macros in sys/types.h on FreeBSD and a few other platforms). To make the
// generated code compile on these platforms, we either have to undef the
// macro for these few platforms, or rename the field name for all platforms.
// Since these names are part of protobuf public API, renaming is generally
// a breaking change so we prefer the #undef approach.
void GenerateMacroUndefs(io::Printer* printer);
const FileDescriptor* file_; const FileDescriptor* file_;
const Options options_; const Options options_;

@ -30,6 +30,12 @@
#include <google/protobuf/unknown_field_set.h> #include <google/protobuf/unknown_field_set.h>
#include <google/protobuf/descriptor.pb.h> #include <google/protobuf/descriptor.pb.h>
// @@protoc_insertion_point(includes) // @@protoc_insertion_point(includes)
#ifdef major
#undef major
#endif
#ifdef minor
#undef minor
#endif
namespace google { namespace google {
namespace protobuf { namespace protobuf {
class DescriptorProto; class DescriptorProto;

@ -783,11 +783,13 @@ TEST(FindOneCharTest, EdgeCases) {
EXPECT_EQ(StringPiece::npos, a.rfind('x')); EXPECT_EQ(StringPiece::npos, a.rfind('x'));
} }
#ifdef PROTOBUF_HAS_DEATH_TEST
#ifndef NDEBUG #ifndef NDEBUG
TEST(NonNegativeLenTest, NonNegativeLen) { TEST(NonNegativeLenTest, NonNegativeLen) {
EXPECT_DEATH(StringPiece("xyz", -1), "len >= 0"); EXPECT_DEATH(StringPiece("xyz", -1), "len >= 0");
} }
#endif // ndef DEBUG #endif // ndef DEBUG
#endif // PROTOBUF_HAS_DEATH_TEST
} // namespace } // namespace
} // namespace protobuf } // namespace protobuf

Loading…
Cancel
Save