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