1 # -*- coding: utf-8 -*- 2 3 #------------------------------------------------------------------------- 4 # drawElements Quality Program utilities 5 # -------------------------------------- 6 # 7 # Copyright 2015 The Android Open Source Project 8 # 9 # Licensed under the Apache License, Version 2.0 (the "License"); 10 # you may not use this file except in compliance with the License. 11 # You may obtain a copy of the License at 12 # 13 # http://www.apache.org/licenses/LICENSE-2.0 14 # 15 # Unless required by applicable law or agreed to in writing, software 16 # distributed under the License is distributed on an "AS IS" BASIS, 17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 # See the License for the specific language governing permissions and 19 # limitations under the License. 20 # 21 #------------------------------------------------------------------------- 22 23 import os 24 from build.common import * 25 from build.build import * 26 from argparse import ArgumentParser 27 import multiprocessing 28 from build_android_mustpass import * 29 30 class LaunchControlConfig: 31 def __init__ (self, buildArgs, checkMustpassLists): 32 self.buildArgs = buildArgs 33 self.checkMustpassLists = checkMustpassLists 34 35 def getBuildArgs (self): 36 return self.buildArgs 37 38 def getCheckMustpassLists (self): 39 return self.checkMustpassLists 40 41 # This is a bit silly, but CMake needs to know the word width prior to 42 # parsing the project files, hence cannot use our own defines. 43 X86_64_ARGS = ["-DDE_CPU=DE_CPU_X86_64", "-DCMAKE_C_FLAGS=-m64", "-DCMAKE_CXX_FLAGS=-m64"] 44 45 BUILD_CONFIGS = { 46 "gcc-x86_64-x11_glx": LaunchControlConfig(X86_64_ARGS + ["-DDEQP_TARGET=x11_glx"], False), 47 "clang-x86_64-x11_glx": LaunchControlConfig(X86_64_ARGS + ["-DDEQP_TARGET=x11_glx", "-DCMAKE_C_COMPILER=clang", "-DCMAKE_CXX_COMPILER=clang++"], False), 48 "gcc-x86_64-null": LaunchControlConfig(X86_64_ARGS + ["-DDEQP_TARGET=null"], True) 49 } 50 51 def buildWithMake (workingDir): 52 pushWorkingDir(workingDir) 53 # CMake docs advised this to be the best magic formula... 54 threadCount = multiprocessing.cpu_count() + 1 55 print "Invoke make with %d threads" % threadCount 56 execute(["make", "-j%d" % threadCount]) 57 popWorkingDir() 58 59 def checkForChanges (): 60 pushWorkingDir(DEQP_DIR) 61 # If there are changed files, exit code will be non-zero and the script terminates immediately. 62 execute(["git", "diff", "--exit-code"]) 63 popWorkingDir() 64 65 def parseOptions (): 66 parser = ArgumentParser() 67 68 parser.add_argument("-d", 69 "--build-dir", 70 dest="buildDir", 71 default="out", 72 help="Temporary build directory") 73 parser.add_argument("-c", 74 "--config", 75 dest="config", 76 choices=BUILD_CONFIGS.keys(), 77 required=True, 78 help="Build configuration name") 79 parser.add_argument("-t", 80 "--build-type", 81 dest="buildType", 82 choices=["Debug", "Release"], 83 default="Debug", 84 help="Build type") 85 return parser.parse_args() 86 87 if __name__ == "__main__": 88 options = parseOptions() 89 90 print "\n############################################################" 91 print "# %s %s BUILD" % (options.config.upper(), options.buildType.upper()) 92 print "############################################################\n" 93 94 launchControlConfig = BUILD_CONFIGS[options.config] 95 buildDir = os.path.realpath(os.path.normpath(options.buildDir)) 96 config = BuildConfig(buildDir, options.buildType, launchControlConfig.getBuildArgs()) 97 initBuildDir(config, MAKEFILE_GENERATOR) 98 buildWithMake(buildDir) 99 100 if launchControlConfig.getCheckMustpassLists(): 101 genMustpassLists(MUSTPASS_LISTS, MAKEFILE_GENERATOR, config) 102 checkForChanges() 103 104 print "\n--- BUILD SCRIPT COMPLETE" 105