Get rid of OEDIR. It'll still get added to the OEPATH if you set it, for compatibili...
[bitbake.git] / bin / oeinstall
1 #!/usr/bin/env python
2
3 import sys, os, string, oe
4 from oe import *
5
6 __version__ = 1.0
7 cfg_oe = data.init()
8
9 def usage():
10         print "Usage: oeinstall [options ...]"
11         print "Installs specified files of supported types into a root filesystem."
12         print "Currently only supports installing OEFILES into the rootfs directly"
13         print "using their do_install target."
14         print ""
15         print "  %s\t\t%s" % ("-r [arg], --root [arg]", "root directory (default=${IMAGE_ROOTFS})")
16         print "  %s\t\t%s" % ("-f [arg], --files [arg]", ".oe files available (default=${OEFILES})")
17         print "  %s\t\t%s" % ("-t [arg], --type [arg]", "installation type (direct, and any for which package_[type].oeclass exists)")
18         print "  %s\t\t%s" % ("-v, --version", "output version information and exit")
19         sys.exit(0)
20
21 def version():
22         print "OpenEmbedded Build Infrastructure Core version %s" % oe.__version__
23         print "OEInstall version %s" % __version__
24
25 def getopthash(l):
26         h = {}
27         for (opt, val) in l:
28                 h[opt] = val
29         return h
30
31 import getopt
32 try:
33         (opts, args) = getopt.getopt(sys.argv[1:], 'vr:f:t:', [ 'version', 'root=', 'files=', 'type=' ])
34 except getopt.GetoptError:
35         usage()
36
37 # handle opts
38 opthash = getopthash(opts)
39
40 if opthash.has_key('--version') or opthash.has_key('-v'):
41         version()
42         sys.exit(0)
43
44 try:
45         cfg_oe = parse.handle("conf/oe.conf", cfg_oe)
46 except IOError:
47         fatal("Unable to open oe.conf")
48
49 # sanity check
50 if cfg_oe is None:
51         fatal("Unable to open/parse conf/oe.conf")
52         usage(1)
53
54 rootfs = data.getVar('IMAGE_ROOTFS', cfg_oe, 1)
55
56 if opthash.has_key('--root'):
57         rootfs = opthash['--root']
58 if opthash.has_key('-r'):
59         rootfs = opthash['-r']
60
61 if not rootfs:
62         oe.fatal("root filesystem not specified")
63
64 data.setVar('IMAGE_ROOTFS', rootfs, cfg_oe)
65
66 #type = 'direct'
67 type = 'tar'
68
69 if opthash.has_key('--type'):
70         type = opthash['--type']
71 if opthash.has_key('-t'):
72         type = opthash['-t']
73
74 topdir = data.getVar('TOPDIR', cfg_oe, 1) or os.getcwd()
75
76 # Iterate through .oe files
77 files = string.split(data.getVar("OEFILES", cfg_oe, 1) or "")
78 if opthash.has_key('-f'):
79         files.extend(opthash['-f'])
80 if opthash.has_key('--files'):
81         files.extend(opthash['--files'])
82 data.setVar("OEFILES", string.join(files), cfg_oe)
83
84 def get_oefiles():
85         """Get default oefiles"""
86         dirs = os.listdir(os.getcwd())
87         oefiles = []
88         for f in dirs:
89                 (root, ext) = os.path.splitext(f)
90                 if ext == ".oe":
91                         oefiles.append(os.path.abspath(os.path.join(os.getcwd(),f)))
92         return oefiles
93
94 if not len(files):
95         files = get_oefiles()
96
97 if not len(files):
98         usage()
99
100 def inst_pkg(d):
101         from oe import data, build, error
102         if data.getVar('pkg_preinst', d):
103                 try:
104                         build.exec_func('pkg_preinst', d)
105                 except build.FuncFailed:
106                         oe.note("preinst execution failure")
107                         return 0
108         if type is not 'direct':
109                 try:
110                         build.exec_func('package_%s_fn' % type, d)
111                 except build.FuncFailed:
112                         oe.error("failed obtaining the filename of the outputted package for %s" % type)
113                         return 0
114         if data.getVar('package_%s_install' % type, d):
115                 try:
116                         build.exec_func('package_%s_install' % type, d)
117                         print "package %s (%s) installed." % (p, data.getVar('PN', d, 1))
118                 except build.FuncFailed:
119                         return 0
120         else:
121                 oe.error("no package_%s_install function to execute. skipping." % type)
122                 return 0
123         if data.getVar('pkg_postinst', d):
124                 try:
125                         build.exec_func('pkg_postinst', d)
126                 except build.FuncFailed:
127                         oe.note("postinst execution failure")
128                         pass
129         return 1
130
131
132 # if type is not direct, add 'package_[type]' to INHERIT
133 if type is not 'direct':
134         inherit = data.getVar('INHERIT', cfg_oe, 1) or ""
135         inherit += " base package_%s" % type
136         data.setVarFlag('INHERIT', 'export', 1, cfg_oe)
137         data.setVar('INHERIT', inherit, cfg_oe)
138
139 pkgs_to_install = None
140 if args:
141         if not pkgs_to_install:
142                 pkgs_to_install = []
143         pkgs_to_install.extend(args)
144 if not pkgs_to_install:
145         inst_oepkgs = data.getVar('INST_OEPKGS', cfg_oe, 1)
146         if inst_oepkgs:
147                 pkgs_to_install = string.split(inst_oepkgs)
148 debug(1, "installing: %s" % pkgs_to_install)
149
150 import glob
151 for f in files:
152         if pkgs_to_install is not None and len(pkgs_to_install) == 0:
153                 # done!
154                 break
155         globbed = glob.glob(f) or [ f ]
156         if globbed:
157                 if [ f ] != globbed:
158                         files += globbed
159                         continue
160         from copy import deepcopy
161         fdata = deepcopy(cfg_oe)
162         parse.handle(f, fdata)
163         if fdata is None:
164                 continue
165         # allow metadata files to add items to OEFILES
166         data.update_data(fdata)
167         addoefiles = data.getVar('OEFILES', fdata) or None
168         if addoefiles:
169                 for aof in string.split(addoefiles):
170                         if not files.count(aof):
171                                 if not os.path.isabs(aof):
172                                         aof = os.path.join(os.path.dirname(f),aof)
173                                 files.append(aof)
174         pkgs = string.split(data.getVar('PACKAGES', fdata, 1) or "")
175         # Iterate through PACKAGES
176         for p in pkgs:
177                 if pkgs_to_install is not None:
178                         if not p in pkgs_to_install:
179                                 continue
180                 d = deepcopy(fdata)
181                 data.setVar('PKG', p, d)
182                 # Add package to overrides, collapse the metadata
183                 overrides = data.getVar('OVERRIDES', d, 1) or ""
184                 overrides += ":%s" % p
185                 data.setVar('OVERRIDES', overrides, d)
186                 data.update_data(d)
187                 data.setVarFlag('INHERIT', 'export', 1, d)
188                 # Look at vars to determine the file names for the package type in question
189                 # Call installer for a given package type as pulled from the metadata with INHERIT set properly
190                 data.setVar('D', rootfs, d)
191                 if inst_pkg(d):
192                         if pkgs_to_install is not None:
193                                 del pkgs_to_install[pkgs_to_install.index(p)]
194                 if pkgs_to_install is not None and len(pkgs_to_install) == 0:
195                         break