📄 genmake.c
字号:
fprintf (FpOut, "\n");
}
fprintf (FpOut, "\n");
// Append to build object list
if (!IsListEmpty (&FileList->C)) {
fprintf (FpOut, "OBJECTS = $(OBJECTS) \\\n");
for (Link=FileList->C.Flink; Link != &FileList->C; Link=Link->Flink) {
FInfo = CONTAINING_RECORD (Link, A_FILE, Link);
fprintf (FpOut, " $(BUILD_DIR)\\%s%s.obj \\\n", FInfo->ProcDir, FInfo->Filename);
}
}
fprintf (FpOut, "\n\n");
// Each ASM file depends on each OBJ file
for (Link=FileList->A.Flink; Link != &FileList->A; Link=Link->Flink) {
FInfo = CONTAINING_RECORD (Link, A_FILE, Link);
fprintf (FpOut, "$(BUILD_DIR)\\%s%s.obj : $(SOURCE_DIR)\\%s%s.asm $(INC_DEPS)\n",
FInfo->ProcDir, FInfo->Filename,
FInfo->ProcDir, FInfo->Filename
);
fprintf (FpOut, " $(MASM) $(MASM_FLAGS) $(MODULE_MASMFLAGS) /Fo$@ $(SOURCE_DIR)\\%s%s.asm\n",
FInfo->ProcDir, FInfo->Filename
);
fprintf (FpOut, "\n");
}
fprintf (FpOut, "\n");
// Append to build object list
if (!IsListEmpty (&FileList->A)) {
fprintf (FpOut, "OBJECTS = $(OBJECTS) \\\n");
for (Link=FileList->A.Flink; Link != &FileList->A; Link=Link->Flink) {
FInfo = CONTAINING_RECORD (Link, A_FILE, Link);
fprintf (FpOut, " $(BUILD_DIR)\\%s%s.obj \\\n",
FInfo->ProcDir, FInfo->Filename
);
}
}
fprintf (FpOut, "\n\n");
// Each S file depends on each OBJ file
for (Link=FileList->S.Flink; Link != &FileList->S; Link=Link->Flink) {
FInfo = CONTAINING_RECORD (Link, A_FILE, Link);
fprintf (FpOut, "$(BUILD_DIR)\\%s%s.obj : $(SOURCE_DIR)\\%s%s.s $(INC_DEPS)\n",
FInfo->ProcDir, FInfo->Filename,
FInfo->ProcDir, FInfo->Filename
);
fprintf (FpOut, " $(CC) $(CFLAGS_P) $(SOURCE_DIR)\\%s%s.s > $(BUILD_DIR)\\%s%s.pro\n",
FInfo->ProcDir, FInfo->Filename,
FInfo->ProcDir, FInfo->Filename
);
fprintf (FpOut, " $(ASM) $(AFLAGS) $(MODULE_AFLAGS) $(BUILD_DIR)\\%s%s.pro\n",
FInfo->ProcDir, FInfo->Filename
);
fprintf (FpOut, " del $(BUILD_DIR)\\%s%s.pro\n",
FInfo->ProcDir, FInfo->Filename
);
fprintf (FpOut, "\n");
}
fprintf (FpOut, "\n");
// Append to build object list
if (!IsListEmpty (&FileList->S)) {
fprintf (FpOut, "OBJECTS = $(OBJECTS) \\\n");
for (Link=FileList->S.Flink; Link != &FileList->S; Link=Link->Flink) {
FInfo = CONTAINING_RECORD (Link, A_FILE, Link);
fprintf (FpOut, " $(BUILD_DIR)\\%s%s.obj \\\n",
FInfo->ProcDir, FInfo->Filename
);
}
}
fprintf (FpOut, "\n\n");
}
VOID
DumpIncludeInfo (
IN FILE *FpOut,
IN PUCHAR DirName,
IN FILE_LIST *FileList
)
{
PLIST_ENTRY Link;
A_FILE *FInfo;
fprintf (FpOut, "INC_DEPS = $(INC_DEPS) \\\n");
// Append to INC_DEPS list
if (!IsListEmpty (&FileList->H)) {
for (Link=FileList->H.Flink; Link != &FileList->H; Link=Link->Flink) {
FInfo = CONTAINING_RECORD (Link, A_FILE, Link);
fprintf (FpOut, " $(EFI_SOURCE)\\%s\\%s%s.h \\\n", DirName, FInfo->ProcDir, FInfo->Filename);
}
}
// Append to INC_DEPS list
if (!IsListEmpty (&FileList->INC)) {
for (Link=FileList->INC.Flink; Link != &FileList->INC; Link=Link->Flink) {
FInfo = CONTAINING_RECORD (Link, A_FILE, Link);
fprintf (FpOut, " $(EFI_SOURCE)\\%s\\%s%s.inc \\\n", DirName, FInfo->ProcDir, FInfo->Filename);
}
}
fprintf (FpOut, "\n\n");
}
VOID
DumpHeader (
IN FILE *Fp,
IN PCHAR Line
)
{
fprintf (Fp, "\n");
fprintf (Fp, "#\n");
if (Line) {
fprintf (Fp, "# %s\n", Line);
} else {
fprintf (Fp, "# This is a machine generated file - DO NOT EDIT\n");
fprintf (Fp, "# Generated by genmake.exe from component make.inf\n\n");
fprintf (Fp, "# Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved\n");
fprintf (Fp, "# This software and associated documentation (if any) is furnished\n");
fprintf (Fp, "# under a license and may only be used or copied in accordance\n");
fprintf (Fp, "# with the terms of the license. Except as permitted by such\n");
fprintf (Fp, "# license, no part of this software or documentation may be\n");
fprintf (Fp, "# reproduced, stored in a retrieval system, or transmitted in any\n");
fprintf (Fp, "# form or by any means without the express written consent of\n");
fprintf (Fp, "# Intel Corporation.\n");
}
fprintf (Fp, "#\n");
fprintf (Fp, "\n");
}
PCHAR
LastName (
IN PCHAR FullName
)
{
PCHAR p1, p2;
p2 = FullName;
for (p1=FullName; *p1; p1++) {
if (*p1 == '\\' || *p1 == '/') {
p2 = p1 + 1;
}
}
return p2;
}
VOID
ProcessMakeInfo (
IN PCHAR DirName,
IN ULONG DirLevel
)
{
FILE *FpIn, *FpOut, *FpInc;
BOOLEAN Failed, f, RawMakefile;
UCHAR OutName[MAX_FILE_NAME];
UCHAR OutDir[MAX_FILE_NAME];
UCHAR IncName[MAX_FILE_NAME];
PCHAR LName;
MAKE_INFO MakInfo;
A_LINE *Line;
PLIST_ENTRY Link;
Failed = TRUE;
FpIn = NULL;
FpOut = NULL;
FpInc = NULL;
OutName[0] = 0;
IncName[0] = 0;
RawMakefile = FALSE;
//
// Create out directory
//
sprintf (OutDir, "%s\\output\\%s", BuildDir, DirName);
_mkdir (OutDir);
//
// Open input file
//
FpIn = fopen("make.inf", "r");
if (!FpIn) {
//
// Check for makefile
//
FpIn = fopen("makefile", "r");
if (!FpIn) {
return ;
}
RawMakefile = TRUE;
}
printf ("Processing %s ", DirName);
InitMakeInfo (&MakInfo);
//
// Read input file
//
if (!RawMakefile) {
f = ParseInput (FpIn, &MakInfo);
if (f) {
goto Done;
}
}
//
// Create output name
//
sprintf (OutName, "%s\\makefile", OutDir);
FpOut = fopen (OutName, "w+");
if (!FpOut) {
printf ("Could not create %s\n", OutName);
goto Done;
}
DumpHeader (FpOut, NULL);
//
// If the source is a raw makefile, just copy it
//
if (RawMakefile) {
Failed = CopyFileData (FpIn, FpOut);
goto Done;
}
sprintf (IncName, "%s\\makefile.hdr", OutDir);
FpInc = fopen (IncName, "w+");
if (!FpInc) {
printf ("Could not create %s\n", IncName);
goto Done;
}
DumpHeader (FpInc, NULL);
//
// Write header to output file
//
DumpHeader (FpOut, "Globals");
fprintf (FpOut, "SOURCE_DIR=$(EFI_SOURCE)\\%s\n", DirName);
fprintf (FpOut, "BUILD_DIR=$(EFI_SOURCE)%s\\output\\%s\n", BuildPath, DirName);
fprintf (FpOut, "\n");
//
// Include master.env
//
DumpHeader (FpOut, "Include Master.env enviroment");
fprintf (FpOut, "!include $(EFI_SOURCE)%s\\master.env\n", BuildPath);
//
// Dump nmake section
//
if (!IsListEmpty (&MakInfo.NMake)) {
DumpHeader (FpOut, "Gerneral make info");
for (Link=MakInfo.NMake.Flink; Link != &MakInfo.NMake; Link = Link->Flink) {
Line = CONTAINING_RECORD (Link, A_LINE, Link);
fprintf (FpOut, "%s\n", Line->Line);
}
}
//
// If building for EBC, rename the entry point function to EfiMain so
// that the startup EbcLib.lib entry point function EfiStart() knows what
// to call.
//
fprintf (FpOut, "!IF \"$(PROCESSOR)\" == \"Ebc\"\n");
fprintf (FpOut, "!IF DEFINED(IMAGE_ENTRY_POINT)\n");
fprintf (FpOut, "!IF \"$(IMAGE_ENTRY_POINT)\" != \"EfiMain\"\n");
fprintf (FpOut, "C_FLAGS = $(C_FLAGS) /D $(IMAGE_ENTRY_POINT)=EfiMain\n");
fprintf (FpOut, "!ENDIF\n");
fprintf (FpOut, "!ENDIF\n");
fprintf (FpOut, "!ENDIF\n");
//
// Include header file includes
//
DumpHeader (FpOut, "Include paths");
for (Link=MakInfo.Includes.Flink; Link != &MakInfo.Includes; Link = Link->Flink) {
Line = CONTAINING_RECORD (Link, A_LINE, Link);
if (strncmp(Line->Line, "$(EFI_SOURCE)\\", 14) == 0) {
fprintf (FpOut, "!include $(EFI_SOURCE)%s\\output\\%s\\makefile.hdr\n", BuildPath, Line->Line+14);
fprintf (FpOut, "INC=-I %s -I %s\\$(PROCESSOR) $(INC)\n", Line->Line, Line->Line);
} else {
fprintf (FpOut, "!include $(BUILD_DIR)\\%s\\makefile.hdr\n", Line->Line);
fprintf (FpOut, "INC=-I $(SOURCE_DIR)\\%s -I $(SOURCE_DIR)\\%s\\$(PROCESSOR) $(INC)\n",
Line->Line,
Line->Line
);
}
fprintf (FpOut, "\n");
}
//
// Include libaries
//
if (!IsListEmpty (&MakInfo.Libraries)) {
DumpHeader (FpOut, "Libraries");
for (Link=MakInfo.Libraries.Flink; Link != &MakInfo.Libraries; Link = Link->Flink) {
Line = CONTAINING_RECORD (Link, A_LINE, Link);
LName = LastName (Line->Line);
if (strncmp(Line->Line, "$(EFI_SOURCE)\\", 14) == 0) {
fprintf (FpOut, "LIBS = $(LIBS) $(EFI_SOURCE)%s\\output\\%s\\%s.lib\n",
BuildPath,
Line->Line+14,
LName
);
} else {
fprintf (FpOut, "LIBS = $(LIBS) $(SOURCE_DIR)\\%s\\%s.lib\n",
Line->Line,
LName
);
}
}
}
//
// Dump source file info
//
DumpHeader (FpOut, "Source file dependencies");
// Dump common files
DumpFileInfo (FpOut, &MakInfo.Comm);
// Dump ia32 files
fprintf (FpOut, "!IF \"$(PROCESSOR)\" == \"Ia32\"\n");
DumpFileInfo (FpOut, &MakInfo.Ia32);
fprintf (FpOut, "!ENDIF\n\n");
// Dump ipf files
fprintf (FpOut, "!IF \"$(PROCESSOR)\" == \"Ipf\"\n");
DumpFileInfo (FpOut, &MakInfo.Ipf);
fprintf (FpOut, "!ENDIF\n\n");
//
// Dump ebc files.
//
fprintf (FpOut, "!IF \"$(PROCESSOR)\" == \"Ebc\"\n");
DumpFileInfo (FpOut, &MakInfo.Ebc);
fprintf (FpOut, "!ENDIF\n\n");
//
// Dump include file info
//
DumpIncludeInfo (FpInc, DirName, &MakInfo.Comm);
// Dump ia32 files
fprintf (FpInc, "!IF \"$(PROCESSOR)\" == \"Ia32\"\n");
DumpIncludeInfo(FpInc, DirName, &MakInfo.Ia32);
fprintf (FpInc, "!ENDIF\n\n");
// Dump ipf files
fprintf (FpInc, "\n");
fprintf (FpInc, "!IF \"$(PROCESSOR)\" == \"Ipf\"\n");
DumpIncludeInfo (FpInc, DirName, &MakInfo.Ipf);
fprintf (FpInc, "!ENDIF\n\n");
// Dump ebc files
fprintf (FpInc, "\n");
fprintf (FpInc, "!IF \"$(PROCESSOR)\" == \"Ebc\"\n");
DumpIncludeInfo (FpInc, DirName, &MakInfo.Ebc);
fprintf (FpInc, "!ENDIF\n\n");
DumpHeader (FpOut, "Define for EBC boot service drivers");
//
// !IF some code to the makefile for EBC linking. This is required
// because the link command is different. Mainly the entry
// point function has been renamed and fixed to be EfiStart().
// Also make sure that they're not building a runtime driver.
//
fprintf (FpOut, "!IF \"$(PROCESSOR)\" == \"Ebc\"\n");
fprintf (FpOut, "!IFDEF TARGET_BS_DRIVER\n");
fprintf (FpOut, "TARGET_DRIVER = $(BIN_DIR)\\$(TARGET_BS_DRIVER).efi\n");
fprintf (FpOut, "BIN_TARGETS = $(BIN_TARGETS) $(TARGET_DRIVER)\n");
fprintf (FpOut, "$(TARGET_DRIVER) : $(OBJECTS) $(LIBS)\n");
fprintf (FpOut, " $(LINK) $(L_FLAGS) $(MODULE_LFLAGS) $** /ENTRY:EfiStart /OUT:$(@R).dll\n");
fprintf (FpOut, " $(FWIMAGE) bsdrv $(@R).dll $(TARGET_DRIVER)\n");
fprintf (FpOut, "!ELSEIFDEF TARGET_RT_DRIVER\n");
fprintf (FpOut, "!ERROR Runtime drivers are not supported for EBC\n");
fprintf (FpOut, "!ENDIF\n");
LName = LastName (DirName);
DumpHeader (FpOut, "Define the lib");
fprintf (FpOut, "!IFDEF OBJECTS\n");
fprintf (FpOut, "TARGET_LIB = $(BUILD_DIR)\\%s.lib\n", LName);
fprintf (FpOut, "BIN_TARGETS = $(BIN_TARGETS) $(TARGET_LIB)\n");
fprintf (FpOut, "$(TARGET_LIB) : $(OBJECTS) \n");
fprintf (FpOut, " $(LIB) $(LIB_FLAGS) $** /OUT:$(TARGET_LIB)\n");
fprintf (FpOut, "!ENDIF\n");
fprintf (FpOut, "\n!ELSE\n\n");
//
// If there are any sources to build, define a lib target
//
LName = LastName (DirName);
DumpHeader (FpOut, "Define the lib");
fprintf (FpOut, "!IFDEF OBJECTS\n");
fprintf (FpOut, "TARGET_LIB = $(BUILD_DIR)\\%s.lib\n", LName);
fprintf (FpOut, "BIN_TARGETS = $(BIN_TARGETS) $(TARGET_LIB)\n");
fprintf (FpOut, "$(TARGET_LIB) : $(OBJECTS) \n");
fprintf (FpOut, " $(LIB) $(LIB_FLAGS) $** /OUT:$(TARGET_LIB)\n");
fprintf (FpOut, "!ENDIF\n");
//
//
//
DumpHeader (FpOut, "Define for apps");
fprintf (FpOut, "!IFDEF TARGET_APP\n");
fprintf (FpOut, "TARGET_APP = $(BIN_DIR)\\$(TARGET_APP).efi\n");
fprintf (FpOut, "BIN_TARGETS = $(BIN_TARGETS) $(TARGET_APP)\n");
fprintf (FpOut, "$(TARGET_APP) : $(TARGET_LIB) $(LIBS)\n");
fprintf (FpOut, " $(LINK) $(L_FLAGS) $(MODULE_LFLAGS) $** /ENTRY:$(IMAGE_ENTRY_POINT) /OUT:$(@R).dll\n");
fprintf (FpOut, " $(FWIMAGE) app $(@R).dll $(TARGET_APP)\n");
fprintf (FpOut, "!ENDIF\n");
//
//
//
DumpHeader (FpOut, "Define for boot service drivers");
fprintf (FpOut, "!IFDEF TARGET_BS_DRIVER\n");
fprintf (FpOut, "TARGET_DRIVER = $(BIN_DIR)\\$(TARGET_BS_DRIVER).efi\n");
fprintf (FpOut, "BIN_TARGETS = $(BIN_TARGETS) $(TARGET_DRIVER)\n");
fprintf (FpOut, "$(TARGET_DRIVER) : $(TARGET_LIB) $(LIBS)\n");
fprintf (FpOut, " $(LINK) $(L_FLAGS) $(MODULE_LFLAGS) $** /ENTRY:$(IMAGE_ENTRY_POINT) /OUT:$(@R).dll\n");
fprintf (FpOut, " $(FWIMAGE) bsdrv $(@R).dll $(TARGET_DRIVER)\n");
fprintf (FpOut, "!ENDIF\n");
//
// ENDIF of the EBC ELSE condition
//
fprintf (FpOut, "!ENDIF\n\n");
//
//
//
DumpHeader (FpOut, "Define for runtime service drivers");
fprintf (FpOut, "!IFDEF TARGET_RT_DRIVER\n");
fprintf (FpOut, "TARGET_DRIVER = $(BIN_DIR)\\$(TARGET_RT_DRIVER).efi\n");
fprintf (FpOut, "BIN_TARGETS = $(BIN_TARGETS) $(TARGET_DRIVER)\n");
fprintf (FpOut, "$(TARGET_DRIVER) : $(TARGET_LIB) $(LIBS)\n");
fprintf (FpOut, " $(LINK) $(L_FLAGS) $(MODULE_LFLAGS) $** /ENTRY:$(IMAGE_ENTRY_POINT) /OUT:$(@R).dll\n");
fprintf (FpOut, " $(FWIMAGE) rtdrv $(@R).dll $(TARGET_DRIVER)\n");
fprintf (FpOut, "!ENDIF\n");
//
// Worked
//
DumpHeader (FpOut, "Handoff to Master.Mak");
fprintf (FpOut, "!include $(EFI_SOURCE)%s\\master.mak\n", BuildPath);
Failed = FALSE;
printf ("\n");
Done:
if (FpIn) {
fclose (FpIn);
}
if (FpOut) {
fclose (FpOut);
}
if (FpInc) {
fclose (FpInc);
}
if (Failed) {
if (OutName[0]) {
unlink (OutName);
}
if (IncName[0]) {
unlink (IncName);
}
}
FreeMakeInfo (&MakInfo);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -