public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v2 0/4] Compile AML bytecode array into OBJ file
@ 2020-06-18 14:27 PierreGondois
  2020-06-18 14:27 ` [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files PierreGondois
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: PierreGondois @ 2020-06-18 14:27 UTC (permalink / raw)
  To: devel; +Cc: Pierre Gondois, sami.mujawar, tomas.pilar, bob.c.feng, liming.gao,
	nd

Following the BZ at https://bugzilla.tianocore.org/show_bug.cgi?id=2425
This patch serie is a another way to solve the dependency
of C files over ASL files. With this new method, the
dependency is resolved at the linking stage.

The last method to solve this dependency was to add
the possibility to modify INF files to depict such a
dependency. This method was not accepted. The discussion
is available at https://edk2.groups.io/g/devel/topic/72655342#56658

The last patch modifying the INF specification and INF
parsing are available at:
https://edk2.groups.io/g/devel/topic/72655342#56658
https://edk2.groups.io/g/devel/topic/72656060#56662

Pierre Gondois (4):
  BaseTools: Generate multiple rules when multiple output files
  BaseTools: Rename AmlToHex script to AmlToC
  BaseTools: Compile AML bytecode arrays into .obj file
  BaseTools: Fix string concatenation

 BaseTools/BinWrappers/PosixLike/{AmlToHex => AmlToC}               | 28 +++----
 BaseTools/BinWrappers/WindowsLike/{AmlToHex.bat => AmlToC.bat}     |  0
 BaseTools/Conf/build_rule.template                                 | 15 +++-
 BaseTools/Source/Python/{AmlToHex/AmlToHex.py => AmlToC/AmlToC.py} | 82 ++++++++------------
 BaseTools/Source/Python/AutoGen/BuildEngine.py                     |  2 +-
 BaseTools/Source/Python/AutoGen/GenMake.py                         |  6 ++
 BaseTools/Source/Python/AutoGen/ModuleAutoGen.py                   | 38 +++++----
 7 files changed, 89 insertions(+), 82 deletions(-)
 rename BaseTools/BinWrappers/PosixLike/{AmlToHex => AmlToC} (97%)
 rename BaseTools/BinWrappers/WindowsLike/{AmlToHex.bat => AmlToC.bat} (100%)
 rename BaseTools/Source/Python/{AmlToHex/AmlToHex.py => AmlToC/AmlToC.py} (52%)

-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files
  2020-06-18 14:27 [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
@ 2020-06-18 14:27 ` PierreGondois
  2020-06-19  6:34   ` [edk2-devel] " Yuwei Chen
  2020-06-18 14:27 ` [PATCH v2 2/4] BaseTools: Rename AmlToHex script to AmlToC PierreGondois
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: PierreGondois @ 2020-06-18 14:27 UTC (permalink / raw)
  To: devel; +Cc: Pierre Gondois, sami.mujawar, tomas.pilar, bob.c.feng, liming.gao,
	nd

From: Pierre Gondois <pierre.gondois@arm.com>

This patch modifies the Makefile generation not to stop
adding Makfile rules when the first final target is found.
E.g.:
If the following rules are described in build_rule.txt:
 -[Rule1]: .X files generate .Y and .Z files;
 -[Rule2]: .Z files generate .Z1 files.
Currently, if a File1.X file was part of the sources of a
module, only [Rule1] would be generated in the Makefile.
Indeed, there are no rules to apply to .Y files: .Y files
are a final target. However, there is still [Rule2] to
apply to .Z files.

This patch also adds a dependency between the first
ouput file of a rule and the other output files.
For instance, with the same example as above, File1.Y
and File1.Z are generated by the following rule:
File1.Y: File1.X
    <Generate File1.Y>
    <Generate File1.Z>

and the new dependency is:
File1.Z: File1.Y

This is necessary to keep a dependency order during the
execution of the Makefile. Indeed, .Y and .Z files are
generated by the execution of a common set of commands,
and without this rule, there is no explicit dependency
relation between them.

Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---

The changes can be seen at https://github.com/PierreARM/edk2/commits/pg/803_Compile_AML_bytecode_array_into_OBJ_file_v2

Notes:
    Notes:
      v1:
       - Generate multiple rules when multiple output files
         are specified in the build_rule.txt file. [Pierre]
      v2:
       - Use the "FileType" variable in the _ApplyBuildRule
         function as it is in the current state. [Pierre]

 BaseTools/Source/Python/AutoGen/GenMake.py       |  6 ++++
 BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 38 +++++++++++---------
 2 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py
index bbb3c29446f53fa7f2cb61a216a5b119f72c3fbc..0314d0ea34d99a014379e8d30c46ac0f0a7068ce 100755
--- a/BaseTools/Source/Python/AutoGen/GenMake.py
+++ b/BaseTools/Source/Python/AutoGen/GenMake.py
@@ -1054,6 +1054,12 @@ cleanlib:
                     TargetDict = {"target": self.PlaceMacro(T.Target.Path, self.Macros), "cmd": "\n\t".join(T.Commands),"deps": Deps}
                     self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(TargetDict))
 
+                    # Add a Makefile rule for targets generating multiple files.
+                    # The main output is a prerequisite for the other output files.
+                    for i in T.Outputs[1:]:
+                        AnnexeTargetDict = {"target": self.PlaceMacro(i.Path, self.Macros), "cmd": "", "deps": self.PlaceMacro(T.Target.Path, self.Macros)}
+                        self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(AnnexeTargetDict))
+
     def ParserCCodeFile(self, T, Type, CmdSumDict, CmdTargetDict, CmdCppDict, DependencyDict):
         if not CmdSumDict:
             for item in self._AutoGenObject.Targets[Type]:
diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
index aad591de65f086043d55aeea5661f59c53792e7c..dc8b1fe3d160cac2da22227fc233e3aa0d92cb1e 100755
--- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
@@ -860,7 +860,8 @@ class ModuleAutoGen(AutoGen):
         SubDirectory = os.path.join(self.OutputDir, File.SubDir)
         if not os.path.exists(SubDirectory):
             CreateDirectory(SubDirectory)
-        LastTarget = None
+        TargetList = set()
+        FinalTargetName = set()
         RuleChain = set()
         SourceList = [File]
         Index = 0
@@ -870,6 +871,9 @@ class ModuleAutoGen(AutoGen):
         self.BuildOption
 
         while Index < len(SourceList):
+            # Reset the FileType if not the first iteration.
+            if Index > 0:
+                FileType = TAB_UNKNOWN_FILE
             Source = SourceList[Index]
             Index = Index + 1
 
@@ -886,29 +890,25 @@ class ModuleAutoGen(AutoGen):
             elif Source.Ext in self.BuildRules:
                 RuleObject = self.BuildRules[Source.Ext]
             else:
-                # stop at no more rules
-                if LastTarget:
-                    self._FinalBuildTargetList.add(LastTarget)
-                break
+                # No more rule to apply: Source is a final target.
+                FinalTargetName.add(Source)
+                continue
 
             FileType = RuleObject.SourceFileType
             self._FileTypes[FileType].add(Source)
 
             # stop at STATIC_LIBRARY for library
             if self.IsLibrary and FileType == TAB_STATIC_LIBRARY:
-                if LastTarget:
-                    self._FinalBuildTargetList.add(LastTarget)
-                break
+                FinalTargetName.add(Source)
+                continue
 
             Target = RuleObject.Apply(Source, self.BuildRuleOrder)
             if not Target:
-                if LastTarget:
-                    self._FinalBuildTargetList.add(LastTarget)
-                break
-            elif not Target.Outputs:
-                # Only do build for target with outputs
-                self._FinalBuildTargetList.add(Target)
+                # No Target: Source is a final target.
+                FinalTargetName.add(Source)
+                continue
 
+            TargetList.add(Target)
             self._BuildTargets[FileType].add(Target)
 
             if not Source.IsBinary and Source == File:
@@ -916,12 +916,16 @@ class ModuleAutoGen(AutoGen):
 
             # to avoid cyclic rule
             if FileType in RuleChain:
-                break
+                EdkLogger.error("build", ERROR_STATEMENT, "Cyclic dependency detected while generating rule for %s" % str(Source))
 
             RuleChain.add(FileType)
             SourceList.extend(Target.Outputs)
-            LastTarget = Target
-            FileType = TAB_UNKNOWN_FILE
+
+        # For each final target name, retrieve the corresponding TargetDescBlock instance.
+        for FTargetName in FinalTargetName:
+            for Target in TargetList:
+                if FTargetName == Target.Target:
+                    self._FinalBuildTargetList.add(Target)
 
     @cached_property
     def Targets(self):
