a. Added binary file support during AutoGen
authorjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 19 Feb 2008 05:58:18 +0000 (05:58 +0000)
committerjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 19 Feb 2008 05:58:18 +0000 (05:58 +0000)
b. Removed "extern int __make_me_compile_correctly;" from AutoGen.h
c. Added BUILD_RULE_CONF in target.txt to specify build rules file

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1007 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/AutoGen/AutoGen.py
Source/Python/AutoGen/BuildInfo.py
Source/Python/AutoGen/GenC.py
Source/Python/AutoGen/GenMake.py
Source/Python/Common/DataType.py
Source/Python/Common/EdkIIWorkspaceBuild.py
Source/Python/Common/InfClassObject.py
Source/Python/Common/TargetTxtClassObject.py
Source/Python/build/build.py

index a7a1099..a10f4b7 100755 (executable)
@@ -269,7 +269,10 @@ class PlatformAutoGen:
     #   @retval     BuildRule object\r
     #\r
     def GetBuildRule(self):\r
-        return BuildRule(self.Workspace.WorkspaceFile(gBuildRuleFile))\r
+        BuildRuleFile = self.Workspace.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_BUILD_RULE_CONF]\r
+        if BuildRuleFile in [None, '']:\r
+            BuildRuleFile = gBuildRuleFile\r
+        return BuildRule(self.Workspace.WorkspaceFile(BuildRuleFile))\r
 \r
     ## Get tool chain definition\r
     #\r
@@ -734,7 +737,7 @@ class ModuleAutoGen(object):
         Info.BuildTarget = self.BuildTarget\r
         Info.ToolChain = self.ToolChain\r
         Info.Arch = self.Arch\r
-        Info.IsBinary = False\r
+        # Info.IsBinary = self.Module.BinaryModule\r
         Info.BaseName = self.Module.BaseName\r
         Info.FileBase, Info.FileExt = path.splitext(path.basename(self.Module.DescFilePath))\r
         Info.SourceDir = path.dirname(self.Module.DescFilePath)\r
@@ -781,8 +784,9 @@ class ModuleAutoGen(object):
         Info.IncludePathList = [Info.SourceDir, Info.DebugDir]\r
         Info.IncludePathList.extend(self.GetIncludePathList(Info.DependentPackageList))\r
 \r
-        Info.SourceFileList = self.GetBuildFileList(Info)\r
+        Info.SourceFileList = self.GetSourceFileList(Info)\r
         Info.AutoGenFileList = self.GetAutoGenFileList(Info)\r
+        Info.BinaryFileDict = self.GetBinaryFiles()\r
 \r
         return Info\r
 \r
@@ -905,7 +909,7 @@ class ModuleAutoGen(object):
 \r
         return OptionList\r
 \r
-    ## Return a list of files which can be built\r
+    ## Return a list of files which can be built from source\r
     #\r
     #  What kind of files can be built is determined by build rules in\r
     #  $(WORKSPACE)/Conf/build_rule.txt and toolchain family.\r
@@ -913,7 +917,7 @@ class ModuleAutoGen(object):
     #   @param      PlatformInfo    The object of PlatformBuildInfo\r
     #   @retval     list            The list of files which can be built later\r
     #\r
-    def GetBuildFileList(self, Info):\r
+    def GetSourceFileList(self, Info):\r
         # use toolchain family of CC as the primary toolchain family\r
         ToolChainFamily = Info.PlatformInfo.ToolChainFamily["CC"]\r
         BuildRule = Info.PlatformInfo.BuildRule\r
@@ -966,6 +970,23 @@ class ModuleAutoGen(object):
 \r
         return BuildFileList\r
 \r
+    ## Return a list of files which can be built from binary\r
+    #\r
+    #  "Build" binary files are just to copy them to build directory.\r
+    #\r
+    #   @param      PlatformInfo    The object of PlatformBuildInfo\r
+    #   @retval     list            The list of files which can be built later\r
+    #\r
+    def GetBinaryFiles(self):\r
+        FileDict = {}\r
+        for F in self.Module.Binaries:\r
+            if F.Target != '*' and F.Target != self.BuildTarget:\r
+                continue\r
+            if F.FileType not in FileDict:\r
+                FileDict[F.FileType] = []\r
+            FileDict[F.FileType].append(F.BinaryFile)\r
+        return FileDict\r
+\r
     ## Get the list of package object the module depends on\r
     #\r
     #   @retval     list    The package object list\r
index e98dee3..52bb1df 100644 (file)
@@ -84,6 +84,7 @@ class ModuleBuildInfo(BuildInfo):
         self.UnicodeFileList = []
         self.SourceFileList = []
         self.ObjectFileList = []
