summaryrefslogtreecommitdiff
path: root/Core/Rules.mak
blob: d28a9619aa04a48a1a133dd5e793d98c29bbd77d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
#**********************************************************************
#**********************************************************************
#**                                                                  **
#**        (C)Copyright 1985-2011, American Megatrends, Inc.         **
#**                                                                  **
#**                       All Rights Reserved.                       **
#**                                                                  **
#**      5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093        **
#**                                                                  **
#**                       Phone: (770)-246-8600                      **
#**                                                                  **
#**********************************************************************
#**********************************************************************

#**********************************************************************
# $Header: /Alaska/BIN/Core/Rules.mak 83    11/03/11 2:21p Felixp $
#
# $Revision: 83 $
#
# $Date: 11/03/11 2:21p $
#**********************************************************************
# Revision History
# ----------------
# $Log: /Alaska/BIN/Core/Rules.mak $
# 
# 83    11/03/11 2:21p Felixp
# [TAG]  		EIP61003
# [Category]  	Improvement
# [Description]  	Support for setting of the debug parameters when
# DEBUG_MODE is 0.
# 
# 82    11/03/11 12:27p Felixp
# [TAG]  		EIP74554 
# [Category]  	Improvement
# [Description]  	Support generation of the assembly listing file.
# [Files]  		Core.sdl, Rules.mak
# 
# 81    10/27/11 3:27p Felixp
# Improvement:
# Make sure all externally callable targets have dependency from the
# $(DIRS), 
# which is a list of targets that create intermediate file directories.
# 
# 80    6/27/11 5:36p Felixp
# 1. DUAL_INSTANCE_LIBRARIES_BUILD_DIR macro is added.
# 2. Use PEI instance of AmiCspLib when PEI components are built
# 
# 79    6/16/11 9:12a Felixp
# Enhancements: 
# 1. Make sure $(BUILD_DIR)\$(NAME)CcOptions.txt is regenerated during
# every build.
# 2. Define SMM_BUILD macro during the compilation of PI SMM drivers (SMM
# and Combined DXE/SMM).
# 
# 78    2/05/11 1:44p Artems
# Added PI 1.1 support (SMM driver build rules)
# 
# 77    11/17/10 11:09a Felixp
# New Rules.mak parameter MY_SDBS is added. 
# It can be used to extend list of module's SDB files. 
# The list of module's SDB files is a concatenation of the 
# list of SDB files generated from module's UNI files and MY_SDB files. 
# The MY_SDB macro has to be in the format -db <sdb-file>. 
# For example, "MY_SDBS=-db $(BUILD_DIR)\S1.sdb -db $(BUILD_DIR)\S1.sdb"
# 
# 76    6/09/10 11:04p Felixp
# Command to delete .i files after VFR processing is removed.
# It is no longer needed because updated VFR compiler is no longer
# placing 
# .i files into the project root directory.
# 
# 75    6/09/10 10:44p Felixp
# New build type RESOURCES is added to rules.mak. 
# The type is used to build only HII resources of the component.
# 
# 74    5/07/10 12:41p Felixp
# PEI_PHASE and DXE_PAHSE macros are renamed to PEI_BUILD and DXE_BUILD
# 
# 73    5/07/10 12:22p Felixp
# Predefined PEI_PHASE and DXE_PHASE macros are added.
# The macros can be used in the in the source code that used in PEI and
# DXE to 
# implemented phase specific behavior.
# 
# 72    3/19/10 6:02p Felixp
# Support USE_CC_RESPONSE_FILE for GUID_LIBRARY builds.
# 
# 71    3/18/10 5:49p Felixp
# Bug fix in USE_LINKER_RESPONSE_FILE processing
# 
# 70    3/18/10 5:23p Felixp
# Bug fix in USE_CC_RESPONSE_FILE processing
# 
# 69    3/18/10 5:12p Felixp
# New SDL token USE_CC_RESPONSE_FILE is added.
# When this token is enabled, all C-compiler(CC) options are passed via
# the response file. 
# The token should be enabled when the length of the CC command line
# exceeds 
# the maximum supported limit. The token is disabled by default.
# 
# 68    2/23/10 8:28p Felixp
# String Override Support(EIP 32696).
# Rules.mak is updated to run .uni file processing utility (StrGather)
# with the special -override flag. The flag instructs the utility to use
# last instance of the string, if more than one instance is available. 
# NOTE: This feature requires new version of the Tools module
# (4.5.5_Tools_30 or newer).
# 
# 67    11/13/09 5:05p Felixp
# Don't generate debug information for components of type BINARY.
# 
# 66    11/06/09 9:24a Felixp
# 1. PE32-based .bin Files Support
#   New built type BINARY is added. 
#   The type is used to generate FFS files containing raw binary data. 
#   The binary file is created from the PE32/PE32+ file by stripping the
# headers. 
#   NOTE: This feature requires new version of the Tools module. 
# 2. New SDL token USE_LINKER_RESPONSE_FILE is added.
#   When this token is enabled, all linked options are passed via the
# response file. 
#   The token should be enabled when the length of the linker command
# line exceeds 
#   the maximum supported limit. The token is disabled by default.
# 
# 64    10/09/09 5:11p Felixp
# UEFI 2.1-related changes.
# 
# 63    5/04/09 2:00p Felixp
# Support for alternative font data packaging(EIP 18489) is added.
# Description: Build process is updated to provide framework that can be
# used to 
# overwrite default packaging of the font data.
# Two new SDL tokens are created:
# "LANGUAGE_FONT_LIST" - Space separated list of language identifiers. 
# The fonts for these languages will be included into the ROM image.
# "STRING_PACK_POST_PROCESS_COMMAND" - The token defines command 
# used in rules.mak to perform additional processing of 
# module's HII string pack ($(BUILD_DIR)$(NAME)Str.hpk) 
# after standard processing (performed by StrGather utility) is
# completed.
# 
# 62    3/05/09 9:52a Felixp
# Minor bug fix: Dual mode libraries (libraries with PEI and DXE
# instances) INIT_LIST problem. 
# Description: Compilation of the dual mode libraries with 
#   INIT_LIST in x64 mode (x64_SUPPORT=1) was failing.
# Symptoms: Build fails with "Don't know how to build Build\IA32\Token.h"
# error.
# Details: $(BUILD_DIR)\Token.h replaced with $(BUILD_ROOT)\Token.h
# 
# 61    1/02/09 12:49p Felixp
# C preprocessor copyright message is suppressed.
# 
# 60    12/16/08 3:50p Felixp
# Support for "Step out" operation in the debugger.
#   x64 debuggers implemen "Step out" operation using exception directory
# within PE32+ image. 
#   In previous versions of the Core exception directory was stripped out
# by the build process to reduce PE32 image size. 
#   Current version of the code preserves exception directory when
# generation of debug informataon is enabled (DEBUG_INFO token is set to
# "on"). 
# 
# 59    10/31/08 11:22a Felixp
# 
# 58    10/22/08 3:57p Felixp
# Some of the linker warnings are eliminated (.efi files are no longer
# built as .dll files. They are built as .exe files).
# 
# 57    10/10/08 9:51a Felixp
# 
# 56    10/10/08 9:50a Felixp
#  - Component VFR files were compiled when HAS_RESOURCES was set to zero
#  - Workaround for ML64 added
# 
# 55    5/09/08 5:05p Felixp
# Minor bug fix: Rules.mak based build of the componentns with .efi files
# did not work.
# 
# 54    12/14/07 12:38p Felixp
# 
# 53    12/14/07 12:30p Felixp
# DEST_DIR usage removed (DEST_DIR is not defined by cif2mak if more than
# one cif file used).
# 
# 52    10/22/07 6:11p Felixp
# New FFS_ALIGNMENT switch added to support FFS data alignment
# 
# 51    9/05/07 6:49p Felixp
# Disable debugging features is DEBUG_MODE is zero
# 
# 50    9/05/07 1:42a Felixp
# 1. Debugging-related tokens updated to use boolean tokens instead of
# enumeration
# 2. Support for ROM_IMAGE_SIZE is added.
# 
# 49    8/02/07 1:27a Felixp
# 
# 48    6/01/07 2:53p Felixp
# TE image support added. (PE_IMAGE_FORMAT macro that is used to
# supppress TE image generation passed to FFS.mak)
# 
# 47    3/30/07 4:43p Felixp
# Support for FFS_CHECKSUM added to control FFS checksum generation.
# 
# 46    3/13/07 9:54a Felixp
# Global and CPU architecture specific macros are now passed 
# to C preprocessor (used during DepEx and VFR compilation)
# 
# 45    2/23/07 2:30p Felixp
# Support for custom string consumers added (MY_STRING_CONSUMERS).
# 
# 44    12/28/06 6:24p Felixp
# Support for 32-bit C compiler from Windows Server 2003 SP1 DDK
# (3790.1830) added
# 
# 43    11/11/06 11:47a Felixp
# Support for date/time stamps(All executables generated with the
# identical date/time stamp)
# 
# 36    10/03/06 8:56a Felixp
# Support for a build family specific build rules.
# MY_DEFINES macro added to list all module specific macro definitions
# 
# 35    9/26/06 9:01a Felixp
# Multilanguage support added. New FontTool is required.
# 
# 34    9/07/06 1:48p Felixp
# 
# 33    8/24/06 9:06a Felixp
# Preliminary x64 support (work in progress)
# 
# 32    7/14/06 9:55a Pavell
# 
# 31    6/22/06 2:55p Andriyn
# Fix EDK modules compiling
# 
# 30    5/19/06 6:14p Felixp
# 1. Support for EDK-based modules added.
# 2. MY_INCLUDES macro added to specify list of include directories
# 
# 28    5/12/06 3:07p Felixp
# EDK support added
# 
# 25    3/30/06 6:05p Felixp
# Support for compiler version auto-detection added.
# 
# 24    2/24/06 2:43p Felixp
# 
# 23    2/23/06 6:44p Felixp
# Change in string handling. Skip source scanning if STRING_CONSUMERS is
# blank.
# This is needed to support binary modules with strings.
# 
# 22    7/29/05 4:16p Robert
# Updated Init Parts rule to allow use in libraries
# 
# 20    7/14/05 6:36p Felixp
# SDL tokens for ECHO and DEL added
# 
# 18    6/17/05 3:25p Felixp
# Setup support: sd files handling
# 
# 17    6/16/05 10:42a Felixp
# 1. Tokens.c added. It has variables representing SDL tokens.
# 2. InitList.c extended to support 2 init lists
# 
# 15    5/24/05 12:47a Felixp
# ignore unsupported languages
# 
# 14    5/23/05 6:01p Felixp
# CreateSdb target added
# STRING_TOKEN definition added to avery StrToken.h
# FFS file dependecies from RAWFILE and SECTION added
# 
# 12    4/08/05 7:40a Felixp
# strings
# 
# 11    4/04/05 4:54p Felixp
# dependency fix in .uni files processing
# 
# 10    3/28/05 7:03p Felixp
# 
# 9     3/28/05 7:02p Felixp
# del command to delete .i files
# 
# 8     3/22/05 10:31p Felixp
# support for EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER added
# 
# 5     3/17/05 1:26p Felixp
# processing of multiple .uni files added
# 
# 2     3/02/05 5:27p Felixp
# Support for resources (strings, forms, fonts, etc.) added
# 
# 5     1/20/05 11:34a Felixp
# support for prebuilt objects, libraries and .efi files
# 
# 4     1/18/05 3:21p Felixp
# PrintDebugMessage renamed to Trace
# 
# 2     12/24/04 2:39p Felixp
# 
# 1     12/23/04 9:41a Felixp
# 
# 7     12/15/04 9:06p Felixp
# LegacyBoot application added
# Minor build process improvements
# 
# 6     11/01/04 7:59a Felixp
# 
#**********************************************************************
#<AMI_FHDR_START>
#
# Name:	Rules.mak
#
# Description:	Build Rules Template
#
#<AMI_FHDR_END>
#**********************************************************************
.SUFFIXES: .asm .c .vfr .dll .uni

!IFNDEF BUILD_ROOT
BUILD_ROOT=$(BUILD_DIR)
!ELSEIFNDEF BUILD_DIR
BUILD_DIR=$(BUILD_ROOT)
!ENDIF

!INCLUDE $(BUILD_ROOT)\token.mak
!INCLUDE $(BUILD_ROOT)\timestamp.mak
!INCLUDE Core\Languages.mak
!IF EXIST ($(BUILD_ROOT)\selectivedebugmodules.mak)
!INCLUDE $(BUILD_ROOT)\selectivedebugmodules.mak
!ENDIF

EXTRA_INCLUDES=$(MY_INCLUDES) $(EXTRA_INCLUDES)
EXTRA_DEFINES=$(MY_DEFINES) $(EXTRA_DEFINES)

FINAL_CFLAGS=$(CFLAGS) $(EXTRA_CFLAGS) $(FORCE_INCLUDE)
FINAL_LFLAGS=$(LFLAGS) $(EXTRA_LFLAGS)
FINAL_AFLAGS=$(AFLAGS) $(EXTRA_AFLAGS)
FINAL_AFLAGS16=$(AFLAGS16) $(EXTRA_AFLAGS16)
LIBFLAGS=/NOLOGO
#C preprocessor flags (used by DepEx parser and VFR compiler)
CPFLAGS=/nologo $(GLOBAL_DEFINES) $(EXTRA_DEFINES) $(EXTRA_INCLUDES)

#Check if this is a PEI module or DXE module
!IF "$(TYPE)"=="PEIM"||"$(TYPE)"=="PEI_CORE"||"$(TYPE)"=="PEI_LIBRARY"||"$(TYPE)"=="PEI_GUID_LIBRARY"
COMPONENT_BUILD_RULES=PEI
EXTRA_CFLAGS=$(EXTRA_CFLAGS) /DPEI_BUILD
DUAL_INSTANCE_LIBRARIES_BUILD_DIR=$(BUILD_ROOT)\IA32
!ELSE
COMPONENT_BUILD_RULES=DXE
EXTRA_CFLAGS=$(EXTRA_CFLAGS) /DDXE_BUILD
!IF "$(TYPE)"=="SMM_DRIVER"||"$(TYPE)"=="DXESMM_DRIVER"
EXTRA_CFLAGS=$(EXTRA_CFLAGS) /DSMM_BUILD
DUAL_INSTANCE_LIBRARIES_BUILD_DIR=$(BUILD_ROOT)
!ENDIF
!ENDIF

!IF "$(DEBUG_MODE)"!="1"
# Debugging is disabled.
# Use release mode settings 
# (unless debug flags have been defined for the release mode)
!IFNDEF OPTIMIZATION
OPTIMIZATION=1
!ENDIF
!IFNDEF DEBUG_INFO
DEBUG_INFO=0
!ENDIF
!IFNDEF DEBUG_CODE
DEBUG_CODE=0
!ENDIF
COMPONENT_OPTIMIZATION=$(OPTIMIZATION)
COMPONENT_DEBUG_INFO=$(DEBUG_INFO)
COMPONENT_DEBUG_CODE=$(DEBUG_CODE)
!ELSEIF "$(SELECTIVE_DEBUG_ENABLE)"=="1"
COMPONENT_OPTIMIZATION=$(SELECTIVE_OPTIMIZATION)
COMPONENT_DEBUG_INFO=$(SELECTIVE_DEBUG_INFO)
COMPONENT_DEBUG_CODE=$(SELECTIVE_DEBUG_CODE)
!ELSEIF "$(COMPONENT_BUILD_RULES)"=="PEI" && "$(INDEPENDENT_PEI_DEBUG_SETTINGS)"=="1"
COMPONENT_OPTIMIZATION=$(PEI_OPTIMIZATION)
COMPONENT_DEBUG_INFO=$(PEI_DEBUG_INFO)
COMPONENT_DEBUG_CODE=$(PEI_DEBUG_CODE)
!ELSE
COMPONENT_OPTIMIZATION=$(OPTIMIZATION)
COMPONENT_DEBUG_INFO=$(DEBUG_INFO)
COMPONENT_DEBUG_CODE=$(DEBUG_CODE)
!ENDIF

