]> git.proxmox.com Git - mirror_edk2.git/blob - Tools/Conf/BuildMacro.xml
0b7f53757a9685ff7f6b2217f9fa51bf409bf4c9
[mirror_edk2.git] / Tools / Conf / BuildMacro.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!--
3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 -->
12 <project name="common">
13 <!--
14 Macro for intialize some properties. This Macro build will be called before source file build.
15 -->
16 <macrodef name="Build_Init">
17 <sequential>
18 <var name="OBJECTS" value="" />
19 <var name="SDB_FILES" value="" />
20 </sequential>
21 </macrodef>
22
23
24 <!--
25 macro definitions for building files with different types
26 -->
27 <!--
28 C Code
29 -->
30 <macrodef name="Build_CCode">
31 <attribute name="FILEPATH"/>
32 <attribute name="FILENAME"/>
33 <attribute name="FILEEXT" default="c"/>
34
35 <element name="EXTRA.INC" optional="yes"/>
36 <element name="EXTRA.ARG" optional="yes"/>
37
38 <sequential>
39 <var name="FILE_BASENAME" value="@{FILENAME}" />
40 <var name="FILE_PATH" value="@{FILEPATH}" />
41 <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
42
43 <if>
44 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
45 <then>
46 <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep">
47 <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
48 <input file="${DEST_DIR_DEBUG}/AutoGen.h"/>
49 <EXTRA.INC/>
50 </makedeps>
51 </then>
52 </if>
53
54 <OnDependency>
55 <sourcefiles>
56 <file ListFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
57 </sourcefiles>
58 <targetfiles>
59 <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
60 </targetfiles>
61
62 <sequential>
63 <cc userdefine="on">
64 <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
65 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
66 <EXTRA.INC/>
67 <argument value="${CC_FLAGS}"/>
68 <EXTRA.ARG/>
69 <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
70 </command>
71 </cc>
72 </sequential>
73 </OnDependency>
74 <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
75 <if>
76 <equals arg1="@{FILEPATH}" arg2="." />
77 <then>
78 <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
79 </then>
80 <else>
81 <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
82 </else>
83 </if>
84 </sequential>
85 </macrodef>
86
87
88 <macrodef name="Build_AUTOGEN">
89 <attribute name="FILEPATH"/>
90 <attribute name="FILENAME"/>
91 <attribute name="FILEEXT" default="c"/>
92
93 <element name="EXTRA.INC" optional="yes"/>
94 <element name="EXTRA.ARG" optional="yes"/>
95
96 <sequential>
97 <var name="FILE_BASENAME" value="@{FILENAME}" />
98 <var name="FILE_PATH" value="@{FILEPATH}" />
99 <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
100
101 <if>
102 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
103 <then>
104 <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep">
105 <input file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
106 <input file="${DEST_DIR_DEBUG}/AutoGen.h"/>
107 <EXTRA.INC/>
108 </makedeps>
109 </then>
110 </if>
111
112 <OnDependency>
113 <sourcefiles>
114 <file ListFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
115 </sourcefiles>
116 <targetfiles>
117 <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
118 </targetfiles>
119
120 <sequential>
121 <cc userdefine="on">
122 <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
123 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
124 <EXTRA.INC/>
125 <argument value="${CC_FLAGS}"/>
126 <EXTRA.ARG/>
127 <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
128 </command>
129 </cc>
130 </sequential>
131 </OnDependency>
132 <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
133 <if>
134 <equals arg1="@{FILEPATH}" arg2="." />
135 <then>
136 <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
137 </then>
138 <else>
139 <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
140 </else>
141 </if>
142 </sequential>
143 </macrodef>
144
145 <macrodef name="Build_DPX">
146 <attribute name="FILEPATH"/>
147 <attribute name="FILENAME"/>
148 <attribute name="FILEEXT" default="dxs"/>
149
150 <element name="EXTRA.INC" optional="yes"/>
151 <element name="EXTRA.ARG" optional="yes"/>
152
153
154 <sequential>
155 <var name="FILE_BASENAME" value="@{FILENAME}" />
156 <var name="FILE_PATH" value="@{FILEPATH}" />
157 <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
158
159 <OnDependency>
160 <sourcefiles>
161 <file name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
162 </sourcefiles>
163 <targetfiles>
164 <file name="${DEST_DIR_OUTPUT}/${BASE_NAME}.depex"/>
165 </targetfiles>
166
167 <sequential>
168 <cc userdefine="on">
169 <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${CC_FAMILY}"
170 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i">
171 <EXTRA.INC/>
172 <argument value="${PP_FLAGS}"/>
173 <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
174 </command>
175 </cc>
176
177 <gendepex inputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i" outputFile="${DEST_DIR_OUTPUT}/${BASE_NAME}.depex"/>
178 </sequential>
179 </OnDependency>
180 </sequential>
181 </macrodef>
182
183 <macrodef name="Build_ASM">
184 <attribute name="FILEPATH"/>
185 <attribute name="FILENAME"/>
186 <attribute name="FILEEXT" default="asm"/>
187
188 <element name="EXTRA.INC" optional="yes"/>
189 <element name="EXTRA.ARG" optional="yes"/>
190
191 <!-- Dispath ASM file, there are three type.
192 asm - Build_Assembly
193 S - Build_Gcc_Assembly
194 s - Build_Ipf_Assembly -->
195 <sequential>
196 <if>
197 <equals arg1="@{FILEEXT}" arg2="asm" />
198 <then>
199 <Build_Assembly FILEPATH="@{FILEPATH}" FILENAME="@{FILENAME}" FILEEXT="@{FILEEXT}">
200 <EXTRA.INC.1><EXTRA.INC /></EXTRA.INC.1>
201 <EXTRA.ARG.1><EXTRA.ARG /></EXTRA.ARG.1>
202 </Build_Assembly>
203 </then>
204 <elseif>
205 <equals arg1="@{FILEEXT}" arg2="S" />
206 <then>
207 <Build_Gcc_Assembly FILEPATH="@{FILEPATH}" FILENAME="@{FILENAME}" FILEEXT="@{FILEEXT}">
208 <EXTRA.INC.1><EXTRA.INC /></EXTRA.INC.1>
209 <EXTRA.ARG.1><EXTRA.ARG /></EXTRA.ARG.1>
210 </Build_Gcc_Assembly>
211 </then>
212 </elseif>
213 <elseif>
214 <equals arg1="@{FILEEXT}" arg2="s" />
215 <then>
216 <Build_IPF_Assembly_Code FILEPATH="@{FILEPATH}" FILENAME="@{FILENAME}" FILEEXT="@{FILEEXT}">
217 <EXTRA.INC.1><EXTRA.INC /></EXTRA.INC.1>
218 <EXTRA.ARG.1><EXTRA.ARG /></EXTRA.ARG.1>
219 </Build_IPF_Assembly_Code>
220 </then>
221 </elseif>
222 </if>
223 </sequential>
224 </macrodef>
225
226 <!--
227 IA32/x64 Assembly
228 -->
229 <macrodef name="Build_Assembly">
230 <attribute name="FILEPATH"/>
231 <attribute name="FILENAME"/>
232 <attribute name="FILEEXT" default="asm"/>
233
234 <element name="EXTRA.INC.1" optional="yes"/>
235 <element name="EXTRA.ARG.1" optional="yes"/>
236
237 <sequential>
238 <var name="FILE_BASENAME" value="@{FILENAME}" />
239 <var name="FILE_PATH" value="@{FILEPATH}" />
240 <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
241
242 <OnDependency>
243 <sourcefiles>
244 <file Name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
245 </sourcefiles>
246 <targetfiles>
247 <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
248 </targetfiles>
249
250 <sequential>
251 <cc userdefine="on">
252 <command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}">
253 <EXTRA.INC.1/>
254 <argument value="${PP_FLAGS}"/>
255 <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
256 </command>
257 </cc>
258
259 <replaceregexp file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"
260 match="^(#line +1 +.*@{FILEPATH}/@{FILENAME}\.@{FILEEXT}&quot;).+\1"
261 replace=";"
262 flags="gs"/>
263 <replaceregexp file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"
264 match="^(#line .*)$"
265 replace="; \1"
266 byline="true"/>
267 <replaceregexp file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"
268 match="([^_a-zA-Z])0x([0-9a-fA-F]+)"
269 replace="\10\2h"
270 flags="g"
271 byline="true"/>
272
273 <cc userdefine="on">
274 <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"
275 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
276 <EXTRA.INC.1/>
277
278 <argument value="${ASM_FLAGS}"/>
279 <EXTRA.ARG.1/>
280
281 <fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
282 </command>
283 </cc>
284 </sequential>
285 </OnDependency>
286 <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
287 <if>
288 <equals arg1="@{FILEPATH}" arg2="." />
289 <then>
290 <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
291 </then>
292 <else>
293 <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
294 </else>
295 </if>
296 </sequential>
297 </macrodef>
298
299 <!--
300 Build GCC assembly code
301 -->
302 <macrodef name="Build_Gcc_Assembly">
303 <attribute name="FILEPATH"/>
304 <attribute name="FILENAME"/>
305 <attribute name="FILEEXT" default="asm"/>
306
307 <element name="EXTRA.INC.1" optional="yes"/>
308 <element name="EXTRA.ARG.1" optional="yes"/>
309
310 <sequential>
311 <var name="FILE_BASENAME" value="@{FILENAME}" />
312 <var name="FILE_PATH" value="@{FILEPATH}" />
313 <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
314
315 <OnDependency>
316 <sourcefiles>
317 <file Name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
318 </sourcefiles>
319 <targetfiles>
320 <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
321 </targetfiles>
322
323 <sequential>
324 <cc userdefine="on">
325 <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"
326 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
327 <EXTRA.INC.1/>
328
329 <argument value="${ASM_FLAGS}"/>
330 <EXTRA.ARG.1/>
331
332 <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
333 </command>
334 </cc>
335 </sequential>
336 </OnDependency>
337 <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
338 <if>
339 <equals arg1="@{FILEPATH}" arg2="." />
340 <then>
341 <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
342 </then>
343 <else>
344 <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
345 </else>
346 </if>
347 </sequential>
348 </macrodef>
349
350 <!--
351 IPF Assembly
352 -->
353 <macrodef name="Build_IPF_Assembly_Code">
354 <attribute name="FILEPATH"/>
355 <attribute name="FILENAME"/>
356 <attribute name="FILEEXT" default="s"/>
357
358 <element name="EXTRA.INC.1" optional="yes"/>
359 <element name="EXTRA.ARG.1" optional="yes"/>
360
361 <sequential>
362 <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
363
364 <if>
365 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
366 <then>
367 <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep">
368 <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
369 <EXTRA.INC.1/>
370 </makedeps>
371 </then>
372 </if>
373
374 <OnDependency>
375 <sourcefiles>
376 <file listfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
377 </sourcefiles>
378 <targetfiles>
379 <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
380 </targetfiles>
381
382 <sequential>
383 <cc userdefine="on">
384 <command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}">
385 <EXTRA.INC.1/>
386 <argument value="${PP_FLAGS}"/>
387 <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
388 </command>
389 </cc>
390
391 <cc userdefine="on">
392 <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"
393 includepathDelimiter="-I" outputDelimiter="-o"
394 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
395 <EXTRA.INC.1/>
396 <argument value="${ASM_FLAGS}"/>
397 <EXTRA.ARG.1/>
398 <fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
399 </command>
400 </cc>
401 </sequential>
402 </OnDependency>
403 <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
404 <if>
405 <equals arg1="@{FILEPATH}" arg2="." />
406 <then>
407 <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
408 </then>
409 <else>
410 <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
411 </else>
412 </if>
413 </sequential>
414 </macrodef>
415
416
417 <macrodef name="Build_IPF_PP_Code">
418 <attribute name="FILEPATH"/>
419 <attribute name="FILENAME"/>
420 <attribute name="FILEEXT" default="i"/>
421
422 <element name="EXTRA.INC" optional="yes"/>
423 <element name="EXTRA.ARG" optional="yes"/>
424
425 <sequential>
426 <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
427
428 <cc userdefine="on">
429 <command type="ASM" includepathDelimiter="-I">
430 <includepath path="${WORKSPACE_DIR}"/>
431 <includepath path="${MODULE_DIR}"/>
432 <includepath path="${MODULE_DIR}/${ARCH}"/>
433 <EXTRA.INC/>
434
435 <argument value="${ASM_FLAGS}"/>
436 <EXTRA.ARG/>
437 <OutputFile File="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
438
439 <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
440 </command>
441 </cc>
442 </sequential>
443 </macrodef>
444
445
446 <!--
447 Library private HashMap map = new HashMap();
448 -->
449 <macrodef name="Build_Library">
450 <attribute name="FILENAME" />
451 <attribute name="FILEEXT" default="obj"/>
452
453 <sequential>
454 <var name="FILE_BASENAME" value="@{FILENAME}" />
455 <var name="FILE_PATH" value="." />
456 <mkdir dir="${BIN_DIR}"/>
457
458 <OnDependency>
459 <sourcefiles>
460 <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}" />
461 </sourcefiles>
462 <targetfiles>
463 <file name="${BIN_DIR}/@{FILENAME}.lib"/>
464 </targetfiles>
465
466 <sequential>
467 <cc userdefine="on">
468 <command type="SLINK" cmd="${SLINK}" family="${SLINK_FAMILY}"
469 outputFile="${BIN_DIR}/@{FILENAME}.lib">
470 <argument value="${SLINK_FLAGS}"/>
471
472 <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}"/>
473 </command>
474 </cc>
475 </sequential>
476 </OnDependency>
477 </sequential>
478 </macrodef>
479
480 <!--
481 Unicode -> .sdb
482 -->
483 <macrodef name="Build_UNI">
484 <attribute name="FILEPATH"/>
485 <attribute name="FILENAME"/>
486 <attribute name="FILEEXT" default="uni"/>
487
488 <element name="EXTRA.INC" optional="yes"/>
489 <element name="EXTRA.ARG" optional="yes"/>
490
491 <sequential>
492 <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
493
494 <OnDependency>
495 <sourcefiles>
496 <file name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
497 </sourcefiles>
498 <targetfiles>
499 <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
500 </targetfiles>
501
502 <sequential>
503 <strgather commandtype="parse" newdatabase="true">
504 <database name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
505 <EXTRA.INC/>
506 <EXTRA.ARG/>
507 <inputfile name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
508 </strgather>
509 </sequential>
510 </OnDependency>
511
512 <var name="SDB_FILES" value="${SDB_FILES}, ${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
513 </sequential>
514 </macrodef>
515
516 <!--
517 .sdb(s) -> .c, .h -> .obj
518 -->
519 <macrodef name="Build_Unicode_Database">
520 <attribute name="FILEPATH"/>
521 <attribute name="FILENAME"/>
522 <attribute name="FILEEXT" default="sdb"/>
523
524 <element name="EXTRA.INC" optional="yes"/>
525 <element name="EXTRA.ARG" optional="yes"/>
526
527 <sequential>
528 <var name="FILE_BASENAME" value="@{FILENAME}" />
529 <var name="FILE_PATH" value="@{FILEPATH}" />
530 <OnDependency>
531 <sourcefiles>
532 <file list="${SDB_FILES}"/>
533 <file list="${SOURCE_FILES}"/>
534 </sourcefiles>
535 <targetfiles>
536 <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
537 </targetfiles>
538
539 <sequential>
540 <strgather commandtype="scan" outputdatabase="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb" verbose="read">
541 <skipext name=".uni"/>
542 <skipext name=".h"/>
543 <database list="${SDB_FILES}"/>
544 <inputfile name="${SOURCE_FILES}"/>
545 </strgather>
546 </sequential>
547 </OnDependency>
548
549 <OnDependency>
550 <sourcefiles>
551 <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
552 </sourcefiles>
553 <targetfiles>
554 <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}StrDefs.h"/>
555 <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.hpk"/>
556 <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>
557 </targetfiles>
558
559 <sequential>
560 <strgather basename="@{FILENAME}Strings" commandtype="dump"
561 outputdefines="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}StrDefs.h"
562 outputhpk="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.hpk"
563 outputstring="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c">
564 <database name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
565 </strgather>
566 </sequential>
567 </OnDependency>
568
569 <OnDependency>
570 <sourcefiles>
571 <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>
572 </sourcefiles>
573 <targetfiles>
574 <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Strings.obj"/>
575 </targetfiles>
576
577 <sequential>
578 <cc userdefine="on">
579 <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
580 includepathDelimiter="-I"
581 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Strings.obj">
582 <argument value="${CC_FLAGS}"/>
583 <EXTRA.INC />
584 <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>
585 </command>
586 </cc>
587 </sequential>
588 </OnDependency>
589 <!-- The Module contain Unicode file need those flags -->
590 <var name="CC_FLAGS" value="${CC_FLAGS} /DSTRING_ARRAY_NAME=${BASE_NAME}Strings /FI${DEST_DIR_DEBUG}/${BASE_NAME}StrDefs.h" />
591
592 <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
593 <if>
594 <equals arg1="@{FILEPATH}" arg2="." />
595 <then>
596 <var name="OBJECTS" value="${OBJECTS} @{FILENAME}Strings.obj" />
597 </then>
598 <else>
599 <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}Strings.obj" />
600 </else>
601 </if>
602 </sequential>
603 </macrodef>
604
605 <!--
606 Vfr
607 -->
608 <macrodef name="Build_VFR">
609 <attribute name="FILEPATH"/>
610 <attribute name="FILENAME"/>
611 <attribute name="FILEEXT" default="vfr"/>
612
613 <element name="EXTRA.INC" optional="yes"/>
614 <element name="EXTRA.ARG" optional="yes"/>
615
616 <sequential>
617 <mkdir dir="${DEST_DIR_DEBUG}/@{FILEPATH}"/>
618
619 <if>
620 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
621 <then>
622 <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep">
623 <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
624 <EXTRA.INC/>
625 </makedeps>
626 </then>
627 </if>
628
629 <OnDependency>
630 <sourcefiles>
631 <file listfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
632 </sourcefiles>
633 <targetfiles>
634 <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
635 </targetfiles>
636
637 <sequential>
638 <vfrcompile createIfrBinFile="on" createListFile="on" outPutDir="${DEST_DIR_DEBUG}/@{FILEPATH}" vfrFile="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}">
639 <EXTRA.INC/>
640 </vfrcompile>
641
642 <cc userdefine="on">
643 <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}"
644 includepathDelimiter="-I" family="${CC_FAMILY}"
645 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" >
646 <argument value="${CC_FLAGS}"/>
647 <EXTRA.INC/>
648 <EXTRA.ARG/>
649 <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.c"/>
650 </command>
651 </cc>
652 <delete file="${PLATFORM_DIR}/@{FILENAME}.i" />
653 </sequential>
654 </OnDependency>
655 <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
656 <if>
657 <equals arg1="@{FILEPATH}" arg2="." />
658 <then>
659 <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
660 </then>
661 <else>
662 <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
663 </else>
664 </if>
665 </sequential>
666 </macrodef>
667
668 <!--
669 DUMMY
670 -->
671 <macrodef name="Build_DUMMY">
672 <attribute name="FILEPATH"/>
673 <attribute name="FILENAME"/>
674 <attribute name="FILEEXT"/>
675
676 <element name="EXTRA.INC" optional="yes"/>
677 <element name="EXTRA.ARG" optional="yes"/>
678
679 <sequential>
680 <echo message="Ignoring ${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
681 </sequential>
682 </macrodef>
683
684 <!--############################################################################
685 Build Sections
686 #############################################################################-->
687 <!--
688 DLL
689 -->
690 <macrodef name="GenDll">
691 <attribute name="FILEPATH"/>
692 <attribute name="FILENAME"/>
693 <attribute name="FILEEXT"/>
694
695 <element name="LIB.ARG" optional="yes"/>
696 <element name="LINK.ARG" optional="yes"/>
697
698 <sequential>
699 <var name="FILE_BASENAME" value="@{FILENAME}" />
700 <var name="FILE_PATH" value="@{FILEPATH}" />
701 <OnDependency>
702 <sourcefiles>
703 <file list="${LIBS}"/>
704 <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}" />
705 </sourcefiles>
706 <targetfiles>
707 <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.dll"/>
708 </targetfiles>
709
710 <sequential>
711 <cc userdefine="on">
712 <command type="SLINK" cmd="${SLINK}" family="${SLINK_FAMILY}"
713 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Local.lib">
714 <argument value="${SLINK_FLAGS}"/>
715
716 <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}"/>
717 </command>
718 </cc>
719 <cc userdefine="on">
720 <command type="DLINK" cmd="${DLINK}" family="${DLINK_FAMILY}"
721 outputFile="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.dll" >
722 <argument value="${DLINK_FLAGS}"/>
723 <libset libs="${LIBS}"/>
724 <libset libs="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Local.lib"/>
725 <libset libs="${DLINK_SPATH}" />
726 <LINK.ARG/>
727 </command>
728 </cc>
729 </sequential>
730 </OnDependency>
731 </sequential>
732 </macrodef>
733
734 <!--
735 EFI
736 -->
737 <macrodef name="GenEfi">
738 <attribute name="FILEPATH"/>
739 <attribute name="FILENAME"/>
740 <attribute name="FILEEXT" default="dll"/>
741
742 <sequential>
743 <OnDependency>
744 <sourcefiles>
745 <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
746 </sourcefiles>
747 <targetfiles>
748 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
749 </targetfiles>
750
751 <sequential>
752 <fwimage componentType="${MODULE_TYPE}" outImage="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"
753 peImage="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" time="0"/>
754 </sequential>
755 </OnDependency>
756 </sequential>
757 </macrodef>
758
759 <!--
760 EFI_SECTION_FREEFORM_SUBTYPE_GUID
761 EFI_SECTION_VERSION
762 EFI_SECTION_USER_INTERFACE
763 EFI_SECTION_DXE_DEPEX
764 EFI_SECTION_PEI_DEPEX
765 EFI_SECTION_PE32
766 EFI_SECTION_PIC
767 EFI_SECTION_TE
768 EFI_SECTION_RAW
769 EFI_SECTION_COMPRESSION
770 EFI_SECTION_GUID_DEFINED
771 EFI_SECTION_COMPATIBILITY16
772 EFI_SECTION_FIRMWARE_VOLUME_IMAGE
773 -->
774 <!--
775 EFI_SECTION_PE32
776 -->
777
778 <macrodef name="EFI_SECTION_TE">
779 <attribute name="FILEPATH"/>
780 <attribute name="FILENAME"/>
781 <attribute name="FILEEXT" default="" />
782
783 <element name="PRE.PROCESS" optional="yes"/>
784 <element name="POST.PROCESS" optional="yes"/>
785
786 <sequential>
787 <PRE.PROCESS/>
788 <if>
789 <not>
790 <equals arg1="${LIBS}" arg2=""/>
791 </not>
792
793 <then>
794 <GenDll FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="">
795 <LIB.ARG></LIB.ARG>
796 <LINK.ARG></LINK.ARG>
797 </GenDll>
798
799 <GenEfi FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="dll"/>
800 </then>
801 </if>
802
803 <OnDependency>
804 <sourcefiles>
805 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
806 </sourcefiles>
807 <targetfiles>
808 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.tes"/>
809 </targetfiles>
810
811 <sequential>
812 <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${BIN_DIR}/@{FILENAME}.efi" />
813 <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${DEST_DIR_DEBUG}/@{FILENAME}.efi" />
814 <genteimage Dump="false" Verbose="false" OutputDir="" OutputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" InputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
815 <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.te" tofile="${BIN_DIR}/@{FILENAME}.te" />
816 <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.te"
817 outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.tes"
818 sectiontype="EFI_SECTION_TE"/>
819 <POST.PROCESS/>
820 </sequential>
821 </OnDependency>
822 </sequential>
823 </macrodef>
824
825 <macrodef name="EFI_SECTION_PE32">
826 <attribute name="FILEPATH"/>
827 <attribute name="FILENAME"/>
828 <attribute name="FILEEXT" default="" />
829
830 <element name="PRE.PROCESS" optional="yes"/>
831 <element name="POST.PROCESS" optional="yes"/>
832
833 <sequential>
834 <PRE.PROCESS/>
835 <if>
836 <not>
837 <!-- TBD ${OBJECTS} -->
838 <equals arg1="${LIBS}" arg2=""/>
839 </not>
840
841 <then>
842 <GenDll FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="">
843 <LIB.ARG></LIB.ARG>
844 <LINK.ARG></LINK.ARG>
845 </GenDll>
846
847 <GenEfi FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="dll"/>
848 </then>
849 </if>
850
851 <OnDependency>
852 <sourcefiles>
853 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
854 </sourcefiles>
855 <targetfiles>
856 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.pe32"/>
857 </targetfiles>
858
859 <sequential>
860 <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${BIN_DIR}/@{FILENAME}.efi" />
861
862 <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"
863 outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.pe32"
864 sectiontype="EFI_SECTION_PE32"/>
865
866 <POST.PROCESS/>
867 </sequential>
868 </OnDependency>
869 <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${DEST_DIR_DEBUG}/@{FILENAME}.efi" />
870 </sequential>
871 </macrodef>
872
873 <!--
874 EFI_SECTION_VERSION
875 -->
876 <macrodef name="EFI_SECTION_VERSION">
877 <attribute name="FILEPATH"/>
878 <attribute name="FILENAME"/>
879 <attribute name="FILEEXT" default="" />
880 <attribute name="VERSION" default="0000"/>
881
882 <element name="PRE.PROCESS" optional="yes"/>
883 <element name="POST.PROCESS" optional="yes"/>
884
885 <sequential>
886 <if>
887 <not>
888 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ver"/>
889 </not>
890
891 <then>
892 <PRE.PROCESS/>
893 <gensection outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ver"
894 versionnum="@{VERSION}"
895 sectiontype="EFI_SECTION_VERSION"/>
896 <POST.PROCESS/>
897 </then>
898 </if>
899 </sequential>
900 </macrodef>
901
902 <!--
903 EFI_SECTION_USER_INTERFACE
904 -->
905 <macrodef name="EFI_SECTION_USER_INTERFACE">
906 <attribute name="FILEPATH"/>
907 <attribute name="FILENAME"/>
908 <attribute name="FILEEXT" default="" />
909 <attribute name="UI" default="${BASE_NAME}"/>
910
911 <element name="PRE.PROCESS" optional="yes"/>
912 <element name="POST.PROCESS" optional="yes"/>
913
914 <sequential>
915 <if>
916 <not>
917 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ui"/>
918 </not>
919
920 <then>
921 <PRE.PROCESS/>
922 <gensection interfacestring="@{UI}"
923 outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ui"
924 sectiontype="EFI_SECTION_USER_INTERFACE"/>
925 <POST.PROCESS/>
926 </then>
927 </if>
928 </sequential>
929 </macrodef>
930
931 <!--
932 EFI_SECTION_DXE_DEPEX
933 -->
934 <macrodef name="EFI_SECTION_DXE_DEPEX">
935 <attribute name="FILEPATH"/>
936 <attribute name="FILENAME"/>
937 <attribute name="FILEEXT" default="dxs"/>
938
939 <element name="PRE.PROCESS" optional="yes"/>
940 <element name="POST.PROCESS" optional="yes"/>
941
942 <sequential>
943 <PRE.PROCESS/>
944
945 <if>
946 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"/>
947 <then>
948 <OnDependency>
949 <sourcefiles>
950 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"/>
951 </sourcefiles>
952 <targetfiles>
953 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
954 </targetfiles>
955 <sequential>
956 <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"
957 outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"
958 sectiontype="EFI_SECTION_DXE_DEPEX"/>
959 </sequential>
960 </OnDependency>
961 </then>
962 <else>
963 <if>
964 <not>
965 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
966 </not>
967 <then>
968 <touch file="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
969 </then>
970 </if>
971 </else>
972 </if>
973
974 <POST.PROCESS/>
975 </sequential>
976 </macrodef>
977
978 <!--
979 EFI_SECTION_PEI_DEPEX
980 -->
981 <macrodef name="EFI_SECTION_PEI_DEPEX">
982 <attribute name="FILEPATH"/>
983 <attribute name="FILENAME"/>
984 <attribute name="FILEEXT" default="dxs"/>
985
986 <element name="PRE.PROCESS" optional="yes"/>
987 <element name="POST.PROCESS" optional="yes"/>
988 <sequential>
989 <PRE.PROCESS/>
990 <if>
991 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"/>
992 <then>
993 <OnDependency>
994 <sourcefiles>
995 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"/>
996 </sourcefiles>
997 <targetfiles>
998 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
999 </targetfiles>
1000
1001 <sequential>
1002 <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"
1003 outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"
1004 sectiontype="EFI_SECTION_PEI_DEPEX"/>
1005 </sequential>
1006 </OnDependency>
1007
1008 </then>
1009 <else>
1010 <if>
1011 <not>
1012 <available type="file" file="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
1013 </not>
1014 <then>
1015 <touch file="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
1016 </then>
1017 </if>
1018 </else>
1019 </if>
1020 <POST.PROCESS/>
1021 </sequential>
1022 </macrodef>
1023
1024
1025 <!--
1026 EFI_SECTION_RAW
1027 -->
1028 <macrodef name="EFI_SECTION_RAW">
1029 <attribute name="FILEPATH"/>
1030 <attribute name="FILENAME"/>
1031 <attribute name="FILEEXT" default="bin"/>
1032
1033 <element name="PRE.PROCESS" optional="yes"/>
1034 <element name="POST.PROCESS" optional="yes"/>
1035
1036 <sequential>
1037 <OnDependency>
1038 <sourcefiles>
1039 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.@{FILEEXT}"/>
1040 </sourcefiles>
1041 <targetfiles>
1042 <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"/>
1043 </targetfiles>
1044
1045 <sequential>
1046 <PRE.PROCESS/>
1047 <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.@{FILEEXT}"
1048 outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"
1049 sectiontype="EFI_SECTION_RAW"/>
1050 <POST.PROCESS/>
1051 </sequential>
1052 </OnDependency>
1053 </sequential>
1054 </macrodef>
1055
1056 <!--
1057 EFI_SECTION_FIRMWARE_VOLUME_IMAGE
1058 -->
1059 <macrodef name="EFI_SECTION_FIRMWARE_VOLUME_IMAGE">
1060 <attribute name="FILEPATH"/>
1061 <attribute name="FILENAME"/>
1062 <attribute name="FILEEXT" default="fv"/>
1063
1064 <element name="PRE.PROCESS" optional="yes"/>
1065 <element name="POST.PROCESS" optional="yes"/>
1066
1067 <sequential>
1068 <OnDependency>
1069 <sourcefiles>
1070 <file name="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
1071 </sourcefiles>
1072 <targetfiles>
1073 <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}fv.sec"/>
1074 </targetfiles>
1075
1076 <sequential>
1077 <PRE.PROCESS/>
1078
1079 <copy file="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
1080 tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
1081 overwrite="true"/>
1082 <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
1083 outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}fv.sec"
1084 sectiontype="EFI_SECTION_FIRMWARE_VOLUME_IMAGE"/>
1085
1086 <POST.PROCESS/>
1087 </sequential>
1088 </OnDependency>
1089 </sequential>
1090 </macrodef>
1091
1092 <!--
1093 Binary
1094 -->
1095 <macrodef name="Build_Binary">
1096 <attribute name="FILEPATH"/>
1097 <attribute name="FILENAME"/>
1098 <attribute name="FILEEXT" default="bin"/>
1099
1100 <element name="EXTRA.INC" optional="yes"/>
1101 <element name="EXTRA.ARG" optional="yes"/>
1102
1103 <sequential>
1104 <copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
1105 tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>
1106 </sequential>
1107 </macrodef>
1108
1109 <!--
1110 Graphics (bmp, ...)
1111 -->
1112 <macrodef name="Build_Graphics">
1113 <attribute name="FILEPATH"/>
1114 <attribute name="FILENAME"/>
1115 <attribute name="FILEEXT" default="bmp"/>
1116
1117 <element name="EXTRA.INC" optional="yes"/>
1118 <element name="EXTRA.ARG" optional="yes"/>
1119
1120 <sequential>
1121 <mkdir dir="${MODULE_DIR}/@{FILEPATH}" />
1122 <copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
1123 tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>
1124 </sequential>
1125 </macrodef>
1126 <macrodef name="Build_EFI">
1127 <attribute name="FILEPATH"/>
1128 <attribute name="FILENAME"/>
1129 <attribute name="FILEEXT" default="efi"/>
1130
1131 <element name="EXTRA.INC" optional="yes"/>
1132 <element name="EXTRA.ARG" optional="yes"/>
1133
1134 <sequential>
1135 <mkdir dir="${MODULE_DIR}/@{FILEPATH}" />
1136 <copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"
1137 tofile="${DEST_DIR_OUTPUT}/${BASE_NAME}.efi"/>
1138 </sequential>
1139 </macrodef>
1140 </project>