@ -4,7 +4,24 @@ def _GetPath(ctx, path):
else :
return path
def _IsNewExternal ( ctx ) :
# Bazel 0.4.4 and older have genfiles paths that look like:
# bazel-out/local-fastbuild/genfiles/external/repo/foo
# After the exec root rearrangement, they look like:
# ../repo/bazel-out/local-fastbuild/genfiles/foo
return ctx . label . workspace_root . startswith ( " ../ " )
def _GenDir ( ctx ) :
if _IsNewExternal ( ctx ) :
# We are using the fact that Bazel 0.4.4+ provides repository-relative paths
# for ctx.genfiles_dir.
return ctx . genfiles_dir . path + (
" / " + ctx . attr . includes [ 0 ] if ctx . attr . includes and ctx . attr . includes [ 0 ] else " " )
# This means that we're either in the old version OR the new version in the local repo.
# Either way, appending the source path to the genfiles dir works.
return ctx . var [ " GENDIR " ] + " / " + _SourceDir ( ctx )
def _SourceDir ( ctx ) :
if not ctx . attr . includes :
return ctx . label . workspace_root
if not ctx . attr . includes [ 0 ] :
@ -51,9 +68,10 @@ def _proto_gen_impl(ctx):
srcs = ctx . files . srcs
deps = [ ]
deps + = ctx . files . srcs
source_dir = _SourceDir ( ctx )
gen_dir = _GenDir ( ctx )
if gen _dir:
import_flags = [ " -I " + gen _dir, " -I " + ctx . var [ " GENDIR " ] + " / " + gen_dir ]
if source _dir:
import_flags = [ " -I " + source _dir, " -I " + gen_dir ]
else :
import_flags = [ " -I. " ]
@ -63,9 +81,9 @@ def _proto_gen_impl(ctx):
args = [ ]
if ctx . attr . gen_cc :
args + = [ " --cpp_out= " + ctx . var [ " GENDIR " ] + " / " + gen_dir ]
args + = [ " --cpp_out= " + gen_dir ]
if ctx . attr . gen_py :
args + = [ " --python_out= " + ctx . var [ " GENDIR " ] + " / " + gen_dir ]
args + = [ " --python_out= " + gen_dir ]
inputs = srcs + deps
if ctx . executable . plugin :
@ -76,7 +94,7 @@ def _proto_gen_impl(ctx):
if not lang :
fail ( " cannot infer the target language of plugin " , " plugin_language " )
outdir = ctx . var [ " GENDIR " ] + " / " + gen_dir
outdir = gen_dir
if ctx . attr . plugin_options :
outdir = " , " . join ( ctx . attr . plugin_options ) + " : " + outdir
args + = [ " --plugin=protoc-gen- %s = %s " % ( lang , plugin . path ) ]
@ -141,7 +159,7 @@ Args:
compiler .
plugin_language : the language of the generated sources
plugin_options : a list of options to be passed to the plugin
gen_cc : generates C + + sources in addition to the ones from the plugin .
gen_cc : generates C + + sources in addition to the ones from the plugin .
gen_py : generates Python sources in addition to the ones from the plugin .
outs : a list of labels of the expected outputs from the protocol compiler .
"""