#Set debug mode specific flags
#1. Optimization
!IF "$(COMPONENT_OPTIMIZATION)"=="1"
EXTRA_CFLAGS=$(EXTRA_CFLAGS) /O1
!ENDIF
#2. Debug information
!IF "$(COMPONENT_DEBUG_INFO)"=="1" && "$(TYPE)"!="BINARY"
EXTRA_CFLAGS=$(EXTRA_CFLAGS) /Fd$(BUILD_DIR)\ /Zi /Gm
EXTRA_LFLAGS=$(EXTRA_LFLAGS) /MAP /DEBUG /PDB:$*.pdb
EXTRA_AFLAGS=$(EXTRA_AFLAGS) /Zi /Zf /Zd
!ENDIF
#3. Debug code
!IF "$(COMPONENT_DEBUG_CODE)"=="1"
EXTRA_CFLAGS=$(EXTRA_CFLAGS) /DEFI_DEBUG
EXTRA_AFLAGS=$(EXTRA_AFLAGS) /DDEBUG /DEFI_DEBUG
!ENDIF
#Done setting debug mode specific flags

!IF "$(PROCESSOR_RULES)"!=""
!INCLUDE $(PROCESSOR_RULES)
MAKEFILES=$(MAKEFILES) $(PROCESSOR_RULES)
!ENDIF

!IF "$(FAMILY_RULES)"!=""
!INCLUDE $(FAMILY_RULES)
MAKEFILES=$(MAKEFILES) $(FAMILY_RULES)
#This is here for backward compatibility/
#Old labels of EDK module need this
!ELSEIF "$(FAMILY)"=="EDK"
EXTRA_CFLAGS=$(EXTRA_CFLAGS) /X $(EDK_INCLUDES)
!ENDIF

!IFNDEF MAKEFILE
MAKEFILE=$(BUILD_ROOT)\$(NAME).mak
!ENDIF
MAKEFILES=$(MAKEFILES) $(MAKEFILE)

!IFNDEF FFS_FILE
FFS_FILE=$(BUILD_ROOT)\$(NAME).ffs
!ENDIF

!IFNDEF LIB_BUILD_DIR
LIB_BUILD_DIR=$(BUILD_DIR)
!ENDIF

!IF "$(TYPE)"=="PEI_DXE_LIBRARY"
all:
	$(MAKE) /$(MAKEFLAGS)\
        /f $(MAKEFILE) all\
		TYPE=LIBRARY $(PARAMETERS)
!IF DEFINED(CCPEI) && "$(CCPEI)"!="$(CC)"
	$(MAKE) /$(MAKEFLAGS) BUILD_DIR=$$(LIB_BUILD_DIR)\
		/f $(MAKEFILE) all\
		TYPE=PEI_LIBRARY $(PARAMETERS)
!ENDIF
!ENDIF

!IF "$(TYPE)"=="LEGACY16"
.SOURCEGRULE .asm.obj
	$(ASM16) $(FINAL_AFLAGS16) /Fo$D\ $<
!ELSE
#Workaround for ML64
#If ML64 absolute path contains spaces,
#it fails to process multiple files.
#To workaround the issue, group file processing is disabled for ML64
!IF "$(PROCESSOR)"=="x64"
.SOURCERULE .asm.obj
	$(ASM) $(FINAL_AFLAGS) /Fo$D\ $<
!ELSE
.SOURCEGRULE .asm.obj
	$(ASM) $(FINAL_AFLAGS) /Fo$D\ $<
!ENDIF
!ENDIF

!IF "$(USE_CC_RESPONSE_FILE)"=="1"
CC_COMMAND_LINE=@$(BUILD_DIR)\$(NAME)CcOptions.txt
!ELSE
CC_COMMAND_LINE=$(FINAL_CFLAGS) $(EXTRA_DEFINES) $(EXTRA_INCLUDES)
!ENDIF
!IF "$(GENERATE_CC_LISTING_FILE)"=="1"
.SOURCEGRULE .c.obj
	$(CC) $(CC_COMMAND_LINE) /Fa$D\ /FAs /Fo$D\ $<
!ELSE
.SOURCEGRULE .c.obj
	$(CC) $(CC_COMMAND_LINE) /Fo$D\ $<
!ENDIF

.SOURCERULE .vfr.hpk
	$(VFRCOMPILE) -ppflag "/EP $(CPFLAGS)" -od $D -ibin -i INCLUDE -i Build -i $(PROJECT_DIR) $(VFR_INCLUDES) $<

STRGATHER_PARSE_FLAGS=-i INCLUDE -parse -newdb -db $@ $<
!IFDEF UNI_INCLUDE_PATH
STRGATHER_PARSE_FLAGS=-i $(UNI_INCLUDE_PATH) $(STRGATHER_PARSE_FLAGS)
!ENDIF
.SOURCERULE .uni.sdb
	$(STRGATHER) $(STRGATHER_PARSE_FLAGS)

!IF "$(TYPE)"=="SDB" || "$(TYPE)"=="RESOURCES"
HAS_RESOURCES=1
!ENDIF

