summaryrefslogtreecommitdiffstats
path: root/scripts/wic
diff options
context:
space:
mode:
authorTom Zanussi <tom.zanussi@linux.intel.com>2013-08-20 20:55:16 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-10-01 22:56:03 +0100
commit53a1d9a788fd9f970af980da2ab975cca60685c4 (patch)
treea7c0cd0c0483b6c8af7941a024173ce2b01239eb /scripts/wic
parente5d09762c26d31f7f26e921b743d39a50696cbb5 (diff)
downloadpoky-53a1d9a788fd9f970af980da2ab975cca60685c4.tar.gz
wic: Initial code for wic (OpenEmbedded Image Creator)
Initial implementation of the 'wic' command. The 'wic' command generates partitioned images from existing OpenEmbedded build artifacts. Image generation is driven by partitioning commands contained in an 'Openembedded kickstart' (.wks) file specified either directly on the command-line or as one of a selection of canned .wks files (see 'wic list images'). When applied to a given set of build artifacts, the result is an image or set of images that can be directly written onto media and used on a particular system. 'wic' is based loosely on the 'mic' (Meego Image Creator) framework, but heavily modified to make direct use of OpenEmbedded build artifacts instead of package installation and configuration, things already incorporated int the OE artifacts. The name 'wic' comes from 'oeic' with the 'oe' diphthong promoted to the letter 'w', because 'oeic' is impossible to remember or pronounce. This covers the mechanics of invoking and providing help for the command and sub-commands; it contains hooks for future commits to connect with the actual functionality, once implemented. Help is integrated into the 'wic' command - see that for details on usage. (From OE-Core rev: 95455ae4251e06d66e60945092b784d2d9ef165c) Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/wic')
-rwxr-xr-xscripts/wic185
1 files changed, 185 insertions, 0 deletions
diff --git a/scripts/wic b/scripts/wic
new file mode 100755
index 0000000000..06e72bbfda
--- /dev/null
+++ b/scripts/wic
@@ -0,0 +1,185 @@
1#!/usr/bin/env python
2# ex:ts=4:sw=4:sts=4:et
3# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4#
5# Copyright (c) 2013, Intel Corporation.
6# All rights reserved.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License version 2 as
10# published by the Free Software Foundation.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License along
18# with this program; if not, write to the Free Software Foundation, Inc.,
19# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20#
21# DESCRIPTION 'wic' is the OpenEmbedded Image Creator that users can
22# use to generate bootable images. Invoking it without any arguments
23# will display help screens for the 'wic' command and list the
24# available 'wic' subcommands. Invoking a subcommand without any
25# arguments will likewise display help screens for the specified
26# subcommand. Please use that interface for detailed help.
27#
28# AUTHORS
29# Tom Zanussi <tom.zanussi (at] linux.intel.com>
30#
31
32__version__ = "0.1.0"
33
34import os
35import sys
36import optparse
37import logging
38
39scripts_path = os.path.abspath(os.path.dirname(os.path.abspath(sys.argv[0])))
40lib_path = scripts_path + '/lib'
41sys.path = sys.path + [lib_path]
42
43from image.help import *
44from image.engine import *
45
46
47def wic_create_subcommand(args, usage_str):
48 """
49 Command-line handling for image creation. The real work is done
50 by image.engine.wic_create()
51 """
52 parser = optparse.OptionParser(usage = usage_str)
53
54 parser.add_option("-o", "--outdir", dest = "outdir",
55 action = "store", help = "name of directory to create image in")
56 parser.add_option("-i", "--infile", dest = "properties_file",
57 action = "store", help = "name of file containing the values for image properties as a JSON file")
58 parser.add_option("-e", "--image-name", dest = "image_name",
59 action = "store", help = "name of the image to use the artifacts from e.g. core-image-sato")
60 parser.add_option("-r", "--rootfs-dir", dest = "rootfs_dir",
61 action = "store", help = "path to the /rootfs dir to use as the .wks rootfs source")
62 parser.add_option("-b", "--bootimg-dir", dest = "bootimg_dir",
63 action = "store", help = "path to the dir containing the boot artifacts (e.g. /EFI or /syslinux dirs) to use as the .wks bootimg source")
64 parser.add_option("-k", "--kernel-dir", dest = "kernel_dir",
65 action = "store", help = "path to the dir containing the kernel to use in the .wks bootimg")
66 parser.add_option("-n", "--native-sysroot", dest = "native_sysroot",
67 action = "store", help = "path to the native sysroot containing the tools to use to build the image")
68 parser.add_option("-p", "--skip-build-check", dest = "build_check",
69 action = "store_false", default = True, help = "skip the build check")
70
71 (options, args) = parser.parse_args(args)
72
73 if len(args) != 1:
74 logging.error("Wrong number of arguments, exiting\n")
75 parser.print_help()
76 sys.exit(1)
77
78 if not options.image_name:
79 options.build_check = False
80
81 if options.build_check and not options.properties_file:
82 print "Checking basic build environment..."
83 if not verify_build_env():
84 print "Couldn't verify build environment, exiting\n"
85 sys.exit(1)
86 else:
87 print "Done.\n"
88
89 print "Creating image(s)...\n"
90
91 bootimg_dir = staging_data_dir = hdddir = ""
92
93 if options.image_name:
94 (rootfs_dir, kernel_dir, hdddir, staging_data_dir, native_sysroot) = \
95 find_artifacts(options.image_name)
96
97 wks_file = args[0]
98
99 if not wks_file.endswith(".wks"):
100 wks_file = find_canned_image(scripts_path, wks_file)
101 if not wks_file:
102 print "No image named %s found, exiting. (Use 'wic list images' to list available images, or specify a fully-qualified OE kickstart (.wks) filename)\n" % wks_file
103 sys.exit(1)
104
105 image_output_dir = ""
106 if options.outdir:
107 image_output_dir = options.outdir
108
109 if not options.image_name:
110 rootfs_dir = options.rootfs_dir
111 bootimg_dir = options.bootimg_dir
112 kernel_dir = options.kernel_dir
113 native_sysroot = options.native_sysroot
114
115 wic_create(args, wks_file, rootfs_dir, bootimg_dir, kernel_dir,
116 native_sysroot, hdddir, staging_data_dir, scripts_path,
117 image_output_dir, options.properties_file)
118
119
120def wic_list_subcommand(args, usage_str):
121 """
122 Command-line handling for listing available image properties and
123 values. The real work is done by image.engine.wic_list()
124 """
125 parser = optparse.OptionParser(usage = usage_str)
126
127 parser.add_option("-o", "--outfile", action = "store",
128 dest = "properties_file",
129 help = "dump the possible values for image properties to a JSON file")
130
131 (options, args) = parser.parse_args(args)
132
133 if not wic_list(args, scripts_path, options.properties_file):
134 logging.error("Bad list arguments, exiting\n")
135 parser.print_help()
136 sys.exit(1)
137
138
139subcommands = {
140 "create": [wic_create_subcommand,
141 wic_create_usage,
142 wic_create_help],
143 "list": [wic_list_subcommand,
144 wic_list_usage,
145 wic_list_help],
146}
147
148
149def start_logging(loglevel):
150 logging.basicConfig(filname = 'wic.log', filemode = 'w', level=loglevel)
151
152
153def main():
154 parser = optparse.OptionParser(version = "wic version %s" % __version__,
155 usage = wic_usage)
156
157 parser.disable_interspersed_args()
158 parser.add_option("-D", "--debug", dest = "debug", action = "store_true",
159 default = False, help = "output debug information")
160
161 (options, args) = parser.parse_args()
162
163 loglevel = logging.INFO
164 if options.debug:
165 loglevel = logging.DEBUG
166 start_logging(loglevel)
167
168 if len(args):
169 if args[0] == "help":
170 if len(args) == 1:
171 parser.print_help()
172 sys.exit(1)
173
174 invoke_subcommand(args, parser, wic_help_usage, subcommands)
175
176
177if __name__ == "__main__":
178 try:
179 ret = main()
180 except Exception:
181 ret = 1
182 import traceback
183 traceback.print_exc(5)
184 sys.exit(ret)
185