xref: /aosp_15_r20/bionic/libc/kernel/tools/utils.py (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker# common python utility routines for the Bionic tool scripts
2*8d67ca89SAndroid Build Coastguard Worker
3*8d67ca89SAndroid Build Coastguard Workerimport logging
4*8d67ca89SAndroid Build Coastguard Workerimport os
5*8d67ca89SAndroid Build Coastguard Workerimport string
6*8d67ca89SAndroid Build Coastguard Workerimport sys
7*8d67ca89SAndroid Build Coastguard Worker
8*8d67ca89SAndroid Build Coastguard Worker
9*8d67ca89SAndroid Build Coastguard Workerdef panic(msg):
10*8d67ca89SAndroid Build Coastguard Worker    sys.stderr.write(os.path.basename(sys.argv[0]) + ": error: ")
11*8d67ca89SAndroid Build Coastguard Worker    sys.stderr.write(msg)
12*8d67ca89SAndroid Build Coastguard Worker    sys.exit(1)
13*8d67ca89SAndroid Build Coastguard Worker
14*8d67ca89SAndroid Build Coastguard Worker
15*8d67ca89SAndroid Build Coastguard Workerdef get_kernel_headers_dir():
16*8d67ca89SAndroid Build Coastguard Worker    return os.path.join(get_android_root(), "external/kernel-headers")
17*8d67ca89SAndroid Build Coastguard Worker
18*8d67ca89SAndroid Build Coastguard Worker
19*8d67ca89SAndroid Build Coastguard Workerdef get_kernel_headers_original_dir():
20*8d67ca89SAndroid Build Coastguard Worker    return os.path.join(get_kernel_headers_dir(), "original")
21*8d67ca89SAndroid Build Coastguard Worker
22*8d67ca89SAndroid Build Coastguard Worker
23*8d67ca89SAndroid Build Coastguard Workerdef get_kernel_headers_modified_dir():
24*8d67ca89SAndroid Build Coastguard Worker    return os.path.join(get_kernel_headers_dir(), "modified")
25*8d67ca89SAndroid Build Coastguard Worker
26*8d67ca89SAndroid Build Coastguard Worker
27*8d67ca89SAndroid Build Coastguard Workerdef get_kernel_dir():
28*8d67ca89SAndroid Build Coastguard Worker    return os.path.join(get_android_root(), "bionic/libc/kernel")
29*8d67ca89SAndroid Build Coastguard Worker
30*8d67ca89SAndroid Build Coastguard Worker
31*8d67ca89SAndroid Build Coastguard Workerdef get_android_root():
32*8d67ca89SAndroid Build Coastguard Worker    if "ANDROID_BUILD_TOP" in os.environ:
33*8d67ca89SAndroid Build Coastguard Worker        # Verify that the current directory is in the root.
34*8d67ca89SAndroid Build Coastguard Worker        # If not, then print an error.
35*8d67ca89SAndroid Build Coastguard Worker        cwd = os.getcwd()
36*8d67ca89SAndroid Build Coastguard Worker        root = os.environ["ANDROID_BUILD_TOP"]
37*8d67ca89SAndroid Build Coastguard Worker        if len(cwd) < len(root) or not root == cwd[:len(root)]:
38*8d67ca89SAndroid Build Coastguard Worker            panic("Not in android tree pointed at by ANDROID_BUILD_TOP (%s)\n" % root)
39*8d67ca89SAndroid Build Coastguard Worker        return os.environ["ANDROID_BUILD_TOP"]
40*8d67ca89SAndroid Build Coastguard Worker    panic("Unable to find root of tree, did you forget to lunch a target?\n")
41*8d67ca89SAndroid Build Coastguard Worker
42*8d67ca89SAndroid Build Coastguard Worker
43*8d67ca89SAndroid Build Coastguard Workerclass StringOutput:
44*8d67ca89SAndroid Build Coastguard Worker    def __init__(self):
45*8d67ca89SAndroid Build Coastguard Worker        self.line = ""
46*8d67ca89SAndroid Build Coastguard Worker
47*8d67ca89SAndroid Build Coastguard Worker    def write(self,msg):
48*8d67ca89SAndroid Build Coastguard Worker        self.line += msg
49*8d67ca89SAndroid Build Coastguard Worker        logging.debug("write '%s'" % msg)
50*8d67ca89SAndroid Build Coastguard Worker
51*8d67ca89SAndroid Build Coastguard Worker    def get(self):
52*8d67ca89SAndroid Build Coastguard Worker        return self.line
53*8d67ca89SAndroid Build Coastguard Worker
54*8d67ca89SAndroid Build Coastguard Worker
55*8d67ca89SAndroid Build Coastguard Workerdef create_file_path(path):
56*8d67ca89SAndroid Build Coastguard Worker    dirs = []
57*8d67ca89SAndroid Build Coastguard Worker    while 1:
58*8d67ca89SAndroid Build Coastguard Worker        parent = os.path.dirname(path)
59*8d67ca89SAndroid Build Coastguard Worker        #print "parent: %s <- %s" % (parent, path)
60*8d67ca89SAndroid Build Coastguard Worker        if parent == "/" or parent == "":
61*8d67ca89SAndroid Build Coastguard Worker            break
62*8d67ca89SAndroid Build Coastguard Worker        dirs.append(parent)
63*8d67ca89SAndroid Build Coastguard Worker        path = parent
64*8d67ca89SAndroid Build Coastguard Worker
65*8d67ca89SAndroid Build Coastguard Worker    dirs.reverse()
66*8d67ca89SAndroid Build Coastguard Worker    for dir in dirs:
67*8d67ca89SAndroid Build Coastguard Worker        #print "dir %s" % dir
68*8d67ca89SAndroid Build Coastguard Worker        if os.path.isdir(dir):
69*8d67ca89SAndroid Build Coastguard Worker            continue
70*8d67ca89SAndroid Build Coastguard Worker        os.mkdir(dir)
71*8d67ca89SAndroid Build Coastguard Worker
72*8d67ca89SAndroid Build Coastguard Worker
73*8d67ca89SAndroid Build Coastguard Workerclass BatchFileUpdater:
74*8d67ca89SAndroid Build Coastguard Worker    """a class used to edit several files at once"""
75*8d67ca89SAndroid Build Coastguard Worker    def __init__(self):
76*8d67ca89SAndroid Build Coastguard Worker        self.old_files = set()
77*8d67ca89SAndroid Build Coastguard Worker        self.new_files = set()
78*8d67ca89SAndroid Build Coastguard Worker        self.new_data  = {}
79*8d67ca89SAndroid Build Coastguard Worker
80*8d67ca89SAndroid Build Coastguard Worker    def readFile(self,path):
81*8d67ca89SAndroid Build Coastguard Worker        #path = os.path.realpath(path)
82*8d67ca89SAndroid Build Coastguard Worker        if os.path.exists(path):
83*8d67ca89SAndroid Build Coastguard Worker            self.old_files.add(path)
84*8d67ca89SAndroid Build Coastguard Worker
85*8d67ca89SAndroid Build Coastguard Worker    def readDir(self,path):
86*8d67ca89SAndroid Build Coastguard Worker        #path = os.path.realpath(path)
87*8d67ca89SAndroid Build Coastguard Worker        for root, dirs, files in os.walk(path):
88*8d67ca89SAndroid Build Coastguard Worker            for f in files:
89*8d67ca89SAndroid Build Coastguard Worker                dst = "%s/%s" % (root,f)
90*8d67ca89SAndroid Build Coastguard Worker                self.old_files.add(dst)
91*8d67ca89SAndroid Build Coastguard Worker
92*8d67ca89SAndroid Build Coastguard Worker    def editFile(self,dst,data):
93*8d67ca89SAndroid Build Coastguard Worker        """edit a destination file. if the file is not mapped from a source,
94*8d67ca89SAndroid Build Coastguard Worker           it will be added. return 0 if the file content wasn't changed,
95*8d67ca89SAndroid Build Coastguard Worker           1 if it was edited, or 2 if the file is new"""
96*8d67ca89SAndroid Build Coastguard Worker        #dst = os.path.realpath(dst)
97*8d67ca89SAndroid Build Coastguard Worker        result = 1
98*8d67ca89SAndroid Build Coastguard Worker        if os.path.exists(dst):
99*8d67ca89SAndroid Build Coastguard Worker            f = open(dst, "r")
100*8d67ca89SAndroid Build Coastguard Worker            olddata = f.read()
101*8d67ca89SAndroid Build Coastguard Worker            f.close()
102*8d67ca89SAndroid Build Coastguard Worker            if olddata == data:
103*8d67ca89SAndroid Build Coastguard Worker                self.old_files.remove(dst)
104*8d67ca89SAndroid Build Coastguard Worker                return 0
105*8d67ca89SAndroid Build Coastguard Worker        else:
106*8d67ca89SAndroid Build Coastguard Worker            result = 2
107*8d67ca89SAndroid Build Coastguard Worker
108*8d67ca89SAndroid Build Coastguard Worker        self.new_data[dst] = data
109*8d67ca89SAndroid Build Coastguard Worker        self.new_files.add(dst)
110*8d67ca89SAndroid Build Coastguard Worker        return result
111*8d67ca89SAndroid Build Coastguard Worker
112*8d67ca89SAndroid Build Coastguard Worker    def getChanges(self):
113*8d67ca89SAndroid Build Coastguard Worker        """determine changes, returns (adds, deletes, edits)"""
114*8d67ca89SAndroid Build Coastguard Worker        adds    = set()
115*8d67ca89SAndroid Build Coastguard Worker        edits   = set()
116*8d67ca89SAndroid Build Coastguard Worker        deletes = set()
117*8d67ca89SAndroid Build Coastguard Worker
118*8d67ca89SAndroid Build Coastguard Worker        for dst in self.new_files:
119*8d67ca89SAndroid Build Coastguard Worker            if not (dst in self.old_files):
120*8d67ca89SAndroid Build Coastguard Worker                adds.add(dst)
121*8d67ca89SAndroid Build Coastguard Worker            else:
122*8d67ca89SAndroid Build Coastguard Worker                edits.add(dst)
123*8d67ca89SAndroid Build Coastguard Worker
124*8d67ca89SAndroid Build Coastguard Worker        for dst in self.old_files:
125*8d67ca89SAndroid Build Coastguard Worker            if not dst in self.new_files:
126*8d67ca89SAndroid Build Coastguard Worker                deletes.add(dst)
127*8d67ca89SAndroid Build Coastguard Worker
128*8d67ca89SAndroid Build Coastguard Worker        return (adds, deletes, edits)
129*8d67ca89SAndroid Build Coastguard Worker
130*8d67ca89SAndroid Build Coastguard Worker    def _writeFile(self,dst):
131*8d67ca89SAndroid Build Coastguard Worker        if not os.path.exists(os.path.dirname(dst)):
132*8d67ca89SAndroid Build Coastguard Worker            create_file_path(dst)
133*8d67ca89SAndroid Build Coastguard Worker        f = open(dst, "w")
134*8d67ca89SAndroid Build Coastguard Worker        f.write(self.new_data[dst])
135*8d67ca89SAndroid Build Coastguard Worker        f.close()
136*8d67ca89SAndroid Build Coastguard Worker
137*8d67ca89SAndroid Build Coastguard Worker    def updateFiles(self):
138*8d67ca89SAndroid Build Coastguard Worker        adds, deletes, edits = self.getChanges()
139*8d67ca89SAndroid Build Coastguard Worker
140*8d67ca89SAndroid Build Coastguard Worker        for dst in sorted(adds):
141*8d67ca89SAndroid Build Coastguard Worker            self._writeFile(dst)
142*8d67ca89SAndroid Build Coastguard Worker
143*8d67ca89SAndroid Build Coastguard Worker        for dst in sorted(edits):
144*8d67ca89SAndroid Build Coastguard Worker            self._writeFile(dst)
145*8d67ca89SAndroid Build Coastguard Worker
146*8d67ca89SAndroid Build Coastguard Worker        for dst in sorted(deletes):
147*8d67ca89SAndroid Build Coastguard Worker            os.remove(dst)
148