!IFNDEF OBJECTS
.SOURCEVAR OBJECTS=.obj(.c,.asm)
!ENDIF
!IFNDEF HEADERS
.SOURCEVAR HEADERS=.h
!ENDIF
!IFNDEF DEPEX1
.SOURCEVAR DEPEX1=.dxs
!ENDIF
!IFNDEF LIBRARIES
.SOURCEVAR LIBRARIES=.lib
!ENDIF
!IFNDEF PRECOMPILED_OBJS
.SOURCEVAR PRECOMPILED_OBJS=.obj
!ENDIF
!IFNDEF EFI_FILE
.SOURCEVAR EFI_FILE=.efi
!ENDIF

!IF !DEFINED(SDB_FILES) && "$(HAS_RESOURCES)"=="1"
.SOURCEVAR SDB_FILES=.sdb(.uni)
!ENDIF
!IFNDEF STRGATHER_FLAGS
.SOURCEVAR STRGATHER_FLAGS=.sdb(.uni) : -db $F
!ENDIF
!IF !DEFINED(VFR_PACKS) && "$(HAS_RESOURCES)"=="1"
.SOURCEVAR VFR_PACKS=.hpk(.vfr)
!ENDIF
!IFNDEF STRING_CONSUMERS
STRING_CONSUMERS = $(MY_STRING_CONSUMERS)
.SOURCEVAR CFILES=.c
.SOURCEVAR VFRFILES=.vfr
.SOURCEVAR SDFILES=.sd
!IF "$(CFILES)"!=""
STRING_CONSUMERS=$(STRING_CONSUMERS) $(CFILES)
!ENDIF
!IF "$(VFRFILES)"!=""
STRING_CONSUMERS=$(STRING_CONSUMERS) $(VFRFILES)
!ENDIF
!IF "$(SDFILES)"!=""
STRING_CONSUMERS=$(STRING_CONSUMERS) $(SDFILES)
!ENDIF
!ENDIF

HEADERS=$(HEADERS) $(EXT_HEADERS)
ALL_EXT_OBJS_TMP=$(EXT_OBJS) $(LIBRARIES) $(PRECOMPILED_OBJS)
!IF "$(COMPONENT_BUILD_RULES)"=="PEI" && EXIST (Build\IA32\AmiCSPLib.lib)
ALL_EXT_OBJS=$(ALL_EXT_OBJS_TMP:Build\AmiCSPLib.lib=Build\IA32\AmiCSPLib.lib)
!ELSE
ALL_EXT_OBJS=$(ALL_EXT_OBJS_TMP)
!ENDIF
PACKS = $(VFR_PACKS)

!IF "$(OBJECTS)"!=""
$(OBJECTS) : $(HEADERS) $(MAKEFILES)
!ENDIF

!IF "$(VFR_PACKS)"!=""
$(VFR_PACKS) : $(HEADERS) $(MAKEFILES)
!ENDIF

!IF "$(SDB_FILES)"!=""
$(SDB_FILES) : $(HEADERS) $(MAKEFILES)
!ENDIF

!IF "$(TYPE)"=="BS_DRIVER"
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
FV_TYPE=EFI_FV_FILETYPE_DRIVER
PE_TYPE=$(TYPE)
DEPEX1_TYPE=EFI_SECTION_DXE_DEPEX
!ELSEIF "$(TYPE)"=="RT_DRIVER"
SUBSYSTEM = EFI_RUNTIME_DRIVER
FV_TYPE=EFI_FV_FILETYPE_DRIVER
PE_TYPE=$(TYPE)
DEPEX1_TYPE=EFI_SECTION_DXE_DEPEX
!ELSEIF "$(TYPE)"=="SMM_DRIVER"
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
FV_TYPE=EFI_FV_FILETYPE_SMM
PE_TYPE=BS_DRIVER
DEPEX1_TYPE=EFI_SECTION_SMM_DEPEX
!ELSEIF "$(TYPE)"=="DXESMM_DRIVER"
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
FV_TYPE=EFI_FV_FILETYPE_COMBINED_SMM_DXE
PE_TYPE=BS_DRIVER
!ELSEIF "$(TYPE)"=="APPLICATION"
SUBSYSTEM = EFI_APPLICATION
FV_TYPE=EFI_FV_FILETYPE_APPLICATION
PE_TYPE=$(TYPE)
!ELSEIF "$(TYPE)"=="PEI_CORE"
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
FV_TYPE=EFI_FV_FILETYPE_PEI_CORE
PE_TYPE=BS_DRIVER
!ELSEIF "$(TYPE)"=="DXE_CORE"
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
FV_TYPE=EFI_FV_FILETYPE_DXE_CORE
PE_TYPE=BS_DRIVER
!ELSEIF "$(TYPE)"=="SMM_CORE"
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
FV_TYPE=EFI_FV_FILETYPE_SMM_CORE
PE_TYPE=BS_DRIVER
DEPEX1_TYPE=EFI_SECTION_DXE_DEPEX
!ELSEIF "$(TYPE)"=="PEIM"
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
FV_TYPE=EFI_FV_FILETYPE_PEIM
PE_TYPE=BS_DRIVER
DEPEX1_TYPE=EFI_SECTION_PEI_DEPEX
!ELSEIF "$(TYPE)"=="COMBINED"
SUBSYSTEM=EFI_BOOT_SERVICE_DRIVER
FV_TYPE=EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER
PE_TYPE=BS_DRIVER
!ELSEIF "$(TYPE)"=="LIBRARY" || "$(TYPE)"=="PEI_LIBRARY"
!UNDEF TYPE
TYPE=LIBRARY
!ELSEIF "$(TYPE)"=="PEI_GUID_LIBRARY" || "$(TYPE)"=="GUID_LIBRARY"
!IF "$(TYPE)"=="PEI_GUID_LIBRARY"
FORCE_INCLUDE=/FIPEI.h
!ELSE
FORCE_INCLUDE=/FIEFI.h
!ENDIF
!UNDEF TYPE
TYPE=GUID_LIBRARY
!ELSEIF "$(TYPE)"=="SDB"
!ELSEIF "$(TYPE)"=="RESOURCES"
!ELSEIF "$(TYPE)"=="LEGACY16" || "$(TYPE)"=="BINARY"
FV_TYPE=EFI_FV_FILETYPE_FREEFORM
!IFNDEF BINFILE
BINFILE=$(BUILD_DIR)\$(NAME).bin

