177f71597eb4e83437ea824bfc111accfaf0988deKalle Raita# -*- coding: utf-8 -*-
277f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
33c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#-------------------------------------------------------------------------
43c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# drawElements Quality Program utilities
53c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# --------------------------------------
63c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
73c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Copyright 2015 The Android Open Source Project
83c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
93c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Licensed under the Apache License, Version 2.0 (the "License");
103c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# you may not use this file except in compliance with the License.
113c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# You may obtain a copy of the License at
123c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
133c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#      http://www.apache.org/licenses/LICENSE-2.0
143c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
153c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Unless required by applicable law or agreed to in writing, software
163c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# distributed under the License is distributed on an "AS IS" BASIS,
173c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
183c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# See the License for the specific language governing permissions and
193c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# limitations under the License.
203c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
213c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#-------------------------------------------------------------------------
223c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry
2377f71597eb4e83437ea824bfc111accfaf0988deKalle Raitaimport os
2477f71597eb4e83437ea824bfc111accfaf0988deKalle Raitafrom build.common import *
2577f71597eb4e83437ea824bfc111accfaf0988deKalle Raitafrom build.build import *
2677f71597eb4e83437ea824bfc111accfaf0988deKalle Raitafrom argparse import ArgumentParser
2777f71597eb4e83437ea824bfc111accfaf0988deKalle Raitaimport multiprocessing
28ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raitafrom build_android_mustpass import *
29ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita
30ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raitaclass LaunchControlConfig:
31ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	def __init__ (self, buildArgs, checkMustpassLists):
32f189365bd621a14ac442faf93d81d031aad3a6f8Pyry Haulos		self.buildArgs			= buildArgs
33ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita		self.checkMustpassLists = checkMustpassLists
34ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita
35ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	def getBuildArgs (self):
36ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita		return self.buildArgs
37ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita
38ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	def getCheckMustpassLists (self):
39ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita		return self.checkMustpassLists
4077f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
412011fb57b88a861b31a860be501e7231d9639747Pyry HaulosCOMMON_GCC_CFLAGS	= ["-Werror"]
422011fb57b88a861b31a860be501e7231d9639747Pyry HaulosCOMMON_CLANG_CFLAGS	= COMMON_GCC_CFLAGS + ["-Wno-error=unused-command-line-argument"]
432011fb57b88a861b31a860be501e7231d9639747Pyry HaulosX86_64_GCC_CFLAGS	= COMMON_GCC_CFLAGS + ["-m64"]
442011fb57b88a861b31a860be501e7231d9639747Pyry HaulosX86_64_CLANG_CFLAGS	= COMMON_CLANG_CFLAGS + ["-m64"]
452011fb57b88a861b31a860be501e7231d9639747Pyry Haulos
462011fb57b88a861b31a860be501e7231d9639747Pyry Haulosdef makeCflagsArgs (cflags):
472011fb57b88a861b31a860be501e7231d9639747Pyry Haulos	cflagsStr = " ".join(cflags)
482011fb57b88a861b31a860be501e7231d9639747Pyry Haulos	return ["-DCMAKE_C_FLAGS=%s" % cflagsStr, "-DCMAKE_CXX_FLAGS=%s" % cflagsStr]
4977f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
5077f71597eb4e83437ea824bfc111accfaf0988deKalle RaitaBUILD_CONFIGS = {
512011fb57b88a861b31a860be501e7231d9639747Pyry Haulos	"gcc-x86_64-x11_glx":   LaunchControlConfig(["-DDEQP_TARGET=x11_glx"] + makeCflagsArgs(X86_64_GCC_CFLAGS), False),
522011fb57b88a861b31a860be501e7231d9639747Pyry Haulos	"clang-x86_64-x11_glx": LaunchControlConfig(["-DDEQP_TARGET=x11_glx", "-DCMAKE_C_COMPILER=clang", "-DCMAKE_CXX_COMPILER=clang++"] + makeCflagsArgs(X86_64_CLANG_CFLAGS), False),
532011fb57b88a861b31a860be501e7231d9639747Pyry Haulos	"gcc-x86_64-null":		LaunchControlConfig(["-DDEQP_TARGET=null"] + makeCflagsArgs(X86_64_GCC_CFLAGS), True)
5477f71597eb4e83437ea824bfc111accfaf0988deKalle Raita}
5577f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
5677f71597eb4e83437ea824bfc111accfaf0988deKalle Raitadef buildWithMake (workingDir):
5777f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	pushWorkingDir(workingDir)
5877f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	# CMake docs advised this to be the best magic formula...
5977f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	threadCount = multiprocessing.cpu_count() + 1
6077f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	print "Invoke make with %d threads" % threadCount
6177f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	execute(["make", "-j%d" % threadCount])
6277f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	popWorkingDir()
6377f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
64ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raitadef checkForChanges ():
65ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	pushWorkingDir(DEQP_DIR)
66ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	# If there are changed files, exit code will be non-zero and the script terminates immediately.
67ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	execute(["git", "diff", "--exit-code"])
68ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	popWorkingDir()
69ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita
7077f71597eb4e83437ea824bfc111accfaf0988deKalle Raitadef parseOptions ():
7177f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	parser = ArgumentParser()
7277f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
7377f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	parser.add_argument("-d",
7477f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						"--build-dir",
7577f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						dest="buildDir",
7677f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						default="out",
7777f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						help="Temporary build directory")
7877f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	parser.add_argument("-c",
7977f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						"--config",
8077f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						dest="config",
8177f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						choices=BUILD_CONFIGS.keys(),
8277f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						required=True,
8377f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						help="Build configuration name")
8477f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	parser.add_argument("-t",
8577f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						"--build-type",
8677f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						dest="buildType",
8777f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						choices=["Debug", "Release"],
8877f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						default="Debug",
8977f71597eb4e83437ea824bfc111accfaf0988deKalle Raita						help="Build type")
9077f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	return parser.parse_args()
9177f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
9277f71597eb4e83437ea824bfc111accfaf0988deKalle Raitaif __name__ == "__main__":
9377f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	options = parseOptions()
9477f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
9577f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	print "\n############################################################"
9677f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	print "# %s %s BUILD" % (options.config.upper(), options.buildType.upper())
9777f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	print "############################################################\n"
9877f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
99ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	launchControlConfig = BUILD_CONFIGS[options.config]
10077f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	buildDir = os.path.realpath(os.path.normpath(options.buildDir))
101ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	config = BuildConfig(buildDir, options.buildType, launchControlConfig.getBuildArgs())
10277f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	initBuildDir(config, MAKEFILE_GENERATOR)
10377f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	buildWithMake(buildDir)
10477f71597eb4e83437ea824bfc111accfaf0988deKalle Raita
105ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita	if launchControlConfig.getCheckMustpassLists():
106ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita		genMustpassLists(MUSTPASS_LISTS, MAKEFILE_GENERATOR, config)
107ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita		checkForChanges()
108ad8bdbb1b6ca58fb84deaaf0ddfc8ac8d9c89b9aKalle Raita
10977f71597eb4e83437ea824bfc111accfaf0988deKalle Raita	print "\n--- BUILD SCRIPT COMPLETE"
110