Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
e2555e23
Commit
e2555e23
authored
Feb 07, 2015
by
Bo Yang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Change target to output filenames
parent
1d627f85
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
73 additions
and
25 deletions
+73
-25
command_line_interface.cc
src/google/protobuf/compiler/command_line_interface.cc
+48
-21
command_line_interface.h
src/google/protobuf/compiler/command_line_interface.h
+3
-0
command_line_interface_unittest.cc
...ogle/protobuf/compiler/command_line_interface_unittest.cc
+22
-4
No files found.
src/google/protobuf/compiler/command_line_interface.cc
View file @
e2555e23
...
@@ -48,7 +48,6 @@
...
@@ -48,7 +48,6 @@
#include <iostream>
#include <iostream>
#include <ctype.h>
#include <ctype.h>
#include <google/protobuf/stubs/hash.h>
#include <memory>
#include <memory>
#ifndef _SHARED_PTR_H
#ifndef _SHARED_PTR_H
#include <google/protobuf/stubs/shared_ptr.h>
#include <google/protobuf/stubs/shared_ptr.h>
...
@@ -254,6 +253,9 @@ class CommandLineInterface::GeneratorContextImpl : public GeneratorContext {
...
@@ -254,6 +253,9 @@ class CommandLineInterface::GeneratorContextImpl : public GeneratorContext {
// format, unless one has already been written.
// format, unless one has already been written.
void
AddJarManifest
();
void
AddJarManifest
();
// Get name of all output files.
void
GetOutputFilenames
(
vector
<
string
>*
output_filenames
);
// implements GeneratorContext --------------------------------------
// implements GeneratorContext --------------------------------------
io
::
ZeroCopyOutputStream
*
Open
(
const
string
&
filename
);
io
::
ZeroCopyOutputStream
*
Open
(
const
string
&
filename
);
io
::
ZeroCopyOutputStream
*
OpenForAppend
(
const
string
&
filename
);
io
::
ZeroCopyOutputStream
*
OpenForAppend
(
const
string
&
filename
);
...
@@ -441,6 +443,14 @@ void CommandLineInterface::GeneratorContextImpl::AddJarManifest() {
...
@@ -441,6 +443,14 @@ void CommandLineInterface::GeneratorContextImpl::AddJarManifest() {
}
}
}
}
void
CommandLineInterface
::
GeneratorContextImpl
::
GetOutputFilenames
(
vector
<
string
>*
output_filenames
)
{
for
(
map
<
string
,
string
*>::
iterator
iter
=
files_
.
begin
();
iter
!=
files_
.
end
();
++
iter
)
{
output_filenames
->
push_back
(
iter
->
first
);
}
}
io
::
ZeroCopyOutputStream
*
CommandLineInterface
::
GeneratorContextImpl
::
Open
(
io
::
ZeroCopyOutputStream
*
CommandLineInterface
::
GeneratorContextImpl
::
Open
(
const
string
&
filename
)
{
const
string
&
filename
)
{
return
new
MemoryOutputStream
(
this
,
filename
,
false
);
return
new
MemoryOutputStream
(
this
,
filename
,
false
);
...
@@ -670,7 +680,6 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) {
...
@@ -670,7 +680,6 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) {
// We construct a separate GeneratorContext for each output location. Note
// We construct a separate GeneratorContext for each output location. Note
// that two code generators may output to the same location, in which case
// that two code generators may output to the same location, in which case
// they should share a single GeneratorContext so that OpenForInsert() works.
// they should share a single GeneratorContext so that OpenForInsert() works.
typedef
hash_map
<
string
,
GeneratorContextImpl
*>
GeneratorContextMap
;
GeneratorContextMap
output_directories
;
GeneratorContextMap
output_directories
;
// Generate output.
// Generate output.
...
@@ -717,16 +726,17 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) {
...
@@ -717,16 +726,17 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) {
}
}
}
}
STLDeleteValues
(
&
output_directories
);
if
(
!
dependency_out_name_
.
empty
())
{
if
(
!
GenerateDependencyManifestFile
(
parsed_files
,
output_directories
,
if
(
!
descriptor_set_name_
.
empty
())
{
&
source_tree
))
{
if
(
!
WriteDescriptorSet
(
parsed_files
))
{
return
1
;
return
1
;
}
}
}
}
if
(
!
dependency_out_name_
.
empty
())
{
STLDeleteValues
(
&
output_directories
);
if
(
!
GenerateDependencyManifestFile
(
parsed_files
,
&
source_tree
))
{
if
(
!
descriptor_set_name_
.
empty
())
{
if
(
!
WriteDescriptorSet
(
parsed_files
))
{
return
1
;
return
1
;
}
}
}
}
...
@@ -878,6 +888,15 @@ CommandLineInterface::ParseArguments(int argc, const char* const argv[]) {
...
@@ -878,6 +888,15 @@ CommandLineInterface::ParseArguments(int argc, const char* const argv[]) {
cerr
<<
"Missing output directives."
<<
endl
;
cerr
<<
"Missing output directives."
<<
endl
;
return
PARSE_ARGUMENT_FAIL
;
return
PARSE_ARGUMENT_FAIL
;
}
}
if
(
mode_
!=
MODE_COMPILE
&&
!
dependency_out_name_
.
empty
())
{
cerr
<<
"Can only use --dependency_out=FILE when generating code."
<<
endl
;
return
PARSE_ARGUMENT_FAIL
;
}
if
(
!
dependency_out_name_
.
empty
()
&&
input_files_
.
size
()
>
1
)
{
cerr
<<
"Can only process one input file when using --dependency_out=FILE."
<<
endl
;
return
PARSE_ARGUMENT_FAIL
;
}
if
(
imports_in_descriptor_set_
&&
descriptor_set_name_
.
empty
())
{
if
(
imports_in_descriptor_set_
&&
descriptor_set_name_
.
empty
())
{
cerr
<<
"--include_imports only makes sense when combined with "
cerr
<<
"--include_imports only makes sense when combined with "
"--descriptor_set_out."
<<
endl
;
"--descriptor_set_out."
<<
endl
;
...
@@ -1028,11 +1047,6 @@ CommandLineInterface::InterpretArgument(const string& name,
...
@@ -1028,11 +1047,6 @@ CommandLineInterface::InterpretArgument(const string& name,
cerr
<<
name
<<
" requires a non-empty value."
<<
endl
;
cerr
<<
name
<<
" requires a non-empty value."
<<
endl
;
return
PARSE_ARGUMENT_FAIL
;
return
PARSE_ARGUMENT_FAIL
;
}
}
if
(
mode_
!=
MODE_COMPILE
)
{
cerr
<<
"Cannot use --encode or --decode and --dependency_out=FILE at "
"the same time."
<<
endl
;
return
PARSE_ARGUMENT_FAIL
;
}
dependency_out_name_
=
value
;
dependency_out_name_
=
value
;
}
else
if
(
name
==
"--include_imports"
)
{
}
else
if
(
name
==
"--include_imports"
)
{
...
@@ -1310,6 +1324,7 @@ bool CommandLineInterface::GenerateOutput(
...
@@ -1310,6 +1324,7 @@ bool CommandLineInterface::GenerateOutput(
bool
CommandLineInterface
::
GenerateDependencyManifestFile
(
bool
CommandLineInterface
::
GenerateDependencyManifestFile
(
const
vector
<
const
FileDescriptor
*>&
parsed_files
,
const
vector
<
const
FileDescriptor
*>&
parsed_files
,
const
GeneratorContextMap
&
output_directories
,
DiskSourceTree
*
source_tree
)
{
DiskSourceTree
*
source_tree
)
{
FileDescriptorSet
file_set
;
FileDescriptorSet
file_set
;
...
@@ -1321,6 +1336,18 @@ bool CommandLineInterface::GenerateDependencyManifestFile(
...
@@ -1321,6 +1336,18 @@ bool CommandLineInterface::GenerateDependencyManifestFile(
file_set
.
mutable_file
());
file_set
.
mutable_file
());
}
}
vector
<
string
>
output_filenames
;
for
(
GeneratorContextMap
::
const_iterator
iter
=
output_directories
.
begin
();
iter
!=
output_directories
.
end
();
++
iter
)
{
const
string
&
location
=
iter
->
first
;
GeneratorContextImpl
*
directory
=
iter
->
second
;
vector
<
string
>
relative_output_filenames
;
directory
->
GetOutputFilenames
(
&
relative_output_filenames
);
for
(
int
i
=
0
;
i
<
relative_output_filenames
.
size
();
i
++
)
{
output_filenames
.
push_back
(
location
+
relative_output_filenames
[
i
]);
}
}
int
fd
;
int
fd
;
do
{
do
{
fd
=
open
(
dependency_out_name_
.
c_str
(),
fd
=
open
(
dependency_out_name_
.
c_str
(),
...
@@ -1335,15 +1362,15 @@ bool CommandLineInterface::GenerateDependencyManifestFile(
...
@@ -1335,15 +1362,15 @@ bool CommandLineInterface::GenerateDependencyManifestFile(
io
::
FileOutputStream
out
(
fd
);
io
::
FileOutputStream
out
(
fd
);
io
::
Printer
printer
(
&
out
,
'$'
);
io
::
Printer
printer
(
&
out
,
'$'
);
if
(
dependency_out_name_
.
compare
(
0
,
1
,
"/"
)
!=
0
)
{
for
(
int
i
=
0
;
i
<
output_filenames
.
size
();
i
++
)
{
// Convert relative path to absolute path before print.
printer
.
Print
(
output_filenames
[
i
].
c_str
());
printer
.
Print
(
"$working_directory$/$output_filename$:"
,
if
(
i
==
output_filenames
.
size
()
-
1
)
{
"working_directory"
,
get_current_dir_name
(),
printer
.
Print
(
":"
);
"output_filename"
,
dependency_out_name_
);
}
else
{
}
else
{
printer
.
Print
(
"
\\\n
"
);
printer
.
Print
(
"$output_filename$:"
,
}
"output_filename"
,
dependency_out_name_
);
}
}
for
(
int
i
=
0
;
i
<
file_set
.
file_size
();
i
++
)
{
for
(
int
i
=
0
;
i
<
file_set
.
file_size
();
i
++
)
{
const
FileDescriptorProto
&
file
=
file_set
.
file
(
i
);
const
FileDescriptorProto
&
file
=
file_set
.
file
(
i
);
const
string
&
virtual_file
=
file
.
name
();
const
string
&
virtual_file
=
file
.
name
();
...
...
src/google/protobuf/compiler/command_line_interface.h
View file @
e2555e23
...
@@ -39,6 +39,7 @@
...
@@ -39,6 +39,7 @@
#define GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__
#define GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__
#include <google/protobuf/stubs/common.h>
#include <google/protobuf/stubs/common.h>
#include <google/protobuf/stubs/hash.h>
#include <string>
#include <string>
#include <vector>
#include <vector>
#include <map>
#include <map>
...
@@ -190,6 +191,7 @@ class LIBPROTOC_EXPORT CommandLineInterface {
...
@@ -190,6 +191,7 @@ class LIBPROTOC_EXPORT CommandLineInterface {
class
ErrorPrinter
;
class
ErrorPrinter
;
class
GeneratorContextImpl
;
class
GeneratorContextImpl
;
class
MemoryOutputStream
;
class
MemoryOutputStream
;
typedef
hash_map
<
string
,
GeneratorContextImpl
*>
GeneratorContextMap
;
// Clear state from previous Run().
// Clear state from previous Run().
void
Clear
();
void
Clear
();
...
@@ -250,6 +252,7 @@ class LIBPROTOC_EXPORT CommandLineInterface {
...
@@ -250,6 +252,7 @@ class LIBPROTOC_EXPORT CommandLineInterface {
// Implements the --dependency_out option
// Implements the --dependency_out option
bool
GenerateDependencyManifestFile
(
bool
GenerateDependencyManifestFile
(
const
vector
<
const
FileDescriptor
*>&
parsed_files
,
const
vector
<
const
FileDescriptor
*>&
parsed_files
,
const
GeneratorContextMap
&
output_directories
,
DiskSourceTree
*
source_tree
);
DiskSourceTree
*
source_tree
);
// Get all transitive dependencies of the given file (including the file
// Get all transitive dependencies of the given file (including the file
...
...
src/google/protobuf/compiler/command_line_interface_unittest.cc
View file @
e2555e23
...
@@ -959,6 +959,24 @@ TEST_F(CommandLineInterfaceTest, WriteTransitiveDescriptorSetWithSourceInfo) {
...
@@ -959,6 +959,24 @@ TEST_F(CommandLineInterfaceTest, WriteTransitiveDescriptorSetWithSourceInfo) {
EXPECT_TRUE
(
descriptor_set
.
file
(
1
).
has_source_code_info
());
EXPECT_TRUE
(
descriptor_set
.
file
(
1
).
has_source_code_info
());
}
}
TEST_F
(
CommandLineInterfaceTest
,
WriteDependencyManifestFileGivenTwoInputs
)
{
CreateTempFile
(
"foo.proto"
,
"syntax =
\"
proto2
\"
;
\n
"
"message Foo {}
\n
"
);
CreateTempFile
(
"bar.proto"
,
"syntax =
\"
proto2
\"
;
\n
"
"import
\"
foo.proto
\"
;
\n
"
"message Bar {
\n
"
" optional Foo foo = 1;
\n
"
"}
\n
"
);
Run
(
"protocol_compiler --dependency_out=$tmpdir/manifest "
"--test_out=$tmpdir --proto_path=$tmpdir bar.proto foo.proto"
);
ExpectErrorText
(
"Can only process one input file when using --dependency_out=FILE.
\n
"
);
}
TEST_F
(
CommandLineInterfaceTest
,
WriteDependencyManifestFile
)
{
TEST_F
(
CommandLineInterfaceTest
,
WriteDependencyManifestFile
)
{
CreateTempFile
(
"foo.proto"
,
CreateTempFile
(
"foo.proto"
,
"syntax =
\"
proto2
\"
;
\n
"
"syntax =
\"
proto2
\"
;
\n
"
...
@@ -976,8 +994,8 @@ TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFile) {
...
@@ -976,8 +994,8 @@ TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFile) {
ExpectNoErrors
();
ExpectNoErrors
();
ExpectFileContent
(
"manifest"
,
ExpectFileContent
(
"manifest"
,
"$tmpdir/
manifest: $tmpdir/foo.proto
\\\n
"
"$tmpdir/
bar.proto.MockCodeGenerator.test_generator:
"
" $tmpdir/bar.proto"
);
"
$tmpdir/foo.proto
\\\n
$tmpdir/bar.proto"
);
}
}
TEST_F
(
CommandLineInterfaceTest
,
WriteDependencyManifestFileForRelativePath
)
{
TEST_F
(
CommandLineInterfaceTest
,
WriteDependencyManifestFileForRelativePath
)
{
...
@@ -1000,8 +1018,8 @@ TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFileForRelativePath) {
...
@@ -1000,8 +1018,8 @@ TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFileForRelativePath) {
ExpectNoErrors
();
ExpectNoErrors
();
ExpectFileContent
(
"manifest"
,
ExpectFileContent
(
"manifest"
,
"$tmpdir/
manifest: $tmpdir/foo.proto
\\\n
"
"$tmpdir/
bar.proto.MockCodeGenerator.test_generator:
"
" $tmpdir/bar.proto"
);
"
$tmpdir/foo.proto
\\\n
$tmpdir/bar.proto"
);
File
::
ChangeWorkingDirectory
(
current_working_directory
);
File
::
ChangeWorkingDirectory
(
current_working_directory
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment