misc. stuff:

- Improved readmes.
- Fixed incorrect definition of kint32min.
- Fixed absolute output paths on Windows.
- Added info to Java POM that will be required when we upload the
  package to a Maven repo.
pull/3335/head
temporal 17 years ago
parent e8564291e2
commit cc930432c2
  1. 26
      README.txt
  2. 32
      java/README.txt
  3. 22
      java/pom.xml
  4. 12
      python/README.txt
  5. 33
      src/google/protobuf/compiler/command_line_interface.cc
  6. 71
      src/google/protobuf/compiler/command_line_interface_unittest.cc
  7. 2
      src/google/protobuf/stubs/common.h
  8. 11
      src/google/protobuf/stubs/common_unittest.cc
  9. 7
      vsprojects/readme.txt

@ -10,8 +10,8 @@ incompatible way in the future. It's unlikely that any big changes
will be made, but we can make no promises. Expect a non-beta release
sometime in August 2008.
C++ Installation
================
C++ Installation - Unix
=======================
To build and install the C++ Protocol Buffer runtime and the Protocol
Buffer compiler (protoc) execute the following:
@ -27,7 +27,19 @@ Proceed at your own risk.
"make install" may require superuser privileges.
For advanced usage information on configure and make, see INSTALL.
For advanced usage information on configure and make, see INSTALL.txt.
** Hint on insall location **
By default, the package will be installed to /usr/local. However,
on many platforms, /usr/local/lib is not part of LD_LIBRARY_PATH.
You can add it, but it may be easier to just install to /usr
instead. To do this, invoke configure as follows:
./configure --prefix=/usr
If you already built the package with a different prefix, make sure
to run "make clean" before building again.
** Note for Solaris users **
@ -39,6 +51,14 @@ For advanced usage information on configure and make, see INSTALL.
See src/solaris/libstdc++.la for more info on this bug.
C++ Installation - Windows
==========================
If you are using Micosoft Visual C++, see vsprojects/readme.txt.
If you are using Cygwin or MinGW, follow the Unix installation
instructions, above.
Java and Python Installation
============================

@ -3,8 +3,11 @@ Copyright 2008 Google Inc.
This directory contains the Java Protocol Buffers runtime library.
Installation
============
Installation - With Maven
=========================
The Protocol Buffers build is managed using Maven. If you would
rather build without Maven, see the next section.
1) Install Apache Maven if you don't have it:
@ -37,6 +40,31 @@ Installation
The .jar will be placed in the "target" directory.
Installation - Without Maven
============================
If you would rather not install Maven to build the library, you may
follow these instructions instead. Note that these instructions skip
running unit tests.
1) Build the C++ code, or obtain a binary distribution of protoc. If
you install a binary distribution, make sure that it is the same
version as this package. If in doubt, run:
$ protoc --version
If you built the C++ code without installing, the compiler binary
should be located in ../src.
2) Invoke protoc to build DescriptorProtos.java:
$ protoc --java_out=src/main/java -I../src \
../src/google/protobuf/descriptor.proto
3) Compile the code in src/main/java using whatever means you prefer.
4) Install the classes wherever you prefer.
Usage
=====

@ -14,10 +14,27 @@
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.0.1-SNAPSHOT</version>
<name>Protocol Buffer Java API</name>
<packaging>jar</packaging>
<name>Protocol Buffer Java API</name>
<description>
Protocol Buffers are a way of encoding structured data in an efficient yet
extensible format.
</description>
<inceptionYear>2008</inceptionYear>
<url>http://code.google.com/p/protobuf</url>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<scm>
<url>http://code.google.com/p/protobuf/source/browse</url>
<connection>
scm:svn:http://protobuf.googlecode.com/svn/trunk/
</connection>
</scm>
<dependencies>
<dependency>
<groupId>junit</groupId>
@ -89,7 +106,8 @@
<arg value="../src/google/protobuf/unittest.proto" />
<arg value="../src/google/protobuf/unittest_import.proto" />
<arg value="../src/google/protobuf/unittest_mset.proto" />
<arg value="src/test/java/com/google/protobuf/multiple_files_test.proto" />
<arg
value="src/test/java/com/google/protobuf/multiple_files_test.proto" />
<arg
value="../src/google/protobuf/unittest_optimize_for.proto" />
</exec>

@ -3,6 +3,18 @@ Copyright 2008 Google Inc.
This directory contains the Python Protocol Buffers runtime library.
Normally, this directory comes as part of the protobuf package, available
from:
http://code.google.com/p/protobuf
The complete package includes the C++ source code, which includes the
Protocol Compiler (protoc). If you downloaded this package from PyPI
or some other Python-specific source, you may have received only the
Python part of the code. In this case, you will need to obtain the
Protocol Compiler from some other source before you can use this
package.
Installation
============

@ -29,6 +29,7 @@
#endif
#include <errno.h>
#include <iostream>
#include <ctype.h>
#include <google/protobuf/compiler/command_line_interface.h>
#include <google/protobuf/compiler/importer.h>
@ -67,6 +68,20 @@ static const char* kPathSeparator = ";";
#else
static const char* kPathSeparator = ":";
#endif
// Returns true if the text looks like a Windows-style absolute path, starting
// with a drive letter. Example: "C:\foo".
static bool IsWindowsAbsolutePath(const string& text) {
#if defined(_WIN32) || defined(__CYGWIN__)
return text.size() >= 3 && text[1] == ':' &&
isalpha(text[0]) &&
(text[2] == '/' || text[2] == '\\') &&
text.find_last_of(':') == 1;
#else
return false;
#endif
}
} // namespace
// A MultiFileErrorCollector that prints errors to stderr.
@ -502,18 +517,14 @@ bool CommandLineInterface::InterpretArgument(const string& name,
directive.generator = iter->second.generator;
// Split value at ':' to separate the generator parameter from the
// filename.
vector<string> parts;
SplitStringUsing(value, ":", &parts);
if (parts.size() == 1) {
directive.output_location = parts[0];
} else if (parts.size() == 2) {
directive.parameter = parts[0];
directive.output_location = parts[1];
// filename. However, avoid doing this if the colon is part of a valid
// Windows-style absolute path.
string::size_type colon_pos = value.find_first_of(':');
if (colon_pos == string::npos || IsWindowsAbsolutePath(value)) {
directive.output_location = value;
} else {
cerr << "Invalid value for flag " << name << "." << endl;
return false;
directive.parameter = value.substr(0, colon_pos);
directive.output_location = value.substr(colon_pos + 1);
}
output_directives_.push_back(directive);

@ -51,6 +51,7 @@ class CommandLineInterfaceTest : public testing::Test {
// Methods to set up the test (called before Run()).
class MockCodeGenerator;
class NullCodeGenerator;
// Registers a MockCodeGenerator with the given name.
MockCodeGenerator* RegisterGenerator(const string& generator_name,
@ -63,6 +64,10 @@ class CommandLineInterfaceTest : public testing::Test {
const string& filename,
const string& help_text);
// Registers a CodeGenerator which will not actually generate anything,
// but records the parameter passed to the generator.
NullCodeGenerator* RegisterNullGenerator(const string& flag_name);
// Create a temp file within temp_directory_ with the given name.
// The containing directory is also created if necessary.
void CreateTempFile(const string& name, const string& contents);
@ -122,7 +127,7 @@ class CommandLineInterfaceTest : public testing::Test {
string error_text_;
// Pointers which need to be deleted later.
vector<MockCodeGenerator*> mock_generators_to_delete_;
vector<CodeGenerator*> mock_generators_to_delete_;
};
// A mock CodeGenerator which outputs information about the context in which
@ -159,6 +164,25 @@ class CommandLineInterfaceTest::MockCodeGenerator : public CodeGenerator {
bool expect_write_error_;
};
class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator {
public:
NullCodeGenerator() : called_(false) {}
~NullCodeGenerator() {}
mutable bool called_;
mutable string parameter_;
// implements CodeGenerator ----------------------------------------
bool Generate(const FileDescriptor* file,
const string& parameter,
OutputDirectory* output_directory,
string* error) const {
called_ = true;
parameter_ = parameter;
return true;
}
};
// ===================================================================
void CommandLineInterfaceTest::SetUp() {
@ -239,6 +263,15 @@ CommandLineInterfaceTest::RegisterErrorGenerator(
return generator;
}
CommandLineInterfaceTest::NullCodeGenerator*
CommandLineInterfaceTest::RegisterNullGenerator(
const string& flag_name) {
NullCodeGenerator* generator = new NullCodeGenerator;
mock_generators_to_delete_.push_back(generator);
cli_.RegisterGenerator(flag_name, generator, "");
return generator;
}
void CommandLineInterfaceTest::CreateTempFile(
const string& name,
const string& contents) {
@ -424,6 +457,42 @@ TEST_F(CommandLineInterfaceTest, GeneratorParameters) {
"foo.proto", "Foo", "output.test");
}
#if defined(_WIN32) || defined(__CYGWIN__)
TEST_F(CommandLineInterfaceTest, WindowsOutputPath) {
// Test that the output path can be a Windows-style path.
NullCodeGenerator* generator = RegisterNullGenerator("--test_out");
CreateTempFile("foo.proto",
"syntax = \"proto2\";\n");
Run("protocol_compiler --test_out=C:\\ "
"--proto_path=$tmpdir foo.proto");
ExpectNoErrors();
EXPECT_TRUE(generator->called_);
EXPECT_EQ("", generator->parameter_);
}
TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) {
// Test that we can have a windows-style output path and a parameter.
NullCodeGenerator* generator = RegisterNullGenerator("--test_out");
CreateTempFile("foo.proto",
"syntax = \"proto2\";\n");
Run("protocol_compiler --test_out=bar:C:\\ "
"--proto_path=$tmpdir foo.proto");
ExpectNoErrors();
EXPECT_TRUE(generator->called_);
EXPECT_EQ("bar", generator->parameter_);
}
#endif // defined(_WIN32) || defined(__CYGWIN__)
TEST_F(CommandLineInterfaceTest, PathLookup) {
// Test that specifying multiple directories in the proto search path works.

@ -147,7 +147,7 @@ typedef uint64_t uint64;
#endif
static const int32 kint32max = 0x7FFFFFFF;
static const int32 kint32min = -kint32min - 1;
static const int32 kint32min = -kint32max - 1;
static const int64 kint64max = GOOGLE_LONGLONG(0x7FFFFFFFFFFFFFFF);
static const int64 kint64min = -kint64max - 1;
static const uint32 kuint32max = 0xFFFFFFFFu;

@ -50,6 +50,17 @@ TEST(VersionTest, VersionMatchesConfig) {
#endif // PACKAGE_VERSION
TEST(CommonTest, IntMinMaxConstants) {
// kint32min was declared incorrectly in the first release of protobufs.
// Ugh.
EXPECT_LT(kint32min, kint32max);
EXPECT_EQ(static_cast<uint32>(kint32min), static_cast<uint32>(kint32max) + 1);
EXPECT_LT(kint64min, kint64max);
EXPECT_EQ(static_cast<uint64>(kint64min), static_cast<uint64>(kint64max) + 1);
EXPECT_EQ(0, kuint32max + 1);
EXPECT_EQ(0, kuint64max + 1);
}
vector<string> captured_messages_;
void CaptureLog(LogLevel level, const char* filename, int line,

@ -7,7 +7,7 @@ Compiling and Installing
========================
1) Open protobuf.sln in Microsoft Visual Studio.
2) Choose "Debug" or "Release" configuration as desired.
2) Choose "Debug" or "Release" configuration as desired.*
3) From the Build menu, choose "Build Solution". Wait for compiling to finish.
4) From a command shell, run tests.exe and check that all tests pass.
5) Run extract_includes.bat to copy all the public headers into a separate
@ -19,6 +19,11 @@ Compiling and Installing
8) Copy libprotobuf.{lib,dll} and libprotoc.{lib,dll} wherever you put
libraries.
* To avoid conflicts between the MSVC debug and release runtime libraries, when
compiling a debug build of your application, you must link against a debug
build of libprotobuf.dll. Similarly, release builds must link against
release DLLs.
DLLs and Distribution
=====================

Loading…
Cancel
Save