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