]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/python\r | |
2 | #\r | |
3 | # Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r | |
4 | #\r | |
5 | # This program and the accompanying materials\r | |
6 | # are licensed and made available under the terms and conditions of the BSD License\r | |
7 | # which accompanies this distribution. The full text of the license may be found at\r | |
8 | # http://opensource.org/licenses/bsd-license.php\r | |
9 | #\r | |
10 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
11 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
12 | #\r | |
13 | \r | |
14 | import os\r | |
15 | import re\r | |
16 | import StringIO\r | |
17 | import subprocess\r | |
18 | import sys\r | |
19 | import zipfile\r | |
20 | \r | |
21 | is_unix = not sys.platform.startswith('win')\r | |
22 | \r | |
23 | if not is_unix:\r | |
24 | print "This script currently only supports unix-like systems"\r | |
25 | sys.exit(-1)\r | |
26 | \r | |
27 | if os.path.exists('OvmfPkgX64.dsc'):\r | |
28 | os.chdir('..')\r | |
29 | \r | |
30 | if not os.path.exists(os.path.join('OvmfPkg', 'OvmfPkgX64.dsc')):\r | |
31 | print "OvmfPkg/OvmfPkgX64.dsc doesn't exist"\r | |
32 | sys.exit(-1)\r | |
33 | \r | |
34 | def run_and_capture_output(args, checkExitCode = True):\r | |
35 | p = subprocess.Popen(args=args, stdout=subprocess.PIPE)\r | |
36 | stdout = p.stdout.read()\r | |
37 | ret_code = p.wait()\r | |
38 | if checkExitCode:\r | |
39 | assert ret_code == 0\r | |
40 | return stdout\r | |
41 | \r | |
42 | gcc_version = run_and_capture_output(args=('gcc', '--version'))\r | |
43 | gcc_re = re.compile(r'\s*\S+\s+\([^\)]+?\)\s+(\d+(?:\.\d+)*)(?:\s+.*)?')\r | |
44 | mo = gcc_re.match(gcc_version)\r | |
45 | if not mo:\r | |
46 | print "Unable to find GCC version"\r | |
47 | sys.exit(-1)\r | |
48 | gcc_version = map(lambda n: int(n), mo.group(1).split('.'))\r | |
49 | \r | |
50 | if 'TOOLCHAIN' in os.environ:\r | |
51 | TOOLCHAIN = os.environ['TOOLCHAIN']\r | |
52 | else:\r | |
53 | assert(gcc_version[0] == 4)\r | |
54 | minor = max(4, min(7, gcc_version[1]))\r | |
55 | TOOLCHAIN = 'GCC4' + str(minor)\r | |
56 | \r | |
57 | def git_based_version():\r | |
58 | dir = os.getcwd()\r | |
59 | if not os.path.exists('.git'):\r | |
60 | os.chdir('OvmfPkg')\r | |
61 | stdout = run_and_capture_output(args=('git', 'log',\r | |
62 | '-n', '1',\r | |
63 | '--abbrev-commit'))\r | |
64 | regex = re.compile(r'^\s*git-svn-id:\s+\S+@(\d+)\s+[0-9a-f\-]+$',\r | |
65 | re.MULTILINE)\r | |
66 | mo = regex.search(stdout)\r | |
67 | if mo:\r | |
68 | version = 'r' + mo.group(1)\r | |
69 | else:\r | |
70 | version = stdout.split(None, 3)[1]\r | |
71 | os.chdir(dir)\r | |
72 | return version\r | |
73 | \r | |
74 | def svn_info():\r | |
75 | dir = os.getcwd()\r | |
76 | os.chdir('OvmfPkg')\r | |
77 | stdout = run_and_capture_output(args=('svn', 'info'))\r | |
78 | os.chdir(dir)\r | |
79 | return stdout\r | |
80 | \r | |
81 | def svn_based_version():\r | |
82 | buf = svn_info()\r | |
83 | revision_re = re.compile('^Revision\:\s*([\da-f]+)$', re.MULTILINE)\r | |
84 | mo = revision_re.search(buf)\r | |
85 | assert(mo is not None)\r | |
86 | return 'r' + mo.group(1)\r | |
87 | \r | |
88 | def get_revision():\r | |
89 | if os.path.exists(os.path.join('OvmfPkg', '.svn')):\r | |
90 | return svn_based_version()\r | |
91 | else:\r | |
92 | return git_based_version()\r | |
93 | \r | |
94 | revision = get_revision()\r | |
95 | \r | |
96 | newline_re = re.compile(r'(\n|\r\n|\r(?!\n))', re.MULTILINE)\r | |
97 | def to_dos_text(str):\r | |
98 | return newline_re.sub('\r\n', str)\r | |
99 | \r | |
100 | def gen_build_info():\r | |
101 | distro = run_and_capture_output(args=('lsb_release', '-sd')).strip()\r | |
102 | \r | |
103 | machine = run_and_capture_output(args=('uname', '-m')).strip()\r | |
104 | \r | |
105 | gcc_version_str = '.'.join(map(lambda v: str(v), gcc_version))\r | |
106 | \r | |
107 | ld_version = run_and_capture_output(args=('ld', '--version'))\r | |
108 | ld_version = ld_version.split('\n')[0].split()[-1]\r | |
109 | \r | |
110 | iasl_version = run_and_capture_output(args=('iasl'), checkExitCode=False)\r | |
111 | iasl_version = filter(lambda s: s.find(' version ') >= 0, iasl_version.split('\n'))[0]\r | |
112 | iasl_version = iasl_version.split(' version ')[1].strip()\r | |
113 | \r | |
114 | sb = StringIO.StringIO()\r | |
115 | print >> sb, 'edk2: ', revision\r | |
116 | print >> sb, 'compiler: GCC', gcc_version_str, '(' + TOOLCHAIN + ')'\r | |
117 | print >> sb, 'binutils:', ld_version\r | |
118 | print >> sb, 'iasl: ', iasl_version\r | |
119 | print >> sb, 'system: ', distro, machine.replace('_', '-')\r | |
120 | return to_dos_text(sb.getvalue())\r | |
121 | \r | |
122 | def read_file(filename):\r | |
123 | f = open(filename)\r | |
124 | d = f.read()\r | |
125 | f.close()\r | |
126 | return d\r | |
127 | \r | |
128 | LICENSE = to_dos_text(\r | |
129 | '''This OVMF binary release is built from source code licensed under\r | |
130 | the BSD open source license. The BSD license is documented at\r | |
131 | http://opensource.org/licenses/bsd-license.php, and a copy is\r | |
132 | shown below.\r | |
133 | \r | |
134 | One sub-component of the OVMF project is a FAT filesystem driver. The FAT\r | |
135 | filesystem driver code is also BSD licensed, but the code license contains\r | |
136 | one additional term. This license can be found at\r | |
137 | https://github.com/tianocore/tianocore.github.io/wiki/Edk2-fat-driver\r | |
138 | and a copy is shown below (following the normal BSD license).\r | |
139 | \r | |
140 | === BSD license: START ===\r | |
141 | \r | |
142 | ''')\r | |
143 | \r | |
144 | LICENSE += read_file(os.path.join('MdePkg', 'License.txt'))\r | |
145 | \r | |
146 | LICENSE += to_dos_text(\r | |
147 | '''\r | |
148 | === BSD license: END ===\r | |
149 | \r | |
150 | === FAT filesystem driver license: START ===\r | |
151 | \r | |
152 | ''')\r | |
153 | \r | |
154 | LICENSE += read_file(os.path.join('FatBinPkg', 'License.txt'))\r | |
155 | \r | |
156 | LICENSE += to_dos_text(\r | |
157 | '''\r | |
158 | === FAT filesystem driver license: END ===\r | |
159 | ''')\r | |
160 | \r | |
161 | def build(arch):\r | |
162 | args = (\r | |
163 | 'OvmfPkg/build.sh',\r | |
164 | '-t', TOOLCHAIN,\r | |
165 | '-a', arch,\r | |
166 | '-b', 'RELEASE'\r | |
167 | )\r | |
168 | logname = 'build-%s.log' % arch\r | |
169 | build_log = open(logname, 'w')\r | |
170 | print 'Building OVMF for', arch, '(%s)' % logname, '...',\r | |
171 | sys.stdout.flush()\r | |
172 | p = subprocess.Popen(args=args, stdout=build_log, stderr=build_log)\r | |
173 | ret_code = p.wait()\r | |
174 | if ret_code == 0:\r | |
175 | print '[done]'\r | |
176 | else:\r | |
177 | print '[error 0x%x]' % ret_code\r | |
178 | return ret_code\r | |
179 | \r | |
180 | def create_zip(arch):\r | |
181 | global build_info\r | |
182 | filename = 'OVMF-%s-%s.zip' % (arch, revision)\r | |
183 | print 'Creating', filename, '...',\r | |
184 | sys.stdout.flush()\r | |
185 | if os.path.exists(filename):\r | |
186 | os.remove(filename)\r | |
187 | zipf = zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED)\r | |
188 | \r | |
189 | zipf.writestr('BUILD_INFO', build_info)\r | |
190 | zipf.writestr('LICENSE', LICENSE)\r | |
191 | zipf.write(os.path.join('OvmfPkg', 'README'), 'README')\r | |
192 | FV_DIR = os.path.join(\r | |
193 | 'Build',\r | |
194 | 'Ovmf' + arch.title(),\r | |
195 | 'RELEASE_' + TOOLCHAIN,\r | |
196 | 'FV'\r | |
197 | )\r | |
198 | zipf.write(os.path.join(FV_DIR, 'OVMF.fd'), 'OVMF.fd')\r | |
199 | zipf.close()\r | |
200 | print '[done]'\r | |
201 | \r | |
202 | build_info = gen_build_info()\r | |
203 | build('IA32')\r | |
204 | build('X64')\r | |
205 | create_zip('IA32')\r | |
206 | create_zip('X64')\r | |
207 | \r | |
208 | \r |