xref: /aosp_15_r20/external/deqp/scripts/make_release.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 2015 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 os
24*35238bceSAndroid Build Coastguard Workerimport re
25*35238bceSAndroid Build Coastguard Workerimport sys
26*35238bceSAndroid Build Coastguard Workerimport copy
27*35238bceSAndroid Build Coastguard Workerimport zlib
28*35238bceSAndroid Build Coastguard Workerimport time
29*35238bceSAndroid Build Coastguard Workerimport shlex
30*35238bceSAndroid Build Coastguard Workerimport shutil
31*35238bceSAndroid Build Coastguard Workerimport fnmatch
32*35238bceSAndroid Build Coastguard Workerimport tarfile
33*35238bceSAndroid Build Coastguard Workerimport argparse
34*35238bceSAndroid Build Coastguard Workerimport platform
35*35238bceSAndroid Build Coastguard Workerimport datetime
36*35238bceSAndroid Build Coastguard Workerimport tempfile
37*35238bceSAndroid Build Coastguard Workerimport posixpath
38*35238bceSAndroid Build Coastguard Workerimport subprocess
39*35238bceSAndroid Build Coastguard Worker
40*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.common import *
41*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.config import *
42*35238bceSAndroid Build Coastguard Workerfrom ctsbuild.build import *
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard WorkerpythonExecutable = sys.executable or "python"
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Workerdef die (msg):
47*35238bceSAndroid Build Coastguard Worker    print(msg)
48*35238bceSAndroid Build Coastguard Worker    sys.exit(-1)
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard Workerdef removeLeadingPath (path, basePath):
51*35238bceSAndroid Build Coastguard Worker    # Both inputs must be normalized already
52*35238bceSAndroid Build Coastguard Worker    assert os.path.normpath(path) == path
53*35238bceSAndroid Build Coastguard Worker    assert os.path.normpath(basePath) == basePath
54*35238bceSAndroid Build Coastguard Worker    return path[len(basePath) + 1:]
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Workerdef findFile (candidates):
57*35238bceSAndroid Build Coastguard Worker    for file in candidates:
58*35238bceSAndroid Build Coastguard Worker        if os.path.exists(file):
59*35238bceSAndroid Build Coastguard Worker            return file
60*35238bceSAndroid Build Coastguard Worker    return None
61*35238bceSAndroid Build Coastguard Worker
62*35238bceSAndroid Build Coastguard Workerdef getFileList (basePath):
63*35238bceSAndroid Build Coastguard Worker    allFiles = []
64*35238bceSAndroid Build Coastguard Worker    basePath = os.path.normpath(basePath)
65*35238bceSAndroid Build Coastguard Worker    for root, dirs, files in os.walk(basePath):
66*35238bceSAndroid Build Coastguard Worker        for file in files:
67*35238bceSAndroid Build Coastguard Worker            relPath = removeLeadingPath(os.path.normpath(os.path.join(root, file)), basePath)
68*35238bceSAndroid Build Coastguard Worker            allFiles.append(relPath)
69*35238bceSAndroid Build Coastguard Worker    return allFiles
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard Workerdef toDatetime (dateTuple):
72*35238bceSAndroid Build Coastguard Worker    Y, M, D = dateTuple
73*35238bceSAndroid Build Coastguard Worker    return datetime.datetime(Y, M, D)
74*35238bceSAndroid Build Coastguard Worker
75*35238bceSAndroid Build Coastguard Workerclass PackageBuildInfo:
76*35238bceSAndroid Build Coastguard Worker    def __init__ (self, releaseConfig, srcBasePath, dstBasePath, tmpBasePath):
77*35238bceSAndroid Build Coastguard Worker        self.releaseConfig = releaseConfig
78*35238bceSAndroid Build Coastguard Worker        self.srcBasePath = srcBasePath
79*35238bceSAndroid Build Coastguard Worker        self.dstBasePath = dstBasePath
80*35238bceSAndroid Build Coastguard Worker        self.tmpBasePath = tmpBasePath
81*35238bceSAndroid Build Coastguard Worker
82*35238bceSAndroid Build Coastguard Worker    def getReleaseConfig (self):
83*35238bceSAndroid Build Coastguard Worker        return self.releaseConfig
84*35238bceSAndroid Build Coastguard Worker
85*35238bceSAndroid Build Coastguard Worker    def getReleaseVersion (self):
86*35238bceSAndroid Build Coastguard Worker        return self.releaseConfig.getVersion()
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker    def getReleaseId (self):
89*35238bceSAndroid Build Coastguard Worker        # Release id is crc32(releaseConfig + release)
90*35238bceSAndroid Build Coastguard Worker        return zlib.crc32(self.releaseConfig.getName() + self.releaseConfig.getVersion()) & 0xffffffff
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker    def getSrcBasePath (self):
93*35238bceSAndroid Build Coastguard Worker        return self.srcBasePath
94*35238bceSAndroid Build Coastguard Worker
95*35238bceSAndroid Build Coastguard Worker    def getTmpBasePath (self):
96*35238bceSAndroid Build Coastguard Worker        return self.tmpBasePath
97*35238bceSAndroid Build Coastguard Worker
98*35238bceSAndroid Build Coastguard Workerclass DstFile (object):
99*35238bceSAndroid Build Coastguard Worker    def __init__ (self, dstFile):
100*35238bceSAndroid Build Coastguard Worker        self.dstFile = dstFile
101*35238bceSAndroid Build Coastguard Worker
102*35238bceSAndroid Build Coastguard Worker    def makeDir (self):
103*35238bceSAndroid Build Coastguard Worker        dirName = os.path.dirname(self.dstFile)
104*35238bceSAndroid Build Coastguard Worker        if not os.path.exists(dirName):
105*35238bceSAndroid Build Coastguard Worker            os.makedirs(dirName)
106*35238bceSAndroid Build Coastguard Worker
107*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
108*35238bceSAndroid Build Coastguard Worker        assert False # Should not be called
109*35238bceSAndroid Build Coastguard Worker
110*35238bceSAndroid Build Coastguard Workerclass CopyFile (DstFile):
111*35238bceSAndroid Build Coastguard Worker    def __init__ (self, srcFile, dstFile):
112*35238bceSAndroid Build Coastguard Worker        super(CopyFile, self).__init__(dstFile)
113*35238bceSAndroid Build Coastguard Worker        self.srcFile = srcFile
114*35238bceSAndroid Build Coastguard Worker
115*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
116*35238bceSAndroid Build Coastguard Worker        self.makeDir()
117*35238bceSAndroid Build Coastguard Worker        if os.path.exists(self.dstFile):
118*35238bceSAndroid Build Coastguard Worker            die("%s already exists" % self.dstFile)
119*35238bceSAndroid Build Coastguard Worker        shutil.copyfile(self.srcFile, self.dstFile)
120*35238bceSAndroid Build Coastguard Worker
121*35238bceSAndroid Build Coastguard Workerclass GenReleaseInfoFileTarget (DstFile):
122*35238bceSAndroid Build Coastguard Worker    def __init__ (self, dstFile):
123*35238bceSAndroid Build Coastguard Worker        super(GenReleaseInfoFileTarget, self).__init__(dstFile)
124*35238bceSAndroid Build Coastguard Worker
125*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
126*35238bceSAndroid Build Coastguard Worker        self.makeDir()
127*35238bceSAndroid Build Coastguard Worker
128*35238bceSAndroid Build Coastguard Worker        scriptPath = os.path.normpath(os.path.join(packageBuildInfo.srcBasePath, "framework", "qphelper", "gen_release_info.py"))
129*35238bceSAndroid Build Coastguard Worker        execute([
130*35238bceSAndroid Build Coastguard Worker                pythonExecutable,
131*35238bceSAndroid Build Coastguard Worker                "-B", # no .py[co]
132*35238bceSAndroid Build Coastguard Worker                scriptPath,
133*35238bceSAndroid Build Coastguard Worker                "--name=%s" % packageBuildInfo.getReleaseVersion(),
134*35238bceSAndroid Build Coastguard Worker                "--id=0x%08x" % packageBuildInfo.getReleaseId(),
135*35238bceSAndroid Build Coastguard Worker                "--out=%s" % self.dstFile
136*35238bceSAndroid Build Coastguard Worker            ])
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Workerclass GenCMake (DstFile):
139*35238bceSAndroid Build Coastguard Worker    def __init__ (self, srcFile, dstFile, replaceVars):
140*35238bceSAndroid Build Coastguard Worker        super(GenCMake, self).__init__(dstFile)
141*35238bceSAndroid Build Coastguard Worker        self.srcFile = srcFile
142*35238bceSAndroid Build Coastguard Worker        self.replaceVars = replaceVars
143*35238bceSAndroid Build Coastguard Worker
144*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
145*35238bceSAndroid Build Coastguard Worker        self.makeDir()
146*35238bceSAndroid Build Coastguard Worker        print("    GenCMake: %s" % removeLeadingPath(self.dstFile, packageBuildInfo.dstBasePath))
147*35238bceSAndroid Build Coastguard Worker        src = readFile(self.srcFile)
148*35238bceSAndroid Build Coastguard Worker        for var, value in self.replaceVars:
149*35238bceSAndroid Build Coastguard Worker            src = re.sub('set\(%s\s+"[^"]*"' % re.escape(var),
150*35238bceSAndroid Build Coastguard Worker                         'set(%s "%s"' % (var, value), src)
151*35238bceSAndroid Build Coastguard Worker        writeFile(self.dstFile, src)
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Workerdef createFileTargets (srcBasePath, dstBasePath, files, filters):
154*35238bceSAndroid Build Coastguard Worker    usedFiles = set() # Files that are already included by other filters
155*35238bceSAndroid Build Coastguard Worker    targets = []
156*35238bceSAndroid Build Coastguard Worker
157*35238bceSAndroid Build Coastguard Worker    for isMatch, createFileObj in filters:
158*35238bceSAndroid Build Coastguard Worker        # Build list of files that match filter
159*35238bceSAndroid Build Coastguard Worker        matchingFiles = []
160*35238bceSAndroid Build Coastguard Worker        for file in files:
161*35238bceSAndroid Build Coastguard Worker            if not file in usedFiles and isMatch(file):
162*35238bceSAndroid Build Coastguard Worker                matchingFiles.append(file)
163*35238bceSAndroid Build Coastguard Worker
164*35238bceSAndroid Build Coastguard Worker        # Build file objects, add to used set
165*35238bceSAndroid Build Coastguard Worker        for file in matchingFiles:
166*35238bceSAndroid Build Coastguard Worker            usedFiles.add(file)
167*35238bceSAndroid Build Coastguard Worker            targets.append(createFileObj(os.path.join(srcBasePath, file), os.path.join(dstBasePath, file)))
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker    return targets
170*35238bceSAndroid Build Coastguard Worker
171*35238bceSAndroid Build Coastguard Worker# Generates multiple file targets based on filters
172*35238bceSAndroid Build Coastguard Workerclass FileTargetGroup:
173*35238bceSAndroid Build Coastguard Worker    def __init__ (self, srcBasePath, dstBasePath, filters, srcBasePathFunc=PackageBuildInfo.getSrcBasePath):
174*35238bceSAndroid Build Coastguard Worker        self.srcBasePath = srcBasePath
175*35238bceSAndroid Build Coastguard Worker        self.dstBasePath = dstBasePath
176*35238bceSAndroid Build Coastguard Worker        self.filters = filters
177*35238bceSAndroid Build Coastguard Worker        self.getSrcBasePath = srcBasePathFunc
178*35238bceSAndroid Build Coastguard Worker
179*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
180*35238bceSAndroid Build Coastguard Worker        fullSrcPath = os.path.normpath(os.path.join(self.getSrcBasePath(packageBuildInfo), self.srcBasePath))
181*35238bceSAndroid Build Coastguard Worker        fullDstPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstBasePath))
182*35238bceSAndroid Build Coastguard Worker
183*35238bceSAndroid Build Coastguard Worker        allFiles = getFileList(fullSrcPath)
184*35238bceSAndroid Build Coastguard Worker        targets = createFileTargets(fullSrcPath, fullDstPath, allFiles, self.filters)
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker        # Make all file targets
187*35238bceSAndroid Build Coastguard Worker        for file in targets:
188*35238bceSAndroid Build Coastguard Worker            file.make(packageBuildInfo)
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker# Single file target
191*35238bceSAndroid Build Coastguard Workerclass SingleFileTarget:
192*35238bceSAndroid Build Coastguard Worker    def __init__ (self, srcFile, dstFile, makeTarget):
193*35238bceSAndroid Build Coastguard Worker        self.srcFile = srcFile
194*35238bceSAndroid Build Coastguard Worker        self.dstFile = dstFile
195*35238bceSAndroid Build Coastguard Worker        self.makeTarget = makeTarget
196*35238bceSAndroid Build Coastguard Worker
197*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
198*35238bceSAndroid Build Coastguard Worker        fullSrcPath = os.path.normpath(os.path.join(packageBuildInfo.srcBasePath, self.srcFile))
199*35238bceSAndroid Build Coastguard Worker        fullDstPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstFile))
200*35238bceSAndroid Build Coastguard Worker
201*35238bceSAndroid Build Coastguard Worker        target = self.makeTarget(fullSrcPath, fullDstPath)
202*35238bceSAndroid Build Coastguard Worker        target.make(packageBuildInfo)
203*35238bceSAndroid Build Coastguard Worker
204*35238bceSAndroid Build Coastguard Workerclass BuildTarget:
205*35238bceSAndroid Build Coastguard Worker    def __init__ (self, baseConfig, generator, targets = None):
206*35238bceSAndroid Build Coastguard Worker        self.baseConfig = baseConfig
207*35238bceSAndroid Build Coastguard Worker        self.generator = generator
208*35238bceSAndroid Build Coastguard Worker        self.targets = targets
209*35238bceSAndroid Build Coastguard Worker
210*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
211*35238bceSAndroid Build Coastguard Worker        print("    Building %s" % self.baseConfig.getBuildDir())
212*35238bceSAndroid Build Coastguard Worker
213*35238bceSAndroid Build Coastguard Worker        # Create config with full build dir path
214*35238bceSAndroid Build Coastguard Worker        config = BuildConfig(os.path.join(packageBuildInfo.getTmpBasePath(), self.baseConfig.getBuildDir()),
215*35238bceSAndroid Build Coastguard Worker                             self.baseConfig.getBuildType(),
216*35238bceSAndroid Build Coastguard Worker                             self.baseConfig.getArgs(),
217*35238bceSAndroid Build Coastguard Worker                             srcPath = os.path.join(packageBuildInfo.dstBasePath, "src"))
218*35238bceSAndroid Build Coastguard Worker
219*35238bceSAndroid Build Coastguard Worker        assert not os.path.exists(config.getBuildDir())
220*35238bceSAndroid Build Coastguard Worker        build(config, self.generator, self.targets)
221*35238bceSAndroid Build Coastguard Worker
222*35238bceSAndroid Build Coastguard Workerclass BuildAndroidTarget:
223*35238bceSAndroid Build Coastguard Worker    def __init__ (self, dstFile):
224*35238bceSAndroid Build Coastguard Worker        self.dstFile = dstFile
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
227*35238bceSAndroid Build Coastguard Worker        print("    Building Android binary")
228*35238bceSAndroid Build Coastguard Worker
229*35238bceSAndroid Build Coastguard Worker        buildRoot = os.path.join(packageBuildInfo.tmpBasePath, "android-build")
230*35238bceSAndroid Build Coastguard Worker
231*35238bceSAndroid Build Coastguard Worker        assert not os.path.exists(buildRoot)
232*35238bceSAndroid Build Coastguard Worker        os.makedirs(buildRoot)
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker        # Execute build script
235*35238bceSAndroid Build Coastguard Worker        scriptPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, "src", "android", "scripts", "build.py"))
236*35238bceSAndroid Build Coastguard Worker        execute([
237*35238bceSAndroid Build Coastguard Worker                pythonExecutable,
238*35238bceSAndroid Build Coastguard Worker                "-B", # no .py[co]
239*35238bceSAndroid Build Coastguard Worker                scriptPath,
240*35238bceSAndroid Build Coastguard Worker                "--build-root=%s" % buildRoot,
241*35238bceSAndroid Build Coastguard Worker            ])
242*35238bceSAndroid Build Coastguard Worker
243*35238bceSAndroid Build Coastguard Worker        srcFile = os.path.normpath(os.path.join(buildRoot, "package", "bin", "dEQP-debug.apk"))
244*35238bceSAndroid Build Coastguard Worker        dstFile = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, self.dstFile))
245*35238bceSAndroid Build Coastguard Worker
246*35238bceSAndroid Build Coastguard Worker        CopyFile(srcFile, dstFile).make(packageBuildInfo)
247*35238bceSAndroid Build Coastguard Worker
248*35238bceSAndroid Build Coastguard Workerclass FetchExternalSourcesTarget:
249*35238bceSAndroid Build Coastguard Worker    def __init__ (self):
250*35238bceSAndroid Build Coastguard Worker        pass
251*35238bceSAndroid Build Coastguard Worker
252*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
253*35238bceSAndroid Build Coastguard Worker        scriptPath = os.path.normpath(os.path.join(packageBuildInfo.dstBasePath, "src", "external", "fetch_sources.py"))
254*35238bceSAndroid Build Coastguard Worker        execute([
255*35238bceSAndroid Build Coastguard Worker                pythonExecutable,
256*35238bceSAndroid Build Coastguard Worker                "-B", # no .py[co]
257*35238bceSAndroid Build Coastguard Worker                scriptPath,
258*35238bceSAndroid Build Coastguard Worker            ])
259*35238bceSAndroid Build Coastguard Worker
260*35238bceSAndroid Build Coastguard Workerclass RemoveSourcesTarget:
261*35238bceSAndroid Build Coastguard Worker    def __init__ (self):
262*35238bceSAndroid Build Coastguard Worker        pass
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
265*35238bceSAndroid Build Coastguard Worker        shutil.rmtree(os.path.join(packageBuildInfo.dstBasePath, "src"), ignore_errors=False)
266*35238bceSAndroid Build Coastguard Worker
267*35238bceSAndroid Build Coastguard Workerclass Module:
268*35238bceSAndroid Build Coastguard Worker    def __init__ (self, name, targets):
269*35238bceSAndroid Build Coastguard Worker        self.name = name
270*35238bceSAndroid Build Coastguard Worker        self.targets = targets
271*35238bceSAndroid Build Coastguard Worker
272*35238bceSAndroid Build Coastguard Worker    def make (self, packageBuildInfo):
273*35238bceSAndroid Build Coastguard Worker        for target in self.targets:
274*35238bceSAndroid Build Coastguard Worker            target.make(packageBuildInfo)
275*35238bceSAndroid Build Coastguard Worker
276*35238bceSAndroid Build Coastguard Workerclass ReleaseConfig:
277*35238bceSAndroid Build Coastguard Worker    def __init__ (self, name, version, modules, sources = True):
278*35238bceSAndroid Build Coastguard Worker        self.name = name
279*35238bceSAndroid Build Coastguard Worker        self.version = version
280*35238bceSAndroid Build Coastguard Worker        self.modules = modules
281*35238bceSAndroid Build Coastguard Worker        self.sources = sources
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker    def getName (self):
284*35238bceSAndroid Build Coastguard Worker        return self.name
285*35238bceSAndroid Build Coastguard Worker
286*35238bceSAndroid Build Coastguard Worker    def getVersion (self):
287*35238bceSAndroid Build Coastguard Worker        return self.version
288*35238bceSAndroid Build Coastguard Worker
289*35238bceSAndroid Build Coastguard Worker    def getModules (self):
290*35238bceSAndroid Build Coastguard Worker        return self.modules
291*35238bceSAndroid Build Coastguard Worker
292*35238bceSAndroid Build Coastguard Worker    def packageWithSources (self):
293*35238bceSAndroid Build Coastguard Worker        return self.sources
294*35238bceSAndroid Build Coastguard Worker
295*35238bceSAndroid Build Coastguard Workerdef matchIncludeExclude (includePatterns, excludePatterns, filename):
296*35238bceSAndroid Build Coastguard Worker    components = os.path.normpath(filename).split(os.sep)
297*35238bceSAndroid Build Coastguard Worker    for pattern in excludePatterns:
298*35238bceSAndroid Build Coastguard Worker        for component in components:
299*35238bceSAndroid Build Coastguard Worker            if fnmatch.fnmatch(component, pattern):
300*35238bceSAndroid Build Coastguard Worker                return False
301*35238bceSAndroid Build Coastguard Worker
302*35238bceSAndroid Build Coastguard Worker    for pattern in includePatterns:
303*35238bceSAndroid Build Coastguard Worker        for component in components:
304*35238bceSAndroid Build Coastguard Worker            if fnmatch.fnmatch(component, pattern):
305*35238bceSAndroid Build Coastguard Worker                return True
306*35238bceSAndroid Build Coastguard Worker
307*35238bceSAndroid Build Coastguard Worker    return False
308*35238bceSAndroid Build Coastguard Worker
309*35238bceSAndroid Build Coastguard Workerdef copyFileFilter (includePatterns, excludePatterns=[]):
310*35238bceSAndroid Build Coastguard Worker    return (lambda f: matchIncludeExclude(includePatterns, excludePatterns, f),
311*35238bceSAndroid Build Coastguard Worker            lambda s, d: CopyFile(s, d))
312*35238bceSAndroid Build Coastguard Worker
313*35238bceSAndroid Build Coastguard Workerdef makeFileCopyGroup (srcDir, dstDir, includePatterns, excludePatterns=[]):
314*35238bceSAndroid Build Coastguard Worker    return FileTargetGroup(srcDir, dstDir, [copyFileFilter(includePatterns, excludePatterns)])
315*35238bceSAndroid Build Coastguard Worker
316*35238bceSAndroid Build Coastguard Workerdef makeTmpFileCopyGroup (srcDir, dstDir, includePatterns, excludePatterns=[]):
317*35238bceSAndroid Build Coastguard Worker    return FileTargetGroup(srcDir, dstDir, [copyFileFilter(includePatterns, excludePatterns)], PackageBuildInfo.getTmpBasePath)
318*35238bceSAndroid Build Coastguard Worker
319*35238bceSAndroid Build Coastguard Workerdef makeFileCopy (srcFile, dstFile):
320*35238bceSAndroid Build Coastguard Worker    return SingleFileTarget(srcFile, dstFile, lambda s, d: CopyFile(s, d))
321*35238bceSAndroid Build Coastguard Worker
322*35238bceSAndroid Build Coastguard Workerdef getReleaseFileName (configName, releaseName):
323*35238bceSAndroid Build Coastguard Worker    today = datetime.date.today()
324*35238bceSAndroid Build Coastguard Worker    return "dEQP-%s-%04d-%02d-%02d-%s" % (releaseName, today.year, today.month, today.day, configName)
325*35238bceSAndroid Build Coastguard Worker
326*35238bceSAndroid Build Coastguard Workerdef getTempDir ():
327*35238bceSAndroid Build Coastguard Worker    dirName = os.path.join(tempfile.gettempdir(), "dEQP-Releases")
328*35238bceSAndroid Build Coastguard Worker    if not os.path.exists(dirName):
329*35238bceSAndroid Build Coastguard Worker        os.makedirs(dirName)
330*35238bceSAndroid Build Coastguard Worker    return dirName
331*35238bceSAndroid Build Coastguard Worker
332*35238bceSAndroid Build Coastguard Workerdef makeRelease (releaseConfig):
333*35238bceSAndroid Build Coastguard Worker    releaseName = getReleaseFileName(releaseConfig.getName(), releaseConfig.getVersion())
334*35238bceSAndroid Build Coastguard Worker    tmpPath = getTempDir()
335*35238bceSAndroid Build Coastguard Worker    srcBasePath = DEQP_DIR
336*35238bceSAndroid Build Coastguard Worker    dstBasePath = os.path.join(tmpPath, releaseName)
337*35238bceSAndroid Build Coastguard Worker    tmpBasePath = os.path.join(tmpPath, releaseName + "-tmp")
338*35238bceSAndroid Build Coastguard Worker    packageBuildInfo = PackageBuildInfo(releaseConfig, srcBasePath, dstBasePath, tmpBasePath)
339*35238bceSAndroid Build Coastguard Worker    dstArchiveName = releaseName + ".tar.bz2"
340*35238bceSAndroid Build Coastguard Worker
341*35238bceSAndroid Build Coastguard Worker    print("Creating release %s to %s" % (releaseName, tmpPath))
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker    # Remove old temporary dirs
344*35238bceSAndroid Build Coastguard Worker    for path in [dstBasePath, tmpBasePath]:
345*35238bceSAndroid Build Coastguard Worker        if os.path.exists(path):
346*35238bceSAndroid Build Coastguard Worker            shutil.rmtree(path, ignore_errors=False)
347*35238bceSAndroid Build Coastguard Worker
348*35238bceSAndroid Build Coastguard Worker    # Make all modules
349*35238bceSAndroid Build Coastguard Worker    for module in releaseConfig.getModules():
350*35238bceSAndroid Build Coastguard Worker        print("  Processing module %s" % module.name)
351*35238bceSAndroid Build Coastguard Worker        module.make(packageBuildInfo)
352*35238bceSAndroid Build Coastguard Worker
353*35238bceSAndroid Build Coastguard Worker    # Remove sources?
354*35238bceSAndroid Build Coastguard Worker    if not releaseConfig.packageWithSources():
355*35238bceSAndroid Build Coastguard Worker        shutil.rmtree(os.path.join(dstBasePath, "src"), ignore_errors=False)
356*35238bceSAndroid Build Coastguard Worker
357*35238bceSAndroid Build Coastguard Worker    # Create archive
358*35238bceSAndroid Build Coastguard Worker    print("Creating %s" % dstArchiveName)
359*35238bceSAndroid Build Coastguard Worker    archive = tarfile.open(dstArchiveName, 'w:bz2')
360*35238bceSAndroid Build Coastguard Worker    archive.add(dstBasePath, arcname=releaseName)
361*35238bceSAndroid Build Coastguard Worker    archive.close()
362*35238bceSAndroid Build Coastguard Worker
363*35238bceSAndroid Build Coastguard Worker    # Remove tmp dirs
364*35238bceSAndroid Build Coastguard Worker    for path in [dstBasePath, tmpBasePath]:
365*35238bceSAndroid Build Coastguard Worker        if os.path.exists(path):
366*35238bceSAndroid Build Coastguard Worker            shutil.rmtree(path, ignore_errors=False)
367*35238bceSAndroid Build Coastguard Worker
368*35238bceSAndroid Build Coastguard Worker    print("Done!")
369*35238bceSAndroid Build Coastguard Worker
370*35238bceSAndroid Build Coastguard Worker# Module declarations
371*35238bceSAndroid Build Coastguard Worker
372*35238bceSAndroid Build Coastguard WorkerSRC_FILE_PATTERNS = ["*.h", "*.hpp", "*.c", "*.cpp", "*.m", "*.mm", "*.inl", "*.java", "*.aidl", "CMakeLists.txt", "LICENSE.txt", "*.cmake"]
373*35238bceSAndroid Build Coastguard WorkerTARGET_PATTERNS = ["*.cmake", "*.h", "*.lib", "*.dll", "*.so", "*.txt"]
374*35238bceSAndroid Build Coastguard Worker
375*35238bceSAndroid Build Coastguard WorkerBASE = Module("Base", [
376*35238bceSAndroid Build Coastguard Worker    makeFileCopy        ("LICENSE", "src/LICENSE"),
377*35238bceSAndroid Build Coastguard Worker    makeFileCopy        ("CMakeLists.txt", "src/CMakeLists.txt"),
378*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("targets", "src/targets", TARGET_PATTERNS),
379*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("execserver", "src/execserver", SRC_FILE_PATTERNS),
380*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("executor", "src/executor", SRC_FILE_PATTERNS),
381*35238bceSAndroid Build Coastguard Worker    makeFileCopy        ("modules/CMakeLists.txt", "src/modules/CMakeLists.txt"),
382*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("external", "src/external", ["CMakeLists.txt", "*.py"]),
383*35238bceSAndroid Build Coastguard Worker
384*35238bceSAndroid Build Coastguard Worker    # Stylesheet for displaying test logs on browser
385*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("doc/testlog-stylesheet", "doc/testlog-stylesheet", ["*"]),
386*35238bceSAndroid Build Coastguard Worker
387*35238bceSAndroid Build Coastguard Worker    # Non-optional parts of framework
388*35238bceSAndroid Build Coastguard Worker    makeFileCopy        ("framework/CMakeLists.txt", "src/framework/CMakeLists.txt"),
389*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/delibs", "src/framework/delibs", SRC_FILE_PATTERNS),
390*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/common", "src/framework/common", SRC_FILE_PATTERNS),
391*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/qphelper", "src/framework/qphelper", SRC_FILE_PATTERNS),
392*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/platform", "src/framework/platform", SRC_FILE_PATTERNS),
393*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/opengl", "src/framework/opengl", SRC_FILE_PATTERNS, ["simplereference"]),
394*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/egl", "src/framework/egl", SRC_FILE_PATTERNS),
395*35238bceSAndroid Build Coastguard Worker
396*35238bceSAndroid Build Coastguard Worker    # android sources
397*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("android/package/src", "src/android/package/src", SRC_FILE_PATTERNS),
398*35238bceSAndroid Build Coastguard Worker    makeFileCopy        ("android/package/AndroidManifest.xml", "src/android/package/AndroidManifest.xml"),
399*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("android/package/res", "src/android/package/res", ["*.png", "*.xml"]),
400*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("android/scripts", "src/android/scripts", [
401*35238bceSAndroid Build Coastguard Worker        "common.py",
402*35238bceSAndroid Build Coastguard Worker        "build.py",
403*35238bceSAndroid Build Coastguard Worker        "resources.py",
404*35238bceSAndroid Build Coastguard Worker        "install.py",
405*35238bceSAndroid Build Coastguard Worker        "launch.py",
406*35238bceSAndroid Build Coastguard Worker        "debug.py"
407*35238bceSAndroid Build Coastguard Worker        ]),
408*35238bceSAndroid Build Coastguard Worker
409*35238bceSAndroid Build Coastguard Worker    # Release info
410*35238bceSAndroid Build Coastguard Worker    GenReleaseInfoFileTarget("src/framework/qphelper/qpReleaseInfo.inl")
411*35238bceSAndroid Build Coastguard Worker])
412*35238bceSAndroid Build Coastguard Worker
413*35238bceSAndroid Build Coastguard WorkerDOCUMENTATION = Module("Documentation", [
414*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("doc/pdf", "doc", ["*.pdf"]),
415*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("doc", "doc", ["porting_layer_changes_*.txt"]),
416*35238bceSAndroid Build Coastguard Worker])
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard WorkerGLSHARED = Module("Shared GL Tests", [
419*35238bceSAndroid Build Coastguard Worker    # Optional framework components
420*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/randomshaders", "src/framework/randomshaders", SRC_FILE_PATTERNS),
421*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/opengl/simplereference", "src/framework/opengl/simplereference", SRC_FILE_PATTERNS),
422*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("framework/referencerenderer", "src/framework/referencerenderer", SRC_FILE_PATTERNS),
423*35238bceSAndroid Build Coastguard Worker
424*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("modules/glshared", "src/modules/glshared", SRC_FILE_PATTERNS),
425*35238bceSAndroid Build Coastguard Worker])
426*35238bceSAndroid Build Coastguard Worker
427*35238bceSAndroid Build Coastguard WorkerGLES2 = Module("GLES2", [
428*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("modules/gles2", "src/modules/gles2", SRC_FILE_PATTERNS),
429*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("data/gles2", "src/data/gles2", ["*.*"]),
430*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("doc/testspecs/GLES2", "doc/testspecs/GLES2", ["*.txt"])
431*35238bceSAndroid Build Coastguard Worker])
432*35238bceSAndroid Build Coastguard Worker
433*35238bceSAndroid Build Coastguard WorkerGLES3 = Module("GLES3", [
434*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("modules/gles3", "src/modules/gles3", SRC_FILE_PATTERNS),
435*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("data/gles3", "src/data/gles3", ["*.*"]),
436*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("doc/testspecs/GLES3", "doc/testspecs/GLES3", ["*.txt"])
437*35238bceSAndroid Build Coastguard Worker])
438*35238bceSAndroid Build Coastguard Worker
439*35238bceSAndroid Build Coastguard WorkerGLES31 = Module("GLES31", [
440*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("modules/gles31", "src/modules/gles31", SRC_FILE_PATTERNS),
441*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("data/gles31", "src/data/gles31", ["*.*"]),
442*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("doc/testspecs/GLES31", "doc/testspecs/GLES31", ["*.txt"])
443*35238bceSAndroid Build Coastguard Worker])
444*35238bceSAndroid Build Coastguard Worker
445*35238bceSAndroid Build Coastguard WorkerEGL = Module("EGL", [
446*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("modules/egl", "src/modules/egl", SRC_FILE_PATTERNS)
447*35238bceSAndroid Build Coastguard Worker])
448*35238bceSAndroid Build Coastguard Worker
449*35238bceSAndroid Build Coastguard WorkerINTERNAL = Module("Internal", [
450*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("modules/internal", "src/modules/internal", SRC_FILE_PATTERNS),
451*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("data/internal", "src/data/internal", ["*.*"]),
452*35238bceSAndroid Build Coastguard Worker])
453*35238bceSAndroid Build Coastguard Worker
454*35238bceSAndroid Build Coastguard WorkerEXTERNAL_SRCS = Module("External sources", [
455*35238bceSAndroid Build Coastguard Worker    FetchExternalSourcesTarget()
456*35238bceSAndroid Build Coastguard Worker])
457*35238bceSAndroid Build Coastguard Worker
458*35238bceSAndroid Build Coastguard WorkerANDROID_BINARIES = Module("Android Binaries", [
459*35238bceSAndroid Build Coastguard Worker    BuildAndroidTarget    ("bin/android/dEQP.apk"),
460*35238bceSAndroid Build Coastguard Worker    makeFileCopyGroup    ("targets/android", "bin/android", ["*.bat", "*.sh"]),
461*35238bceSAndroid Build Coastguard Worker])
462*35238bceSAndroid Build Coastguard Worker
463*35238bceSAndroid Build Coastguard WorkerCOMMON_BUILD_ARGS = ['-DPNG_SRC_PATH=%s' % os.path.realpath(os.path.join(DEQP_DIR, '..', 'libpng'))]
464*35238bceSAndroid Build Coastguard WorkerNULL_X32_CONFIG = BuildConfig('null-x32', 'Release', ['-DDEQP_TARGET=null', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32'] + COMMON_BUILD_ARGS)
465*35238bceSAndroid Build Coastguard WorkerNULL_X64_CONFIG = BuildConfig('null-x64', 'Release', ['-DDEQP_TARGET=null', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'] + COMMON_BUILD_ARGS)
466*35238bceSAndroid Build Coastguard WorkerGLX_X32_CONFIG = BuildConfig('glx-x32', 'Release', ['-DDEQP_TARGET=x11_glx', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32'] + COMMON_BUILD_ARGS)
467*35238bceSAndroid Build Coastguard WorkerGLX_X64_CONFIG = BuildConfig('glx-x64', 'Release', ['-DDEQP_TARGET=x11_glx', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'] + COMMON_BUILD_ARGS)
468*35238bceSAndroid Build Coastguard Worker
469*35238bceSAndroid Build Coastguard WorkerEXCLUDE_BUILD_FILES = ["CMakeFiles", "*.a", "*.cmake"]
470*35238bceSAndroid Build Coastguard Worker
471*35238bceSAndroid Build Coastguard WorkerLINUX_X32_COMMON_BINARIES = Module("Linux x32 Common Binaries", [
472*35238bceSAndroid Build Coastguard Worker    BuildTarget            (NULL_X32_CONFIG, ANY_UNIX_GENERATOR),
473*35238bceSAndroid Build Coastguard Worker    makeTmpFileCopyGroup(NULL_X32_CONFIG.getBuildDir() + "/execserver", "bin/linux32", ["*"], EXCLUDE_BUILD_FILES),
474*35238bceSAndroid Build Coastguard Worker    makeTmpFileCopyGroup(NULL_X32_CONFIG.getBuildDir() + "/executor", "bin/linux32", ["*"], EXCLUDE_BUILD_FILES),
475*35238bceSAndroid Build Coastguard Worker])
476*35238bceSAndroid Build Coastguard Worker
477*35238bceSAndroid Build Coastguard WorkerLINUX_X64_COMMON_BINARIES = Module("Linux x64 Common Binaries", [
478*35238bceSAndroid Build Coastguard Worker    BuildTarget            (NULL_X64_CONFIG, ANY_UNIX_GENERATOR),
479*35238bceSAndroid Build Coastguard Worker    makeTmpFileCopyGroup(NULL_X64_CONFIG.getBuildDir() + "/execserver", "bin/linux64", ["*"], EXCLUDE_BUILD_FILES),
480*35238bceSAndroid Build Coastguard Worker    makeTmpFileCopyGroup(NULL_X64_CONFIG.getBuildDir() + "/executor", "bin/linux64", ["*"], EXCLUDE_BUILD_FILES),
481*35238bceSAndroid Build Coastguard Worker])
482*35238bceSAndroid Build Coastguard Worker
483*35238bceSAndroid Build Coastguard Worker# Special module to remove src dir, for example after binary build
484*35238bceSAndroid Build Coastguard WorkerREMOVE_SOURCES = Module("Remove sources from package", [
485*35238bceSAndroid Build Coastguard Worker    RemoveSourcesTarget()
486*35238bceSAndroid Build Coastguard Worker])
487*35238bceSAndroid Build Coastguard Worker
488*35238bceSAndroid Build Coastguard Worker# Release configuration
489*35238bceSAndroid Build Coastguard Worker
490*35238bceSAndroid Build Coastguard WorkerALL_MODULES = [
491*35238bceSAndroid Build Coastguard Worker    BASE,
492*35238bceSAndroid Build Coastguard Worker    DOCUMENTATION,
493*35238bceSAndroid Build Coastguard Worker    GLSHARED,
494*35238bceSAndroid Build Coastguard Worker    GLES2,
495*35238bceSAndroid Build Coastguard Worker    GLES3,
496*35238bceSAndroid Build Coastguard Worker    GLES31,
497*35238bceSAndroid Build Coastguard Worker    EGL,
498*35238bceSAndroid Build Coastguard Worker    INTERNAL,
499*35238bceSAndroid Build Coastguard Worker    EXTERNAL_SRCS,
500*35238bceSAndroid Build Coastguard Worker]
501*35238bceSAndroid Build Coastguard Worker
502*35238bceSAndroid Build Coastguard WorkerALL_BINARIES = [
503*35238bceSAndroid Build Coastguard Worker    LINUX_X64_COMMON_BINARIES,
504*35238bceSAndroid Build Coastguard Worker    ANDROID_BINARIES,
505*35238bceSAndroid Build Coastguard Worker]
506*35238bceSAndroid Build Coastguard Worker
507*35238bceSAndroid Build Coastguard WorkerRELEASE_CONFIGS = {
508*35238bceSAndroid Build Coastguard Worker    "src": ALL_MODULES,
509*35238bceSAndroid Build Coastguard Worker    "src-bin": ALL_MODULES + ALL_BINARIES,
510*35238bceSAndroid Build Coastguard Worker    "bin": ALL_MODULES + ALL_BINARIES + [REMOVE_SOURCES],
511*35238bceSAndroid Build Coastguard Worker}
512*35238bceSAndroid Build Coastguard Worker
513*35238bceSAndroid Build Coastguard Workerdef parseArgs ():
514*35238bceSAndroid Build Coastguard Worker    parser = argparse.ArgumentParser(description = "Build release package")
515*35238bceSAndroid Build Coastguard Worker    parser.add_argument("-c",
516*35238bceSAndroid Build Coastguard Worker                        "--config",
517*35238bceSAndroid Build Coastguard Worker                        dest="config",
518*35238bceSAndroid Build Coastguard Worker                        choices=RELEASE_CONFIGS.keys(),
519*35238bceSAndroid Build Coastguard Worker                        required=True,
520*35238bceSAndroid Build Coastguard Worker                        help="Release configuration")
521*35238bceSAndroid Build Coastguard Worker    parser.add_argument("-n",
522*35238bceSAndroid Build Coastguard Worker                        "--name",
523*35238bceSAndroid Build Coastguard Worker                        dest="name",
524*35238bceSAndroid Build Coastguard Worker                        required=True,
525*35238bceSAndroid Build Coastguard Worker                        help="Package-specific name")
526*35238bceSAndroid Build Coastguard Worker    parser.add_argument("-v",
527*35238bceSAndroid Build Coastguard Worker                        "--version",
528*35238bceSAndroid Build Coastguard Worker                        dest="version",
529*35238bceSAndroid Build Coastguard Worker                        required=True,
530*35238bceSAndroid Build Coastguard Worker                        help="Version code")
531*35238bceSAndroid Build Coastguard Worker    return parser.parse_args()
532*35238bceSAndroid Build Coastguard Worker
533*35238bceSAndroid Build Coastguard Workerif __name__ == "__main__":
534*35238bceSAndroid Build Coastguard Worker    args = parseArgs()
535*35238bceSAndroid Build Coastguard Worker    config = ReleaseConfig(args.name, args.version, RELEASE_CONFIGS[args.config])
536*35238bceSAndroid Build Coastguard Worker    makeRelease(config)
537