-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v2 2/4] BaseTools: Rename AmlToHex script to AmlToC
  2020-06-18 14:27 [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
  2020-06-18 14:27 ` [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files PierreGondois
@ 2020-06-18 14:27 ` PierreGondois
  2020-06-24  5:48   ` Bob Feng
  2020-06-18 14:27 ` [PATCH v2 3/4] BaseTools: Compile AML bytecode arrays into .obj file PierreGondois
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: PierreGondois @ 2020-06-18 14:27 UTC (permalink / raw)
  To: devel; +Cc: Pierre Gondois, sami.mujawar, tomas.pilar, bob.c.feng, liming.gao,
	nd

From: Pierre Gondois <pierre.gondois@arm.com>

The AmlToHex script and Posix/WindowsLike wrappers convert
an AML file to a .hex file, containing a C array storing
AML bytecode. This ".hex" file can then be included in a
C file, allowing to access the AML bytecode from this C
file.

The EDK2 build system doesn't allow to a depict dependency
orders between files of different languages. For instance,
in a module containing a ".c" file and a ".asl", the ".c"
file may or may not be built prior to the ".asl" file.
This prevents any inclusion of a generated ".hex" in a
".c" file since this later ".hex" file may or may not
have been created yet.

This patch renames the script as AmlToC. It is posted as
a separate patch to prevent git from seeing the renaming
as a deletion plus addition of a new file.
The ending line of the posix-like bin-wrapper script has
also been corrected.

This is a first step toward generating a C file containing
the AML bytecode from an ASL file. This C file will then
be handled by the EDK2 build system to generate an object
file.
Thus, no file inclusion will be required anymore. The C file
requiring the AML bytecode as a C array, and the ASL file,
will be compiled independently. The C array must be defined
as an external symbol. The linker is resolving the
reference to the C array symbol.

To summarize, the flow goes as:
 -1. ASL file is compiled to AML;
 -2. AML file is copied to a ".amli" intermediate file;
 -3. EDK2 build system applies the rule relevant to ".amli"
     files. This is, calling the "AmlToC" script, generating
     a C file from the ".amli" file;
 -4. EDK2 build system applies the rule relevant to C files.
     This is creating an object file.
 -5. EDK2 build system links the object file containing the
     AML bytecode with the object file requiring it.

Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
Signed-off-by: Tomas Pilar <Tomas.Pilar@arm.com>
---

The changes can be seen at https://github.com/PierreARM/edk2/commits/pg/803_Compile_AML_bytecode_array_into_OBJ_file_v2

Notes:
    Notes:
      v1:
       - Rename AmlToHex scripts to AmlToC, and change line
         endings of the PosixLike bin-wrapper. [Pierre]
      v2:
       - No modification. [Pierre]

 BaseTools/BinWrappers/PosixLike/{AmlToHex => AmlToC}               | 28 ++++++++++----------
 BaseTools/BinWrappers/WindowsLike/{AmlToHex.bat => AmlToC.bat}     |  0
 BaseTools/Source/Python/{AmlToHex/AmlToHex.py => AmlToC/AmlToC.py} |  0
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/BaseTools/BinWrappers/PosixLike/AmlToHex b/BaseTools/BinWrappers/PosixLike/AmlToC
similarity index 97%
rename from BaseTools/BinWrappers/PosixLike/AmlToHex
rename to BaseTools/BinWrappers/PosixLike/AmlToC
index 9fb68299e4c67d1f332cd883fd348a896f1bdc50..1dd28e966288f6ea4fc52d42e2dc7b1f74226c23 100755
--- a/BaseTools/BinWrappers/PosixLike/AmlToHex
+++ b/BaseTools/BinWrappers/PosixLike/AmlToC
@@ -1,14 +1,14 @@
-#!/usr/bin/env bash
-#python `dirname $0`/RunToolFromSource.py `basename $0` $*
-
-# If a ${PYTHON_COMMAND} command is available, use it in preference to python
-if command -v ${PYTHON_COMMAND} >/dev/null 2>&1; then
-    python_exe=${PYTHON_COMMAND}
-fi
-
-full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here
-dir=$(dirname "$full_cmd")
-exe=$(basename "$full_cmd")
-
-export PYTHONPATH="$dir/../../Source/Python${PYTHONPATH:+:"$PYTHONPATH"}"
-exec "${python_exe:-python}" "$dir/../../Source/Python/$exe/$exe.py" "$@"
+#!/usr/bin/env bash
+#python `dirname $0`/RunToolFromSource.py `basename $0` $*
+
+# If a ${PYTHON_COMMAND} command is available, use it in preference to python
+if command -v ${PYTHON_COMMAND} >/dev/null 2>&1; then
+    python_exe=${PYTHON_COMMAND}
+fi
+
+full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here
+dir=$(dirname "$full_cmd")
+exe=$(basename "$full_cmd")
+
+export PYTHONPATH="$dir/../../Source/Python${PYTHONPATH:+:"$PYTHONPATH"}"
+exec "${python_exe:-python}" "$dir/../../Source/Python/$exe/$exe.py" "$@"
diff --git a/BaseTools/BinWrappers/WindowsLike/AmlToHex.bat b/BaseTools/BinWrappers/WindowsLike/AmlToC.bat
similarity index 100%
rename from BaseTools/BinWrappers/WindowsLike/AmlToHex.bat
rename to BaseTools/BinWrappers/WindowsLike/AmlToC.bat
diff --git a/BaseTools/Source/Python/AmlToHex/AmlToHex.py b/BaseTools/Source/Python/AmlToC/AmlToC.py
similarity index 100%
rename from BaseTools/Source/Python/AmlToHex/AmlToHex.py
rename to BaseTools/Source/Python/AmlToC/AmlToC.py
-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v2 3/4] BaseTools: Compile AML bytecode arrays into .obj file
  2020-06-18 14:27 [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
  2020-06-18 14:27 ` [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files PierreGondois
  2020-06-18 14:27 ` [PATCH v2 2/4] BaseTools: Rename AmlToHex script to AmlToC PierreGondois
@ 2020-06-18 14:27 ` PierreGondois
  2020-06-24  5:48   ` [edk2-devel] " Bob Feng
  2020-06-18 14:27 ` [PATCH v2 4/4] BaseTools: Fix string concatenation PierreGondois
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: PierreGondois @ 2020-06-18 14:27 UTC (permalink / raw)
  To: devel; +Cc: Pierre Gondois, sami.mujawar, tomas.pilar, bob.c.feng, liming.gao,
	nd

From: Pierre Gondois <pierre.gondois@arm.com>

The AmlToHex script and Posix/WindowsLike wrappers convert
an AML file to a .hex file, containing a C array storing
AML bytecode. This ".hex" file can then be included in a
C file, allowing to access the AML bytecode from this C
file.

The EDK2 build system doesn't allow to a depict dependency
orders between files of different languages. For instance,
in a module containing a ".c" file and a ".asl", the ".c"
file may or may not be built prior to the ".asl" file.
This prevents any inclusion of a generated ".hex" in a
".c" file since this later ".hex" file may or may not
have been created yet.

This patch modifies the AmlToC script to generate a C file
instead of a ".hex" file.
It also adds the generation of an intermediate ".amli" file
when compiling an ASL file, and adds a rule to convert this
".amli" to a C file.

This allows to generate a C file containing the AML bytecode
from an ASL file. This C file will then be handled by the EDK2
build system to generate an object file.
Thus, no file inclusion will be required anymore. The C file
requiring the AML bytecode as a C array, and the ASL file,
will be compiled independently. The C array must be defined
as an external symbol. The linker is resolving the
reference to the C array symbol.

To summarize, the flow goes as:
 -1. ASL file is compiled to AML;
 -2. AML file is copied to a ".amli" intermediate file;
 -3. EDK2 build system applies the rule relevant to ".amli"
     files. This is, calling the "AmlToC" script, generating
     a C file from the ".amli" file;
 -4. EDK2 build system applies the rule relevant to C files.
     This is creating an object file.
 -5. EDK2 build system links the object file containing the
     AML bytecode with the object file requiring it.

Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
Signed-off-by: Tomas Pilar <Tomas.Pilar@arm.com>
---

The changes can be seen at https://github.com/PierreARM/edk2/commits/pg/803_Compile_AML_bytecode_array_into_OBJ_file_v2

Notes:
    Notes:
      v1:
       - Add a new rule to the build_rule.template file to
         generate ".obj" files from .asl files, and modify
         the AmlToC script accordingly. [Pierre]
      v2:
       - Restrict the rule to DXE_DRIVER. This allows to build
         the OvmfPkg, which was not the case in v1. [Pierre]

 BaseTools/Conf/build_rule.template       | 15 +++-
 BaseTools/Source/Python/AmlToC/AmlToC.py | 82 ++++++++------------
 2 files changed, 47 insertions(+), 50 deletions(-)

diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template
index 0822b681fcd9f61c6508e6f93ffc31fa70fd7059..c034869915914936e28f64a6aadba08e0169da44 100755
--- a/BaseTools/Conf/build_rule.template
+++ b/BaseTools/Conf/build_rule.template
@@ -419,6 +419,7 @@
 
     <OutputFile>
         $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml
+        $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli
 
     <ExtraDependency>
         $(MAKE_FILE)
@@ -428,14 +429,24 @@
         "$(ASLPP)" $(DEPS_FLAGS) $(ASLPP_FLAGS) $(INC) /I${s_path} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii
         Trim --source-code -l -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii 
         "$(ASL)" $(ASL_FLAGS) $(ASL_OUTFLAGS)${dst} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii
-        -AmlToHex $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml
+        $(CP) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli
 
     <Command.GCC>
         Trim --asl-file --asl-deps -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i -i $(INC_LIST) ${src}
         "$(ASLPP)" $(DEPS_FLAGS) $(ASLPP_FLAGS) $(INC) -I${s_path} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii
         Trim --source-code -l -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii 
         "$(ASL)" $(ASL_FLAGS) $(ASL_OUTFLAGS)${dst} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii
-        -AmlToHex $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml
+        $(CP) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli
+
+[Acpi-Machine-Language-File-to-C.DXE_DRIVER]
+    <InputFile>
+        ?.amli
+
+    <OutputFile>
+        ${s_path}(+)${s_base}.c
+
+    <Command>
+        -AmlToC ${src}
 
 [C-Code-File.AcpiTable]
     <InputFile>
diff --git a/BaseTools/Source/Python/AmlToC/AmlToC.py b/BaseTools/Source/Python/AmlToC/AmlToC.py
index 643db2910e37acfdd80ac18d288c921320a79ce1..346de7159de702d860bbd809ddbe8175f1493cfb 100644
--- a/BaseTools/Source/Python/AmlToC/AmlToC.py
+++ b/BaseTools/Source/Python/AmlToC/AmlToC.py
@@ -1,9 +1,9 @@
 ## @file
 #
-# Convert an AML file to a .hex file containing the AML bytecode stored in a
+# Convert an AML file to a .c file containing the AML bytecode stored in a
 # C array.
-# By default, "Tables\Dsdt.aml" will generate "Tables\Dsdt.hex".
-# "Tables\Dsdt.hex" will contain a C array named "dsdt_aml_code" that contains
+# By default, "Tables\Dsdt.aml" will generate "Tables\Dsdt.c".
+# "Tables\Dsdt.c" will contain a C array named "dsdt_aml_code" that contains
 # the AML bytecode.
 #
 # Copyright (c) 2020, ARM Limited. All rights reserved.<BR>
@@ -17,31 +17,26 @@ from Common.BuildToolError import *
 import sys
 import os
 
+__description__ = """
+Convert an AML file to a .c file containing the AML bytecode stored in a C
+array. By default, Tables\Dsdt.aml will generate Tables\Dsdt.c.
+Tables\Dsdt.c will contain a C array named "dsdt_aml_code" that contains
+the AML bytecode.
+"""
+
 ## Parse the command line arguments.
 #
 # @retval A argparse.NameSpace instance, containing parsed values.
 #
 def ParseArgs():
     # Initialize the parser.
-    Parser = argparse.ArgumentParser(
-      description="Convert an AML file to a .hex file containing the AML " + \
-                  "bytecode stored in a C array. By default, " + \
-                  "\"Tables\\Dsdt.aml\" will generate" + \
-                  "\"Tables\\Dsdt.hex\". \"Tables\\Dsdt.hex\" will " + \
-                  "contain a C array named \"dsdt_aml_code\" that " + \
-                  "contains the AML bytecode."
-      )
+    Parser = argparse.ArgumentParser(description=__description__)
 
     # Define the possible arguments.
-    Parser.add_argument(
-      dest="InputFile",
-      help="Path to an input AML file to generate a .hex file from."
-      )
-    Parser.add_argument(
-      "-o", "--out-dir", dest="OutDir",
-      help="Output directory where the .hex file will be generated. " + \
-           "Default is the input file's directory."
-      )
+    Parser.add_argument(dest="InputFile",
+                        help="Path to an input AML file to generate a .c file from.")
+    Parser.add_argument("-o", "--out-dir", dest="OutDir",
+                        help="Output directory where the .c file will be generated. Default is the input file's directory.")
 
     # Parse the input arguments.
     Args = Parser.parse_args()
@@ -55,9 +50,7 @@ def ParseArgs():
         with open(Args.InputFile, "rb") as fIn:
             Signature = str(fIn.read(4))
             if ("DSDT" not in Signature) and ("SSDT" not in Signature):
-                EdkLogger.info("Invalid file type. " + \
-                                "File does not have a valid " + \
-                                "DSDT or SSDT signature: %s" % Args.InputFile)
+                EdkLogger.info("Invalid file type. File does not have a valid DSDT or SSDT signature: {}".format(Args.InputFile))
                 return None
 
     # Get the basename of the input file.
@@ -66,42 +59,39 @@ def ParseArgs():
 
     # If no output directory is specified, output to the input directory.
     if not Args.OutDir:
-        Args.OutputFile = os.path.join(
-          os.path.dirname(Args.InputFile),
-          BaseName + ".hex"
-          )
+        Args.OutputFile = os.path.join(os.path.dirname(Args.InputFile),
+                                       BaseName + ".c")
     else:
         if not os.path.exists(Args.OutDir):
             os.mkdir(Args.OutDir)
-        Args.OutputFile = os.path.join(Args.OutDir, BaseName + ".hex")
+        Args.OutputFile = os.path.join(Args.OutDir, BaseName + ".c")
 
     Args.BaseName = BaseName
 
     return Args
 
-## Convert an AML file to a .hex file containing the AML bytecode stored
+## Convert an AML file to a .c file containing the AML bytecode stored
 #  in a C array.
 #
 # @param  InputFile     Path to the input AML file.
-# @param  OutputFile    Path to the output .hex file to generate.
+# @param  OutputFile    Path to the output .c file to generate.
 # @param  BaseName      Base name of the input file.
-#                       This is also the name of the generated .hex file.
+#                       This is also the name of the generated .c file.
 #
-def AmlToHex(InputFile, OutputFile, BaseName):
+def AmlToC(InputFile, OutputFile, BaseName):
 
-    MacroName = "__{}_HEX__".format(BaseName.upper())
     ArrayName = BaseName.lower() + "_aml_code"
+    FileHeader =\
+"""
+// This file has been generated from:
+//   -Python script: {}
+//   -Input AML file: {}
+
+"""
 
     with open(InputFile, "rb") as fIn, open(OutputFile, "w") as fOut:
         # Write header.
-        fOut.write("// This file has been generated from:\n" + \
-                   "// \tPython script: " + \
-                   os.path.abspath(__file__) + "\n" + \
-                   "// \tInput AML file: " + \
-                   os.path.abspath(InputFile) + "\n\n" + \
-                   "#ifndef {}\n".format(MacroName) + \
-                   "#define {}\n\n".format(MacroName)
-                   )
+        fOut.write(FileHeader.format(os.path.abspath(InputFile), os.path.abspath(__file__)))
 
         # Write the array and its content.
         fOut.write("unsigned char {}[] = {{\n  ".format(ArrayName))
@@ -115,15 +105,12 @@ def AmlToHex(InputFile, OutputFile, BaseName):
             byte = fIn.read(1)
         fOut.write("\n};\n")
 
-        # Write footer.
-        fOut.write("#endif // {}\n".format(MacroName))
-
 ## Main method
 #
 # This method:
 #   1-  Initialize an EdkLogger instance.
 #   2-  Parses the input arguments.
-#   3-  Converts an AML file to a .hex file containing the AML bytecode stored
+#   3-  Converts an AML file to a .c file containing the AML bytecode stored
 #       in a C array.
 #
 # @retval 0     Success.
@@ -139,10 +126,9 @@ def Main():
         if not CommandArguments:
             return 1
 
-        # Convert an AML file to a .hex file containing the AML bytecode stored
+        # Convert an AML file to a .c file containing the AML bytecode stored
         # in a C array.
-        AmlToHex(CommandArguments.InputFile, CommandArguments.OutputFile,
-                          CommandArguments.BaseName)
+        AmlToC(CommandArguments.InputFile, CommandArguments.OutputFile, CommandArguments.BaseName)
     except Exception as e:
         print(e)
         return 1
-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v2 4/4] BaseTools: Fix string concatenation
  2020-06-18 14:27 [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
                   ` (2 preceding siblings ...)
  2020-06-18 14:27 ` [PATCH v2 3/4] BaseTools: Compile AML bytecode arrays into .obj file PierreGondois
@ 2020-06-18 14:27 ` PierreGondois
  2020-06-18 14:39 ` [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
  2020-06-24  3:19 ` [edk2-devel] " Bob Feng
  5 siblings, 0 replies; 11+ messages in thread
From: PierreGondois @ 2020-06-18 14:27 UTC (permalink / raw)
  To: devel; +Cc: Pierre Gondois, sami.mujawar, tomas.pilar, bob.c.feng, liming.gao,
	nd

From: Pierre Gondois <pierre.gondois@arm.com>

Using Python 3.7.2 on win32, when printing a FileBuildRule
instance, the following error occurs:
File "edk2\BaseTools\Source\Python\AutoGen\BuildEngine.py",
line 177, in __str__
  DestString = ", ".join(self.DestFileList)
  TypeError: sequence item 0: expected str instance, PathClass found

This patch converts each PathClass element of the list to a string
instance before concatenating them.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---

The changes can be seen at https://github.com/PierreARM/edk2/commits/pg/803_Compile_AML_bytecode_array_into_OBJ_file_v2

Notes:
    Notes:
      v2:
       - No v1 for this patch. Fix a __str__ method. [Pierre]

 BaseTools/Source/Python/AutoGen/BuildEngine.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py b/BaseTools/Source/Python/AutoGen/BuildEngine.py
index d602414ca41f37155c9c6d00eec54ea3918840c3..722fead75af6d60aa82365d999837cd5ac3299af 100644
--- a/BaseTools/Source/Python/AutoGen/BuildEngine.py
+++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py
@@ -172,7 +172,7 @@ class FileBuildRule:
     def __str__(self):
         SourceString = ""
         SourceString += " %s %s %s" % (self.SourceFileType, " ".join(self.SourceFileExtList), self.ExtraSourceFileList)
-        DestString = ", ".join(self.DestFileList)
+        DestString = ", ".join([str(i) for i in self.DestFileList])
         CommandString = "\n\t".join(self.CommandList)
         return "%s : %s\n\t%s" % (DestString, SourceString, CommandString)
 
-- 
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 0/4] Compile AML bytecode array into OBJ file
  2020-06-18 14:27 [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
                   ` (3 preceding siblings ...)
  2020-06-18 14:27 ` [PATCH v2 4/4] BaseTools: Fix string concatenation PierreGondois
@ 2020-06-18 14:39 ` PierreGondois
  2020-06-24  3:19 ` [edk2-devel] " Bob Feng
  5 siblings, 0 replies; 11+ messages in thread
From: PierreGondois @ 2020-06-18 14:39 UTC (permalink / raw)
  To: Pierre Gondois, devel@edk2.groups.io
  Cc: Sami Mujawar, Tomas Pilar, bob.c.feng@intel.com,
	liming.gao@intel.com, nd

Hello Bob,
As discussed, I have created a pull request on the edk2 github. It is available here:
https://github.com/tianocore/edk2/pull/700
Feel free to delete it.

I have tested the patch set on the following confifurations, with the following formating for each line:
[DSC file] [Build environment (Linux/Windows)] [Arch] [Toolchain] [Build type (DEBUG, ...)]

ArmCrashDumpDxe_dsc LinuxEnv AARCH64 GCC5 DEBUG
ArmPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
ArmPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
ArmPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
ArmPlatformPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
ArmPlatformPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
ArmPlatformPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
ArmVirtQemuKernel_dsc LinuxEnv AARCH64 GCC5 DEBUG
ArmVirtQemuKernel_dsc LinuxEnv AARCH64 GCC5 NOOPT
ArmVirtQemuKernel_dsc LinuxEnv AARCH64 GCC5 RELEASE
ArmVirtQemu_dsc LinuxEnv AARCH64 GCC5 DEBUG
ArmVirtQemu_dsc LinuxEnv AARCH64 GCC5 NOOPT
ArmVirtQemu_dsc LinuxEnv AARCH64 GCC5 RELEASE
ArmVirtXen_dsc LinuxEnv AARCH64 GCC5 DEBUG
ArmVirtXen_dsc LinuxEnv AARCH64 GCC5 NOOPT
ArmVirtXen_dsc LinuxEnv AARCH64 GCC5 RELEASE
CryptoPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
CryptoPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
CryptoPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
DynamicTablesPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
DynamicTablesPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
DynamicTablesPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
EmbeddedPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
EmbeddedPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
EmbeddedPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
FatPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
FatPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
FatPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
FmpDevicePkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
FmpDevicePkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
FmpDevicePkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
MdeModulePkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
MdeModulePkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
MdeModulePkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
MdePkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
MdePkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
MdePkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
NetworkPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
NetworkPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
NetworkPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
SecurityPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
SecurityPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
SecurityPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
ShellPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
ShellPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
ShellPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
SignedCapsulePkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
SignedCapsulePkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
SignedCapsulePkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
StandaloneMmPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
StandaloneMmPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
UnitTestFrameworkPkg_dsc LinuxEnv AARCH64 GCC5 DEBUG
UnitTestFrameworkPkg_dsc LinuxEnv AARCH64 GCC5 NOOPT
UnitTestFrameworkPkg_dsc LinuxEnv AARCH64 GCC5 RELEASE
edk2_ArmPkg_ArmPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_ArmPkg_ArmPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_ArmPkg_ArmPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_ArmPkg_Drivers_ArmCrashDumpDxe_ArmCrashDumpDxe_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_ArmPkg_Drivers_ArmCrashDumpDxe_ArmCrashDumpDxe_dsc WindowsEnv AARCH64 VS2017 DEBUG
edk2_ArmPlatformPkg_ArmPlatformPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_ArmPlatformPkg_ArmPlatformPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_ArmPlatformPkg_ArmPlatformPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_ArmVirtPkg_ArmVirtQemuKernel_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_ArmVirtPkg_ArmVirtQemuKernel_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_ArmVirtPkg_ArmVirtQemuKernel_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_ArmVirtPkg_ArmVirtQemu_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_ArmVirtPkg_ArmVirtQemu_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_ArmVirtPkg_ArmVirtQemu_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_ArmVirtPkg_ArmVirtXen_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_ArmVirtPkg_ArmVirtXen_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_ArmVirtPkg_ArmVirtXen_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_CryptoPkg_CryptoPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_DynamicTablesPkg_DynamicTablesPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_DynamicTablesPkg_DynamicTablesPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_DynamicTablesPkg_DynamicTablesPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_DynamicTablesPkg_DynamicTablesPkg_dsc WindowsEnv AARCH64 VS2017 DEBUG
edk2_DynamicTablesPkg_DynamicTablesPkg_dsc WindowsEnv AARCH64 VS2017 NOOPT
edk2_DynamicTablesPkg_DynamicTablesPkg_dsc WindowsEnv AARCH64 VS2017 RELEASE
edk2_EmulatorPkg_EmulatorPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_EmulatorPkg_EmulatorPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_EmulatorPkg_EmulatorPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_EmulatorPkg_EmulatorPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_EmulatorPkg_EmulatorPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_EmulatorPkg_EmulatorPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_FatPkg_FatPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_FatPkg_FatPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_FatPkg_FatPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_FatPkg_FatPkg_dsc WindowsEnv AARCH64 VS2017 DEBUG
edk2_FatPkg_FatPkg_dsc WindowsEnv AARCH64 VS2017 NOOPT
edk2_FatPkg_FatPkg_dsc WindowsEnv AARCH64 VS2017 RELEASE
edk2_FatPkg_FatPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_FatPkg_FatPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_FatPkg_FatPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_FatPkg_FatPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_FatPkg_FatPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_FatPkg_FatPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_FmpDevicePkg_FmpDevicePkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_FmpDevicePkg_Test_FmpDeviceHostPkgTest_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_FmpDevicePkg_Test_FmpDeviceHostPkgTest_dsc WindowsEnv X64 VS2017 NOOPT
edk2_IntelFsp2Pkg_IntelFsp2Pkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_IntelFsp2Pkg_IntelFsp2Pkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_IntelFsp2Pkg_IntelFsp2Pkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_IntelFsp2WrapperPkg_IntelFsp2WrapperPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_IntelFsp2WrapperPkg_IntelFsp2WrapperPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_IntelFsp2WrapperPkg_IntelFsp2WrapperPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_IntelFsp2WrapperPkg_IntelFsp2WrapperPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_IntelFsp2WrapperPkg_IntelFsp2WrapperPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_IntelFsp2WrapperPkg_IntelFsp2WrapperPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_MdeModulePkg_MdeModulePkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_MdeModulePkg_Test_MdeModulePkgHostTest_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_MdeModulePkg_Test_MdeModulePkgHostTest_dsc WindowsEnv X64 VS2017 NOOPT
edk2_MdePkg_MdePkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_MdePkg_MdePkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_MdePkg_MdePkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_MdePkg_MdePkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_MdePkg_MdePkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_MdePkg_MdePkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_MdePkg_MdePkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_MdePkg_MdePkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_MdePkg_MdePkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_MdePkg_Test_MdePkgHostTest_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_MdePkg_Test_MdePkgHostTest_dsc WindowsEnv X64 VS2017 NOOPT
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_NetworkPkg_NetworkPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_OvmfPkg_OvmfPkgIa32_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_OvmfPkg_OvmfPkgIa32_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_OvmfPkg_OvmfPkgIa32_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_OvmfPkg_OvmfPkgX64_dsc WindowsEnv X64 VS2017 DEBUG
edk2_OvmfPkg_OvmfPkgX64_dsc WindowsEnv X64 VS2017 NOOPT
edk2_OvmfPkg_OvmfPkgX64_dsc WindowsEnv X64 VS2017 RELEASE
edk2_OvmfPkg_OvmfXen_dsc WindowsEnv X64 VS2017 DEBUG
edk2_OvmfPkg_OvmfXen_dsc WindowsEnv X64 VS2017 NOOPT
edk2_OvmfPkg_OvmfXen_dsc WindowsEnv X64 VS2017 RELEASE
edk2_PcAtChipsetPkg_PcAtChipsetPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_PcAtChipsetPkg_PcAtChipsetPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_PcAtChipsetPkg_PcAtChipsetPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_PcAtChipsetPkg_PcAtChipsetPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_PcAtChipsetPkg_PcAtChipsetPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_PcAtChipsetPkg_PcAtChipsetPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv AARCH64 VS2017 DEBUG
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv AARCH64 VS2017 NOOPT
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv AARCH64 VS2017 RELEASE
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_SecurityPkg_SecurityPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_ShellPkg_ShellPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_ShellPkg_ShellPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_ShellPkg_ShellPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_ShellPkg_ShellPkg_dsc WindowsEnv AARCH64 VS2017 DEBUG
edk2_ShellPkg_ShellPkg_dsc WindowsEnv AARCH64 VS2017 NOOPT
edk2_ShellPkg_ShellPkg_dsc WindowsEnv AARCH64 VS2017 RELEASE
edk2_ShellPkg_ShellPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_ShellPkg_ShellPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_ShellPkg_ShellPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_ShellPkg_ShellPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_ShellPkg_ShellPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_ShellPkg_ShellPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_SignedCapsulePkg_SignedCapsulePkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_SourceLevelDebugPkg_SourceLevelDebugPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_SourceLevelDebugPkg_SourceLevelDebugPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_SourceLevelDebugPkg_SourceLevelDebugPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_SourceLevelDebugPkg_SourceLevelDebugPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_SourceLevelDebugPkg_SourceLevelDebugPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_SourceLevelDebugPkg_SourceLevelDebugPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_StandaloneMmPkg_StandaloneMmPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_StandaloneMmPkg_StandaloneMmPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_UefiCpuPkg_UefiCpuPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_UefiCpuPkg_UefiCpuPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_UefiCpuPkg_UefiCpuPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_UefiCpuPkg_UefiCpuPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_UefiCpuPkg_UefiCpuPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_UefiCpuPkg_UefiCpuPkg_dsc WindowsEnv X64 VS2017 RELEASE
edk2_UefiPayloadPkg_UefiPayloadPkgIa32_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_UefiPayloadPkg_UefiPayloadPkgIa32_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_UnitTestFrameworkPkg_Test_UnitTestFrameworkPkgHostTest_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_UnitTestFrameworkPkg_Test_UnitTestFrameworkPkgHostTest_dsc WindowsEnv X64 VS2017 NOOPT
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv AARCH64 GCC5 DEBUG
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv AARCH64 GCC5 NOOPT
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv AARCH64 GCC5 RELEASE
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv AARCH64 VS2017 DEBUG
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv AARCH64 VS2017 NOOPT
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv AARCH64 VS2017 RELEASE
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv IA32 VS2017 DEBUG
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv IA32 VS2017 NOOPT
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv IA32 VS2017 RELEASE
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv X64 VS2017 DEBUG
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv X64 VS2017 NOOPT
edk2_UnitTestFrameworkPkg_UnitTestFrameworkPkg_dsc WindowsEnv X64 VS2017 RELEASE

Regards,
Pierre

-----Original Message-----
From: PierreGondois <pierre.gondois@arm.com> 
Sent: Thursday, June 18, 2020 3:27 PM
To: devel@edk2.groups.io
Cc: Pierre Gondois <Pierre.Gondois@arm.com>; Sami Mujawar <Sami.Mujawar@arm.com>; Tomas Pilar <Tomas.Pilar@arm.com>; bob.c.feng@intel.com; liming.gao@intel.com; nd <nd@arm.com>
Subject: [PATCH v2 0/4] Compile AML bytecode array into OBJ file

Following the BZ at https://bugzilla.tianocore.org/show_bug.cgi?id=2425
This patch serie is a another way to solve the dependency of C files over ASL files. With this new method, the dependency is resolved at the linking stage.

The last method to solve this dependency was to add the possibility to modify INF files to depict such a dependency. This method was not accepted. The discussion is available at https://edk2.groups.io/g/devel/topic/72655342#56658

The last patch modifying the INF specification and INF parsing are available at:
https://edk2.groups.io/g/devel/topic/72655342#56658
https://edk2.groups.io/g/devel/topic/72656060#56662

Pierre Gondois (4):
  BaseTools: Generate multiple rules when multiple output files
  BaseTools: Rename AmlToHex script to AmlToC
  BaseTools: Compile AML bytecode arrays into .obj file
  BaseTools: Fix string concatenation

 BaseTools/BinWrappers/PosixLike/{AmlToHex => AmlToC}               | 28 +++----
 BaseTools/BinWrappers/WindowsLike/{AmlToHex.bat => AmlToC.bat}     |  0
 BaseTools/Conf/build_rule.template                                 | 15 +++-
 BaseTools/Source/Python/{AmlToHex/AmlToHex.py => AmlToC/AmlToC.py} | 82 ++++++++------------
 BaseTools/Source/Python/AutoGen/BuildEngine.py                     |  2 +-
 BaseTools/Source/Python/AutoGen/GenMake.py                         |  6 ++
 BaseTools/Source/Python/AutoGen/ModuleAutoGen.py                   | 38 +++++----
 7 files changed, 89 insertions(+), 82 deletions(-)  rename BaseTools/BinWrappers/PosixLike/{AmlToHex => AmlToC} (97%)  rename BaseTools/BinWrappers/WindowsLike/{AmlToHex.bat => AmlToC.bat} (100%)  rename BaseTools/Source/Python/{AmlToHex/AmlToHex.py => AmlToC/AmlToC.py} (52%)

--
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files
  2020-06-18 14:27 ` [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files PierreGondois
@ 2020-06-19  6:34   ` Yuwei Chen
  2020-06-23 16:33     ` PierreGondois
  0 siblings, 1 reply; 11+ messages in thread
From: Yuwei Chen @ 2020-06-19  6:34 UTC (permalink / raw)
  To: devel@edk2.groups.io, pierre.gondois@arm.com
  Cc: sami.mujawar@arm.com, tomas.pilar@arm.com, Feng, Bob C,
	Gao, Liming, nd@arm.com

Hi, Pierre

The patch looks good.

Thanks,
Yuwei
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> PierreGondois
> Sent: Thursday, June 18, 2020 10:27 PM
> To: devel@edk2.groups.io
> Cc: Pierre Gondois <Pierre.Gondois@arm.com>; sami.mujawar@arm.com;
> tomas.pilar@arm.com; Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming
> <liming.gao@intel.com>; nd@arm.com
> Subject: [edk2-devel] [PATCH v2 1/4] BaseTools: Generate multiple rules
> when multiple output files
> 
> From: Pierre Gondois <pierre.gondois@arm.com>
> 
> This patch modifies the Makefile generation not to stop adding Makfile rules
> when the first final target is found.
> E.g.:
> If the following rules are described in build_rule.txt:
>  -[Rule1]: .X files generate .Y and .Z files;
>  -[Rule2]: .Z files generate .Z1 files.
> Currently, if a File1.X file was part of the sources of a module, only [Rule1]
> would be generated in the Makefile.
> Indeed, there are no rules to apply to .Y files: .Y files are a final target.
> However, there is still [Rule2] to apply to .Z files.
> 
> This patch also adds a dependency between the first ouput file of a rule and
> the other output files.
> For instance, with the same example as above, File1.Y and File1.Z are
> generated by the following rule:
> File1.Y: File1.X
>     <Generate File1.Y>
>     <Generate File1.Z>
> 
> and the new dependency is:
> File1.Z: File1.Y
> 
> This is necessary to keep a dependency order during the execution of the
> Makefile. Indeed, .Y and .Z files are generated by the execution of a common
> set of commands, and without this rule, there is no explicit dependency
> relation between them.
> 
> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
> ---
> 
> The changes can be seen at
> https://github.com/PierreARM/edk2/commits/pg/803_Compile_AML_bytec
> ode_array_into_OBJ_file_v2
> 
> Notes:
>     Notes:
>       v1:
>        - Generate multiple rules when multiple output files
>          are specified in the build_rule.txt file. [Pierre]
>       v2:
>        - Use the "FileType" variable in the _ApplyBuildRule
>          function as it is in the current state. [Pierre]
> 
>  BaseTools/Source/Python/AutoGen/GenMake.py       |  6 ++++
>  BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 38
> +++++++++++---------
>  2 files changed, 27 insertions(+), 17 deletions(-)
> 
> diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py
> b/BaseTools/Source/Python/AutoGen/GenMake.py
> index
> bbb3c29446f53fa7f2cb61a216a5b119f72c3fbc..0314d0ea34d99a014379e8d30c
> 46ac0f0a7068ce 100755
> --- a/BaseTools/Source/Python/AutoGen/GenMake.py
> +++ b/BaseTools/Source/Python/AutoGen/GenMake.py
> @@ -1054,6 +1054,12 @@ cleanlib:
>                      TargetDict = {"target": self.PlaceMacro(T.Target.Path, self.Macros),
> "cmd": "\n\t".join(T.Commands),"deps": Deps}
> 
> self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(Target
> Dict))
> 
> +                    # Add a Makefile rule for targets generating multiple files.
> +                    # The main output is a prerequisite for the other output files.
> +                    for i in T.Outputs[1:]:
> +                        AnnexeTargetDict = {"target": self.PlaceMacro(i.Path,
> self.Macros), "cmd": "", "deps": self.PlaceMacro(T.Target.Path, self.Macros)}
> +
> +
> self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(Annex
> e
> + TargetDict))
> +
>      def ParserCCodeFile(self, T, Type, CmdSumDict, CmdTargetDict,
> CmdCppDict, DependencyDict):
>          if not CmdSumDict:
>              for item in self._AutoGenObject.Targets[Type]:
> diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> index
> aad591de65f086043d55aeea5661f59c53792e7c..dc8b1fe3d160cac2da22227fc2
> 33e3aa0d92cb1e 100755
> --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> @@ -860,7 +860,8 @@ class ModuleAutoGen(AutoGen):
>          SubDirectory = os.path.join(self.OutputDir, File.SubDir)
>          if not os.path.exists(SubDirectory):
>              CreateDirectory(SubDirectory)
> -        LastTarget = None
> +        TargetList = set()
> +        FinalTargetName = set()
>          RuleChain = set()
>          SourceList = [File]
>          Index = 0
> @@ -870,6 +871,9 @@ class ModuleAutoGen(AutoGen):
>          self.BuildOption
> 
>          while Index < len(SourceList):
> +            # Reset the FileType if not the first iteration.
> +            if Index > 0:
> +                FileType = TAB_UNKNOWN_FILE
>              Source = SourceList[Index]
>              Index = Index + 1
> 
> @@ -886,29 +890,25 @@ class ModuleAutoGen(AutoGen):
>              elif Source.Ext in self.BuildRules:
>                  RuleObject = self.BuildRules[Source.Ext]
>              else:
> -                # stop at no more rules
> -                if LastTarget:
> -                    self._FinalBuildTargetList.add(LastTarget)
> -                break
> +                # No more rule to apply: Source is a final target.
> +                FinalTargetName.add(Source)
> +                continue
> 
>              FileType = RuleObject.SourceFileType
>              self._FileTypes[FileType].add(Source)
> 
>              # stop at STATIC_LIBRARY for library
>              if self.IsLibrary and FileType == TAB_STATIC_LIBRARY:
> -                if LastTarget:
> -                    self._FinalBuildTargetList.add(LastTarget)
> -                break
> +                FinalTargetName.add(Source)
> +                continue
> 
>              Target = RuleObject.Apply(Source, self.BuildRuleOrder)
>              if not Target:
> -                if LastTarget:
> -                    self._FinalBuildTargetList.add(LastTarget)
> -                break
> -            elif not Target.Outputs:
> -                # Only do build for target with outputs
> -                self._FinalBuildTargetList.add(Target)
> +                # No Target: Source is a final target.
> +                FinalTargetName.add(Source)
> +                continue
> 
> +            TargetList.add(Target)
>              self._BuildTargets[FileType].add(Target)
> 
>              if not Source.IsBinary and Source == File:
> @@ -916,12 +916,16 @@ class ModuleAutoGen(AutoGen):
> 
>              # to avoid cyclic rule
>              if FileType in RuleChain:
> -                break
> +                EdkLogger.error("build", ERROR_STATEMENT, "Cyclic
> + dependency detected while generating rule for %s" % str(Source))
> 
>              RuleChain.add(FileType)
>              SourceList.extend(Target.Outputs)
> -            LastTarget = Target
> -            FileType = TAB_UNKNOWN_FILE
> +
> +        # For each final target name, retrieve the corresponding
> TargetDescBlock instance.
> +        for FTargetName in FinalTargetName:
> +            for Target in TargetList:
> +                if FTargetName == Target.Target:
> +                    self._FinalBuildTargetList.add(Target)
> 
>      @cached_property
>      def Targets(self):
> --
> 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'
> 
> 
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files
  2020-06-19  6:34   ` [edk2-devel] " Yuwei Chen
@ 2020-06-23 16:33     ` PierreGondois
  0 siblings, 0 replies; 11+ messages in thread
From: PierreGondois @ 2020-06-23 16:33 UTC (permalink / raw)
  To: Chen, Yuwei, devel@edk2.groups.io
  Cc: Sami Mujawar, Tomas Pilar, Feng, Bob C, Gao, Liming, nd

Hello Yuwei and Bob,
Thank you for the review Yuwei.
Bob, are the patches acceptable?

Regards,
Pierre

-----Original Message-----
From: Chen, Yuwei <yuwei.chen@intel.com> 
Sent: Friday, June 19, 2020 7:35 AM
To: devel@edk2.groups.io; Pierre Gondois <Pierre.Gondois@arm.com>
Cc: Sami Mujawar <Sami.Mujawar@arm.com>; Tomas Pilar <Tomas.Pilar@arm.com>; Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming <liming.gao@intel.com>; nd <nd@arm.com>
Subject: RE: [edk2-devel] [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files

Hi, Pierre

The patch looks good.

Thanks,
Yuwei
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of 
> PierreGondois
> Sent: Thursday, June 18, 2020 10:27 PM
> To: devel@edk2.groups.io
> Cc: Pierre Gondois <Pierre.Gondois@arm.com>; sami.mujawar@arm.com; 
> tomas.pilar@arm.com; Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming 
> <liming.gao@intel.com>; nd@arm.com
> Subject: [edk2-devel] [PATCH v2 1/4] BaseTools: Generate multiple 
> rules when multiple output files
> 
> From: Pierre Gondois <pierre.gondois@arm.com>
> 
> This patch modifies the Makefile generation not to stop adding Makfile 
> rules when the first final target is found.
> E.g.:
> If the following rules are described in build_rule.txt:
>  -[Rule1]: .X files generate .Y and .Z files;
>  -[Rule2]: .Z files generate .Z1 files.
> Currently, if a File1.X file was part of the sources of a module, only 
> [Rule1] would be generated in the Makefile.
> Indeed, there are no rules to apply to .Y files: .Y files are a final target.
> However, there is still [Rule2] to apply to .Z files.
> 
> This patch also adds a dependency between the first ouput file of a 
> rule and the other output files.
> For instance, with the same example as above, File1.Y and File1.Z are 
> generated by the following rule:
> File1.Y: File1.X
>     <Generate File1.Y>
>     <Generate File1.Z>
> 
> and the new dependency is:
> File1.Z: File1.Y
> 
> This is necessary to keep a dependency order during the execution of 
> the Makefile. Indeed, .Y and .Z files are generated by the execution 
> of a common set of commands, and without this rule, there is no 
> explicit dependency relation between them.
> 
> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
> ---
> 
> The changes can be seen at
> https://github.com/PierreARM/edk2/commits/pg/803_Compile_AML_bytec
> ode_array_into_OBJ_file_v2
> 
> Notes:
>     Notes:
>       v1:
>        - Generate multiple rules when multiple output files
>          are specified in the build_rule.txt file. [Pierre]
>       v2:
>        - Use the "FileType" variable in the _ApplyBuildRule
>          function as it is in the current state. [Pierre]
> 
>  BaseTools/Source/Python/AutoGen/GenMake.py       |  6 ++++
>  BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 38
> +++++++++++---------
>  2 files changed, 27 insertions(+), 17 deletions(-)
> 
> diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py
> b/BaseTools/Source/Python/AutoGen/GenMake.py
> index
> bbb3c29446f53fa7f2cb61a216a5b119f72c3fbc..0314d0ea34d99a014379e8d30c
> 46ac0f0a7068ce 100755
> --- a/BaseTools/Source/Python/AutoGen/GenMake.py
> +++ b/BaseTools/Source/Python/AutoGen/GenMake.py
> @@ -1054,6 +1054,12 @@ cleanlib:
>                      TargetDict = {"target": 
> self.PlaceMacro(T.Target.Path, self.Macros),
> "cmd": "\n\t".join(T.Commands),"deps": Deps}
> 
> self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(Target
> Dict))
> 
> +                    # Add a Makefile rule for targets generating multiple files.
> +                    # The main output is a prerequisite for the other output files.
> +                    for i in T.Outputs[1:]:
> +                        AnnexeTargetDict = {"target": 
> + self.PlaceMacro(i.Path,
> self.Macros), "cmd": "", "deps": self.PlaceMacro(T.Target.Path, 
> self.Macros)}
> +
> +
> self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(Annex
> e
> + TargetDict))
> +
>      def ParserCCodeFile(self, T, Type, CmdSumDict, CmdTargetDict, 
> CmdCppDict, DependencyDict):
>          if not CmdSumDict:
>              for item in self._AutoGenObject.Targets[Type]:
> diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> index
> aad591de65f086043d55aeea5661f59c53792e7c..dc8b1fe3d160cac2da22227fc2
> 33e3aa0d92cb1e 100755
> --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
> @@ -860,7 +860,8 @@ class ModuleAutoGen(AutoGen):
>          SubDirectory = os.path.join(self.OutputDir, File.SubDir)
>          if not os.path.exists(SubDirectory):
>              CreateDirectory(SubDirectory)
> -        LastTarget = None
> +        TargetList = set()
> +        FinalTargetName = set()
>          RuleChain = set()
>          SourceList = [File]
>          Index = 0
> @@ -870,6 +871,9 @@ class ModuleAutoGen(AutoGen):
>          self.BuildOption
> 
>          while Index < len(SourceList):
> +            # Reset the FileType if not the first iteration.
> +            if Index > 0:
> +                FileType = TAB_UNKNOWN_FILE
>              Source = SourceList[Index]
>              Index = Index + 1
> 
> @@ -886,29 +890,25 @@ class ModuleAutoGen(AutoGen):
>              elif Source.Ext in self.BuildRules:
>                  RuleObject = self.BuildRules[Source.Ext]
>              else:
> -                # stop at no more rules
> -                if LastTarget:
> -                    self._FinalBuildTargetList.add(LastTarget)
> -                break
> +                # No more rule to apply: Source is a final target.
> +                FinalTargetName.add(Source)
> +                continue
> 
>              FileType = RuleObject.SourceFileType
>              self._FileTypes[FileType].add(Source)
> 
>              # stop at STATIC_LIBRARY for library
>              if self.IsLibrary and FileType == TAB_STATIC_LIBRARY:
> -                if LastTarget:
> -                    self._FinalBuildTargetList.add(LastTarget)
> -                break
> +                FinalTargetName.add(Source)
> +                continue
> 
>              Target = RuleObject.Apply(Source, self.BuildRuleOrder)
>              if not Target:
> -                if LastTarget:
> -                    self._FinalBuildTargetList.add(LastTarget)
> -                break
> -            elif not Target.Outputs:
> -                # Only do build for target with outputs
> -                self._FinalBuildTargetList.add(Target)
> +                # No Target: Source is a final target.
> +                FinalTargetName.add(Source)
> +                continue
> 
> +            TargetList.add(Target)
>              self._BuildTargets[FileType].add(Target)
> 
>              if not Source.IsBinary and Source == File:
> @@ -916,12 +916,16 @@ class ModuleAutoGen(AutoGen):
> 
>              # to avoid cyclic rule
>              if FileType in RuleChain:
> -                break
> +                EdkLogger.error("build", ERROR_STATEMENT, "Cyclic 
> + dependency detected while generating rule for %s" % str(Source))
> 
>              RuleChain.add(FileType)
>              SourceList.extend(Target.Outputs)
> -            LastTarget = Target
> -            FileType = TAB_UNKNOWN_FILE
> +
> +        # For each final target name, retrieve the corresponding
> TargetDescBlock instance.
> +        for FTargetName in FinalTargetName:
> +            for Target in TargetList:
> +                if FTargetName == Target.Target:
> +                    self._FinalBuildTargetList.add(Target)
> 
>      @cached_property
>      def Targets(self):
> --
> 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'
> 
> 
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v2 0/4] Compile AML bytecode array into OBJ file
  2020-06-18 14:27 [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
                   ` (4 preceding siblings ...)
  2020-06-18 14:39 ` [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
@ 2020-06-24  3:19 ` Bob Feng
  5 siblings, 0 replies; 11+ messages in thread
From: Bob Feng @ 2020-06-24  3:19 UTC (permalink / raw)
  To: devel@edk2.groups.io, pierre.gondois@arm.com
  Cc: sami.mujawar@arm.com, tomas.pilar@arm.com, Gao, Liming,
	nd@arm.com

Hi Pierre,

This patch set looks good to me.

Reviewed-by: Bob Feng<bob.c.feng@intel.com>

Thanks,
Bob

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of PierreGondois
Sent: Thursday, June 18, 2020 10:27 PM
To: devel@edk2.groups.io
Cc: Pierre Gondois <Pierre.Gondois@arm.com>; sami.mujawar@arm.com; tomas.pilar@arm.com; Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming <liming.gao@intel.com>; nd@arm.com
Subject: [edk2-devel] [PATCH v2 0/4] Compile AML bytecode array into OBJ file

Following the BZ at https://bugzilla.tianocore.org/show_bug.cgi?id=2425
This patch serie is a another way to solve the dependency of C files over ASL files. With this new method, the dependency is resolved at the linking stage.

The last method to solve this dependency was to add the possibility to modify INF files to depict such a dependency. This method was not accepted. The discussion is available at https://edk2.groups.io/g/devel/topic/72655342#56658

The last patch modifying the INF specification and INF parsing are available at:
https://edk2.groups.io/g/devel/topic/72655342#56658
https://edk2.groups.io/g/devel/topic/72656060#56662

Pierre Gondois (4):
  BaseTools: Generate multiple rules when multiple output files
  BaseTools: Rename AmlToHex script to AmlToC
  BaseTools: Compile AML bytecode arrays into .obj file
  BaseTools: Fix string concatenation

 BaseTools/BinWrappers/PosixLike/{AmlToHex => AmlToC}               | 28 +++----
 BaseTools/BinWrappers/WindowsLike/{AmlToHex.bat => AmlToC.bat}     |  0
 BaseTools/Conf/build_rule.template                                 | 15 +++-
 BaseTools/Source/Python/{AmlToHex/AmlToHex.py => AmlToC/AmlToC.py} | 82 ++++++++------------
 BaseTools/Source/Python/AutoGen/BuildEngine.py                     |  2 +-
 BaseTools/Source/Python/AutoGen/GenMake.py                         |  6 ++
 BaseTools/Source/Python/AutoGen/ModuleAutoGen.py                   | 38 +++++----
 7 files changed, 89 insertions(+), 82 deletions(-)  rename BaseTools/BinWrappers/PosixLike/{AmlToHex => AmlToC} (97%)  rename BaseTools/BinWrappers/WindowsLike/{AmlToHex.bat => AmlToC.bat} (100%)  rename BaseTools/Source/Python/{AmlToHex/AmlToHex.py => AmlToC/AmlToC.py} (52%)

--
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'





^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v2 3/4] BaseTools: Compile AML bytecode arrays into .obj file
  2020-06-18 14:27 ` [PATCH v2 3/4] BaseTools: Compile AML bytecode arrays into .obj file PierreGondois
@ 2020-06-24  5:48   ` Bob Feng
  0 siblings, 0 replies; 11+ messages in thread
