⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genmake.c

📁 Next BIOS Source code : Extensible Firmware Interface
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -