#!/usr/bin/env python # # Copyright (C) 2012 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an 'AS IS' BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # prepare_pdk_tree.py target_dir [-m manifest] pdk_groups # Ex: prepare_pdk_tree.py ../tmp/pdk grouper # create mount_pdk.sh and umount_pdk.sh, which mounts/umounts pdk sources. import os import re import sys import subprocess class ManifestHandler(object): def __init__(self): # current pattern self.current = 0 self.patterns = [re.compile('path=\"([^\"]*)\".*groups=\"([^\"]*)\"'), \ re.compile('groups=\"([^\"]*)\".*path=\"([^\"]*)\"')] def getAttribs(self, line): attrib = [None, None] # list of path, groups m = self.patterns[self.current].search(line) # if match fails, try both pattens and change default one # if match founds if m is None: notCurrent = 1 - self.current mOther = self.patterns[notCurrent].search(line) if mOther is not None: # toggle self.current = notCurrent m = mOther if m is not None: if (self.current == 0): attrib[0] = m.group(1) attrib[1] = m.group(2) else: attrib[0] = m.group(2) attrib[1] = m.group(1) return attrib def isInGroups(groupsAttrib, groups): if groupsAttrib is None: return False groupsAttribList = groupsAttrib.split(',') for group in groups: if group in groupsAttribList: return True return False def getPDKDirs(manifest, groups): subdirs = [] handler = ManifestHandler() f = open(manifest, 'r') for line in f: [path, groupsAttrib] = handler.getAttribs(line) if isInGroups(groupsAttrib, groups): subdirs.append(path) f.close() return subdirs def create_symbolic_link(src_top, dest_top, dir_name): src_full = src_top + "/" + dir_name dest_full = dest_top + "/" + dir_name #print "create symbolic link from " + dest_full + " to " + src_full # remove existing link first to prevent recursive loop os.system("rm -rf " + dest_full) os.system("ln -s " + src_full + " " + dest_full) # The only file not from manifest. copy_files_list = [ "Makefile" ] MOUNT_FILE = 'mount_pdk.sh' UMOUNT_FILE = 'umount_pdk.sh' SH_HEADER = "#!/bin/bash\n#Auto-generated file, do not edit!\n" def main(argv): manifestFile = ".repo/manifest.xml" groups = ["pdk"] if len(argv) < 2: print "create_pdk_tree.py target_dir [-m manifest] [-a dir_to_add] pdk_groups" print " ex) create_pdk_tree.py ../tmp grouper" print " -a option is to include a directory which does not belong to specified group" print " multiple -a options can be specified like -a frameworks/base -a external/aaa" print " Note that pdk group is included by default" print " Do not create target_dir under the current source tree. This will cause build error." sys.exit(1) targetDir = argv[1] argc = 2 subdirs = [] if len(argv) > 2: if argv[2] == "-m": manifestFile = argv[3] argc += 2 while argc < len(argv): if argv[argc] == "-a": argc += 1 subdirs.append(argv[argc]) else: groups.append(argv[argc]) argc += 1 sourceDir = os.path.abspath('.') targetDir = os.path.abspath(targetDir) p = subprocess.Popen("mount", stdout = subprocess.PIPE) targetMounted = False for line in p.stdout: if targetDir in line: targetMounted = True p.stdout.close() if targetMounted: print "target dir already mounted" if os.path.exists(targetDir + '/' + UMOUNT_FILE): print "Use existing file", UMOUNT_FILE, "to unmount" sys.exit(1) else: print "Will create scripts, but may need manual unmount" subdirs += getPDKDirs(manifestFile, groups) print subdirs os.system("mkdir -p " + targetDir) mountf = open(targetDir + '/' + MOUNT_FILE, 'w+') mountf.write(SH_HEADER) umountf = open(targetDir + '/' + UMOUNT_FILE, 'w+') umountf.write(SH_HEADER) for subdir in subdirs: os.system("mkdir -p " + targetDir + '/' + subdir) mountf.write("mount --bind " + sourceDir + "/" + subdir + " " + targetDir + "/" + subdir + \ "\n") umountf.write("umount " + targetDir + "/" + subdir + "\n") for file_name in copy_files_list: create_symbolic_link(sourceDir, targetDir, file_name) mountf.close() umountf.close() os.system("chmod 700 " + targetDir + '/' + MOUNT_FILE) os.system("chmod 700 " + targetDir + '/' + UMOUNT_FILE) if __name__ == '__main__': main(sys.argv)