xref: /aosp_15_r20/external/intel-media-driver/Tools/MediaDriverTools/Android/GenerateAndroidMk.py (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1#! /usr/bin/env python3
2"""
3* Copyright (c) 2018, Intel Corporation
4*
5* Permission is hereby granted, free of charge, to any person obtaining a
6* copy of this software and associated documentation files (the "Software"),
7* to deal in the Software without restriction, including without limitation
8* the rights to use, copy, modify, merge, publish, distribute, sublicense,
9* and/or sell copies of the Software, and to permit persons to whom the
10* Software is furnished to do so, subject to the following conditions:
11*
12* The above copyright notice and this permission notice shall be included
13* in all copies or substantial portions of the Software.
14*
15* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21* OTHER DEALINGS IN THE SOFTWARE.
22"""
23
24"""
25the basic idea from this script are:
261. generate linux make file using cmake
272. get source files using "grep -ir \\.o:$ Makefile  |sed s/.c.o:/.c/ |sed s/.cpp.o:/.cpp/ | sed s,^,\\t, | sed s/$/' \\'/"
283. get c/cpp defines using "grep CXX_DEFINES flags.make | sed s/"CXX_DEFINES = "/""/g | sed s/" "/"\n"/g | sed s/"^"/"\t"/g | sed 's/$/ \\/'"
294. get includes directories using "grep CXX_INCLUDES flags.make | sed s/"CXX_DEFINES = "/""/g | sed s/" "/"\n"/g | sed s/"^"/"\t"/g | sed 's/$/ \\/'"
305. replace related text in template
31"""
32
33import os
34import os.path as path
35import re
36
37INDENT = "    "
38TOOL_DIR = "Tools/MediaDriverTools/Android/"
39TEMPLATE_DIR = path.join(TOOL_DIR, "mk")
40
41
42def remove(f):
43    cmd = "rm " + f + "> /dev/null 2>&1"
44    os.system(cmd)
45
46def getDriverName(root):
47    driver = "mod"
48    if not path.exists(path.join(root, driver)):
49        driver = "media-driver"
50    if not path.exists(path.join(root, driver)):
51        raise Exception("driver path " + driver +" not existed")
52    return driver
53
54class Generator:
55    def __init__(self, src, root, makefile=None):
56        #where to put the Android makefile
57        self.makefile = makefile if makefile else src
58
59        #where is the major source file
60        self.src = src
61
62        #driver name
63        driver = getDriverName(root)
64        #where to put build file and template
65        self.tool = path.join(root, driver, TOOL_DIR)
66
67        """where to put the template"""
68        self.templ = path.join(root, driver, TEMPLATE_DIR)
69
70    #major function
71    def generate(self):
72
73        if path.exists(self.src) == False:
74            raise Exception(self.src + "not existed")
75        self.generateMakefile()
76
77        mk = path.join(self.makefile, "Android.mk")
78        #remove old Android.mk
79        remove(mk)
80
81        #create new Android.mk
82        with open(self.getTemplatePath()) as f:
83            tpl = f.read()
84        tpl = tpl.replace("@LOCAL_SRC_FILES", self.getSources())
85        tpl = tpl.replace("@LOCAL_CFLAGS", self.getDefines("CXX_DEFINES"))
86        tpl = tpl.replace("@LOCAL_C_INCLUDES", self.getIncludes())
87        with open(mk, "w") as f:
88            f.write(tpl)
89        print("generated " + self.getName() + " to " + self.makefile)
90
91    #virtuall functions
92    def getTemplate(self):
93        raise Exception("pure virtul function")
94
95    def getFlagsfile(self):
96        raise Exception("pure virtul function")
97
98    def getMakefile(self):
99        return "Makefile"
100
101    def getName(self):
102        return self.getTemplate().split('.')[0]
103
104    def getTemplatePath(self):
105        return path.join(self.templ, self.getTemplate())
106
107    def getBuildDir(self):
108        return path.join(self.tool, 'build', self.getName())
109
110    def adjustSources(self, lines):
111        #print(lines)
112        return lines
113
114    def adjustIncludes(self, lines):
115        #print(lines)
116        return lines
117
118    def getCmakeCmd(self):
119        return "cmake " + self.src
120
121    def generateMakefile(self, debug=False):
122        #Win env can help us debug the script
123        #but we do not want generate makefile on Win-system
124        if os.name == "nt":
125            return
126        verbose = ";" if debug else "> /dev/null 2>&1;"
127        build = self.getBuildDir()
128        cmd = "rm " + path.join(build, "CMakeCache.txt") + verbose
129        cmd += "mkdir -p " + build + verbose
130        cmd += "cd " + build
131        cmd += "&& " + self.getCmakeCmd() + verbose
132        os.system(cmd)
133
134    def getIncludes(self):
135        text = self.getDefines("CXX_INCLUDES")
136        includes = []
137        lines = text.split("\n")
138        for l in lines:
139            #normpath will make sure we did not refer outside.
140            p = path.normpath(l)
141            j = p.find(self.src)
142            if j != -1:
143                includes.append(p[j:].replace(self.src, "$(LOCAL_PATH)"))
144        return INDENT + ("\n" + INDENT).join(includes) if includes else ""
145
146    def getDefines(self, name):
147        flags = path.join(self.getBuildDir(), self.getFlagsfile())
148        with open(flags) as f:
149            text = f.read()
150        line = re.findall(name + " =.*\n", text)[0]
151        if not line:
152            return ""
153
154        line = line.replace(name + " = ", "").strip()
155        return INDENT + line.replace(" ", " \\\n" + INDENT) if line else ""
156
157    def getSources(self):
158        makefile = path.join(self.getBuildDir(), self.getMakefile())
159        with open(makefile) as f:
160            text = f.read()
161        lines = re.findall(".*?\\.o:\\n", text)
162        lines = [l.replace(".o:\n", " \\") for l in lines]
163        self.adjustSources(lines)
164        #make source pretty
165        return INDENT + ("\n" + INDENT).join(lines)
166
167
168class GmmGeneator(Generator):
169    def __init__(self, root):
170        src = path.join(root, "gmmlib")
171        super(GmmGeneator, self).__init__(src, root)
172
173    def getTemplate(self):
174        return "gmm.tpl"
175
176    def getMakefile(self):
177        return "Source/GmmLib/Makefile"
178    def getFlagsfile(self):
179        return "Source/GmmLib/CMakeFiles/igfx_gmmumd_dll.dir/flags.make"
180
181    def adjustSources(self, lines):
182        for i, l in enumerate(lines):
183            j = l.find("__/")
184            if j == -1:
185                lines[i] = path.join("Source/GmmLib", l)
186            else:
187                lines[i] = path.join("Source", l[j+3:])
188
189
190class CmrtGeneator(Generator):
191    def __init__(self, root):
192        src = path.join(root, getDriverName(root), "cmrtlib")
193        super(CmrtGeneator, self).__init__(src, root)
194
195    def getTemplate(self):
196        return "cmrt.tpl"
197
198    def getMakefile(self):
199        return "linux/Makefile"
200
201    def getFlagsfile(self):
202        return "linux/CMakeFiles/igfxcmrt.dir/flags.make"
203
204    def adjustSources(self, lines):
205        for i, l in enumerate(lines):
206            j = l.find("__/")
207            if j == -1:
208                lines[i] = path.join("linux", l)
209            else:
210                lines[i] = l[j+3:]
211
212
213class DriverGeneator(Generator):
214    def __init__(self, root):
215        src = path.join(root, getDriverName(root), "media_driver")
216        super(DriverGeneator, self).__init__(src, root)
217
218    def getCmakeCmd(self):
219        wd = path.join(self.src, "..")
220        cmd = 'cmake ' + wd +' -DCMAKE_INSTALL_PREFIX=/usr'
221        cmd += ' -DBUILD_ALONG_WITH_CMRTLIB=1 -DBS_DIR_GMMLIB=' + path.join(wd, '../gmmlib/Source/GmmLib/')
222        cmd += ' -DBS_DIR_COMMON=' + path.join(wd, '../gmmlib/Source/Common/')
223        cmd += ' -DBS_DIR_INC=' + path.join(wd, '../gmmlib/Source/inc/')
224        cmd += ' -DBS_DIR_MEDIA=' + wd
225        return cmd
226
227    def getTemplate(self):
228        return "media_driver.tpl"
229
230    def getMakefile(self):
231        return "media_driver/Makefile"
232
233    def getFlagsfile(self):
234        return "media_driver/CMakeFiles/iHD_drv_video.dir/flags.make"
235
236    def adjustSources(self, lines):
237        lines[:] = [l for l in lines if "media_libva_putsurface_linux.cpp" not in l]
238
239class Main:
240
241    def run(self):
242        tool = path.dirname(__file__)
243        root = path.abspath(path.join(tool, "../../../../"))
244        print("root = "+root)
245        gens = [GmmGeneator(root), CmrtGeneator(root), DriverGeneator(root)]
246        for g in gens:
247            g.generate()
248
249
250m = Main()
251m.run()
252