blob: 3657ea8ef978a61d567b6bab7cbeb08b178f53af [file] [log] [blame]
Jingwen Chen5ba7e472020-07-15 10:06:41 +00001// Copyright 2020 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package main
16
17import (
18 "android/soong/android"
Liz Kammer2dd9ca42020-11-25 16:06:39 -080019 "android/soong/bp2build"
Jingwen Chen5ba7e472020-07-15 10:06:41 +000020 "io/ioutil"
21 "os"
22 "path/filepath"
Jingwen Chen5ba7e472020-07-15 10:06:41 +000023
24 "github.com/google/blueprint"
25)
26
Liz Kammer2dd9ca42020-11-25 16:06:39 -080027type queryviewContext struct {
28 bpCtx *blueprint.Context
Jingwen Chen5ba7e472020-07-15 10:06:41 +000029}
30
Liz Kammer2dd9ca42020-11-25 16:06:39 -080031func (ctx *queryviewContext) ModuleName(module blueprint.Module) string {
32 return ctx.bpCtx.ModuleName(module)
Jingwen Chen5ba7e472020-07-15 10:06:41 +000033}
34
Liz Kammer2dd9ca42020-11-25 16:06:39 -080035func (ctx *queryviewContext) ModuleDir(module blueprint.Module) string {
36 return ctx.bpCtx.ModuleDir(module)
Jingwen Chen5ba7e472020-07-15 10:06:41 +000037}
38
Liz Kammer2dd9ca42020-11-25 16:06:39 -080039func (ctx *queryviewContext) ModuleSubDir(module blueprint.Module) string {
40 return ctx.bpCtx.ModuleSubDir(module)
Jingwen Chen69d4cbe2020-08-07 14:16:34 +000041}
42
Liz Kammer2dd9ca42020-11-25 16:06:39 -080043func (ctx *queryviewContext) ModuleType(module blueprint.Module) string {
44 return ctx.bpCtx.ModuleType(module)
Jingwen Chen69d4cbe2020-08-07 14:16:34 +000045}
46
Liz Kammer2dd9ca42020-11-25 16:06:39 -080047func (ctx *queryviewContext) VisitAllModulesBlueprint(visit func(blueprint.Module)) {
48 ctx.bpCtx.VisitAllModules(visit)
Jingwen Chen69d4cbe2020-08-07 14:16:34 +000049}
50
Liz Kammer2dd9ca42020-11-25 16:06:39 -080051func (ctx *queryviewContext) VisitDirectDeps(module android.Module, visit func(android.Module)) {
52 ctx.bpCtx.VisitDirectDeps(module, func(m blueprint.Module) {
53 if aModule, ok := m.(android.Module); ok {
54 visit(aModule)
Jingwen Chen69d4cbe2020-08-07 14:16:34 +000055 }
Liz Kammer2dd9ca42020-11-25 16:06:39 -080056 })
Jingwen Chend8004ef2020-08-27 09:40:43 +000057}
58
Jingwen Chen50f93d22020-11-05 07:42:11 -050059func createBazelQueryView(ctx *android.Context, bazelQueryViewDir string) error {
Liz Kammer2dd9ca42020-11-25 16:06:39 -080060 qvCtx := queryviewContext{
61 bpCtx: ctx.Context,
Jingwen Chen5ba7e472020-07-15 10:06:41 +000062 }
Liz Kammer2dd9ca42020-11-25 16:06:39 -080063 ruleShims := bp2build.CreateRuleShims(android.ModuleTypeFactories())
64 buildToTargets := bp2build.GenerateSoongModuleTargets(&qvCtx)
Jingwen Chen5ba7e472020-07-15 10:06:41 +000065
Liz Kammer2dd9ca42020-11-25 16:06:39 -080066 filesToWrite := bp2build.CreateBazelFiles(ruleShims, buildToTargets)
67 for _, f := range filesToWrite {
68 if err := writeReadOnlyFile(bazelQueryViewDir, f); err != nil {
Jingwen Chend8004ef2020-08-27 09:40:43 +000069 return err
70 }
71 }
72
Liz Kammer2dd9ca42020-11-25 16:06:39 -080073 return nil
Jingwen Chen5ba7e472020-07-15 10:06:41 +000074}
75
Liz Kammer2dd9ca42020-11-25 16:06:39 -080076// The auto-conversion directory should be read-only, sufficient for bazel query. The files
Jingwen Chend8004ef2020-08-27 09:40:43 +000077// are not intended to be edited by end users.
Liz Kammer2dd9ca42020-11-25 16:06:39 -080078func writeReadOnlyFile(dir string, f bp2build.BazelFile) error {
79 dir = filepath.Join(dir, f.Dir)
80 if err := createDirectoryIfNonexistent(dir); err != nil {
81 return err
82 }
83 pathToFile := filepath.Join(dir, f.Basename)
84
Jingwen Chen5ba7e472020-07-15 10:06:41 +000085 // 0444 is read-only
Liz Kammer2dd9ca42020-11-25 16:06:39 -080086 err := ioutil.WriteFile(pathToFile, []byte(f.Contents), 0444)
87
88 return err
Jingwen Chen5ba7e472020-07-15 10:06:41 +000089}
Jingwen Chen69d4cbe2020-08-07 14:16:34 +000090
Liz Kammer2dd9ca42020-11-25 16:06:39 -080091func createDirectoryIfNonexistent(dir string) error {
92 if _, err := os.Stat(dir); os.IsNotExist(err) {
93 return os.MkdirAll(dir, os.ModePerm)
94 } else {
95 return err
Jingwen Chen69d4cbe2020-08-07 14:16:34 +000096 }
97}