+        self.BinaryFileDict = {} # FileType : [File List]
 
         self.DependentPackageList = []
         self.DependentLibraryList = []
index 00f66eb..d4bfea0 100644 (file)
@@ -311,7 +311,6 @@ gAutoGenHPrologueString = """
 #ifndef _AUTOGENH_${Guid}\r
 #define _AUTOGENH_${Guid}\r
 \r
-extern int __make_me_compile_correctly;\r
 """\r
 \r
 gAutoGenHEpilogueString = """\r
index 77cb998..4df9a8f 100755 (executable)
@@ -570,10 +570,18 @@ class Makefile(object):
             self.ModuleBuild = True\r
 \r
             self.BuildType = "mbuild"\r
-            self.BuildFileList = []\r
             self.TargetFileList = []\r
             self.ObjectFileList = []\r
-            self.ObjectBuildTargetList = []\r
+\r
+            self.ResultFileList = []\r
+            self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"]\r
+        \r
+            self.SourceFileDatabase = {}  # {file type : file path}\r
+            self.DestFileDatabase = {}  # {file type : file path}\r
+            self.FileBuildTargetList = [] # [(src, target string)]\r
+            self.BuildTargetList = [] # [target string]\r
+            self.PendingBuildTargetList = [] # [FileBuildRule objects]\r
+            self.CommonFileDependency = []\r
 \r
             self.FileDependency = []\r
             self.LibraryBuildCommandList = []\r
@@ -734,7 +742,17 @@ class Makefile(object):
         else:\r
             self.PlatformBuildDirectory = "$(WORKSPACE)" + Separator + PlatformInfo.OutputDir\r
 \r
-        self.ProcessSourceFileList(MakeType)\r
+        # break build if no source files and binary files are found\r
+        if len(self.ModuleInfo.SourceFileList) == 0 and len(self.ModuleInfo.BinaryFileDict) == 0:\r
+            EdkLogger.error("AutoGen", AUTOGEN_ERROR, "No files to be built in module [%s, %s, %s]"\r
+                            % (self.ModuleInfo.BuildTarget, self.ModuleInfo.ToolChain, self.ModuleInfo.Arch),\r
+                            ExtraData=str(self.ModuleInfo.Module))\r
+        # convert source files and binary files to build target\r
+        if len(self.ModuleInfo.SourceFileList) > 0:\r
+            self.ProcessSourceFileList(MakeType)\r
+        if len(self.ModuleInfo.BinaryFileDict) > 0:\r
+            self.ProcessBinaryFileList(MakeType)\r
+        # convert dependent libaries to build command\r
         self.ProcessDependentLibrary(MakeType)\r
 \r
         if "DLINK" in PlatformInfo.ToolStaticLib:\r
@@ -835,8 +853,8 @@ class Makefile(object):
             "start_group_flag"          : gStartGroupFlag[PlatformInfo.ToolChainFamily["DLINK"]],\r
             "end_group_flag"            : gEndGroupFlag[PlatformInfo.ToolChainFamily["DLINK"]],\r
             "include_path"              : self.ModuleInfo.IncludePathList,\r
-            "target_file"               : self.TargetFileList,\r
-            "object_file"               : self.ObjectFileList,\r
+            #"target_file"               : self.TargetFileList,\r
+            #"object_file"               : self.ObjectFileList,\r
             "library_file"              : self.LibraryFileList,\r
             "remaining_build_target"    : self.ResultFileList,\r
             "system_library"            : self.SystemLibraryList,\r
@@ -949,28 +967,17 @@ class Makefile(object):
     def ProcessSourceFileList(self, MakeType=gMakeType):\r
         Separator = gDirectorySeparator[MakeType]\r
 \r
-        Family = self.PlatformInfo.ToolChainFamily["CC"]\r
-        BuildRule = self.PlatformInfo.BuildRule\r
-\r
-        self.ResultFileList = []\r
-        self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"]\r
-\r
-        self.SourceFileDatabase = {}  # {file type : file path}\r
-        self.DestFileDatabase = {}  # {file type : file path}\r
-        self.FileBuildTargetList = [] # [(src, target string)]\r
-        self.BuildTargetList = [] # [target string]\r
-        self.PendingBuildTargetList = [] # [FileBuildRule objects]\r
-\r
         ForceIncludedFile = []\r
         SourceFileList = []\r
 \r
-        FileList = self.ModuleInfo.SourceFileList\r
-        if len(FileList) == 0:\r
-            EdkLogger.error("AutoGen", AUTOGEN_ERROR, "No files to be built in module [%s, %s, %s]"\r
-                            % (self.ModuleInfo.BuildTarget, self.ModuleInfo.ToolChain, self.ModuleInfo.Arch),\r
+        if "CC" not in self.PlatformInfo.ToolChainFamily:\r
+            EdkLogger.error("AutoGen", AUTOGEN_ERROR, "No CC tool found",\r
                             ExtraData=str(self.ModuleInfo.Module))\r
+        Family = self.PlatformInfo.ToolChainFamily["CC"]\r
+        BuildRule = self.PlatformInfo.BuildRule\r
 \r
         CCodeFlag = False\r
+        FileList = self.ModuleInfo.SourceFileList\r
         for FileInfo in FileList:\r
             F, SrcFileType, SrcFileBuildRule = FileInfo\r
             if SrcFileType == "C-Code-File":\r
@@ -1166,6 +1173,28 @@ class Makefile(object):
             Template.Append(TargetTemplate, {"deps" : self.FileDependency[File]})\r
             self.BuildTargetList.append(str(Template))\r
 \r
+\r
+    ## Process binary files to generate makefile targets and dependencies\r
+    #\r
+    # All binary files are just copied to $(OUTPUT_DIR)\r
+    # \r
+    #   @param      MakeType    GNU makefile or MS makefile\r
+    #\r
+    def ProcessBinaryFileList(self, MakeType=gMakeType):\r
+        BinaryFiles = self.ModuleInfo.BinaryFileDict\r
+        BuildTargetString = "%(dst)s : %(src)s\n"\\r
+                            "\t$(CP) %(src)s %(dst)s\n"\r
+        for FileType in BinaryFiles:\r
+            if FileType not in self.DestFileDatabase:\r
+                self.DestFileDatabase[FileType] = []\r
+            for F in BinaryFiles[FileType]:\r
+                Src = os.path.join("$(MODULE_DIR)", F)\r
+                FileName = os.path.basename(F)\r
+                Dst = os.path.join("$(OUTPUT_DIR)", FileName)\r
+                self.DestFileDatabase[FileType].append(Dst)\r
+                self.ResultFileList.append(Dst)\r
+                self.BuildTargetList.append(BuildTargetString % {"dst":Dst, "src":Src})\r
+\r
     ## For creating makefile targets for dependent libraries\r
     #\r
     #   @param      MakeType    GNU makefile or MS makefile\r
index 4d2f7d4..001cdcf 100644 (file)
@@ -321,6 +321,7 @@ TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER = 'MAX_CONCURRENT_THREAD_NUMBER'
 TAB_TAT_DEFINES_TARGET = 'TARGET'\r
 TAB_TAT_DEFINES_TOOL_CHAIN_TAG = 'TOOL_CHAIN_TAG'\r
 TAB_TAT_DEFINES_TARGET_ARCH = 'TARGET_ARCH'\r
+TAB_TAT_DEFINES_BUILD_RULE_CONF = "BUILD_RULE_CONF"\r
 \r
 #\r
 # ToolDef Definitions\r
index 9304ec9..b5c72ed 100755 (executable)
@@ -1152,7 +1152,7 @@ class WorkspaceBuild(object):
                     PcdItemTypeUsed = Pcd.Type\r
                     DefaultValue = Pcd.DefaultValue\r
                     WrnMessage += '%s.%s: Defined in file %s, PcdItemType is Pcds%s, DefaultValue is %s\n' % (Guid, Name, Dec, PcdItemTypeUsed, DefaultValue)\r
-            EdkLogger.info(WrnMessage)\r
+            EdkLogger.verbose(WrnMessage)\r
         \r
     ## Create a full path with workspace dir\r
     #\r
@@ -1467,8 +1467,7 @@ class WorkspaceBuild(object):
         if Token in [None, '']:\r
             Token = Pcd.TokenValue\r
         if DatumType == "VOID*" and MaxDatumSize in ['', None]:\r
-            EdkLogger.warn("\nAutoGen", "No MaxDatumSize specified for PCD %s.%s" % (Guid, Name),\r
-                           ExtraData=ModuleName)\r
+            EdkLogger.verbose("No MaxDatumSize specified for PCD %s.%s in module [%s]" % (Guid, Name, ModuleName))\r
             if Value[0] == 'L':\r
                 MaxDatumSize = str(len(Value) * 2)\r
             elif Value[0] == '{':\r
index ad8b158..396d67a 100755 (executable)
@@ -236,7 +236,6 @@ class Inf(InfObject):
                 self.Defines[Arch].extend(self.Defines[DataType.TAB_ARCH_COMMON.upper()])\r
                 self._Macro.update(self.Defines[Arch].DefinesDictionary[TAB_INF_DEFINES_MACRO])\r
         self._Macro.update(GlobalData.gGlobalDefines)\r
-        # print "###",self._Macro\r
 \r
         if DataType.TAB_ARCH_COMMON in self.Contents:\r
             for Key in self.KeyList:\r
@@ -278,7 +277,8 @@ class Inf(InfObject):
         #\r
         ModuleHeader.InfVersion = Defines.DefinesDictionary[TAB_INF_DEFINES_INF_VERSION][0]\r
         # R8 modules may use macro in base name\r
-        ModuleHeader.Name = ReplaceMacro(Defines.DefinesDictionary[TAB_INF_DEFINES_BASE_NAME][0], ModuleHeader.MacroDefines)\r
+        # ModuleHeader.Name = ReplaceMacro(Defines.DefinesDictionary[TAB_INF_DEFINES_BASE_NAME][0], ModuleHeader.MacroDefines)\r
+        ModuleHeader.Name = Defines.DefinesDictionary[TAB_INF_DEFINES_BASE_NAME][0]\r
         ModuleHeader.Guid = Defines.DefinesDictionary[TAB_INF_DEFINES_FILE_GUID][0]\r
         \r
         ModuleHeader.FileName = self.Identification.FileName\r
index cf9f267..d52a9df 100644 (file)
@@ -39,7 +39,8 @@ class TargetTxtClassObject(object):
             DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER               : '',\r
             DataType.TAB_TAT_DEFINES_TARGET                                     : [],\r
             DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG                             : [],\r
-            DataType.TAB_TAT_DEFINES_TARGET_ARCH                                : []\r
+            DataType.TAB_TAT_DEFINES_TARGET_ARCH                                : [],\r
+            DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF                            : '',\r
         }\r
         if Filename != None:\r
             self.LoadTargetTxtFile(Filename)\r
@@ -87,15 +88,15 @@ class TargetTxtClassObject(object):
                 else:\r
                     Value = ""\r
 \r
-                if Key == DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM or Key == DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF \\r
-                  or Key == DataType.TAB_TAT_DEFINES_MULTIPLE_THREAD or Key == DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER \\r
-                  or Key == DataType.TAB_TAT_DEFINES_ACTIVE_MODULE:\r
+                if Key in [DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM, DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF, \\r
+                           DataType.TAB_TAT_DEFINES_MULTIPLE_THREAD, DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER, \\r
+                           DataType.TAB_TAT_DEFINES_ACTIVE_MODULE, DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF]:\r
                     self.TargetTxtDictionary[Key] = Value.replace('\\', '/')\r
-                elif Key == DataType.TAB_TAT_DEFINES_TARGET or Key == DataType.TAB_TAT_DEFINES_TARGET_ARCH \\r
-                  or Key == DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG:\r
+                elif Key in [DataType.TAB_TAT_DEFINES_TARGET, DataType.TAB_TAT_DEFINES_TARGET_ARCH, \\r
+                             DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG]:\r
                     self.TargetTxtDictionary[Key] = Value.split()\r
-                elif Key not in GlobalData.gGlobalDefines:\r
-                    GlobalData.gGlobalDefines[Key] = Value\r
+                #elif Key not in GlobalData.gGlobalDefines:\r
+                #    GlobalData.gGlobalDefines[Key] = Value\r
 \r
             F.close()\r
             return 0\r
@@ -153,3 +154,4 @@ if __name__ == '__main__':
     Target = TargetTxtDict(os.getenv("WORKSPACE"))\r
     print Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER]\r
     print Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TARGET]\r
+    print Target.TargetTxtDictionary\r
index 20d9a69..17d976b 100644 (file)
@@ -88,23 +88,18 @@ def CheckEnvVariable():
     os.environ["WORKSPACE"] = WorkspaceDir\r
 \r
     #\r
-    # Check EFI_SOURCE and EDK_SOURCE. If EFI_SOURCE is not set but EDK_SOURCE\r
-    # is set, set EFI_SOURCE to EDK_SOURCE (R8 build convention)\r
+    # Check EFI_SOURCE (R8 build convention). EDK_SOURCE will always point to ECP\r
     # \r
-    if "EFI_SOURCE" not in os.environ and "EDK_SOURCE" not in os.environ:\r
-        os.environ["EFI_SOURCE"] = os.path.join(WorkspaceDir, GlobalData.gEdkCompatibilityPkg)\r
-        os.environ["EDK_SOURCE"] = os.path.join(WorkspaceDir, GlobalData.gEdkCompatibilityPkg)\r
-    elif "EFI_SOURCE" in os.environ and "EDK_SOURCE" not in os.environ:\r
-        os.environ["EDK_SOURCE"] = os.path.join(os.environ["EFI_SOURCE"], GlobalData.gEdkSource)\r
-    elif "EFI_SOURCE" not in os.environ and "EDK_SOURCE" in os.environ:\r
+    os.environ["EDK_SOURCE"] = os.path.join(WorkspaceDir, GlobalData.gEdkCompatibilityPkg)\r
+    if "EFI_SOURCE" not in os.environ:\r
         os.environ["EFI_SOURCE"] = os.environ["EDK_SOURCE"]\r
 \r
     EfiSourceDir = os.path.normpath(os.environ["EFI_SOURCE"])\r
     EdkSourceDir = os.path.normpath(os.environ["EDK_SOURCE"])\r
-    if not os.path.exists(EfiSourceDir):\r
-        EdkLogger.warn("build", "EFI_SOURCE = %s doesn't exist. R8 modules could not be built." % EfiSourceDir)\r
     if not os.path.exists(EdkSourceDir):\r
-        EdkLogger.warn("build", "EDK_SOURCE = %s doesn't exist. R8 modules could not be built." % EdkSourceDir)\r
+        EdkLogger.verbose("EDK_SOURCE = %s doesn't exist. R8 modules could not be built." % EdkSourceDir)\r
+    if not os.path.exists(EfiSourceDir):\r
+        EdkLogger.verbose("EFI_SOURCE = %s doesn't exist. R8 modules could not be built." % EfiSourceDir)\r
 \r
     # change absolute path to relative path to WORKSPACE\r
     if EfiSourceDir.upper().find(WorkspaceDir.upper()) != 0:\r
@@ -670,8 +665,8 @@ class Build():
         # print current build environment and configuration\r
         EdkLogger.quiet('')\r
         EdkLogger.quiet("%-24s = %s" % ("WORKSPACE", os.environ["WORKSPACE"]))\r
-        EdkLogger.quiet("%-24s = %s" % ("EFI_SOURCE", os.environ["EFI_SOURCE"]))\r
         EdkLogger.quiet("%-24s = %s" % ("EDK_SOURCE", os.environ["EDK_SOURCE"]))\r
+        EdkLogger.quiet("%-24s = %s" % ("EFI_SOURCE", os.environ["EFI_SOURCE"]))\r
         EdkLogger.quiet("%-24s = %s" % ("EDK_TOOLS_PATH", os.environ["EDK_TOOLS_PATH"]))\r
         EdkLogger.info('')\r
         EdkLogger.info('%-24s = %s' % ("TARGET_ARCH", ' '.join(self.ArchList)))\r
@@ -1152,8 +1147,8 @@ def MyOptionParser():
     Parser.add_option("-k", "--msft", action="store_const", dest="MakefileType", const="nmake", help="Make Option: Generate only NMAKE Makefiles: Makefile")\r
     Parser.add_option("-g", "--gcc", action="store_const", dest="MakefileType", const="gmake", help="Make Option: Generate only GMAKE Makefiles: GNUmakefile")\r
     Parser.add_option("-l", "--all", action="store_const", dest="MakefileType", const="all", help="Make Option: Generate both NMAKE and GMAKE makefiles.")\r
-    Parser.add_option("-D", action="append", dest="Defines", metavar="NAME[=[VALUE]]",\r
-        help="Define global macro which can be used in DSC/DEC/INF files.")\r
+    Parser.add_option("-D", action="append", dest="Defines", metavar="NAME[=[VALUE]]",\r
+        help="Define global macro which can be used in DSC/DEC/INF files.")\r
 \r
     Parser.add_option("-w", "--warning-as-error", action="store_true", dest="WarningAsError", help="Treat warning in tools as error.")\r
     Parser.add_option("-j", "--log", action="store", dest="LogFile", help="Putlog in specified file as well as on console.")\r
@@ -1214,7 +1209,7 @@ def Main():
     ReturnCode = 0\r
     MyBuild = None\r
     try:\r
-        GlobalData.gGlobalDefines = ParseDefines(Option.Defines)\r
+        GlobalData.gGlobalDefines = ParseDefines(Option.Defines)\r
         #\r
         # Check environment variable: EDK_TOOLS_PATH, WORKSPACE, PATH\r
         #\r