summaryrefslogtreecommitdiff
path: root/contrib/mono/collect-files.py
blob: c353667b192ffa86b3bf0dc19f82d767b1db3d85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/env python
# -*- coding: utf-8 -*-

## This utility takes the debian directory from an unpacked debian mono source
## tree (e.g. apt-get source mono), parses the *.install files and generates a
## bitbake include file with the file and package lists. It tries to handle -dbg
## packages by creating additional glob patterns for *.mdb and */.debug/*. Most 
## of these will not match, but that's fine (I think). 
##   -- Henryk Plötz <henryk@openmoko.org>
##
##The output looks like:
##FILES_mono-jit-dbg = "/usr/bin/mono*.mdb \
##        /usr/bin/mono*/*.mdb"
##FILES_mono-jit = "/usr/bin/mono"
##FILES_mono-gac-dbg = "/usr/bin/gacutil*.mdb \
##        /usr/bin/gacutil*/*.mdb \
##        /usr/lib/mono/1.0/gacutil.exe*.mdb \
##        /usr/lib/mono/1.0/gacutil.exe*/*.mdb"
##FILES_mono-gac = "/usr/bin/gacutil \
##        /usr/lib/mono/1.0/gacutil.exe"
## ...
##PACKAGES = "mono-jit-dbg \
##        mono-jit \
##        mono-gac-dbg \
##        mono-gac \
## ...

import os, sys, re

def collect_paths(dir):
    paths = {}
    
    os.chdir(dir)
    for filename in os.listdir("."):
        if filename.endswith(".install"):
            fp = file(filename, "r")
            lines = fp.readlines()
            fp.close()
            
            contents = []
            for line in lines:
                line = line.strip()
                if line.startswith("#"): continue
                if line == "": continue
                
                lineparts = line.split()
                if lineparts[0].startswith("debian/tmp"):
                    pattern = lineparts[0][ len("debian/tmp"): ]
                    if len(lineparts) == 2:
                        if not pattern.startswith(lineparts[1]):
                            print >>sys.stderr, "Warning: Apparently I don't fully understand the format in file %s" % filename
                    elif len(lineparts) > 2:
                        print >>sys.stderr, "Warning: Apparently I don't fully understand the format in file %s" % filename
                    
                    contents.append( pattern )
                else:
                    print >>sys.stderr, "Note: Ignoring %s in %s" % (lineparts, filename)
                
            paths[ filename[ :-len(".install") ] ] = contents
    
    return paths

def collect_packages(paths):
    # These packages should be populated first (e.g. because their files will otherwise end up
    # in other packages)
    PACKAGES_FIRST = ("mono-jit", "mono-gac", "mono-mjs", "mono-gmcs", "mono-utils", "mono-doc")
    # These should be populated last (because their spec is very broad)
    PACKAGES_LAST = ("mono-mcs", "libmono-system1.0-cil", "libmono-system2.0-cil", "libmono1.0-cil", "libmono2.0-cil")
    first = []
    last = []
    packages = paths.keys()
    for packagename in PACKAGES_FIRST + PACKAGES_LAST:
        if packagename in packages:
            packages.remove(packagename)
            if packagename in PACKAGES_FIRST:
                first.append(packagename)
            else:
                last.append(packagename)
    packagenames = first + packages + last
    
    return packagenames, paths

def debugify(packagenames, paths):
    pnames = []
    for pkg in packagenames:
        if not pkg.endswith("-dbg"):
            result = []
            for path in paths[pkg]:
                if not path.endswith("*"):
                    result.append(path + "*.mdb")
                    result.append(path + "*/*.mdb")
                else:
                    result.append(path + ".mdb")
                    result.append(path + "/*.mdb")
                if path.endswith("/"):
                    result.append(path + ".debug/")
                    result.append(path + "../.debug/")
            paths[pkg + "-dbg"] = result
            pnames.append(pkg + "-dbg")
        pnames.append(pkg)
    return pnames, paths

if __name__ == "__main__":
    packagenames, paths = collect_packages( collect_paths(".") )
    packagenames, paths = debugify(packagenames, paths)
    
    print "# This is a generated file, please do not edit directly"
    print "# Use collect-files.py instead. -- Henryk <henryk@openmoko.org>"
    
    packages = []
    for pkg in packagenames:
        if not paths[pkg]: continue
        
        print 'FILES_%s = "%s"' % (pkg, " \\\n\t".join(paths[pkg]))
        packages.append(pkg)
    
    print
    print 'PACKAGES = "%s"' % (" \\\n\t".join(packages))