bin : $(DIRS) $(BUILD_DIR)\$(NAME).bin

!IF "$(TYPE)"=="BINARY"
$(BUILD_DIR)\$(NAME).bin : $(BUILD_DIR)\$(NAME).dll
    pe2bin $(BUILD_DIR)\$(NAME).dll $(BUILD_DIR)\$(NAME).bin
!ELSE
$(BUILD_DIR)\$(NAME).bin : $(OBJECTS)
	$(ASMLINK) $(ASMLINKFLAGS) $(OBJECTS: =+), $(BUILD_DIR)\$(NAME).exe, $(BUILD_DIR)\$(NAME).map,,,
!IFNDEF POST_PROCESS
	exe2bin $(BUILD_DIR)\$(NAME).exe $(BUILD_DIR)\$(NAME).bin
!ELSE
	exe2bin $(BUILD_DIR)\$(NAME).exe $(BUILD_DIR)\$(NAME)1.bin
	$(POST_PROCESS) $(BUILD_DIR)\$(NAME)1.bin $(BUILD_DIR)\$(NAME).bin
!ENDIF # !IFNDEF POST_PROCESS
!ENDIF # !IF "$(TYPE)"=="BINARY"
!ENDIF # !IFNDEF BINFILE
!ELSEIF "$(TYPE)"=="PEI_DXE_LIBRARY"
!ELSEIF "$(TYPE)"==""
!ERROR Error in the makefile of component $(NAME): 'TYPE' is undefined
!ELSE
!ERROR Error in the makefile of component $(NAME): TYPE $(TYPE) is unsupported
!ENDIF

!IF "$(TYPE)"=="BINARY"
EXTRA_LFLAGS = $(EXTRA_LFLAGS) /NOENTRY /FIXED
!ELSE
EXTRA_LFLAGS = $(EXTRA_LFLAGS) /ENTRY:$(ENTRY_POINT)
!ENDIF

# Linkers newer than VC6 can directly generate .efi files.
# However, we use FWIMAGE to generate .efi files because
# FWIMAGE can set date/time stamp to a predefined value
# This is useful for baniray reproducibility of the BIOS
!IF "$(COMPONENT_DEBUG_INFO)"=="1"
FWIMAGE_KEEP_EXCEPTION_TABLE=-e
!ENDIF

{$(BUILD_DIR)}.dll{$(BUILD_DIR)}.efi:
	$(FWIMAGE) -t $(TODAY),$(NOW) $(FWIMAGE_KEEP_EXCEPTION_TABLE) $(PE_TYPE) $< $@

!IF "$(TYPE)"=="APPLICATION" && "$(BUILD_FFS)"!="1"
all : $(BUILD_DIR)\$(NAME).efi
!ELSEIF "$(TYPE)"=="LIBRARY" || "$(TYPE)"=="GUID_LIBRARY"
!IFNDEF LIBRARY_NAME
LIBRARY_NAME=$(BUILD_DIR)\$(NAME).lib
!ENDIF
all : $(LIBRARY_NAME)

!IF "$(TYPE)"=="GUID_LIBRARY"
$(LIBRARY_NAME) : $(HEADERS)
	$(SILENT)if not exist $(BUILD_DIR)\$(@B) md $(BUILD_DIR)\$(@B)
!IF "$(USE_CC_RESPONSE_FILE)"=="1"
	$(CC) @<<$(BUILD_DIR)\$(NAME)CcOptions.txt
$(FINAL_CFLAGS) $(EXTRA_DEFINES) $(EXTRA_INCLUDES) /TC /DGUID_VARIABLE_DEFINITION /Fo$(BUILD_DIR)\$(@B)\\ $**
<<KEEP
!ELSE
	$(CC) $(FINAL_CFLAGS) $(EXTRA_DEFINES) $(EXTRA_INCLUDES) /TC /DGUID_VARIABLE_DEFINITION /Fo$(BUILD_DIR)\$(@B)\\ $**
!ENDIF
	$(SILENT)cd $(BUILD_DIR)\$(@B)
	$(LIBEXE) $(LIBFLAGS) /OUT:$(PROJECT_DIR)\$@ $(**F:.h=.obj)
	$(SILENT)cd $(MAKEDIR)
!ENDIF
!ELSEIF "$(TYPE)"=="SDB"
all : CreateSdb
!ELSEIF "$(TYPE)"=="RESOURCES"
all : CreateAllPacks
!ELSEIF "$(TYPE)"=="PEI_DXE_LIBRARY"
!ELSE
all : $(FFS_FILE)
!ENDIF

# Strings and VFRs processing
!IF "$(SDB_FILES)"!=""
!IF "$(OBJECTS)"!=""||"$(VFR_PACKS)"!=""
$(OBJECTS) $(VFR_PACKS) : $(BUILD_DIR)\$(NAME)StrTokens.h
!ENDIF

PACKS=$(BUILD_DIR)\$(NAME)Str.hpk $(PACKS)
STRGATHER_DUMP_FLAGS=-dump -lang $(SUPPORTED_LANGUAGES: = -lang ) -bn $(NAME) -hpk $(BUILD_DIR)\$(NAME)Str.hpk -oh $(BUILD_DIR)\$(NAME)StrTokens.h -override

CreateSdb : $(DIRS) $(SDB_FILES) $(STRING_CONSUMERS)
!IF "$(STRING_CONSUMERS)"!=""
	$(STRGATHER) -scan $(STRGATHER_FLAGS) $(MY_SDBS) -od $(BUILD_DIR)\$(NAME).sdb $(STRING_CONSUMERS)
!ENDIF

$(BUILD_DIR)\$(NAME)StrTokens.h $(BUILD_DIR)\$(NAME)Str.hpk : $(DIRS) $(SDB_FILES) $(STRING_CONSUMERS)
!IF "$(STRING_CONSUMERS)"==""
    $(STRGATHER) $(STRGATHER_DUMP_FLAGS) $(STRGATHER_FLAGS) $(MY_SDBS)
!ELSE
	$(STRGATHER) -scan $(STRGATHER_FLAGS) $(MY_SDBS) -od $(BUILD_DIR)\$(NAME).sdb $(STRING_CONSUMERS)
    $(STRGATHER) $(STRGATHER_DUMP_FLAGS) -db $(BUILD_DIR)\$(NAME).sdb
!ENDIF
	$(ECHO) #ifndef VFRCOMPILE >> $(BUILD_DIR)\$(NAME)StrTokens.h
	$(ECHO) #ifndef STRING_TOKEN >> $(BUILD_DIR)\$(NAME)StrTokens.h
	$(ECHO) #define STRING_TOKEN(x) x >> $(BUILD_DIR)\$(NAME)StrTokens.h
	$(ECHO) #endif >> $(BUILD_DIR)\$(NAME)StrTokens.h
	$(ECHO) #endif >> $(BUILD_DIR)\$(NAME)StrTokens.h
    $(STRING_PACK_POST_PROCESS_COMMAND)
!ENDIF

CreateAllPacks : $(DIRS) $(PACKS)

!IF "$(PACKS)"!=""
!IF	"$(ITK_SUPPORT)"=="1"
$(FFS_FILE) : $(BUILD_DIR)\$(NAME).hii

$(BUILD_DIR)\$(NAME).hii: $(PACKS)
	$(HIIPACK)	create -g $(GUID) -p $(PACKS) -o $(BUILD_DIR)\$(NAME).hii
!ENDIF
!IF "$(EMBEDDED_RESOURCES)"=="1"
EXTRA_LFLAGS = $(EXTRA_LFLAGS) $(BUILD_DIR)\$(NAME)Resources.obj
$(BUILD_DIR)\$(NAME).dll : $(BUILD_DIR)\$(NAME)Resources.obj
$(BUILD_DIR)\$(NAME)Resources.obj : $(PACKS)
	$(AMIRC) /j /o$@ $**
!ELSE
SECTION=$(NAME)Resources.sec
$(FFS_FILE) : $(BUILD_DIR)\$(NAME)Resources.sec
$(BUILD_DIR)\$(NAME)Resources.sec : $(PACKS)
	$(AMIRC) /s /o$@ $**
!ENDIF
!ENDIF

# sources have priority over the binary
!IF "$(TYPE)"!="LEGACY16" && "$(TYPE)"!="BINARY" && ("$(EFI_FILE)"==""||"$(OBJECTS)"!=""||"$(ALL_EXT_OBJS)"!="  ")
!UNDEF EFI_FILE
EFI_FILE=$(BUILD_DIR)\$(NAME).efi
!ENDIF

efi : $(DIRS) $(EFI_FILE)

!IFDEF RAWFILE
FFS_DEPS=$(FFS_DEPS) $(PROJECT_DIR)\$(RAWFILE)\
!ENDIF
!IFDEF SECTION
FFS_DEPS=$(FFS_DEPS)  $(BUILD_DIR)\$(SECTION)\
!ENDIF

$(FFS_FILE) : $(EFI_FILE) $(MAKEFILES) Core\FFS.mak $(DEPEX1) $(DEPEX2) $(BINFILE) $(FFS_DEPS)
	$(MAKE) /$(MAKEFLAGS) /f Core\FFS.mak \
		NAME=$(NAME) \
		BUILD_DIR=$(BUILD_ROOT) SOURCE_DIR=$(SOURCE_DIR) \
		GUID=$(GUID) \
		TYPE=$(FV_TYPE) \
		FFSFILE=$@ COMPRESS=$(COMPRESS) \
        "EXTRA_DEFINES=$(EXTRA_DEFINES)" "EXTRA_INCLUDES=$(EXTRA_INCLUDES)" "CPFLAGS=$(CPFLAGS)"\
!IF "$(EFI_FILE)"!=""
		PEFILE=$(EFI_FILE) \
!ENDIF
!IF "$(DEPEX1)"!=""
		DEPEX1=$(DEPEX1) DEPEX1_TYPE=$(DEPEX1_TYPE) \
!ENDIF
!IFDEF DEPEX2
		DEPEX2=$(DEPEX2) DEPEX2_TYPE=$(DEPEX2_TYPE) \