From: Bob Feng @ 2020-06-24  5:48 UTC (permalink / raw)
  To: devel@edk2.groups.io, pierre.gondois@arm.com
  Cc: sami.mujawar@arm.com, tomas.pilar@arm.com, Gao, Liming,
	nd@arm.com

Hi Pierre,

The commit message should not have more than one Signed-off-by.

Use of Suggested-by may be more appropriate here.

Thanks,
Bob

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of PierreGondois
Sent: Thursday, June 18, 2020 10:27 PM
To: devel@edk2.groups.io
Cc: Pierre Gondois <Pierre.Gondois@arm.com>; sami.mujawar@arm.com; tomas.pilar@arm.com; Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming <liming.gao@intel.com>; nd@arm.com
Subject: [edk2-devel] [PATCH v2 3/4] BaseTools: Compile AML bytecode arrays into .obj file

From: Pierre Gondois <pierre.gondois@arm.com>

The AmlToHex script and Posix/WindowsLike wrappers convert an AML file to a .hex file, containing a C array storing AML bytecode. This ".hex" file can then be included in a C file, allowing to access the AML bytecode from this C file.

The EDK2 build system doesn't allow to a depict dependency orders between files of different languages. For instance, in a module containing a ".c" file and a ".asl", the ".c"
file may or may not be built prior to the ".asl" file.
This prevents any inclusion of a generated ".hex" in a ".c" file since this later ".hex" file may or may not have been created yet.

