xref: /aosp_15_r20/external/deqp/scripts/check_build_sanity.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker# -*- coding: utf-8 -*-
2*35238bceSAndroid Build Coastguard Worker
3*35238bceSAndroid Build Coastguard Worker#-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker# drawElements Quality Program utilities
5*35238bceSAndroid Build Coastguard Worker# --------------------------------------
6*35238bceSAndroid Build Coastguard Worker#
7*35238bceSAndroid Build Coastguard Worker# Copyright 2016 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker#
9*35238bceSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker# You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker#
13*35238bceSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker#
15*35238bceSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker# limitations under the License.
20*35238bceSAndroid Build Coastguard Worker#
21*35238bceSAndroid Build Coastguard Worker#-------------------------------------------------------------------------
22*35238bceSAndroid Build Coastguard Worker
23*35238bceSAndroid Build Coastguard Workerimport itertools
24*35238bceSAndroid Build Coastguard Workerimport os
25*35238bceSAndroid Build Coastguard Workerimport argparse
26*35238bceSAndroid Build Coastguard Workerimport tempfile
27*35238bceSAndroid Build Coastguard Workerimport sys
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.common import *
30*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.build import *
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard WorkerpythonExecutable = sys.executable or "python"
33*35238bceSAndroid Build Coastguard Worker
34*35238bceSAndroid Build Coastguard Workerclass Environment:
35*35238bceSAndroid Build Coastguard Worker    def __init__ (self, srcDir, tmpDir, verbose):
36*35238bceSAndroid Build Coastguard Worker        self.srcDir = srcDir
37*35238bceSAndroid Build Coastguard Worker        self.tmpDir = tmpDir
38*35238bceSAndroid Build Coastguard Worker        self.verbose = verbose
39*35238bceSAndroid Build Coastguard Worker
40*35238bceSAndroid Build Coastguard Workerclass BuildTestStep:
41*35238bceSAndroid Build Coastguard Worker    def getName (self):
42*35238bceSAndroid Build Coastguard Worker        return "<unknown>"
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker    def isAvailable (self, env):
45*35238bceSAndroid Build Coastguard Worker        return True
46*35238bceSAndroid Build Coastguard Worker
47*35238bceSAndroid Build Coastguard Worker    def run (self, env):
48*35238bceSAndroid Build Coastguard Worker        raise Exception("Not implemented")
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard Workerclass RunScript(BuildTestStep):
51*35238bceSAndroid Build Coastguard Worker    def __init__ (self, scriptPath, getExtraArgs = None):
52*35238bceSAndroid Build Coastguard Worker        self.scriptPath = scriptPath
53*35238bceSAndroid Build Coastguard Worker        self.getExtraArgs = getExtraArgs
54*35238bceSAndroid Build Coastguard Worker
55*35238bceSAndroid Build Coastguard Worker    def getName (self):
56*35238bceSAndroid Build Coastguard Worker        return self.scriptPath
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker    def run (self, env):
59*35238bceSAndroid Build Coastguard Worker        args = [pythonExecutable, os.path.join(env.srcDir, self.scriptPath)]
60*35238bceSAndroid Build Coastguard Worker
61*35238bceSAndroid Build Coastguard Worker        if self.getExtraArgs != None:
62*35238bceSAndroid Build Coastguard Worker            args += self.getExtraArgs(env)
63*35238bceSAndroid Build Coastguard Worker
64*35238bceSAndroid Build Coastguard Worker        execute(args)
65*35238bceSAndroid Build Coastguard Worker
66*35238bceSAndroid Build Coastguard Worker    def __repr__(self):
67*35238bceSAndroid Build Coastguard Worker        return "RunScript:%s" % (self.scriptPath)
68*35238bceSAndroid Build Coastguard Worker
69*35238bceSAndroid Build Coastguard Workerdef makeCflagsArgs (cflags):
70*35238bceSAndroid Build Coastguard Worker    cflagsStr = " ".join(cflags)
71*35238bceSAndroid Build Coastguard Worker    return ["-DCMAKE_C_FLAGS=%s" % cflagsStr, "-DCMAKE_CXX_FLAGS=%s" % cflagsStr]
72*35238bceSAndroid Build Coastguard Worker
73*35238bceSAndroid Build Coastguard Workerdef makeBuildArgs (target, cc, cpp, cflags):
74*35238bceSAndroid Build Coastguard Worker    return ["-DDEQP_TARGET=%s" % target, "-DCMAKE_C_COMPILER=%s" % cc, "-DCMAKE_CXX_COMPILER=%s" % cpp] + makeCflagsArgs(cflags)
75*35238bceSAndroid Build Coastguard Worker
76*35238bceSAndroid Build Coastguard Workerclass BuildConfigGen:
77*35238bceSAndroid Build Coastguard Worker    def isAvailable (self, env):
78*35238bceSAndroid Build Coastguard Worker        return True
79*35238bceSAndroid Build Coastguard Worker
80*35238bceSAndroid Build Coastguard Workerclass UnixConfig(BuildConfigGen):
81*35238bceSAndroid Build Coastguard Worker    def __init__ (self, target, buildType, cc, cpp, cflags):
82*35238bceSAndroid Build Coastguard Worker        self.target = target
83*35238bceSAndroid Build Coastguard Worker        self.buildType = buildType
84*35238bceSAndroid Build Coastguard Worker        self.cc = cc
85*35238bceSAndroid Build Coastguard Worker        self.cpp = cpp
86*35238bceSAndroid Build Coastguard Worker        self.cflags = cflags
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker    def isAvailable (self, env):
89*35238bceSAndroid Build Coastguard Worker        return which(self.cc) != None and which(self.cpp) != None
90*35238bceSAndroid Build Coastguard Worker
91*35238bceSAndroid Build Coastguard Worker    def getBuildConfig (self, env, buildDir):
92*35238bceSAndroid Build Coastguard Worker        args = makeBuildArgs(self.target, self.cc, self.cpp, self.cflags)
93*35238bceSAndroid Build Coastguard Worker        return BuildConfig(buildDir, self.buildType, args, env.srcDir)
94*35238bceSAndroid Build Coastguard Worker
95*35238bceSAndroid Build Coastguard Workerclass VSConfig(BuildConfigGen):
96*35238bceSAndroid Build Coastguard Worker    def __init__ (self, buildType):
97*35238bceSAndroid Build Coastguard Worker        self.buildType = buildType
98*35238bceSAndroid Build Coastguard Worker
99*35238bceSAndroid Build Coastguard Worker    def getBuildConfig (self, env, buildDir):
100*35238bceSAndroid Build Coastguard Worker        args = ["-DCMAKE_C_FLAGS=/WX -DCMAKE_CXX_FLAGS=/WX"]
101*35238bceSAndroid Build Coastguard Worker        return BuildConfig(buildDir, self.buildType, args, env.srcDir)
102*35238bceSAndroid Build Coastguard Worker
103*35238bceSAndroid Build Coastguard Workerclass Build(BuildTestStep):
104*35238bceSAndroid Build Coastguard Worker    def __init__ (self, buildDir, configGen, generator):
105*35238bceSAndroid Build Coastguard Worker        self.buildDir = buildDir
106*35238bceSAndroid Build Coastguard Worker        self.configGen = configGen
107*35238bceSAndroid Build Coastguard Worker        self.generator = generator
108*35238bceSAndroid Build Coastguard Worker
109*35238bceSAndroid Build Coastguard Worker    def getName (self):
110*35238bceSAndroid Build Coastguard Worker        return self.buildDir
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker    def isAvailable (self, env):
113*35238bceSAndroid Build Coastguard Worker        return self.configGen.isAvailable(env) and self.generator != None and self.generator.isAvailable()
114*35238bceSAndroid Build Coastguard Worker
115*35238bceSAndroid Build Coastguard Worker    def run (self, env):
116*35238bceSAndroid Build Coastguard Worker        # specialize config for env
117*35238bceSAndroid Build Coastguard Worker        buildDir = os.path.join(env.tmpDir, self.buildDir)
118*35238bceSAndroid Build Coastguard Worker        curConfig = self.configGen.getBuildConfig(env, buildDir)
119*35238bceSAndroid Build Coastguard Worker
120*35238bceSAndroid Build Coastguard Worker        build(curConfig, self.generator)
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Workerclass CheckSrcChanges(BuildTestStep):
123*35238bceSAndroid Build Coastguard Worker    def getName (self):
124*35238bceSAndroid Build Coastguard Worker        return "check for changes"
125*35238bceSAndroid Build Coastguard Worker
126*35238bceSAndroid Build Coastguard Worker    def run (self, env):
127*35238bceSAndroid Build Coastguard Worker        pushWorkingDir(env.srcDir)
128*35238bceSAndroid Build Coastguard Worker        execute(["git", "diff", "--exit-code"])
129*35238bceSAndroid Build Coastguard Worker        popWorkingDir()
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Workerdef getClangVersion ():
132*35238bceSAndroid Build Coastguard Worker    knownVersions = ["4.0", "3.9", "3.8", "3.7", "3.6", "3.5"]
133*35238bceSAndroid Build Coastguard Worker    for version in knownVersions:
134*35238bceSAndroid Build Coastguard Worker        if which("clang-" + version) != None:
135*35238bceSAndroid Build Coastguard Worker            return "-" + version
136*35238bceSAndroid Build Coastguard Worker    return ""
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Workerdef runSteps (steps):
139*35238bceSAndroid Build Coastguard Worker    for step in steps:
140*35238bceSAndroid Build Coastguard Worker        if step.isAvailable(env):
141*35238bceSAndroid Build Coastguard Worker            print("Run: %s" % step.getName())
142*35238bceSAndroid Build Coastguard Worker            step.run(env)
143*35238bceSAndroid Build Coastguard Worker        else:
144*35238bceSAndroid Build Coastguard Worker            print("Skip: %s" % step.getName())
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard WorkerCOMMON_CFLAGS = ["-Werror", "-Wno-error=unused-function"]
147*35238bceSAndroid Build Coastguard WorkerCOMMON_GCC_CFLAGS = COMMON_CFLAGS + ["-Wno-error=array-bounds", "-Wno-error=address", "-Wno-error=nonnull"]
148*35238bceSAndroid Build Coastguard WorkerCOMMON_CLANG_CFLAGS = COMMON_CFLAGS + ["-Wno-error=unused-command-line-argument"]
149*35238bceSAndroid Build Coastguard WorkerGCC_32BIT_CFLAGS = COMMON_GCC_CFLAGS + ["-m32"]
150*35238bceSAndroid Build Coastguard WorkerCLANG_32BIT_CFLAGS = COMMON_CLANG_CFLAGS + ["-m32"]
151*35238bceSAndroid Build Coastguard WorkerGCC_64BIT_CFLAGS = COMMON_GCC_CFLAGS + ["-m64"]
152*35238bceSAndroid Build Coastguard WorkerCLANG_64BIT_CFLAGS = COMMON_CLANG_CFLAGS + ["-m64"]
153*35238bceSAndroid Build Coastguard WorkerCLANG_VERSION = getClangVersion()
154*35238bceSAndroid Build Coastguard Worker
155*35238bceSAndroid Build Coastguard Worker# Always ran before any receipe
156*35238bceSAndroid Build Coastguard WorkerPREREQUISITES = [
157*35238bceSAndroid Build Coastguard Worker    RunScript(os.path.join("external", "fetch_sources.py"), lambda env: ["--force"] + (["--verbose"] if env.verbose else []))
158*35238bceSAndroid Build Coastguard Worker]
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker# Always ran after any receipe
161*35238bceSAndroid Build Coastguard WorkerPOST_CHECKS = [
162*35238bceSAndroid Build Coastguard Worker    CheckSrcChanges()
163*35238bceSAndroid Build Coastguard Worker]
164*35238bceSAndroid Build Coastguard Worker
165*35238bceSAndroid Build Coastguard Worker# Optional step to clean up external resources after finishing receipe
166*35238bceSAndroid Build Coastguard WorkerPOST_CLEANUP = [
167*35238bceSAndroid Build Coastguard Worker    RunScript(os.path.join("external", "fetch_sources.py"), lambda env: ["--clean"])
168*35238bceSAndroid Build Coastguard Worker]
169*35238bceSAndroid Build Coastguard Worker
170*35238bceSAndroid Build Coastguard WorkerBUILD_TARGETS = [
171*35238bceSAndroid Build Coastguard Worker    Build("clang-64-debug",
172*35238bceSAndroid Build Coastguard Worker          UnixConfig("null",
173*35238bceSAndroid Build Coastguard Worker                     "Debug",
174*35238bceSAndroid Build Coastguard Worker                     "clang" + CLANG_VERSION,
175*35238bceSAndroid Build Coastguard Worker                     "clang++" + CLANG_VERSION,
176*35238bceSAndroid Build Coastguard Worker                     CLANG_64BIT_CFLAGS),
177*35238bceSAndroid Build Coastguard Worker          ANY_UNIX_GENERATOR),
178*35238bceSAndroid Build Coastguard Worker    Build("gcc-32-debug",
179*35238bceSAndroid Build Coastguard Worker          UnixConfig("null",
180*35238bceSAndroid Build Coastguard Worker                     "Debug",
181*35238bceSAndroid Build Coastguard Worker                     "gcc",
182*35238bceSAndroid Build Coastguard Worker                     "g++",
183*35238bceSAndroid Build Coastguard Worker                     GCC_32BIT_CFLAGS),
184*35238bceSAndroid Build Coastguard Worker          ANY_UNIX_GENERATOR),
185*35238bceSAndroid Build Coastguard Worker    Build("gcc-64-release",
186*35238bceSAndroid Build Coastguard Worker          UnixConfig("null",
187*35238bceSAndroid Build Coastguard Worker                     "Release",
188*35238bceSAndroid Build Coastguard Worker                     "gcc",
189*35238bceSAndroid Build Coastguard Worker                     "g++",
190*35238bceSAndroid Build Coastguard Worker                     GCC_64BIT_CFLAGS),
191*35238bceSAndroid Build Coastguard Worker          ANY_UNIX_GENERATOR),
192*35238bceSAndroid Build Coastguard Worker    Build("vs-64-debug",
193*35238bceSAndroid Build Coastguard Worker          VSConfig("Debug"),
194*35238bceSAndroid Build Coastguard Worker          ANY_VS_X64_GENERATOR),
195*35238bceSAndroid Build Coastguard Worker]
196*35238bceSAndroid Build Coastguard Worker
197*35238bceSAndroid Build Coastguard WorkerEARLY_SPECIAL_RECIPES = [
198*35238bceSAndroid Build Coastguard Worker    ('gen-inl-files', [
199*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("scripts", "gen_egl.py")),
200*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("scripts", "opengl", "gen_all.py")),
201*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("external", "vulkancts", "scripts", "gen_framework.py"), lambda env: (["--verbose"] if env.verbose else []) ),
202*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("external", "vulkancts", "scripts", "gen_framework_c.py"), lambda env: (["--verbose"] if env.verbose else []) ),
203*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("external", "vulkancts", "scripts", "gen_framework.py"), lambda env: ["--api", "SC"] ),
204*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("external", "vulkancts", "scripts", "gen_framework_c.py"), lambda env: ["--api", "SC"] ),
205*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("scripts", "gen_android_bp.py")),
206*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("scripts", "gen_khronos_cts_bp.py"))
207*35238bceSAndroid Build Coastguard Worker        ]),
208*35238bceSAndroid Build Coastguard Worker]
209*35238bceSAndroid Build Coastguard Worker
210*35238bceSAndroid Build Coastguard WorkerLATE_SPECIAL_RECIPES = [
211*35238bceSAndroid Build Coastguard Worker    ('android-mustpass', [
212*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("scripts", "build_android_mustpass.py"),
213*35238bceSAndroid Build Coastguard Worker                      lambda env: ["--build-dir", os.path.join(env.tmpDir, "android-mustpass")] + (["--verbose"] if env.verbose else [])),
214*35238bceSAndroid Build Coastguard Worker        ]),
215*35238bceSAndroid Build Coastguard Worker    ('vulkan-mustpass', [
216*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("external", "vulkancts", "scripts", "build_mustpass.py"),
217*35238bceSAndroid Build Coastguard Worker                      lambda env: ["--build-dir", os.path.join(env.tmpDir, "vulkan-mustpass")] + (["--verbose"] if env.verbose else [])),
218*35238bceSAndroid Build Coastguard Worker        ]),
219*35238bceSAndroid Build Coastguard Worker    ('spirv-binaries', [
220*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("external", "vulkancts", "scripts", "build_spirv_binaries.py"),
221*35238bceSAndroid Build Coastguard Worker                      lambda env: ["--build-type", "Release",
222*35238bceSAndroid Build Coastguard Worker                                    "--build-dir", os.path.join(env.tmpDir, "spirv-binaries"),
223*35238bceSAndroid Build Coastguard Worker                                    "--dst-path", os.path.join(env.tmpDir, "spirv-binaries")]),
224*35238bceSAndroid Build Coastguard Worker        ]),
225*35238bceSAndroid Build Coastguard Worker    ('amber-verify', [
226*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("external", "vulkancts", "scripts", "amber_verify.py"),
227*35238bceSAndroid Build Coastguard Worker                      lambda env: ["--build-type", "Release",
228*35238bceSAndroid Build Coastguard Worker                                    "--build-dir", os.path.join(env.tmpDir, "amber-verify"),
229*35238bceSAndroid Build Coastguard Worker                                    "--dst-path", os.path.join(env.tmpDir, "amber-verify")]),
230*35238bceSAndroid Build Coastguard Worker        ]),
231*35238bceSAndroid Build Coastguard Worker    ('check-all', [
232*35238bceSAndroid Build Coastguard Worker            RunScript(os.path.join("scripts", "src_util", "check_all.py")),
233*35238bceSAndroid Build Coastguard Worker        ])
234*35238bceSAndroid Build Coastguard Worker]
235*35238bceSAndroid Build Coastguard Worker
236*35238bceSAndroid Build Coastguard Workerdef getBuildRecipes ():
237*35238bceSAndroid Build Coastguard Worker    return [(b.getName(), [b]) for b in BUILD_TARGETS]
238*35238bceSAndroid Build Coastguard Worker
239*35238bceSAndroid Build Coastguard Workerdef getAllRecipe (recipes):
240*35238bceSAndroid Build Coastguard Worker    allSteps = {}
241*35238bceSAndroid Build Coastguard Worker    for name, steps in recipes:
242*35238bceSAndroid Build Coastguard Worker        allSteps[name] = steps
243*35238bceSAndroid Build Coastguard Worker    return allSteps
244*35238bceSAndroid Build Coastguard Worker
245*35238bceSAndroid Build Coastguard Workerdef getRecipes ():
246*35238bceSAndroid Build Coastguard Worker    recipes = EARLY_SPECIAL_RECIPES + getBuildRecipes() + LATE_SPECIAL_RECIPES
247*35238bceSAndroid Build Coastguard Worker    return recipes
248*35238bceSAndroid Build Coastguard Worker
249*35238bceSAndroid Build Coastguard Workerdef getRecipesByName (recipes, recipeNames):
250*35238bceSAndroid Build Coastguard Worker    selectedRecipes = {}
251*35238bceSAndroid Build Coastguard Worker    for recipeName in recipeNames:
252*35238bceSAndroid Build Coastguard Worker        for curName, steps in recipes:
253*35238bceSAndroid Build Coastguard Worker            logging.debug("Evaluating %s against %s" % (recipeName, curName))
254*35238bceSAndroid Build Coastguard Worker            if curName == recipeName:
255*35238bceSAndroid Build Coastguard Worker                selectedRecipes[curName] = steps
256*35238bceSAndroid Build Coastguard Worker    return selectedRecipes
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard WorkerRECIPES = getRecipes()
259*35238bceSAndroid Build Coastguard Worker
260*35238bceSAndroid Build Coastguard Workerdef parseArgs ():
261*35238bceSAndroid Build Coastguard Worker    parser = argparse.ArgumentParser(description = "Build and test source",
262*35238bceSAndroid Build Coastguard Worker                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
263*35238bceSAndroid Build Coastguard Worker    parser.add_argument("-s",
264*35238bceSAndroid Build Coastguard Worker                        "--src-dir",
265*35238bceSAndroid Build Coastguard Worker                        dest="srcDir",
266*35238bceSAndroid Build Coastguard Worker                        default=DEQP_DIR,
267*35238bceSAndroid Build Coastguard Worker                        help="Source directory")
268*35238bceSAndroid Build Coastguard Worker    parser.add_argument("-t",
269*35238bceSAndroid Build Coastguard Worker                        "--tmp-dir",
270*35238bceSAndroid Build Coastguard Worker                        dest="tmpDir",
271*35238bceSAndroid Build Coastguard Worker                        default=os.path.join(tempfile.gettempdir(), "deqp-build-test"),
272*35238bceSAndroid Build Coastguard Worker                        help="Temporary directory")
273*35238bceSAndroid Build Coastguard Worker    parser.add_argument("-r",
274*35238bceSAndroid Build Coastguard Worker                        "--recipe",
275*35238bceSAndroid Build Coastguard Worker                        dest="recipes",
276*35238bceSAndroid Build Coastguard Worker                        nargs='+',
277*35238bceSAndroid Build Coastguard Worker                        choices=[n for n, s in RECIPES] + ["all"],
278*35238bceSAndroid Build Coastguard Worker                        default="all",
279*35238bceSAndroid Build Coastguard Worker                        help="Build / test recipe")
280*35238bceSAndroid Build Coastguard Worker    parser.add_argument("-d",
281*35238bceSAndroid Build Coastguard Worker                        "--dump-recipes",
282*35238bceSAndroid Build Coastguard Worker                        dest="dumpRecipes",
283*35238bceSAndroid Build Coastguard Worker                        action="store_true",
284*35238bceSAndroid Build Coastguard Worker                        help="Print out recipes that have any available actions")
285*35238bceSAndroid Build Coastguard Worker    parser.add_argument("--skip-prerequisites",
286*35238bceSAndroid Build Coastguard Worker                        dest="skipPrerequisites",
287*35238bceSAndroid Build Coastguard Worker                        action="store_true",
288*35238bceSAndroid Build Coastguard Worker                        help="Skip external dependency fetch")
289*35238bceSAndroid Build Coastguard Worker    parser.add_argument("--skip-post-checks",
290*35238bceSAndroid Build Coastguard Worker                        dest="skipPostCheck",
291*35238bceSAndroid Build Coastguard Worker                        action="store_true",
292*35238bceSAndroid Build Coastguard Worker                        help="Skip post recipe checks")
293*35238bceSAndroid Build Coastguard Worker    parser.add_argument("--apply-post-external-cleanup",
294*35238bceSAndroid Build Coastguard Worker                        dest="applyPostExternalDependencyCleanup",
295*35238bceSAndroid Build Coastguard Worker                        action="store_true",
296*35238bceSAndroid Build Coastguard Worker                        help="skip external dependency clean up")
297*35238bceSAndroid Build Coastguard Worker    parser.add_argument("-v", "--verbose",
298*35238bceSAndroid Build Coastguard Worker                        dest="verbose",
299*35238bceSAndroid Build Coastguard Worker                        action="store_true",
300*35238bceSAndroid Build Coastguard Worker                        help="Enable verbose logging")
301*35238bceSAndroid Build Coastguard Worker
302*35238bceSAndroid Build Coastguard Worker    return parser.parse_args()
303*35238bceSAndroid Build Coastguard Worker
304*35238bceSAndroid Build Coastguard Workerif __name__ == "__main__":
305*35238bceSAndroid Build Coastguard Worker    args = parseArgs()
306*35238bceSAndroid Build Coastguard Worker    env = Environment(args.srcDir, args.tmpDir, args.verbose)
307*35238bceSAndroid Build Coastguard Worker    initializeLogger(args.verbose)
308*35238bceSAndroid Build Coastguard Worker
309*35238bceSAndroid Build Coastguard Worker    if args.dumpRecipes:
310*35238bceSAndroid Build Coastguard Worker        for name, steps in RECIPES:
311*35238bceSAndroid Build Coastguard Worker            for step in steps:
312*35238bceSAndroid Build Coastguard Worker                if step.isAvailable(env):
313*35238bceSAndroid Build Coastguard Worker                    print(name)
314*35238bceSAndroid Build Coastguard Worker                    break
315*35238bceSAndroid Build Coastguard Worker    else:
316*35238bceSAndroid Build Coastguard Worker        selectedRecipes = getAllRecipe(RECIPES) if args.recipes == "all" \
317*35238bceSAndroid Build Coastguard Worker                        else getRecipesByName(RECIPES, args.recipes)
318*35238bceSAndroid Build Coastguard Worker
319*35238bceSAndroid Build Coastguard Worker        print("Running %s" % ','.join(selectedRecipes.keys()))
320*35238bceSAndroid Build Coastguard Worker        selectedSteps = list(itertools.chain.from_iterable(selectedRecipes.values()))
321*35238bceSAndroid Build Coastguard Worker        allSteps = (PREREQUISITES if (args.skipPrerequisites == False) else []) + selectedSteps + (POST_CHECKS if (args.skipPostCheck == False) else []) + (POST_CLEANUP if (args.applyPostExternalDependencyCleanup == True) else [])
322*35238bceSAndroid Build Coastguard Worker        runSteps(allSteps)
323*35238bceSAndroid Build Coastguard Worker
324*35238bceSAndroid Build Coastguard Worker        print("All steps completed successfully")
325