1*c8dee2aaSAndroid Build Coastguard Worker// Copyright 2022 The Chromium Authors. All rights reserved. 2*c8dee2aaSAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*c8dee2aaSAndroid Build Coastguard Worker// found in the LICENSE file. 4*c8dee2aaSAndroid Build Coastguard Worker 5*c8dee2aaSAndroid Build Coastguard Workerpackage main 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Workerimport ( 8*c8dee2aaSAndroid Build Coastguard Worker "flag" 9*c8dee2aaSAndroid Build Coastguard Worker "fmt" 10*c8dee2aaSAndroid Build Coastguard Worker "io" 11*c8dee2aaSAndroid Build Coastguard Worker "os" 12*c8dee2aaSAndroid Build Coastguard Worker "os/exec" 13*c8dee2aaSAndroid Build Coastguard Worker "path/filepath" 14*c8dee2aaSAndroid Build Coastguard Worker "regexp" 15*c8dee2aaSAndroid Build Coastguard Worker "sort" 16*c8dee2aaSAndroid Build Coastguard Worker "strings" 17*c8dee2aaSAndroid Build Coastguard Worker) 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Workertype depConfig struct { 20*c8dee2aaSAndroid Build Coastguard Worker bazelNameOverride string // Bazel style uses underscores not dashes, so we fix those if needed. 21*c8dee2aaSAndroid Build Coastguard Worker needsBazelFile bool 22*c8dee2aaSAndroid Build Coastguard Worker patchCmds []string 23*c8dee2aaSAndroid Build Coastguard Worker patchCmdsWin []string 24*c8dee2aaSAndroid Build Coastguard Worker} 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker// These are all C++ deps or Rust deps (with a compatible C++ FFI) used by the Bazel build. 27*c8dee2aaSAndroid Build Coastguard Worker// They are a subset of those listed in DEPS. 28*c8dee2aaSAndroid Build Coastguard Worker// The key is the name of the repo as specified in DEPS. 29*c8dee2aaSAndroid Build Coastguard Workervar deps = map[string]depConfig{ 30*c8dee2aaSAndroid Build Coastguard Worker "abseil-cpp": {bazelNameOverride: "abseil_cpp"}, 31*c8dee2aaSAndroid Build Coastguard Worker "brotli": {}, 32*c8dee2aaSAndroid Build Coastguard Worker "highway": {}, 33*c8dee2aaSAndroid Build Coastguard Worker "spirv-tools": {bazelNameOverride: "spirv_tools"}, 34*c8dee2aaSAndroid Build Coastguard Worker // This name is important because spirv_tools expects @spirv_headers to exist by that name. 35*c8dee2aaSAndroid Build Coastguard Worker "spirv-headers": {bazelNameOverride: "spirv_headers"}, 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker "dawn": {needsBazelFile: true}, 38*c8dee2aaSAndroid Build Coastguard Worker "delaunator-cpp": {bazelNameOverride: "delaunator", needsBazelFile: true}, 39*c8dee2aaSAndroid Build Coastguard Worker "dng_sdk": {needsBazelFile: true}, 40*c8dee2aaSAndroid Build Coastguard Worker "expat": {needsBazelFile: true}, 41*c8dee2aaSAndroid Build Coastguard Worker "freetype": {needsBazelFile: true}, 42*c8dee2aaSAndroid Build Coastguard Worker "harfbuzz": {needsBazelFile: true}, 43*c8dee2aaSAndroid Build Coastguard Worker "icu": { 44*c8dee2aaSAndroid Build Coastguard Worker needsBazelFile: true, 45*c8dee2aaSAndroid Build Coastguard Worker patchCmds: []string{ 46*c8dee2aaSAndroid Build Coastguard Worker `"rm source/i18n/BUILD.bazel"`, 47*c8dee2aaSAndroid Build Coastguard Worker `"rm source/common/BUILD.bazel"`, 48*c8dee2aaSAndroid Build Coastguard Worker `"rm source/stubdata/BUILD.bazel"`, 49*c8dee2aaSAndroid Build Coastguard Worker }, 50*c8dee2aaSAndroid Build Coastguard Worker patchCmdsWin: []string{ 51*c8dee2aaSAndroid Build Coastguard Worker `"del source/i18n/BUILD.bazel"`, 52*c8dee2aaSAndroid Build Coastguard Worker `"del source/common/BUILD.bazel"`, 53*c8dee2aaSAndroid Build Coastguard Worker `"del source/stubdata/BUILD.bazel"`, 54*c8dee2aaSAndroid Build Coastguard Worker }, 55*c8dee2aaSAndroid Build Coastguard Worker }, 56*c8dee2aaSAndroid Build Coastguard Worker "icu4x": {needsBazelFile: true}, 57*c8dee2aaSAndroid Build Coastguard Worker "imgui": {needsBazelFile: true}, 58*c8dee2aaSAndroid Build Coastguard Worker "libavif": {needsBazelFile: true}, 59*c8dee2aaSAndroid Build Coastguard Worker "libgav1": {needsBazelFile: true}, 60*c8dee2aaSAndroid Build Coastguard Worker "libjpeg-turbo": {bazelNameOverride: "libjpeg_turbo", needsBazelFile: true}, 61*c8dee2aaSAndroid Build Coastguard Worker "libjxl": {needsBazelFile: true}, 62*c8dee2aaSAndroid Build Coastguard Worker "libpng": {needsBazelFile: true}, 63*c8dee2aaSAndroid Build Coastguard Worker "libwebp": {needsBazelFile: true}, 64*c8dee2aaSAndroid Build Coastguard Worker "libyuv": {needsBazelFile: true}, 65*c8dee2aaSAndroid Build Coastguard Worker "spirv-cross": {bazelNameOverride: "spirv_cross", needsBazelFile: true}, 66*c8dee2aaSAndroid Build Coastguard Worker "perfetto": {needsBazelFile: true}, 67*c8dee2aaSAndroid Build Coastguard Worker "piex": {needsBazelFile: true}, 68*c8dee2aaSAndroid Build Coastguard Worker "vello": {needsBazelFile: true}, 69*c8dee2aaSAndroid Build Coastguard Worker "vulkan-headers": {bazelNameOverride: "vulkan_headers", needsBazelFile: true}, 70*c8dee2aaSAndroid Build Coastguard Worker "vulkan-tools": {bazelNameOverride: "vulkan_tools", needsBazelFile: true}, 71*c8dee2aaSAndroid Build Coastguard Worker "vulkan-utility-libraries": {bazelNameOverride: "vulkan_utility_libraries", needsBazelFile: true}, 72*c8dee2aaSAndroid Build Coastguard Worker "vulkanmemoryallocator": {needsBazelFile: true}, 73*c8dee2aaSAndroid Build Coastguard Worker "wuffs": {needsBazelFile: true}, 74*c8dee2aaSAndroid Build Coastguard Worker // Some other dependency downloads zlib but with their own rules 75*c8dee2aaSAndroid Build Coastguard Worker "zlib": {bazelNameOverride: "zlib_skia", needsBazelFile: true}, 76*c8dee2aaSAndroid Build Coastguard Worker} 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Workerfunc main() { 79*c8dee2aaSAndroid Build Coastguard Worker var ( 80*c8dee2aaSAndroid Build Coastguard Worker depsFile = flag.String("deps_file", "DEPS", "The location of the DEPS file. Usually at the root of the repository") 81*c8dee2aaSAndroid Build Coastguard Worker genBzlFile = flag.String("gen_bzl_file", "bazel/deps.bzl", "The location of the .bzl file that has the generated Bazel repository rules.") 82*c8dee2aaSAndroid Build Coastguard Worker workspaceFile = flag.String("workspace_file", "WORKSPACE.bazel", "The location of the WORKSPACE file that should be updated with dep names.") 83*c8dee2aaSAndroid Build Coastguard Worker // https://bazel.build/docs/user-manual#running-executables 84*c8dee2aaSAndroid Build Coastguard Worker repoDir = flag.String("repo_dir", os.Getenv("BUILD_WORKSPACE_DIRECTORY"), "The root directory of the repo. Default set by BUILD_WORKSPACE_DIRECTORY env variable.") 85*c8dee2aaSAndroid Build Coastguard Worker buildifierPath = flag.String("buildifier", "", "Where to find buildifier. Defaults to Bazel's location") 86*c8dee2aaSAndroid Build Coastguard Worker ) 87*c8dee2aaSAndroid Build Coastguard Worker flag.Parse() 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker if *repoDir == "" { 90*c8dee2aaSAndroid Build Coastguard Worker fmt.Println(`Must set --repo_dir 91*c8dee2aaSAndroid Build Coastguard WorkerThis is done automatically via: 92*c8dee2aaSAndroid Build Coastguard Worker bazel run //bazel/deps_parser`) 93*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 94*c8dee2aaSAndroid Build Coastguard Worker } 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker buildifier := *buildifierPath 97*c8dee2aaSAndroid Build Coastguard Worker if buildifier == "" { 98*c8dee2aaSAndroid Build Coastguard Worker // We don't know if this will be buildifier_linux_x64, buildifier_macos_arm64, etc 99*c8dee2aaSAndroid Build Coastguard Worker bp, err := filepath.Glob("../buildifier*/file/buildifier") 100*c8dee2aaSAndroid Build Coastguard Worker if err != nil || len(bp) != 1 { 101*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Could not find exactly one buildifier executable %s %v\n", err, bp) 102*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 103*c8dee2aaSAndroid Build Coastguard Worker } 104*c8dee2aaSAndroid Build Coastguard Worker buildifier = bp[0] 105*c8dee2aaSAndroid Build Coastguard Worker } 106*c8dee2aaSAndroid Build Coastguard Worker buildifier, err := filepath.Abs(buildifier) 107*c8dee2aaSAndroid Build Coastguard Worker if err != nil { 108*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Abs path error %s\n", err) 109*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 110*c8dee2aaSAndroid Build Coastguard Worker } 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker fmt.Println(os.Environ()) 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker if *depsFile == "" || *genBzlFile == "" { 115*c8dee2aaSAndroid Build Coastguard Worker fmt.Println("Must set --deps_file and --gen_bzl_file") 116*c8dee2aaSAndroid Build Coastguard Worker flag.PrintDefaults() 117*c8dee2aaSAndroid Build Coastguard Worker } 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker if err := os.Chdir(*repoDir); err != nil { 120*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Could not cd to %s\n", *repoDir) 121*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 122*c8dee2aaSAndroid Build Coastguard Worker } 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker b, err := os.ReadFile(*depsFile) 125*c8dee2aaSAndroid Build Coastguard Worker if err != nil { 126*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Could not open %s: %s\n", *depsFile, err) 127*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 128*c8dee2aaSAndroid Build Coastguard Worker } 129*c8dee2aaSAndroid Build Coastguard Worker contents := strings.Split(string(b), "\n") 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker outputFile, count, err := parseDEPSFile(contents, *workspaceFile) 132*c8dee2aaSAndroid Build Coastguard Worker if err != nil { 133*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Parsing error %s\n", err) 134*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 135*c8dee2aaSAndroid Build Coastguard Worker } 136*c8dee2aaSAndroid Build Coastguard Worker if err := exec.Command(buildifier, outputFile).Run(); err != nil { 137*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Buildifier error %s\n", err) 138*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 139*c8dee2aaSAndroid Build Coastguard Worker } 140*c8dee2aaSAndroid Build Coastguard Worker if err := moveWithCopyBackup(outputFile, *genBzlFile); err != nil { 141*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Could not write comments in workspace file: %s\n", err) 142*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 143*c8dee2aaSAndroid Build Coastguard Worker } 144*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Wrote %d deps\n", count) 145*c8dee2aaSAndroid Build Coastguard Worker} 146*c8dee2aaSAndroid Build Coastguard Worker 147*c8dee2aaSAndroid Build Coastguard Workerfunc parseDEPSFile(contents []string, workspaceFile string) (string, int, error) { 148*c8dee2aaSAndroid Build Coastguard Worker depsLine := regexp.MustCompile(`externals/(\S+)".+"(https.+)@([a-f0-9]+)"`) 149*c8dee2aaSAndroid Build Coastguard Worker outputFile, err := os.CreateTemp("", "genbzl") 150*c8dee2aaSAndroid Build Coastguard Worker if err != nil { 151*c8dee2aaSAndroid Build Coastguard Worker return "", 0, fmt.Errorf("Could not create output file: %s\n", err) 152*c8dee2aaSAndroid Build Coastguard Worker } 153*c8dee2aaSAndroid Build Coastguard Worker defer outputFile.Close() 154*c8dee2aaSAndroid Build Coastguard Worker 155*c8dee2aaSAndroid Build Coastguard Worker if _, err := outputFile.WriteString(header); err != nil { 156*c8dee2aaSAndroid Build Coastguard Worker return "", 0, fmt.Errorf("Could not write header to output file %s: %s\n", outputFile.Name(), err) 157*c8dee2aaSAndroid Build Coastguard Worker } 158*c8dee2aaSAndroid Build Coastguard Worker 159*c8dee2aaSAndroid Build Coastguard Worker var nativeRepos []string 160*c8dee2aaSAndroid Build Coastguard Worker var providedRepos []string 161*c8dee2aaSAndroid Build Coastguard Worker 162*c8dee2aaSAndroid Build Coastguard Worker count := 0 163*c8dee2aaSAndroid Build Coastguard Worker for _, line := range contents { 164*c8dee2aaSAndroid Build Coastguard Worker if match := depsLine.FindStringSubmatch(line); len(match) > 0 { 165*c8dee2aaSAndroid Build Coastguard Worker id := match[1] 166*c8dee2aaSAndroid Build Coastguard Worker repo := match[2] 167*c8dee2aaSAndroid Build Coastguard Worker rev := match[3] 168*c8dee2aaSAndroid Build Coastguard Worker 169*c8dee2aaSAndroid Build Coastguard Worker cfg, ok := deps[id] 170*c8dee2aaSAndroid Build Coastguard Worker if !ok { 171*c8dee2aaSAndroid Build Coastguard Worker continue 172*c8dee2aaSAndroid Build Coastguard Worker } 173*c8dee2aaSAndroid Build Coastguard Worker if cfg.bazelNameOverride != "" { 174*c8dee2aaSAndroid Build Coastguard Worker id = cfg.bazelNameOverride 175*c8dee2aaSAndroid Build Coastguard Worker } 176*c8dee2aaSAndroid Build Coastguard Worker if cfg.needsBazelFile { 177*c8dee2aaSAndroid Build Coastguard Worker if err := writeNewGitRepositoryRule(outputFile, id, repo, rev, cfg.patchCmds, cfg.patchCmdsWin); err != nil { 178*c8dee2aaSAndroid Build Coastguard Worker return "", 0, fmt.Errorf("Could not write to output file %s: %s\n", outputFile.Name(), err) 179*c8dee2aaSAndroid Build Coastguard Worker } 180*c8dee2aaSAndroid Build Coastguard Worker workspaceLine := fmt.Sprintf("# @%s - //bazel/external/%s:BUILD.bazel", id, id) 181*c8dee2aaSAndroid Build Coastguard Worker providedRepos = append(providedRepos, workspaceLine) 182*c8dee2aaSAndroid Build Coastguard Worker } else { 183*c8dee2aaSAndroid Build Coastguard Worker if err := writeGitRepositoryRule(outputFile, id, repo, rev); err != nil { 184*c8dee2aaSAndroid Build Coastguard Worker return "", 0, fmt.Errorf("Could not write to output file %s: %s\n", outputFile.Name(), err) 185*c8dee2aaSAndroid Build Coastguard Worker } 186*c8dee2aaSAndroid Build Coastguard Worker workspaceLine := fmt.Sprintf("# @%s - %s", id, repo) 187*c8dee2aaSAndroid Build Coastguard Worker nativeRepos = append(nativeRepos, workspaceLine) 188*c8dee2aaSAndroid Build Coastguard Worker } 189*c8dee2aaSAndroid Build Coastguard Worker count++ 190*c8dee2aaSAndroid Build Coastguard Worker } 191*c8dee2aaSAndroid Build Coastguard Worker } 192*c8dee2aaSAndroid Build Coastguard Worker if count != len(deps) { 193*c8dee2aaSAndroid Build Coastguard Worker return "", 0, fmt.Errorf("Not enough deps written. Maybe the deps dictionary needs a bazelNameOverride or an old dep needs to be removed?") 194*c8dee2aaSAndroid Build Coastguard Worker } 195*c8dee2aaSAndroid Build Coastguard Worker 196*c8dee2aaSAndroid Build Coastguard Worker if _, err := outputFile.WriteString(footer); err != nil { 197*c8dee2aaSAndroid Build Coastguard Worker return "", 0, fmt.Errorf("Could not write footer to output file %s: %s\n", outputFile.Name(), err) 198*c8dee2aaSAndroid Build Coastguard Worker } 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker if newWorkspaceFile, err := writeCommentsToWorkspace(workspaceFile, nativeRepos, providedRepos); err != nil { 201*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Could not parse workspace file %s: %s\n", workspaceFile, err) 202*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 203*c8dee2aaSAndroid Build Coastguard Worker } else { 204*c8dee2aaSAndroid Build Coastguard Worker if err := moveWithCopyBackup(newWorkspaceFile, workspaceFile); err != nil { 205*c8dee2aaSAndroid Build Coastguard Worker fmt.Printf("Could not write comments in workspace file: %s\n", err) 206*c8dee2aaSAndroid Build Coastguard Worker os.Exit(1) 207*c8dee2aaSAndroid Build Coastguard Worker } 208*c8dee2aaSAndroid Build Coastguard Worker } 209*c8dee2aaSAndroid Build Coastguard Worker return outputFile.Name(), count, nil 210*c8dee2aaSAndroid Build Coastguard Worker} 211*c8dee2aaSAndroid Build Coastguard Worker 212*c8dee2aaSAndroid Build Coastguard Workerfunc writeCommentsToWorkspace(workspaceFile string, nativeRepos, providedRepos []string) (string, error) { 213*c8dee2aaSAndroid Build Coastguard Worker b, err := os.ReadFile(workspaceFile) 214*c8dee2aaSAndroid Build Coastguard Worker if err != nil { 215*c8dee2aaSAndroid Build Coastguard Worker return "", fmt.Errorf("Could not open %s: %s\n", workspaceFile, err) 216*c8dee2aaSAndroid Build Coastguard Worker } 217*c8dee2aaSAndroid Build Coastguard Worker newWorkspace, err := os.CreateTemp("", "workspace") 218*c8dee2aaSAndroid Build Coastguard Worker if err != nil { 219*c8dee2aaSAndroid Build Coastguard Worker return "", fmt.Errorf("Could not make tempfile: %s\n", err) 220*c8dee2aaSAndroid Build Coastguard Worker } 221*c8dee2aaSAndroid Build Coastguard Worker defer newWorkspace.Close() 222*c8dee2aaSAndroid Build Coastguard Worker 223*c8dee2aaSAndroid Build Coastguard Worker workspaceContents := strings.Split(string(b), "\n") 224*c8dee2aaSAndroid Build Coastguard Worker 225*c8dee2aaSAndroid Build Coastguard Worker sort.Strings(nativeRepos) 226*c8dee2aaSAndroid Build Coastguard Worker sort.Strings(providedRepos) 227*c8dee2aaSAndroid Build Coastguard Worker for _, line := range workspaceContents { 228*c8dee2aaSAndroid Build Coastguard Worker if _, err := newWorkspace.WriteString(line + "\n"); err != nil { 229*c8dee2aaSAndroid Build Coastguard Worker return "", err 230*c8dee2aaSAndroid Build Coastguard Worker } 231*c8dee2aaSAndroid Build Coastguard Worker if line == startListString { 232*c8dee2aaSAndroid Build Coastguard Worker break 233*c8dee2aaSAndroid Build Coastguard Worker } 234*c8dee2aaSAndroid Build Coastguard Worker } 235*c8dee2aaSAndroid Build Coastguard Worker for _, repoLine := range nativeRepos { 236*c8dee2aaSAndroid Build Coastguard Worker if _, err := newWorkspace.WriteString(repoLine + "\n"); err != nil { 237*c8dee2aaSAndroid Build Coastguard Worker return "", err 238*c8dee2aaSAndroid Build Coastguard Worker } 239*c8dee2aaSAndroid Build Coastguard Worker } 240*c8dee2aaSAndroid Build Coastguard Worker if _, err := newWorkspace.WriteString("#\n"); err != nil { 241*c8dee2aaSAndroid Build Coastguard Worker return "", err 242*c8dee2aaSAndroid Build Coastguard Worker } 243*c8dee2aaSAndroid Build Coastguard Worker for _, repoLine := range providedRepos { 244*c8dee2aaSAndroid Build Coastguard Worker if _, err := newWorkspace.WriteString(repoLine + "\n"); err != nil { 245*c8dee2aaSAndroid Build Coastguard Worker return "", err 246*c8dee2aaSAndroid Build Coastguard Worker } 247*c8dee2aaSAndroid Build Coastguard Worker } 248*c8dee2aaSAndroid Build Coastguard Worker if _, err := newWorkspace.WriteString(endListString + "\n"); err != nil { 249*c8dee2aaSAndroid Build Coastguard Worker return "", err 250*c8dee2aaSAndroid Build Coastguard Worker } 251*c8dee2aaSAndroid Build Coastguard Worker 252*c8dee2aaSAndroid Build Coastguard Worker pastEnd := false 253*c8dee2aaSAndroid Build Coastguard Worker // Skip the last line, which is blank. We don't want to end with two empty newlines. 254*c8dee2aaSAndroid Build Coastguard Worker for _, line := range workspaceContents[:len(workspaceContents)-1] { 255*c8dee2aaSAndroid Build Coastguard Worker if line == endListString { 256*c8dee2aaSAndroid Build Coastguard Worker pastEnd = true 257*c8dee2aaSAndroid Build Coastguard Worker continue 258*c8dee2aaSAndroid Build Coastguard Worker } 259*c8dee2aaSAndroid Build Coastguard Worker if !pastEnd { 260*c8dee2aaSAndroid Build Coastguard Worker continue 261*c8dee2aaSAndroid Build Coastguard Worker } 262*c8dee2aaSAndroid Build Coastguard Worker if _, err := newWorkspace.WriteString(line + "\n"); err != nil { 263*c8dee2aaSAndroid Build Coastguard Worker return "", err 264*c8dee2aaSAndroid Build Coastguard Worker } 265*c8dee2aaSAndroid Build Coastguard Worker } 266*c8dee2aaSAndroid Build Coastguard Worker 267*c8dee2aaSAndroid Build Coastguard Worker return newWorkspace.Name(), nil 268*c8dee2aaSAndroid Build Coastguard Worker} 269*c8dee2aaSAndroid Build Coastguard Worker 270*c8dee2aaSAndroid Build Coastguard Workerconst ( 271*c8dee2aaSAndroid Build Coastguard Worker startListString = `#### START GENERATED LIST OF THIRD_PARTY DEPS` 272*c8dee2aaSAndroid Build Coastguard Worker endListString = `#### END GENERATED LIST OF THIRD_PARTY DEPS` 273*c8dee2aaSAndroid Build Coastguard Worker) 274*c8dee2aaSAndroid Build Coastguard Worker 275*c8dee2aaSAndroid Build Coastguard Workerconst header = `""" 276*c8dee2aaSAndroid Build Coastguard WorkerThis file is auto-generated from //bazel/deps_parser 277*c8dee2aaSAndroid Build Coastguard WorkerDO NOT MODIFY BY HAND. 278*c8dee2aaSAndroid Build Coastguard WorkerInstead, do: 279*c8dee2aaSAndroid Build Coastguard Worker bazel run //bazel/deps_parser 280*c8dee2aaSAndroid Build Coastguard Worker""" 281*c8dee2aaSAndroid Build Coastguard Worker 282*c8dee2aaSAndroid Build Coastguard Workerload("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository", "new_git_repository") 283*c8dee2aaSAndroid Build Coastguard Workerload("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") 284*c8dee2aaSAndroid Build Coastguard Workerload("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") 285*c8dee2aaSAndroid Build Coastguard Workerload("//bazel:download_config_files.bzl", "download_config_files") 286*c8dee2aaSAndroid Build Coastguard Workerload("//bazel:gcs_mirror.bzl", "gcs_mirror_url") 287*c8dee2aaSAndroid Build Coastguard Worker 288*c8dee2aaSAndroid Build Coastguard Workerdef c_plus_plus_deps(ws = "@skia"): 289*c8dee2aaSAndroid Build Coastguard Worker """A list of native Bazel git rules to download third party git repositories 290*c8dee2aaSAndroid Build Coastguard Worker 291*c8dee2aaSAndroid Build Coastguard Worker These are in the order they appear in //DEPS. 292*c8dee2aaSAndroid Build Coastguard Worker https://bazel.build/rules/lib/repo/git 293*c8dee2aaSAndroid Build Coastguard Worker 294*c8dee2aaSAndroid Build Coastguard Worker Args: 295*c8dee2aaSAndroid Build Coastguard Worker ws: The name of the Skia Bazel workspace. The default, "@", may be when used from within the 296*c8dee2aaSAndroid Build Coastguard Worker Skia workspace. 297*c8dee2aaSAndroid Build Coastguard Worker """` 298*c8dee2aaSAndroid Build Coastguard Worker 299*c8dee2aaSAndroid Build Coastguard Worker// If necessary, we can make a new map for bazel deps 300*c8dee2aaSAndroid Build Coastguard Workerconst footer = ` 301*c8dee2aaSAndroid Build Coastguard Workerdef bazel_deps(): 302*c8dee2aaSAndroid Build Coastguard Worker maybe( 303*c8dee2aaSAndroid Build Coastguard Worker http_archive, 304*c8dee2aaSAndroid Build Coastguard Worker name = "bazel_skylib", 305*c8dee2aaSAndroid Build Coastguard Worker sha256 = "c6966ec828da198c5d9adbaa94c05e3a1c7f21bd012a0b29ba8ddbccb2c93b0d", 306*c8dee2aaSAndroid Build Coastguard Worker urls = gcs_mirror_url( 307*c8dee2aaSAndroid Build Coastguard Worker sha256 = "c6966ec828da198c5d9adbaa94c05e3a1c7f21bd012a0b29ba8ddbccb2c93b0d", 308*c8dee2aaSAndroid Build Coastguard Worker url = "https://github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz", 309*c8dee2aaSAndroid Build Coastguard Worker ), 310*c8dee2aaSAndroid Build Coastguard Worker ) 311*c8dee2aaSAndroid Build Coastguard Worker 312*c8dee2aaSAndroid Build Coastguard Worker maybe( 313*c8dee2aaSAndroid Build Coastguard Worker http_archive, 314*c8dee2aaSAndroid Build Coastguard Worker name = "bazel_toolchains", 315*c8dee2aaSAndroid Build Coastguard Worker sha256 = "e52789d4e89c3e2dc0e3446a9684626a626b6bec3fde787d70bae37c6ebcc47f", 316*c8dee2aaSAndroid Build Coastguard Worker strip_prefix = "bazel-toolchains-5.1.1", 317*c8dee2aaSAndroid Build Coastguard Worker urls = gcs_mirror_url( 318*c8dee2aaSAndroid Build Coastguard Worker sha256 = "e52789d4e89c3e2dc0e3446a9684626a626b6bec3fde787d70bae37c6ebcc47f", 319*c8dee2aaSAndroid Build Coastguard Worker url = "https://github.com/bazelbuild/bazel-toolchains/archive/refs/tags/v5.1.1.tar.gz", 320*c8dee2aaSAndroid Build Coastguard Worker ), 321*c8dee2aaSAndroid Build Coastguard Worker ) 322*c8dee2aaSAndroid Build Coastguard Worker 323*c8dee2aaSAndroid Build Coastguard Workerdef header_based_configs(): 324*c8dee2aaSAndroid Build Coastguard Worker skia_revision = "d211141c45c9171437fa8e6e07989edb5bffa17a" 325*c8dee2aaSAndroid Build Coastguard Worker maybe( 326*c8dee2aaSAndroid Build Coastguard Worker download_config_files, 327*c8dee2aaSAndroid Build Coastguard Worker name = "expat_config", 328*c8dee2aaSAndroid Build Coastguard Worker skia_revision = skia_revision, 329*c8dee2aaSAndroid Build Coastguard Worker files = { 330*c8dee2aaSAndroid Build Coastguard Worker "BUILD.bazel": "third_party/expat/include/BUILD.bazel", 331*c8dee2aaSAndroid Build Coastguard Worker "expat_config/expat_config.h": "third_party/expat/include/expat_config/expat_config.h", 332*c8dee2aaSAndroid Build Coastguard Worker }, 333*c8dee2aaSAndroid Build Coastguard Worker ) 334*c8dee2aaSAndroid Build Coastguard Worker maybe( 335*c8dee2aaSAndroid Build Coastguard Worker download_config_files, 336*c8dee2aaSAndroid Build Coastguard Worker name = "freetype_config", 337*c8dee2aaSAndroid Build Coastguard Worker skia_revision = skia_revision, 338*c8dee2aaSAndroid Build Coastguard Worker files = { 339*c8dee2aaSAndroid Build Coastguard Worker "BUILD.bazel": "third_party/freetype2/include/BUILD.bazel", 340*c8dee2aaSAndroid Build Coastguard Worker "freetype-android/freetype/config/ftmodule.h": "third_party/freetype2/include/freetype-android/freetype/config/ftmodule.h", 341*c8dee2aaSAndroid Build Coastguard Worker "freetype-android/freetype/config/ftoption.h": "third_party/freetype2/include/freetype-android/freetype/config/ftoption.h", 342*c8dee2aaSAndroid Build Coastguard Worker "freetype-no-type1/freetype/config/ftmodule.h": "third_party/freetype2/include/freetype-no-type1/freetype/config/ftmodule.h", 343*c8dee2aaSAndroid Build Coastguard Worker "freetype-no-type1/freetype/config/ftoption.h": "third_party/freetype2/include/freetype-no-type1/freetype/config/ftoption.h", 344*c8dee2aaSAndroid Build Coastguard Worker }, 345*c8dee2aaSAndroid Build Coastguard Worker ) 346*c8dee2aaSAndroid Build Coastguard Worker maybe( 347*c8dee2aaSAndroid Build Coastguard Worker download_config_files, 348*c8dee2aaSAndroid Build Coastguard Worker name = "harfbuzz_config", 349*c8dee2aaSAndroid Build Coastguard Worker skia_revision = skia_revision, 350*c8dee2aaSAndroid Build Coastguard Worker files = { 351*c8dee2aaSAndroid Build Coastguard Worker "BUILD.bazel": "third_party/harfbuzz/BUILD.bazel", 352*c8dee2aaSAndroid Build Coastguard Worker "config-override.h": "third_party/harfbuzz/config-override.h", 353*c8dee2aaSAndroid Build Coastguard Worker }, 354*c8dee2aaSAndroid Build Coastguard Worker ) 355*c8dee2aaSAndroid Build Coastguard Worker maybe( 356*c8dee2aaSAndroid Build Coastguard Worker download_config_files, 357*c8dee2aaSAndroid Build Coastguard Worker name = "icu_utils", 358*c8dee2aaSAndroid Build Coastguard Worker skia_revision = skia_revision, 359*c8dee2aaSAndroid Build Coastguard Worker files = { 360*c8dee2aaSAndroid Build Coastguard Worker "BUILD.bazel": "third_party/icu/BUILD.bazel", 361*c8dee2aaSAndroid Build Coastguard Worker "SkLoadICU.cpp": "third_party/icu/SkLoadICU.cpp", 362*c8dee2aaSAndroid Build Coastguard Worker "SkLoadICU.h": "third_party/icu/SkLoadICU.h", 363*c8dee2aaSAndroid Build Coastguard Worker "make_data_cpp.py": "third_party/icu/make_data_cpp.py", 364*c8dee2aaSAndroid Build Coastguard Worker }, 365*c8dee2aaSAndroid Build Coastguard Worker ) 366*c8dee2aaSAndroid Build Coastguard Worker` 367*c8dee2aaSAndroid Build Coastguard Worker 368*c8dee2aaSAndroid Build Coastguard Workerfunc writeNewGitRepositoryRule(w io.StringWriter, bazelName, repo, rev string, patchCmds, patchCmdsWin []string) error { 369*c8dee2aaSAndroid Build Coastguard Worker if len(patchCmds) == 0 { 370*c8dee2aaSAndroid Build Coastguard Worker // TODO(kjlubick) In a newer version of Bazel, new_git_repository can be replaced with just 371*c8dee2aaSAndroid Build Coastguard Worker // git_repository 372*c8dee2aaSAndroid Build Coastguard Worker _, err := w.WriteString(fmt.Sprintf(` 373*c8dee2aaSAndroid Build Coastguard Worker new_git_repository( 374*c8dee2aaSAndroid Build Coastguard Worker name = "%s", 375*c8dee2aaSAndroid Build Coastguard Worker build_file = ws + "//bazel/external/%s:BUILD.bazel", 376*c8dee2aaSAndroid Build Coastguard Worker commit = "%s", 377*c8dee2aaSAndroid Build Coastguard Worker remote = "%s", 378*c8dee2aaSAndroid Build Coastguard Worker ) 379*c8dee2aaSAndroid Build Coastguard Worker`, bazelName, bazelName, rev, repo)) 380*c8dee2aaSAndroid Build Coastguard Worker return err 381*c8dee2aaSAndroid Build Coastguard Worker } 382*c8dee2aaSAndroid Build Coastguard Worker patches := "[" + strings.Join(patchCmds, ",\n") + "]" 383*c8dee2aaSAndroid Build Coastguard Worker patches_win := "[" + strings.Join(patchCmdsWin, ",\n") + "]" 384*c8dee2aaSAndroid Build Coastguard Worker _, err := w.WriteString(fmt.Sprintf(` 385*c8dee2aaSAndroid Build Coastguard Worker new_git_repository( 386*c8dee2aaSAndroid Build Coastguard Worker name = "%s", 387*c8dee2aaSAndroid Build Coastguard Worker build_file = ws + "//bazel/external/%s:BUILD.bazel", 388*c8dee2aaSAndroid Build Coastguard Worker commit = "%s", 389*c8dee2aaSAndroid Build Coastguard Worker remote = "%s", 390*c8dee2aaSAndroid Build Coastguard Worker patch_cmds = %s, 391*c8dee2aaSAndroid Build Coastguard Worker patch_cmds_win = %s, 392*c8dee2aaSAndroid Build Coastguard Worker ) 393*c8dee2aaSAndroid Build Coastguard Worker`, bazelName, bazelName, rev, repo, patches, patches_win)) 394*c8dee2aaSAndroid Build Coastguard Worker return err 395*c8dee2aaSAndroid Build Coastguard Worker} 396*c8dee2aaSAndroid Build Coastguard Worker 397*c8dee2aaSAndroid Build Coastguard Workerfunc writeGitRepositoryRule(w io.StringWriter, bazelName, repo, rev string) error { 398*c8dee2aaSAndroid Build Coastguard Worker _, err := w.WriteString(fmt.Sprintf(` 399*c8dee2aaSAndroid Build Coastguard Worker git_repository( 400*c8dee2aaSAndroid Build Coastguard Worker name = "%s", 401*c8dee2aaSAndroid Build Coastguard Worker commit = "%s", 402*c8dee2aaSAndroid Build Coastguard Worker remote = "%s", 403*c8dee2aaSAndroid Build Coastguard Worker ) 404*c8dee2aaSAndroid Build Coastguard Worker`, bazelName, rev, repo)) 405*c8dee2aaSAndroid Build Coastguard Worker return err 406*c8dee2aaSAndroid Build Coastguard Worker} 407*c8dee2aaSAndroid Build Coastguard Worker 408*c8dee2aaSAndroid Build Coastguard Workerfunc moveWithCopyBackup(src, dst string) error { 409*c8dee2aaSAndroid Build Coastguard Worker // Atomically rename temp file to workspace. This should minimize the chance of corruption 410*c8dee2aaSAndroid Build Coastguard Worker // or writing a partial file if there is an error or the program is interrupted. 411*c8dee2aaSAndroid Build Coastguard Worker if err := os.Rename(src, dst); err != nil { 412*c8dee2aaSAndroid Build Coastguard Worker // Errors can happen if the temporary file is on a different partition than the Skia 413*c8dee2aaSAndroid Build Coastguard Worker // codebase. In that case, do a manual read/write to copy the data. See 414*c8dee2aaSAndroid Build Coastguard Worker // https://github.com/jenkins-x/jx/issues/449 for a similar issue 415*c8dee2aaSAndroid Build Coastguard Worker if strings.Contains(err.Error(), "invalid cross-device link") { 416*c8dee2aaSAndroid Build Coastguard Worker bytes, err := os.ReadFile(src) 417*c8dee2aaSAndroid Build Coastguard Worker if err != nil { 418*c8dee2aaSAndroid Build Coastguard Worker return fmt.Errorf("Could not do backup read from %s: %s\n", src, err) 419*c8dee2aaSAndroid Build Coastguard Worker } 420*c8dee2aaSAndroid Build Coastguard Worker if err := os.WriteFile(dst, bytes, 0644); err != nil { 421*c8dee2aaSAndroid Build Coastguard Worker return fmt.Errorf("Could not do backup write of %d bytes to %s: %s\n", len(bytes), dst, err) 422*c8dee2aaSAndroid Build Coastguard Worker } 423*c8dee2aaSAndroid Build Coastguard Worker // Backup "move" successful 424*c8dee2aaSAndroid Build Coastguard Worker return nil 425*c8dee2aaSAndroid Build Coastguard Worker } 426*c8dee2aaSAndroid Build Coastguard Worker return fmt.Errorf("Could not write %s -> %s: %s\n", src, dst, err) 427*c8dee2aaSAndroid Build Coastguard Worker } 428*c8dee2aaSAndroid Build Coastguard Worker return nil 429*c8dee2aaSAndroid Build Coastguard Worker} 430