## @file\r
# Create makefile for MS nmake and GNU make\r
#\r
-# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# which accompanies this distribution. The full text of the license may be found at\r
PLATFORM_GUID = ${platform_guid}\r
PLATFORM_VERSION = ${platform_version}\r
PLATFORM_RELATIVE_DIR = ${platform_relative_directory}\r
-PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory}\r
+PLATFORM_DIR = ${platform_dir}\r
PLATFORM_OUTPUT_DIR = ${platform_output_directory}\r
\r
#\r
#\r
clean:\r
\t${BEGIN}${clean_command}\r
-\t${END}\r
+\t${END}\t$(RM) AutoGenTimeStamp\r
\r
#\r
# clean all generated files\r
${BEGIN}\t${cleanall_command}\r
${END}\t$(RM) *.pdb *.idb > NUL 2>&1\r
\t$(RM) $(BIN_DIR)${separator}$(MODULE_NAME).efi\r
+\t$(RM) AutoGenTimeStamp\r
\r
#\r
# clean all dependent libraries built\r
# EdkII modules always use "_ModuleEntryPoint" as entry point\r
ImageEntryPoint = "_ModuleEntryPoint"\r
\r
+ for k, v in self._AutoGenObject.Module.Defines.iteritems():\r
+ if k not in self._AutoGenObject.Macros.keys():\r
+ self._AutoGenObject.Macros[k] = v\r
+\r
+ if 'MODULE_ENTRY_POINT' not in self._AutoGenObject.Macros.keys():\r
+ self._AutoGenObject.Macros['MODULE_ENTRY_POINT'] = ModuleEntryPoint\r
+ if 'ARCH_ENTRY_POINT' not in self._AutoGenObject.Macros.keys():\r
+ self._AutoGenObject.Macros['ARCH_ENTRY_POINT'] = ArchEntryPoint\r
+ if 'IMAGE_ENTRY_POINT' not in self._AutoGenObject.Macros.keys():\r
+ self._AutoGenObject.Macros['IMAGE_ENTRY_POINT'] = ImageEntryPoint\r
+\r
+ PCI_COMPRESS_Flag = False\r
+ for k, v in self._AutoGenObject.Module.Defines.iteritems():\r
+ if 'PCI_COMPRESS' == k and 'TRUE' == v:\r
+ PCI_COMPRESS_Flag = True\r
+\r
# tools definitions\r
ToolsDef = []\r
IncPrefix = self._INC_FLAG_[self._AutoGenObject.ToolChainFamily]\r
# Remove duplicated include path, if any\r
if Attr == "FLAGS":\r
Value = RemoveDupOption(Value, IncPrefix, self._AutoGenObject.IncludePathList)\r
+ if Tool == "OPTROM" and PCI_COMPRESS_Flag:\r
+ ValueList = Value.split()\r
+ if ValueList:\r
+ for i, v in enumerate(ValueList):\r
+ if '-e' == v:\r
+ ValueList[i] = '-ec'\r
+ Value = ' '.join(ValueList)\r
+\r
ToolsDef.append("%s_%s = %s" % (Tool, Attr, Value))\r
ToolsDef.append("")\r
\r
RespFileListContent = ''\r
for Resp in RespDict.keys():\r
RespFile = os.path.join(self._AutoGenObject.OutputDir, str(Resp).lower() + '.txt')\r
- SaveFileOnChange(RespFile, RespDict[Resp], False)\r
- ToolsDef.append("%s = %s" % (Resp, '@' + RespFile))\r
+ StrList = RespDict[Resp].split(' ')\r
+ UnexpandMacro = []\r
+ NewStr = []\r
+ for Str in StrList:\r
+ if '$' in Str:\r
+ UnexpandMacro.append(Str)\r
+ else:\r
+ NewStr.append(Str)\r
+ UnexpandMacroStr = ' '.join(UnexpandMacro)\r
+ NewRespStr = ' '.join(NewStr)\r
+ SaveFileOnChange(RespFile, NewRespStr, False)\r
+ ToolsDef.append("%s = %s" % (Resp, UnexpandMacroStr + ' @' + RespFile))\r
RespFileListContent += '@' + RespFile + os.linesep\r
- RespFileListContent += RespDict[Resp] + os.linesep\r
+ RespFileListContent += NewRespStr + os.linesep\r
SaveFileOnChange(RespFileList, RespFileListContent, False)\r
else:\r
if os.path.exists(RespFileList):\r
while not found and os.sep in package_rel_dir:\r
index = package_rel_dir.index(os.sep)\r
current_dir = mws.join(current_dir, package_rel_dir[:index])\r
- for fl in os.listdir(current_dir):\r
- if fl.endswith('.dec'):\r
- found = True\r
- break\r
+ if os.path.exists(current_dir):\r
+ for fl in os.listdir(current_dir):\r
+ if fl.endswith('.dec'):\r
+ found = True\r
+ break\r
package_rel_dir = package_rel_dir[index + 1:]\r
\r
MakefileTemplateDict = {\r
"platform_version" : self.PlatformInfo.Version,\r
"platform_relative_directory": self.PlatformInfo.SourceDir,\r
"platform_output_directory" : self.PlatformInfo.OutputDir,\r
+ "platform_dir" : self._AutoGenObject.Macros["PLATFORM_DIR"],\r
\r
"module_name" : self._AutoGenObject.Name,\r
"module_guid" : self._AutoGenObject.Guid,\r
for item in SingleCommandList[1:]:\r
if FlagDict[Tool]['Macro'] in item:\r
Str = self._AutoGenObject._BuildOption[Tool]['FLAGS']\r
+ for Option in self._AutoGenObject.BuildOption.keys():\r
+ for Attr in self._AutoGenObject.BuildOption[Option]:\r
+ if Str.find(Option + '_' + Attr) != -1:\r
+ Str = Str.replace('$(' + Option + '_' + Attr + ')', self._AutoGenObject.BuildOption[Option][Attr])\r
while(Str.find('$(') != -1):\r
for macro in self._AutoGenObject.Macros.keys():\r
MacroName = '$('+ macro + ')'\r
Str = Str.replace(MacroName, self._AutoGenObject.Macros[macro])\r
break\r
else:\r
- EdkLogger.error("build", AUTOGEN_ERROR, "Not supported macro is found in make command : %s" % Str, ExtraData="[%s]" % str(self._AutoGenObject))\r
+ break\r
SingleCommandLength += len(Str)\r
elif '$(INC)' in item:\r
SingleCommandLength += self._AutoGenObject.IncludePathLength + len(IncPrefix) * len(self._AutoGenObject._IncludePathList)\r
Str = Str.replace(MacroName, self._AutoGenObject.Macros[macro])\r
break\r
else:\r
- EdkLogger.error("build", AUTOGEN_ERROR, "Not supported macro is found in make command : %s" % Str, ExtraData="[%s]" % str(self._AutoGenObject))\r
-\r
+ break\r
SingleCommandLength += len(Str)\r
\r
if SingleCommandLength > GlobalData.gCommandMaxLength:\r
Value = self._AutoGenObject.BuildOption[Flag]['FLAGS']\r
for inc in self._AutoGenObject._IncludePathList:\r
Value += ' ' + IncPrefix + inc\r
+ for Option in self._AutoGenObject.BuildOption.keys():\r
+ for Attr in self._AutoGenObject.BuildOption[Option]:\r
+ if Value.find(Option + '_' + Attr) != -1:\r
+ Value = Value.replace('$(' + Option + '_' + Attr + ')', self._AutoGenObject.BuildOption[Option][Attr])\r
while (Value.find('$(') != -1):\r
for macro in self._AutoGenObject.Macros.keys():\r
MacroName = '$('+ macro + ')'\r
Value = Value.replace(MacroName, self._AutoGenObject.Macros[macro])\r
break\r
else:\r
- EdkLogger.error("build", AUTOGEN_ERROR, "Not supported macro is found in make command : %s" % Str, ExtraData="[%s]" % str(self._AutoGenObject))\r
- RespDict[Key] = Value\r
+ break\r
+\r
+ if self._AutoGenObject.ToolChainFamily == 'GCC':\r
+ RespDict[Key] = Value.replace('\\', '/')\r
+ else:\r
+ RespDict[Key] = Value\r
for Target in BuildTargets:\r
for i, SingleCommand in enumerate(BuildTargets[Target].Commands):\r
if FlagDict[Flag]['Macro'] in SingleCommand:\r
if not self.FileDependency[File]:\r
self.FileDependency[File] = ['$(FORCE_REBUILD)']\r
continue\r
+\r
+ self._AutoGenObject.AutoGenDepSet |= set(self.FileDependency[File])\r
+\r
# skip non-C files\r
if File.Ext not in [".c", ".C"] or File.Name == "AutoGen.c":\r
continue\r
## For creating makefile targets for dependent libraries\r
def ProcessDependentLibrary(self):\r
for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList:\r
- self.LibraryBuildDirectoryList.append(self.PlaceMacro(LibraryAutoGen.BuildDir, self.Macros))\r
+ if not LibraryAutoGen.IsBinaryModule:\r
+ self.LibraryBuildDirectoryList.append(self.PlaceMacro(LibraryAutoGen.BuildDir, self.Macros))\r
\r
## Return a list containing source file's dependencies\r
#\r
PLATFORM_GUID = ${platform_guid}\r
PLATFORM_VERSION = ${platform_version}\r
PLATFORM_RELATIVE_DIR = ${platform_relative_directory}\r
-PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory}\r
+PLATFORM_DIR = ${platform_dir}\r
PLATFORM_OUTPUT_DIR = ${platform_output_directory}\r
\r
#\r
"platform_version" : self.PlatformInfo.Version,\r
"platform_relative_directory": self.PlatformInfo.SourceDir,\r
"platform_output_directory" : self.PlatformInfo.OutputDir,\r
+ "platform_dir" : self._AutoGenObject.Macros["PLATFORM_DIR"],\r
\r
"module_name" : self._AutoGenObject.Name,\r
"module_guid" : self._AutoGenObject.Guid,\r
PLATFORM_GUID = ${platform_guid}\r
PLATFORM_VERSION = ${platform_version}\r
PLATFORM_FILE = ${platform_file}\r
-PLATFORM_DIR = $(WORKSPACE)${separator}${platform_relative_directory}\r
+PLATFORM_DIR = ${platform_dir}\r
PLATFORM_OUTPUT_DIR = ${platform_output_directory}\r
\r
#\r
"platform_relative_directory": PlatformInfo.SourceDir,\r
"platform_output_directory" : PlatformInfo.OutputDir,\r
"platform_build_directory" : PlatformInfo.BuildDir,\r
+ "platform_dir" : self._AutoGenObject.Macros["PLATFORM_DIR"],\r
\r
"toolchain_tag" : PlatformInfo.ToolChain,\r
"build_target" : PlatformInfo.BuildTarget,\r
if GlobalData.gIgnoreSource:\r
ExtraOption += " --ignore-sources"\r
\r
+ if GlobalData.BuildOptionPcd:\r
+ for index, option in enumerate(GlobalData.gCommand):\r
+ if "--pcd" == option and GlobalData.gCommand[index+1]:\r
+ pcdName, pcdValue = GlobalData.gCommand[index+1].split('=')\r
+ if pcdValue.startswith('H'):\r
+ pcdValue = 'H' + '"' + pcdValue[1:] + '"'\r
+ ExtraOption += " --pcd " + pcdName + '=' + pcdValue\r
+ elif pcdValue.startswith('L'):\r
+ pcdValue = 'L' + '"' + pcdValue[1:] + '"'\r
+ ExtraOption += " --pcd " + pcdName + '=' + pcdValue\r
+ else:\r
+ ExtraOption += " --pcd " + GlobalData.gCommand[index+1]\r
+\r
MakefileName = self._FILE_NAME_[self._FileType]\r
SubBuildCommandList = []\r
for A in PlatformInfo.ArchList:\r