!ENDIF
!IFDEF BINFILE
		BINFILE=$(BINFILE) \
!ENDIF
!IFDEF RAWFILE
		RAWFILE=$(RAWFILE) \
!ENDIF
!IFDEF SECTION
		SECTION=$(SECTION) \
!ENDIF
!IFDEF FFS_CHECKSUM
        FFS_CHECKSUM=$(FFS_CHECKSUM) \
!ENDIF
!IFDEF FFS_ALIGNMENT
        FFS_ALIGNMENT=$(FFS_ALIGNMENT) \
!ENDIF
!IFDEF PE_IMAGE_FORMAT
        PE_IMAGE_FORMAT=$(PE_IMAGE_FORMAT) \
!ENDIF

!IFDEF INIT_LIST
INIT_LIST_DEFINES=/D"INIT_LIST=$(INIT_LIST)"
!IFDEF INIT_LIST2
INIT_LIST_DEFINES=$(INIT_LIST_DEFINES) /D"INIT_LIST2=$(INIT_LIST2)"
!ENDIF
!IF "$(TYPE)"=="LIBRARY"
$(LIBRARY_NAME) : $(BUILD_DIR)\$(NAME)_INIT_LIST.obj
LIBFLAGS = $(LIBFLAGS) $(BUILD_DIR)\$(NAME)_INIT_LIST.obj
!ELSE
EXTRA_LFLAGS = $(EXTRA_LFLAGS) $(BUILD_DIR)\$(NAME)_INIT_LIST.obj
$(BUILD_DIR)\$(NAME).dll : $(BUILD_DIR)\$(NAME)_INIT_LIST.obj
!ENDIF # !IF "$(TYPE)"=="LIBRARY"
$(BUILD_DIR)\$(NAME)_INIT_LIST.obj : $(PROJECT_DIR)\Core\InitList.c $(BUILD_ROOT)\token.h
	$(CC) $(FINAL_CFLAGS) $(INIT_LIST_DEFINES) /Fo$@ $(PROJECT_DIR)\Core\InitList.c
!ENDIF # !IFDEF INIT_LIST

#We no longer need build-through-lib mode.
#Let's keep IF statement is case we will want to change it in the future
#!IF "$(BUILD_BASE_LIB)"=="1" && "$(OBJECTS)"!=""
#$(BUILD_DIR)\$(NAME)Base.lib : $(OBJECTS)
#	$(LIBEXE) $(LIBFLAGS) /OUT:$@ $(OBJECTS)
#$(BUILD_DIR)\$(NAME).dll :  $(BUILD_DIR)\$(NAME)Base.lib $(ALL_EXT_OBJS) $(MAKEFILE)
#	$(LINK) $(FINAL_LFLAGS) $(BUILD_DIR)\$(NAME)Base.lib $(ALL_EXT_OBJS)
#!ELSE
!IF "$(USE_CC_RESPONSE_FILE)"=="1"
$(BUILD_DIR)\$(NAME).dll : $(BUILD_DIR)\$(NAME)CcOptions.txt

# This target is required to make sure 
# $(BUILD_DIR)\$(NAME)CcOptions.txt is regenerated during every build 
CcOptionsPhonyTargetWithTheLongName:

$(BUILD_DIR)\$(NAME)CcOptions.txt : CcOptionsPhonyTargetWithTheLongName
    $(SILENT)copy << $@
$(FINAL_CFLAGS) $(EXTRA_DEFINES) $(EXTRA_INCLUDES)
<<
!ENDIF
$(BUILD_DIR)\$(NAME).dll : $(OBJECTS) $(ALL_EXT_OBJS) $(MAKEFILES)
!IF "$(USE_LINKER_RESPONSE_FILE)"=="1"
	$(LINK) @<<$(BUILD_DIR)\$(NAME)LinkerOptions.txt
$(FINAL_LFLAGS) $(OBJECTS) $(ALL_EXT_OBJS)
<<KEEP
!ELSE
	$(LINK) $(FINAL_LFLAGS) $(OBJECTS) $(ALL_EXT_OBJS)
!ENDIF
#!ENDIF
!IF "$(TYPE)"=="LIBRARY"
!IF "$(USE_CC_RESPONSE_FILE)"=="1"
$(LIBRARY_NAME) : $(BUILD_DIR)\$(NAME)CcOptions.txt
!ENDIF
$(LIBRARY_NAME) : $(OBJECTS) $(ALL_EXT_OBJS)
!IF "$(USE_LINKER_RESPONSE_FILE)"=="1"
	$(LIBEXE) @<<$(BUILD_DIR)\$(NAME)LibOptions.txt
$(LIBFLAGS) /OUT:$@ $(OBJECTS) $(ALL_EXT_OBJS)
<<KEEP
!ELSE
	$(LIBEXE) $(LIBFLAGS) /OUT:$@ $(OBJECTS) $(ALL_EXT_OBJS)
!ENDIF
!ENDIF
!IF EXIST ($(BUILD_ROOT)\targets.mak)
!INCLUDE $(BUILD_ROOT)\targets.mak
!ENDIF
#**********************************************************************
#**********************************************************************
#**                                                                  **
#**        (C)Copyright 1985-2011, American Megatrends, Inc.         **
#**                                                                  **
#**                       All Rights Reserved.                       **
#**                                                                  **
#**      5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093        **
#**                                                                  **
#**                       Phone: (770)-246-8600                      **
#**                                                                  **
#**********************************************************************
#**********************************************************************