| // Copyright 2022 Google LLC |
| // |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package common |
| |
| import ( |
| "context" |
| "flag" |
| "fmt" |
| |
| "go.skia.org/infra/go/common" |
| "go.skia.org/infra/task_driver/go/td" |
| "go.skia.org/skia/bazel/device_specific_configs" |
| ) |
| |
| // BazelFlags is a struct that holds common flags for task drivers that shell out to Bazel. |
| type BazelFlags struct { |
| Label *string |
| Config *string |
| DeviceSpecificConfig *string |
| AdditionalArgs *[]string |
| CacheDir *string |
| |
| labelRequired bool |
| configRequired bool |
| deviceSpecificConfigRequired bool |
| } |
| |
| // Validate performs common flag validation steps. |
| func (f *BazelFlags) Validate(ctx context.Context) { |
| if f.labelRequired && *f.Label == "" { |
| td.Fatal(ctx, fmt.Errorf("--bazel_label is required")) |
| } |
| if f.configRequired && *f.Config == "" { |
| td.Fatal(ctx, fmt.Errorf("--bazel_config is required")) |
| } |
| if f.deviceSpecificConfigRequired { |
| if *f.DeviceSpecificConfig == "" { |
| td.Fatal(ctx, fmt.Errorf("--device_specific_bazel_config is required")) |
| } |
| if _, ok := device_specific_configs.Configs[*f.DeviceSpecificConfig]; !ok { |
| td.Fatal(ctx, fmt.Errorf("unknown flag --device_specific_bazel_config value: %q", *f.DeviceSpecificConfig)) |
| } |
| } |
| if *f.CacheDir == "" { |
| td.Fatal(ctx, fmt.Errorf("--bazel_cache_dir is required")) |
| } |
| } |
| |
| // MakeBazelFlagsOpts controls which flags are defiend by MakeBazelFlags. |
| type MakeBazelFlagsOpts struct { |
| Label bool |
| Config bool |
| DeviceSpecificConfig bool |
| AdditionalArgs bool |
| } |
| |
| // MakeBazelFlags declares common Bazel flags. |
| func MakeBazelFlags(opts MakeBazelFlagsOpts) *BazelFlags { |
| bazelFlags := &BazelFlags{ |
| CacheDir: flag.String("bazel_cache_dir", "", "Path to the Bazel cache directory. This should be located on a large partition, as the cache can take tens of GB."), |
| } |
| if opts.Label { |
| bazelFlags.Label = flag.String("bazel_label", "", "An fully qualified Bazel label to the target that should be built/tested/executed.") |
| bazelFlags.labelRequired = true |
| } |
| if opts.Config { |
| bazelFlags.Config = flag.String("bazel_config", "", "A custom Bazel configuration defined in //bazel/buildrc. This configuration potentially encapsulates many features and options.") |
| bazelFlags.configRequired = true |
| } |
| if opts.DeviceSpecificConfig { |
| bazelFlags.DeviceSpecificConfig = flag.String("device_specific_bazel_config", "", "A device-specific Bazel configuration defined in //bazel/devicesrc. This configuration determines various keys in any produced Gold/Perf traces, and has no effect in the built artifact.") |
| } |
| if opts.AdditionalArgs { |
| bazelFlags.AdditionalArgs = common.NewMultiStringFlag("bazel_arg", nil, "Additional arguments that should be forwarded directly to the Bazel invocation.") |
| } |
| return bazelFlags |
| } |