]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/create-release.py
OvmfPkg/create-release.py: Support git hash versions
[mirror_edk2.git] / OvmfPkg / create-release.py
1 #!/usr/bin/python
2 #
3 # Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
4 #
5 # This program and the accompanying materials
6 # are licensed and made available under the terms and conditions of the BSD License
7 # which accompanies this distribution. The full text of the license may be found at
8 # http://opensource.org/licenses/bsd-license.php
9 #
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 #
13
14 import os
15 import re
16 import StringIO
17 import subprocess
18 import sys
19 import zipfile
20
21 is_unix = not sys.platform.startswith('win')
22
23 if not is_unix:
24 print "This script currently only supports unix-like systems"
25 sys.exit(-1)
26
27 if os.path.exists('OvmfPkgX64.dsc'):
28 os.chdir('..')
29
30 if not os.path.exists(os.path.join('OvmfPkg', 'OvmfPkgX64.dsc')):
31 print "OvmfPkg/OvmfPkgX64.dsc doesn't exist"
32 sys.exit(-1)
33
34 def run_and_capture_output(args, checkExitCode = True):
35 p = subprocess.Popen(args=args, stdout=subprocess.PIPE)
36 stdout = p.stdout.read()
37 ret_code = p.wait()
38 if checkExitCode:
39 assert ret_code == 0
40 return stdout
41
42 gcc_version = run_and_capture_output(args=('gcc', '--version'))
43 gcc_re = re.compile(r'\s*\S+\s+\([^\)]+?\)\s+(\d+(?:\.\d+)*)(?:\s+.*)?')
44 mo = gcc_re.match(gcc_version)
45 if not mo:
46 print "Unable to find GCC version"
47 sys.exit(-1)
48 gcc_version = map(lambda n: int(n), mo.group(1).split('.'))
49
50 if 'TOOLCHAIN' in os.environ:
51 TOOLCHAIN = os.environ['TOOLCHAIN']
52 else:
53 assert(gcc_version[0] == 4)
54 minor = max(4, min(7, gcc_version[1]))
55 TOOLCHAIN = 'GCC4' + str(minor)
56
57 def git_based_version():
58 dir = os.getcwd()
59 if not os.path.exists('.git'):
60 os.chdir('OvmfPkg')
61 stdout = run_and_capture_output(args=('git', 'log',
62 '-n', '1',
63 '--abbrev-commit'))
64 regex = re.compile(r'^\s*git-svn-id:\s+\S+@(\d+)\s+[0-9a-f\-]+$',
65 re.MULTILINE)
66 mo = regex.search(stdout)
67 if mo:
68 version = 'r' + mo.group(1)
69 else:
70 version = stdout.split(None, 3)[1]
71 os.chdir(dir)
72 return version
73
74 def svn_info():
75 dir = os.getcwd()
76 os.chdir('OvmfPkg')
77 stdout = run_and_capture_output(args=('svn', 'info'))
78 os.chdir(dir)
79 return stdout
80
81 def svn_based_version():
82 buf = svn_info()
83 revision_re = re.compile('^Revision\:\s*([\da-f]+)$', re.MULTILINE)
84 mo = revision_re.search(buf)
85 assert(mo is not None)
86 return 'r' + mo.group(1)
87
88 def get_revision():
89 if os.path.exists(os.path.join('OvmfPkg', '.svn')):
90 return svn_based_version()
91 else:
92 return git_based_version()
93
94 revision = get_revision()
95
96 newline_re = re.compile(r'(\n|\r\n|\r(?!\n))', re.MULTILINE)
97 def to_dos_text(str):
98 return newline_re.sub('\r\n', str)
99
100 def gen_build_info():
101 distro = run_and_capture_output(args=('lsb_release', '-sd')).strip()
102
103 machine = run_and_capture_output(args=('uname', '-m')).strip()
104
105 gcc_version_str = '.'.join(map(lambda v: str(v), gcc_version))
106
107 ld_version = run_and_capture_output(args=('ld', '--version'))
108 ld_version = ld_version.split('\n')[0].split()[-1]
109
110 iasl_version = run_and_capture_output(args=('iasl'), checkExitCode=False)
111 iasl_version = filter(lambda s: s.find(' version ') >= 0, iasl_version.split('\n'))[0]
112 iasl_version = iasl_version.split(' version ')[1].strip()
113
114 sb = StringIO.StringIO()
115 print >> sb, 'edk2: ', revision
116 print >> sb, 'compiler: GCC', gcc_version_str, '(' + TOOLCHAIN + ')'
117 print >> sb, 'binutils:', ld_version
118 print >> sb, 'iasl: ', iasl_version
119 print >> sb, 'system: ', distro, machine.replace('_', '-')
120 return to_dos_text(sb.getvalue())
121
122 LICENSE = to_dos_text(
123 '''This OVMF binary release is built from source code licensed under
124 the BSD open source license. The BSD license is documented at
125 http://opensource.org/licenses/bsd-license.php, and a copy is
126 shown below.
127
128 One sub-component of the OVMF project is a FAT filesystem driver. The FAT
129 filesystem driver code is also BSD licensed, but the code license contains
130 one additional term. This license can be found at
131 http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Edk2-fat-driver,
132 and a copy is shown below (following the normal BSD license).
133
134 === BSD license: START ===
135
136 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
137
138 Redistribution and use in source and binary forms, with or without
139 modification, are permitted provided that the following conditions
140 are met:
141
142 * Redistributions of source code must retain the above copyright
143 notice, this list of conditions and the following disclaimer.
144 * Redistributions in binary form must reproduce the above copyright
145 notice, this list of conditions and the following disclaimer in
146 the documentation and/or other materials provided with the
147 distribution.
148 * Neither the name of the Intel Corporation nor the names of its
149 contributors may be used to endorse or promote products derived
150 from this software without specific prior written permission.
151
152 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
153 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
154 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
155 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
156 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
157 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
158 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
159 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
160 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
161 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
162 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
163 POSSIBILITY OF SUCH DAMAGE.
164
165 === BSD license: END ===
166
167 === FAT filesystem driver license: START ===
168
169 Copyright (c) 2004, Intel Corporation. All rights reserved.
170
171 Redistribution and use in source and binary forms, with or without
172 modification, are permitted provided that the following conditions
173 are met:
174
175 * Redistributions of source code must retain the above copyright
176 notice, this list of conditions and the following disclaimer.
177 * Redistributions in binary form must reproduce the above copyright
178 notice, this list of conditions and the following disclaimer in
179 the documentation and/or other materials provided with the
180 distribution.
181 * Neither the name of Intel nor the names of its
182 contributors may be used to endorse or promote products derived
183 from this software without specific prior written permission.
184
185 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
188 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
189 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
190 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
191 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
192 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
193 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
194 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
195 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
196 POSSIBILITY OF SUCH DAMAGE.
197
198 Additional terms:
199 In addition to the forgoing, redistribution and use of the code is
200 conditioned upon the FAT 32 File System Driver and all derivative
201 works thereof being used for and designed only to read and/or write
202 to a file system that is directly managed by an Extensible Firmware
203 Interface (EFI) implementation or by an emulator of an EFI
204 implementation.
205
206 === FAT filesystem driver license: END ===
207 ''')
208
209 def build(arch):
210 args = (
211 'OvmfPkg/build.sh',
212 '-t', TOOLCHAIN,
213 '-a', arch,
214 '-b', 'RELEASE'
215 )
216 logname = 'build-%s.log' % arch
217 build_log = open(logname, 'w')
218 print 'Building OVMF for', arch, '(%s)' % logname, '...',
219 sys.stdout.flush()
220 p = subprocess.Popen(args=args, stdout=build_log, stderr=build_log)
221 ret_code = p.wait()
222 if ret_code == 0:
223 print '[done]'
224 else:
225 print '[error 0x%x]' % ret_code
226 return ret_code
227
228 def create_zip(arch):
229 global build_info
230 filename = 'OVMF-%s-%s.zip' % (arch, revision)
231 print 'Creating', filename, '...',
232 sys.stdout.flush()
233 if os.path.exists(filename):
234 os.remove(filename)
235 zipf = zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED)
236
237 zipf.writestr('BUILD_INFO', build_info)
238 zipf.writestr('LICENSE', LICENSE)
239 zipf.write(os.path.join('OvmfPkg', 'README'), 'README')
240 FV_DIR = os.path.join(
241 'Build',
242 'Ovmf' + arch.title(),
243 'RELEASE_' + TOOLCHAIN,
244 'FV'
245 )
246 zipf.write(os.path.join(FV_DIR, 'OVMF.fd'), 'OVMF.fd')
247 zipf.close()
248 print '[done]'
249
250 build_info = gen_build_info()
251 build('IA32')
252 build('X64')
253 create_zip('IA32')
254 create_zip('X64')
255
256