You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.2 KiB
154 lines
5.2 KiB
#!/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)
|
|
|