Replacing B.has_key(A) calls with A in B.
[bitbake.git] / bin / oemakepkgs
1 #!/usr/bin/env python
2
3 #
4 # This will become what oemake should be: a builder for packages, that
5 # knows about dependencies and is controlled by a file. The file is
6 # currently done by hand, but will eventually be made with oeconfig.
7 #
8 # The control file for oemakepkgs is named *.pkglist. It has the form
9 #
10 # <group> <flags> <package-name> [<version>]
11 #
12 # Group is some arbitrary group name. You can run "oemakepkgs -g opie"
13 # and only the packages in the group "opie" will be (re)build. If you
14 # don't want to work with groups, then put "default" into this field.
15 #
16 # <flags> are some flags that control the build process. The first flag
17 # we will support is "ipk", this will INHERIT="build_ipk". Other flags
18 # might be "image" to put the file into the initial image (once oeimage
19 # will read this file, too).
20 #
21 # The Package name is just the name of the package. oemakepkgs will search
22 # for <package-name>_*.oe files.
23 #
24 # When no version is specified, then the highest versioned *.oe file wins.
25 # Otherwise the only one with the specified version will be used. Later
26 # we'll add some > or >= flags as well.
27 #
28 # Here is a sample pkglist file:
29 #
30 #       native  -               ipkg-native
31 #       native  -               ipkg-utils
32 #       base    -               autoconf                2.57
33 #       #base   -               automake
34 #       #base   -               libtool
35 #       base    ipk             glibc
36 #       base    ipk             ncurses
37 #
38 # There are two other directives that we support so far:
39 #
40 #       use <dir-or-file-to-search-for-oe-files>
41 #       ignore <dir-or-file-to-not-search>
42 #
43
44
45
46
47
48 import os, sys, re, oe, oe.data, oe.parse
49 #from oe import *
50
51 cfg = {}
52 oefiles = {}
53 ignore = {}
54 selected_group = ''
55
56
57 def add_oe_file(name, dirname):
58         """Adds one *.oe file to oefiles[]"""
59
60         try:
61                 name, version = name.split('_')
62         except ValueError:
63                 version = ''
64         #print dirname, name, version
65         if not name in oefiles:
66                 oefiles[name] = {}
67         oefiles[name][version] = dirname
68
69 def print_oefiles():
70         pkgs = oefiles.keys()
71         pkgs.sort()
72         for p in pkgs:
73                 versions = oefiles[p].keys()
74                 versions.sort()
75                 for v in versions:
76                         print "%-25s %-20s %s" % (p, v, oefiles[p][v])
77
78
79 def add_oe_files(arg, dirname, names):
80         """Adds all found *.oe files to the global oefiles{} hash, except
81         ones in SCCS directories"""
82
83         global oefiles
84
85         # delete the files/directories to ignore from the list of names:
86         for i in ignore.keys():
87                 try:
88                         names.remove(i)
89                 except ValueError:
90                         pass
91         for n in names:
92                 name, ext = os.path.splitext(n)
93                 if ext == ".oe":
94                         add_oe_file(name, dirname)
95
96
97 def search_package(name, flags, version):
98         """Search for the right specified package/version was found"""
99
100         #print "Searching for package %s %s" % (name, version)
101         if not name in oefiles:
102                 print "Package '%s' not found" % name
103                 return
104
105         versions = oefiles[name].keys()
106
107         # Use highest version if none specified
108         # TOOD: this code is full tilt boogy. A string compare can't compare version numbers
109         # e.g. for sort the string "1.9" is higher than "1.10"
110         versions.sort()
111         if not version: version = versions[-1]
112
113         if not oefiles[name][version]:
114                 print "Package '%s' with version '%s' not found" % (name, version)
115                 return
116
117         if version:
118                 fn = "%s_%s.oe" % (name, version)
119         else:
120                 fn = "%s.oe" % name
121         print "Process", os.path.join(oefiles[name][version],fn)
122
123
124
125 __pkglist_regexp__ = re.compile( r"^(\S+)\s+(\S+)\s+(\S+)\s*(\S*)$" )
126 def parse_pkglist(fn):
127         """Parses the *.pkglist file and process valid entries via search_package"""
128
129         global ignore
130
131         print "reading %s" % fn
132         f = open(fn, 'r')
133         lineno = 0
134         while 1:
135                 lineno = lineno + 1
136                 line = f.readline()
137                 if not line:
138                         break
139                 line = line.strip()
140                 if line=='' or line[0]=='#':
141                         continue
142
143                 # key words
144                 if line.startswith("use "):
145                         os.path.walk(line[4:], add_oe_files, '')
146                         continue
147
148                 if line.startswith("ignore "):
149                         ignore[line[7:]] = 1
150                         continue
151
152                 # normal list entry
153                 m = __pkglist_regexp__.match(line)
154                 if m:
155                         group   = m.group(1)
156
157                         #if selected_group and group != selected_group: continue
158
159                         flags   = m.group(2)
160                         name    = m.group(3)
161                         version = m.group(4)
162
163                         search_package(name, flags, version)
164                         continue
165
166                 error("%s:%d: wrong format" % (fn, lineno))
167
168 try:
169         cfg = oe.parse.handle("conf/oe.conf", cfg)
170 except IOError:
171         fatal("Unable to open oe.conf")
172
173
174
175 oe.data.setVar('OEDEBUG', 2)
176
177
178 # TODO: probably we want to specify an *.pkglist file from the command line?
179 found = False
180 pkg_fn = oe.data.expand("${MACHINE}.pkglist", cfg)
181 for p in ('.:'+oe.data.getVar("OEPATH", cfg)).split(':'):
182         p = oe.data.expand(p, cfg)
183         p = os.path.join(p, pkg_fn)
184         #print "Trying to read %s" % p
185         if os.access(p, os.R_OK):
186                 parse_pkglist(p)
187                 found = True
188                 break
189 if not found:
190         print "'%s' not found in OEPATH" % pkg_fn
191
192 print_oefiles()