2016-07-13 12 views
0

私はboolelのBUILDファイルを生成するためにgo lintツールを使いたいと思っています。BazelでBUILDファイルを生成できますか?

私はこのbashスクリプトのようなものを実行することになり、外出先のバイナリを持っているでしょう:

#!/bin/bash 

cat <<EOF > BUILD 
# THIS FILE IS AUTOGENERATED 

package(default_visibility = ["//visibility:public"]) 

load("//go:def.bzl", "go_prefix", "go_library", "go_binary", "go_test") 
EOF 

for pkg in `go list -f {{.ImportPath}} ./...`; do 
    go list -f "`cat test.in`" $pkg >> "BUILD"; 
done 

buildifier -mode fix BUILD 

test.inファイルが含まれています:

{{ if eq .Name "main" }} 
go_binary 
{{else}} 
go_library 
{{end}} 
("{{.Name}}", 
    srcs=[ 
     {{range .GoFiles}} 
      "{{.}}", 
     {{end}} 
    ], 
    deps=[ 
     {{range .Imports}} 
      "{{.}}", 
     {{end}} 
    ], 
    csrcs=[ 
     {{range .CgoFiles}} 
      "{{.}}", 
     {{end}} 
    ], 
    swig_srcs=[ 
     {{range .SwigFiles}} 
      "{{.}}", 
     {{end}} 
    ], 
    cxxswig=[ 
     {{range .SwigCXXFiles}} 
      "{{.}}", 
     {{end}} 
    ], 
    cflags=[ 
     {{range .CgoCFLAGS}} 
      "{{.}}", 
     {{end}} 
    ], 
    cxxflags=[ 
     {{range .CgoCXXFLAGS}} 
      "{{.}}", 
     {{end}} 
    ], 
    cppflags=[ 
     {{range .CgoCPPFLAGS}} 
      "{{.}}", 
     {{end}} 
    ],   
    {{ with $ctx := context}} 
     {{$ctx.InstallSuffix}} 
    {{end}}  
) 

そして、これが生成する:

# THIS FILE IS AUTOGENERATED 

package(default_visibility = ["//visibility:public"]) 

load("//go:def.bzl", "go_prefix", "go_library", "go_binary", "go_test") 

go_library 

(
    "tensorflow", 
    srcs = [ 
     "doc.go", 
     "gen.go", 
     "graph.go", 
     "session.go", 
    ], 
    deps = [ 
     "C", 
     "encoding/binary", 
     "fmt", 
     "github.com/golang/protobuf/proto", 
     "github.com/tensorflow/tensorflow/tensorflow/contrib/go/proto", 
     "math", 
     "reflect", 
     "runtime", 
     "strings", 
     "unsafe", 
    ], 
    csrcs = [ 
     "lib.go", 
     "tensor.go", 
    ], 
    swig_srcs = [ 
    ], 
    cxxswig = [ 
     "tensorflow.swigcxx", 
    ], 
    cflags = [ 
     "-I/Users/fmilo/workspace/gopath/src/github.com/tensorflow/tensorflow/tensorflow/contrib/go/../../../", 
    ], 
    cxxflags = [ 
     "-I/Users/fmilo/workspace/gopath/src/github.com/tensorflow/tensorflow/tensorflow/contrib/go/../../../", 
     "-std=c++11", 
    ], 
    cppflags = [ 
    ], 
) 

go_library 

(
    "tensorflow", 
    srcs = [ 
     "allocation_description.pb.go", 
     "attr_value.pb.go", 
     "config.pb.go", 
     "cost_graph.pb.go", 
     "device_attributes.pb.go", 
     "event.pb.go", 
     "function.pb.go", 
     "graph.pb.go", 
     "kernel_def.pb.go", 
     "log_memory.pb.go", 
     "master.pb.go", 
     "memmapped_file_system.pb.go", 
     "meta_graph.pb.go", 
     "named_tensor.pb.go", 
     "op_def.pb.go", 
     "queue_runner.pb.go", 
     "saved_tensor_slice.pb.go", 
     "saver.pb.go", 
     "step_stats.pb.go", 
     "summary.pb.go", 
     "tensor.pb.go", 
     "tensor_description.pb.go", 
     "tensor_shape.pb.go", 
     "tensor_slice.pb.go", 
     "tensorflow_server.pb.go", 
     "test_log.pb.go", 
     "tf_ops_def.go", 
     "types.pb.go", 
     "variable.pb.go", 
     "versions.pb.go", 
     "worker.pb.go", 
    ], 
    deps = [ 
     "fmt", 
     "github.com/golang/protobuf/proto", 
     "github.com/golang/protobuf/ptypes/any", 
     "math", 
    ], 
    csrcs = [ 
    ], 
    swig_srcs = [ 
    ], 
    cxxswig = [ 
    ], 
    cflags = [ 
    ], 
    cxxflags = [ 
    ], 
    cppflags = [ 
    ], 
) 