This patch modifies the AmlToC script to generate a C file instead of a ".hex" file.
It also adds the generation of an intermediate ".amli" file when compiling an ASL file, and adds a rule to convert this ".amli" to a C file.

This allows to generate a C file containing the AML bytecode from an ASL file. This C file will then be handled by the EDK2 build system to generate an object file.
Thus, no file inclusion will be required anymore. The C file requiring the AML bytecode as a C array, and the ASL file, will be compiled independently. The C array must be defined as an external symbol. The linker is resolving the reference to the C array symbol.

To summarize, the flow goes as:
 -1. ASL file is compiled to AML;
 -2. AML file is copied to a ".amli" intermediate file;  -3. EDK2 build system applies the rule relevant to ".amli"
     files. This is, calling the "AmlToC" script, generating
     a C file from the ".amli" file;
 -4. EDK2 build system applies the rule relevant to C files.
     This is creating an object file.
 -5. EDK2 build system links the object file containing the
     AML bytecode with the object file requiring it.

Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
Signed-off-by: Tomas Pilar <Tomas.Pilar@arm.com>
---

The changes can be seen at https://github.com/PierreARM/edk2/commits/pg/803_Compile_AML_bytecode_array_into_OBJ_file_v2

Notes:
    Notes:
      v1:
       - Add a new rule to the build_rule.template file to
         generate ".obj" files from .asl files, and modify
         the AmlToC script accordingly. [Pierre]
      v2:
       - Restrict the rule to DXE_DRIVER. This allows to build
         the OvmfPkg, which was not the case in v1. [Pierre]

 BaseTools/Conf/build_rule.template       | 15 +++-
 BaseTools/Source/Python/AmlToC/AmlToC.py | 82 ++++++++------------
 2 files changed, 47 insertions(+), 50 deletions(-)

diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template
index 0822b681fcd9f61c6508e6f93ffc31fa70fd7059..c034869915914936e28f64a6aadba08e0169da44 100755
--- a/BaseTools/Conf/build_rule.template
+++ b/BaseTools/Conf/build_rule.template
@@ -419,6 +419,7 @@
 
     <OutputFile>
         $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml
+        $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli
 
     <ExtraDependency>
         $(MAKE_FILE)
@@ -428,14 +429,24 @@
         "$(ASLPP)" $(DEPS_FLAGS) $(ASLPP_FLAGS) $(INC) /I${s_path} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii
         Trim --source-code -l -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii 
         "$(ASL)" $(ASL_FLAGS) $(ASL_OUTFLAGS)${dst} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii
-        -AmlToHex $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml
+        $(CP) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml 
+ $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli
 
     <Command.GCC>
         Trim --asl-file --asl-deps -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i -i $(INC_LIST) ${src}
         "$(ASLPP)" $(DEPS_FLAGS) $(ASLPP_FLAGS) $(INC) -I${s_path} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii
         Trim --source-code -l -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iii 
         "$(ASL)" $(ASL_FLAGS) $(ASL_OUTFLAGS)${dst} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii
-        -AmlToHex $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml
+        $(CP) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.aml 
+ $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.amli
+
+[Acpi-Machine-Language-File-to-C.DXE_DRIVER]
+    <InputFile>
+        ?.amli
+
+    <OutputFile>
+        ${s_path}(+)${s_base}.c
+
+    <Command>
+        -AmlToC ${src}
 
 [C-Code-File.AcpiTable]
     <InputFile>
diff --git a/BaseTools/Source/Python/AmlToC/AmlToC.py b/BaseTools/Source/Python/AmlToC/AmlToC.py
index 643db2910e37acfdd80ac18d288c921320a79ce1..346de7159de702d860bbd809ddbe8175f1493cfb 100644
--- a/BaseTools/Source/Python/AmlToC/AmlToC.py
+++ b/BaseTools/Source/Python/AmlToC/AmlToC.py
@@ -1,9 +1,9 @@
 ## @file
 #
-# Convert an AML file to a .hex file containing the AML bytecode stored in a
+# Convert an AML file to a .c file containing the AML bytecode stored 
+in a
 # C array.
-# By default, "Tables\Dsdt.aml" will generate "Tables\Dsdt.hex".
-# "Tables\Dsdt.hex" will contain a C array named "dsdt_aml_code" that contains
+# By default, "Tables\Dsdt.aml" will generate "Tables\Dsdt.c".
+# "Tables\Dsdt.c" will contain a C array named "dsdt_aml_code" that 
+contains
 # the AML bytecode.
 #
 # Copyright (c) 2020, ARM Limited. All rights reserved.<BR> @@ -17,31 +17,26 @@ from Common.BuildToolError import *  import sys  import os
 
+__description__ = """
+Convert an AML file to a .c file containing the AML bytecode stored in 
+a C array. By default, Tables\Dsdt.aml will generate Tables\Dsdt.c.
+Tables\Dsdt.c will contain a C array named "dsdt_aml_code" that 
+contains the AML bytecode.
+"""
+
 ## Parse the command line arguments.
 #
 # @retval A argparse.NameSpace instance, containing parsed values.
 #
 def ParseArgs():
     # Initialize the parser.
