| #! /usr/bin/env python3 |
| """ |
| * Copyright (c) 2018, Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| """ |
| |
| """ |
| the basic idea from this script are: |
| 1. generate linux make file using cmake |
| 2. get source files using "grep -ir \\.o:$ Makefile |sed s/.c.o:/.c/ |sed s/.cpp.o:/.cpp/ | sed s,^,\\t, | sed s/$/' \\'/" |
| 3. 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/$/ \\/'" |
| 4. get includes directories using "grep CXX_INCLUDES flags.make | sed s/"CXX_DEFINES = "/""/g | sed s/" "/"\n"/g | sed s/"^"/"\t"/g | sed 's/$/ \\/'" |
| 5. replace related text in template |
| """ |
| |
| import os |
| import os.path as path |
| import re |
| |
| INDENT = " " |
| TOOL_DIR = "Tools/MediaDriverTools/Android/" |
| TEMPLATE_DIR = path.join(TOOL_DIR, "mk") |
| |
| |
| def remove(f): |
| cmd = "rm " + f + "> /dev/null 2>&1" |
| os.system(cmd) |
| |
| def getDriverName(root): |
| driver = "mod" |
| if not path.exists(path.join(root, driver)): |
| driver = "media-driver" |
| if not path.exists(path.join(root, driver)): |
| raise Exception("driver path " + driver +" not existed") |
| return driver |
| |
| class Generator: |
| def __init__(self, src, root, makefile=None): |
| #where to put the Android makefile |
| self.makefile = makefile if makefile else src |
| |
| #where is the major source file |
| self.src = src |
| |
| #driver name |
| driver = getDriverName(root) |
| #where to put build file and template |
| self.tool = path.join(root, driver, TOOL_DIR) |
| |
| """where to put the template""" |
| self.templ = path.join(root, driver, TEMPLATE_DIR) |
| |
| #major function |
| def generate(self): |
| |
| if path.exists(self.src) == False: |
| raise Exception(self.src + "not existed") |
| self.generateMakefile() |
| |
| mk = path.join(self.makefile, "Android.mk") |
| #remove old Android.mk |
| remove(mk) |
| |
| #create new Android.mk |
| with open(self.getTemplatePath()) as f: |
| tpl = f.read() |
| tpl = tpl.replace("@LOCAL_SRC_FILES", self.getSources()) |
| tpl = tpl.replace("@LOCAL_CFLAGS", self.getDefines("CXX_DEFINES")) |
| tpl = tpl.replace("@LOCAL_C_INCLUDES", self.getIncludes()) |
| with open(mk, "w") as f: |
| f.write(tpl) |
| print("generated " + self.getName() + " to " + self.makefile) |
| |
| #virtuall functions |
| def getTemplate(self): |
| raise Exception("pure virtul function") |
| |
| def getFlagsfile(self): |
| raise Exception("pure virtul function") |
| |
| def getMakefile(self): |
| return "Makefile" |
| |
| def getName(self): |
| return self.getTemplate().split('.')[0] |
| |
| def getTemplatePath(self): |
| return path.join(self.templ, self.getTemplate()) |
| |
| def getBuildDir(self): |
| return path.join(self.tool, 'build', self.getName()) |
| |
| def adjustSources(self, lines): |
| #print(lines) |
| return lines |
| |
| def adjustIncludes(self, lines): |
| #print(lines) |
| return lines |
| |
| def getCmakeCmd(self): |
| return "cmake " + self.src |
| |
| def generateMakefile(self, debug=False): |
| #Win env can help us debug the script |
| #but we do not want generate makefile on Win-system |
| if os.name == "nt": |
| return |
| verbose = ";" if debug else "> /dev/null 2>&1;" |
| build = self.getBuildDir() |
| cmd = "rm " + path.join(build, "CMakeCache.txt") + verbose |
| cmd += "mkdir -p " + build + verbose |
| cmd += "cd " + build |
| cmd += "&& " + self.getCmakeCmd() + verbose |
| os.system(cmd) |
| |
| def getIncludes(self): |
| text = self.getDefines("CXX_INCLUDES") |
| includes = [] |
| lines = text.split("\n") |
| for l in lines: |
| #normpath will make sure we did not refer outside. |
| p = path.normpath(l) |
| j = p.find(self.src) |
| if j != -1: |
| includes.append(p[j:].replace(self.src, "$(LOCAL_PATH)")) |
| return INDENT + ("\n" + INDENT).join(includes) if includes else "" |
| |
| def getDefines(self, name): |
| flags = path.join(self.getBuildDir(), self.getFlagsfile()) |
| with open(flags) as f: |
| text = f.read() |
| line = re.findall(name + " =.*\n", text)[0] |
| if not line: |
| return "" |
| |
| line = line.replace(name + " = ", "").strip() |
| return INDENT + line.replace(" ", " \\\n" + INDENT) if line else "" |
| |
| def getSources(self): |
| makefile = path.join(self.getBuildDir(), self.getMakefile()) |
| with open(makefile) as f: |
| text = f.read() |
| lines = re.findall(".*?\\.o:\\n", text) |
| lines = [l.replace(".o:\n", " \\") for l in lines] |
| self.adjustSources(lines) |
| #make source pretty |
| return INDENT + ("\n" + INDENT).join(lines) |
| |
| |
| class GmmGeneator(Generator): |
| def __init__(self, root): |
| src = path.join(root, "gmmlib") |
| super(GmmGeneator, self).__init__(src, root) |
| |
| def getTemplate(self): |
| return "gmm.tpl" |
| |
| def getMakefile(self): |
| return "Source/GmmLib/Makefile" |
| def getFlagsfile(self): |
| return "Source/GmmLib/CMakeFiles/igfx_gmmumd_dll.dir/flags.make" |
| |
| def adjustSources(self, lines): |
| for i, l in enumerate(lines): |
| j = l.find("__/") |
| if j == -1: |
| lines[i] = path.join("Source/GmmLib", l) |
| else: |
| lines[i] = path.join("Source", l[j+3:]) |
| |
| |
| class CmrtGeneator(Generator): |
| def __init__(self, root): |
| src = path.join(root, getDriverName(root), "cmrtlib") |
| super(CmrtGeneator, self).__init__(src, root) |
| |
| def getTemplate(self): |
| return "cmrt.tpl" |
| |
| def getMakefile(self): |
| return "linux/Makefile" |
| |
| def getFlagsfile(self): |
| return "linux/CMakeFiles/igfxcmrt.dir/flags.make" |
| |
| def adjustSources(self, lines): |
| for i, l in enumerate(lines): |
| j = l.find("__/") |
| if j == -1: |
| lines[i] = path.join("linux", l) |
| else: |
| lines[i] = l[j+3:] |
| |
| |
| class DriverGeneator(Generator): |
| def __init__(self, root): |
| src = path.join(root, getDriverName(root), "media_driver") |
| super(DriverGeneator, self).__init__(src, root) |
| |
| def getCmakeCmd(self): |
| wd = path.join(self.src, "..") |
| cmd = 'cmake ' + wd +' -DCMAKE_INSTALL_PREFIX=/usr' |
| cmd += ' -DBUILD_ALONG_WITH_CMRTLIB=1 -DBS_DIR_GMMLIB=' + path.join(wd, '../gmmlib/Source/GmmLib/') |
| cmd += ' -DBS_DIR_COMMON=' + path.join(wd, '../gmmlib/Source/Common/') |
| cmd += ' -DBS_DIR_INC=' + path.join(wd, '../gmmlib/Source/inc/') |
| cmd += ' -DBS_DIR_MEDIA=' + wd |
| return cmd |
| |
| def getTemplate(self): |
| return "media_driver.tpl" |
| |
| def getMakefile(self): |
| return "media_driver/Makefile" |
| |
| def getFlagsfile(self): |
| return "media_driver/CMakeFiles/iHD_drv_video.dir/flags.make" |
| |
| def adjustSources(self, lines): |
| lines[:] = [l for l in lines if "media_libva_putsurface_linux.cpp" not in l] |
| |
| class Main: |
| |
| def run(self): |
| tool = path.dirname(__file__) |
| root = path.abspath(path.join(tool, "../../../../")) |
| print("root = "+root) |
| gens = [GmmGeneator(root), CmrtGeneator(root), DriverGeneator(root)] |
| for g in gens: |
| g.generate() |
| |
| |
| m = Main() |
| m.run() |