go_library 

(
    "tensorflow_error", 
    srcs = [ 
     "error_codes.pb.go", 
    ], 
    deps = [ 
     "fmt", 
     "github.com/golang/protobuf/proto", 
     "math", 
    ], 
    csrcs = [ 
    ], 
    swig_srcs = [ 
    ], 
    cxxswig = [ 
    ], 
    cflags = [ 
    ], 
    cxxflags = [ 
    ], 
    cppflags = [ 
    ], 
) 

go_library 

(
    "tensorflow_grpc", 
    srcs = [ 
     "master_service.pb.go", 
     "worker_service.pb.go", 
    ], 
    deps = [ 
     "fmt", 
     "github.com/golang/protobuf/proto", 
     "math", 
     "tensorflow/core/protobuf", 
    ], 
    csrcs = [ 
    ], 
    swig_srcs = [ 
    ], 
    cxxswig = [ 
    ], 
    cflags = [ 
    ], 
    cxxflags = [ 
    ], 
    cppflags = [ 
    ], 
) 

もちろん、上記のBUILDファイルはまだ動作しませんが、まず私が追求は有効です。

  • ビルゼル前段階をbazelで指定するにはどうすればよいですか?
  • それは可能ですか?
+0

私たちが一般的に行っていることは、必要なときにコードジェネレータを手動で実行することです(IDEで自動化することもできます)。ソースコントロールの出力をチェックインします。 – Laurent

答えて

1

一般に、ビルドファイルの生成はできません。ビルドの始めにそこに存在する必要があります。 Bazelの一般的なビルドフェーズは次のとおりです。

  • コマンドラインで指定したターゲットを解析します。
  • 指定する各ディレクトリのBUILDファイルを検索します。
  • これらのターゲットに記述されているBUILDファイルを解析します(など)。
  • 実行するアクションのツリーを生成します(「シェルスクリプトを実行する」など)。
  • 実際にアクションを実行します。

したがって、スクリプトが実行されるまでに、BUILDファイルの読み込み時間が長くなります。

また、出力は独自のディレクトリ(bazel-outの下)に置かれるため、ソースツリーには出力されません。言っ

...

スカイラークリモートリポジトリを使用すると、他のリポジトリには、ファイルを構築するなど、ファイルを書き込むためのコードを実行させてください。希望あなたが@pwd//...に依存/構築することができその後

load('//path/to/your:genrepo.bzl', 'generated_repo') 
generated_repo(
    name = "pwd", 
    paths = ["src", "test", "third_party"], 
) 

とリポジトリのルール:ような何かを、あなたのワークスペースファイルで次に

def _gen_repo_impl(repo_ctx): 
    # Writes external/reponame/BUILD 
    repo_ctx.execute("/your/bash/script.sh") 
    for path in repo_ctx.attr.paths: 
    repo_ctx.symlink(path, path.basename) 

generated_repo = repository_rule(
    implementation = _gen_repo_impl, 
    attrs = {paths = attr.label_list(allow_files = True)} 
) 

:だから、理論的には、(未テスト)のようなものを持っている可能性がありsrc、test、およびthird_partyへのシンボリックリンクを持つ外部レポを生成します(理論的には...私のコードはおそらくいくつかのタイプミスを持っています)。

+0

ありがとう!これがbazelプロジェクトの受け入れられた動作であるのだろうか?何か欠点はありますか? – fabrizioM

+0

私は、ちょっとハッキリで壊れやすい(あなたがディレクトリを手動で指定していると変わるかもしれない)ということです。 – kristina

関連する問題