-    Parser = argparse.ArgumentParser(
-      description="Convert an AML file to a .hex file containing the AML " + \
-                  "bytecode stored in a C array. By default, " + \
-                  "\"Tables\\Dsdt.aml\" will generate" + \
-                  "\"Tables\\Dsdt.hex\". \"Tables\\Dsdt.hex\" will " + \
-                  "contain a C array named \"dsdt_aml_code\" that " + \
-                  "contains the AML bytecode."
-      )
+    Parser = argparse.ArgumentParser(description=__description__)
 
     # Define the possible arguments.
-    Parser.add_argument(
-      dest="InputFile",
-      help="Path to an input AML file to generate a .hex file from."
-      )
-    Parser.add_argument(
-      "-o", "--out-dir", dest="OutDir",
-      help="Output directory where the .hex file will be generated. " + \
-           "Default is the input file's directory."
-      )
+    Parser.add_argument(dest="InputFile",
+                        help="Path to an input AML file to generate a .c file from.")
+    Parser.add_argument("-o", "--out-dir", dest="OutDir",
+                        help="Output directory where the .c file will 
+ be generated. Default is the input file's directory.")
 
     # Parse the input arguments.
     Args = Parser.parse_args()
@@ -55,9 +50,7 @@ def ParseArgs():
         with open(Args.InputFile, "rb") as fIn:
             Signature = str(fIn.read(4))
             if ("DSDT" not in Signature) and ("SSDT" not in Signature):
-                EdkLogger.info("Invalid file type. " + \
-                                "File does not have a valid " + \
-                                "DSDT or SSDT signature: %s" % Args.InputFile)
+                EdkLogger.info("Invalid file type. File does not have a 
+ valid DSDT or SSDT signature: {}".format(Args.InputFile))
                 return None
 
     # Get the basename of the input file.
@@ -66,42 +59,39 @@ def ParseArgs():
 
     # If no output directory is specified, output to the input directory.
     if not Args.OutDir:
-        Args.OutputFile = os.path.join(
-          os.path.dirname(Args.InputFile),
-          BaseName + ".hex"
-          )
+        Args.OutputFile = os.path.join(os.path.dirname(Args.InputFile),
+                                       BaseName + ".c")
     else:
         if not os.path.exists(Args.OutDir):
             os.mkdir(Args.OutDir)
-        Args.OutputFile = os.path.join(Args.OutDir, BaseName + ".hex")
+        Args.OutputFile = os.path.join(Args.OutDir, BaseName + ".c")
 
     Args.BaseName = BaseName
 
     return Args
 
-## Convert an AML file to a .hex file containing the AML bytecode stored
+## Convert an AML file to a .c file containing the AML bytecode stored
 #  in a C array.
 #
 # @param  InputFile     Path to the input AML file.
-# @param  OutputFile    Path to the output .hex file to generate.
+# @param  OutputFile    Path to the output .c file to generate.
 # @param  BaseName      Base name of the input file.
-#                       This is also the name of the generated .hex file.
+#                       This is also the name of the generated .c file.
 #
-def AmlToHex(InputFile, OutputFile, BaseName):
+def AmlToC(InputFile, OutputFile, BaseName):
 
-    MacroName = "__{}_HEX__".format(BaseName.upper())
     ArrayName = BaseName.lower() + "_aml_code"
+    FileHeader =\
+"""
+// This file has been generated from:
+//   -Python script: {}
+//   -Input AML file: {}
+
+"""
 
     with open(InputFile, "rb") as fIn, open(OutputFile, "w") as fOut:
         # Write header.
-        fOut.write("// This file has been generated from:\n" + \
-                   "// \tPython script: " + \
-                   os.path.abspath(__file__) + "\n" + \
-                   "// \tInput AML file: " + \
-                   os.path.abspath(InputFile) + "\n\n" + \
-                   "#ifndef {}\n".format(MacroName) + \
-                   "#define {}\n\n".format(MacroName)
-                   )
+        fOut.write(FileHeader.format(os.path.abspath(InputFile), 
+ os.path.abspath(__file__)))
 
         # Write the array and its content.
         fOut.write("unsigned char {}[] = {{\n  ".format(ArrayName)) @@ -115,15 +105,12 @@ def AmlToHex(InputFile, OutputFile, BaseName):
             byte = fIn.read(1)
         fOut.write("\n};\n")
 
-        # Write footer.
-        fOut.write("#endif // {}\n".format(MacroName))
-
 ## Main method
 #
 # This method:
 #   1-  Initialize an EdkLogger instance.
 #   2-  Parses the input arguments.
-#   3-  Converts an AML file to a .hex file containing the AML bytecode stored
+#   3-  Converts an AML file to a .c file containing the AML bytecode stored
 #       in a C array.
 #
 # @retval 0     Success.
@@ -139,10 +126,9 @@ def Main():
         if not CommandArguments:
             return 1
 
-        # Convert an AML file to a .hex file containing the AML bytecode stored
+        # Convert an AML file to a .c file containing the AML bytecode 
+ stored
         # in a C array.
-        AmlToHex(CommandArguments.InputFile, CommandArguments.OutputFile,
-                          CommandArguments.BaseName)
+        AmlToC(CommandArguments.InputFile, CommandArguments.OutputFile, 
+ CommandArguments.BaseName)
     except Exception as e:
         print(e)
         return 1
--
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'





^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 2/4] BaseTools: Rename AmlToHex script to AmlToC
  2020-06-18 14:27 ` [PATCH v2 2/4] BaseTools: Rename AmlToHex script to AmlToC PierreGondois
@ 2020-06-24  5:48   ` Bob Feng
  0 siblings, 0 replies; 11+ messages in thread
From: Bob Feng @ 2020-06-24  5:48 UTC (permalink / raw)
  To: PierreGondois, devel@edk2.groups.io
  Cc: sami.mujawar@arm.com, tomas.pilar@arm.com, Gao, Liming,
	nd@arm.com

Hi Pierre,

The commit message should not have more than one Signed-off-by.

Use of Suggested-by may be more appropriate here.

Thanks,
Bob

-----Original Message-----
From: PierreGondois <pierre.gondois@arm.com> 
Sent: Thursday, June 18, 2020 10:27 PM
To: devel@edk2.groups.io
Cc: Pierre Gondois <Pierre.Gondois@arm.com>; sami.mujawar@arm.com; tomas.pilar@arm.com; Feng, Bob C <bob.c.feng@intel.com>; Gao, Liming <liming.gao@intel.com>; nd@arm.com
Subject: [PATCH v2 2/4] BaseTools: Rename AmlToHex script to AmlToC

From: Pierre Gondois <pierre.gondois@arm.com>

The AmlToHex script and Posix/WindowsLike wrappers convert an AML file to a .hex file, containing a C array storing AML bytecode. This ".hex" file can then be included in a C file, allowing to access the AML bytecode from this C file.

The EDK2 build system doesn't allow to a depict dependency orders between files of different languages. For instance, in a module containing a ".c" file and a ".asl", the ".c"
file may or may not be built prior to the ".asl" file.
This prevents any inclusion of a generated ".hex" in a ".c" file since this later ".hex" file may or may not have been created yet.

This patch renames the script as AmlToC. It is posted as a separate patch to prevent git from seeing the renaming as a deletion plus addition of a new file.
The ending line of the posix-like bin-wrapper script has also been corrected.

This is a first step toward generating a C file containing the AML bytecode from an ASL file. This C file will then be handled by the EDK2 build system to generate an object file.
Thus, no file inclusion will be required anymore. The C file requiring the AML bytecode as a C array, and the ASL file, will be compiled independently. The C array must be defined as an external symbol. The linker is resolving the reference to the C array symbol.

To summarize, the flow goes as:
 -1. ASL file is compiled to AML;
 -2. AML file is copied to a ".amli" intermediate file;  -3. EDK2 build system applies the rule relevant to ".amli"
     files. This is, calling the "AmlToC" script, generating
     a C file from the ".amli" file;
 -4. EDK2 build system applies the rule relevant to C files.
     This is creating an object file.
 -5. EDK2 build system links the object file containing the
     AML bytecode with the object file requiring it.

Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
Signed-off-by: Tomas Pilar <Tomas.Pilar@arm.com>
---

The changes can be seen at https://github.com/PierreARM/edk2/commits/pg/803_Compile_AML_bytecode_array_into_OBJ_file_v2

Notes:
    Notes:
      v1:
       - Rename AmlToHex scripts to AmlToC, and change line
         endings of the PosixLike bin-wrapper. [Pierre]
      v2:
       - No modification. [Pierre]

 BaseTools/BinWrappers/PosixLike/{AmlToHex => AmlToC}               | 28 ++++++++++----------
 BaseTools/BinWrappers/WindowsLike/{AmlToHex.bat => AmlToC.bat}     |  0
 BaseTools/Source/Python/{AmlToHex/AmlToHex.py => AmlToC/AmlToC.py} |  0
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/BaseTools/BinWrappers/PosixLike/AmlToHex b/BaseTools/BinWrappers/PosixLike/AmlToC
similarity index 97%
rename from BaseTools/BinWrappers/PosixLike/AmlToHex
rename to BaseTools/BinWrappers/PosixLike/AmlToC
index 9fb68299e4c67d1f332cd883fd348a896f1bdc50..1dd28e966288f6ea4fc52d42e2dc7b1f74226c23 100755
--- a/BaseTools/BinWrappers/PosixLike/AmlToHex
+++ b/BaseTools/BinWrappers/PosixLike/AmlToC
@@ -1,14 +1,14 @@
-#!/usr/bin/env bash
-#python `dirname $0`/RunToolFromSource.py `basename $0` $*
-
-# If a ${PYTHON_COMMAND} command is available, use it in preference to python -if command -v ${PYTHON_COMMAND} >/dev/null 2>&1; then
-    python_exe=${PYTHON_COMMAND}
-fi
-
-full_cmd=${BASH_SOURCE:-$0} # see http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is not a good choice here -dir=$(dirname "$full_cmd") -exe=$(basename "$full_cmd")
-
-export PYTHONPATH="$dir/../../Source/Python${PYTHONPATH:+:"$PYTHONPATH"}"
-exec "${python_exe:-python}" "$dir/../../Source/Python/$exe/$exe.py" "$@"
+#!/usr/bin/env bash
+#python `dirname $0`/RunToolFromSource.py `basename $0` $*
+
+# If a ${PYTHON_COMMAND} command is available, use it in preference to 
+python if command -v ${PYTHON_COMMAND} >/dev/null 2>&1; then
+    python_exe=${PYTHON_COMMAND}
+fi
+
+full_cmd=${BASH_SOURCE:-$0} # see 
+http://mywiki.wooledge.org/BashFAQ/028 for a discussion of why $0 is 
+not a good choice here dir=$(dirname "$full_cmd") exe=$(basename 
+"$full_cmd")
+
+export PYTHONPATH="$dir/../../Source/Python${PYTHONPATH:+:"$PYTHONPATH"}"
+exec "${python_exe:-python}" "$dir/../../Source/Python/$exe/$exe.py" "$@"
diff --git a/BaseTools/BinWrappers/WindowsLike/AmlToHex.bat b/BaseTools/BinWrappers/WindowsLike/AmlToC.bat
similarity index 100%
rename from BaseTools/BinWrappers/WindowsLike/AmlToHex.bat
rename to BaseTools/BinWrappers/WindowsLike/AmlToC.bat
diff --git a/BaseTools/Source/Python/AmlToHex/AmlToHex.py b/BaseTools/Source/Python/AmlToC/AmlToC.py
similarity index 100%
rename from BaseTools/Source/Python/AmlToHex/AmlToHex.py
rename to BaseTools/Source/Python/AmlToC/AmlToC.py
--
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2020-06-24  5:48 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-18 14:27 [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
2020-06-18 14:27 ` [PATCH v2 1/4] BaseTools: Generate multiple rules when multiple output files PierreGondois
2020-06-19  6:34   ` [edk2-devel] " Yuwei Chen
2020-06-23 16:33     ` PierreGondois
2020-06-18 14:27 ` [PATCH v2 2/4] BaseTools: Rename AmlToHex script to AmlToC PierreGondois
2020-06-24  5:48   ` Bob Feng
2020-06-18 14:27 ` [PATCH v2 3/4] BaseTools: Compile AML bytecode arrays into .obj file PierreGondois
2020-06-24  5:48   ` [edk2-devel] " Bob Feng
2020-06-18 14:27 ` [PATCH v2 4/4] BaseTools: Fix string concatenation PierreGondois
2020-06-18 14:39 ` [PATCH v2 0/4] Compile AML bytecode array into OBJ file PierreGondois
2020-06-24  3:19 ` [edk2-devel] " Bob Feng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox