* [Patch] BaseTools: Fix the bug for CArray PCD override in command line
@ 2017-05-12 5:11 Yonghong Zhu
2017-05-12 5:24 ` Gao, Liming
0 siblings, 1 reply; 2+ messages in thread
From: Yonghong Zhu @ 2017-05-12 5:11 UTC (permalink / raw)
To: edk2-devel; +Cc: Liming Gao
This patch updated the CArray PCD override format from B"{}" to H"{}"
which align to build spec. Besides, it also do the clean up for the
function BuildOptionPcdValueFormat.
Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
---
BaseTools/Source/Python/AutoGen/AutoGen.py | 29 ++---------------------------
BaseTools/Source/Python/AutoGen/GenMake.py | 12 ++++++++++--
BaseTools/Source/Python/Common/Misc.py | 26 ++++++++++++++++++++++++++
BaseTools/Source/Python/GenFds/GenFds.py | 26 +-------------------------
4 files changed, 39 insertions(+), 54 deletions(-)
diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/Python/AutoGen/AutoGen.py
index 8d8957b..736c1ae 100644
--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
@@ -414,20 +414,20 @@ class WorkspaceAutoGen(AutoGen):
for key in package.Pcds:
PcdItem = package.Pcds[key]
if HasTokenSpace:
if (PcdItem.TokenCName, PcdItem.TokenSpaceGuidCName) == (TokenCName, TokenSpaceGuidCName):
PcdDatumType = PcdItem.DatumType
- NewValue = self._BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)
+ NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)
FoundFlag = True
else:
if PcdItem.TokenCName == TokenCName:
if not PcdItem.TokenSpaceGuidCName in TokenSpaceGuidCNameList:
if len (TokenSpaceGuidCNameList) < 1:
TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)
PcdDatumType = PcdItem.DatumType
TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName
- NewValue = self._BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)
+ NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)
FoundFlag = True
else:
EdkLogger.error(
'build',
AUTOGEN_ERROR,
@@ -695,35 +695,10 @@ class WorkspaceAutoGen(AutoGen):
with open(os.path.join(self.BuildDir, 'AutoGen'), 'w+') as file:
for f in AllWorkSpaceMetaFiles:
print >> file, f
return True
- def _BuildOptionPcdValueFormat(self, TokenSpaceGuidCName, TokenCName, PcdDatumType, Value):
- if PcdDatumType == 'VOID*':
- if Value.startswith('L'):
- if not Value[1]:
- EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')
- Value = Value[0] + '"' + Value[1:] + '"'
- elif Value.startswith('B'):
- if not Value[1]:
- EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')
- Value = Value[1:]
- else:
- if not Value[0]:
- EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')
- Value = '"' + Value + '"'
-
- IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)
- if not IsValid:
- EdkLogger.error('build', FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))
- if PcdDatumType == 'BOOLEAN':
- Value = Value.upper()
- if Value == 'TRUE' or Value == '1':
- Value = '1'
- elif Value == 'FALSE' or Value == '0':
- Value = '0'
- return Value
def _GetMetaFiles(self, Target, Toolchain, Arch):
AllWorkSpaceMetaFiles = set()
#
# add fdf
diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py
index ac24bd8..0f3ddd5 100644
--- a/BaseTools/Source/Python/AutoGen/GenMake.py
+++ b/BaseTools/Source/Python/AutoGen/GenMake.py
@@ -1,9 +1,9 @@
## @file
# Create makefile for MS nmake and GNU make
#
-# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
@@ -1451,11 +1451,19 @@ class TopLevelMakefile(BuildFile):
ExtraOption += " --ignore-sources"
if GlobalData.BuildOptionPcd:
for index, option in enumerate(GlobalData.gCommand):
if "--pcd" == option and GlobalData.gCommand[index+1]:
- ExtraOption += " --pcd " + GlobalData.gCommand[index+1]
+ pcdName, pcdValue = GlobalData.gCommand[index+1].split('=')
+ if pcdValue.startswith('H'):
+ pcdValue = 'H' + '"' + pcdValue[1:] + '"'
+ ExtraOption += " --pcd " + pcdName + '=' + pcdValue
+ elif pcdValue.startswith('L'):
+ pcdValue = 'L' + '"' + pcdValue[1:] + '"'
+ ExtraOption += " --pcd " + pcdName + '=' + pcdValue
+ else:
+ ExtraOption += " --pcd " + GlobalData.gCommand[index+1]
MakefileName = self._FILE_NAME_[self._FileType]
SubBuildCommandList = []
for A in PlatformInfo.ArchList:
Command = self._MAKE_TEMPLATE_[self._FileType] % {"file":os.path.join("$(BUILD_DIR)", A, MakefileName)}
diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Python/Common/Misc.py
index 390ef36..dbb711e 100644
--- a/BaseTools/Source/Python/Common/Misc.py
+++ b/BaseTools/Source/Python/Common/Misc.py
@@ -2060,10 +2060,36 @@ def PackRegistryFormatGuid(Guid):
int(Guid[4][-6:-4], 16),
int(Guid[4][-4:-2], 16),
int(Guid[4][-2:], 16)
)
+def BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, Value):
+ if PcdDatumType == 'VOID*':
+ if Value.startswith('L'):
+ if not Value[1]:
+ EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')
+ Value = Value[0] + '"' + Value[1:] + '"'
+ elif Value.startswith('H'):
+ if not Value[1]:
+ EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')
+ Value = Value[1:]
+ else:
+ if not Value[0]:
+ EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')
+ Value = '"' + Value + '"'
+
+ IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)
+ if not IsValid:
+ EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))
+ if PcdDatumType == 'BOOLEAN':
+ Value = Value.upper()
+ if Value == 'TRUE' or Value == '1':
+ Value = '1'
+ elif Value == 'FALSE' or Value == '0':
+ Value = '0'
+ return Value
+
##
#
# This acts like the main() function for the script, unless it is 'import'ed into another
# script.
#
diff --git a/BaseTools/Source/Python/GenFds/GenFds.py b/BaseTools/Source/Python/GenFds/GenFds.py
index aa8c041..277da35 100644
--- a/BaseTools/Source/Python/GenFds/GenFds.py
+++ b/BaseTools/Source/Python/GenFds/GenFds.py
@@ -37,10 +37,11 @@ from Common.String import *
from Common.Misc import DirCache, PathClass
from Common.Misc import SaveFileOnChange
from Common.Misc import ClearDuplicatedInf
from Common.Misc import GuidStructureStringToGuidString
from Common.Misc import CheckPcdDatum
+from Common.Misc import BuildOptionPcdValueFormat
from Common.BuildVersion import gBUILD_VERSION
from Common.MultipleWorkspace import MultipleWorkspace as mws
## Version and Copyright
versionNumber = "1.0" + ' ' + gBUILD_VERSION
@@ -406,35 +407,10 @@ def CheckBuildOptionPcd():
"The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName, PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])
)
GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, NewValue)
-def BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, Value):
- if PcdDatumType == 'VOID*':
- if Value.startswith('L'):
- if not Value[1]:
- EdkLogger.error('GenFds', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')
- Value = Value[0] + '"' + Value[1:] + '"'
- elif Value.startswith('B'):
- if not Value[1]:
- EdkLogger.error('GenFds', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')
- Value = Value[1:]
- else:
- if not Value[0]:
- EdkLogger.error('GenFds', OPTION_VALUE_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", B"{...}"')
- Value = '"' + Value + '"'
-
- IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)
- if not IsValid:
- EdkLogger.error('build', FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))
- if PcdDatumType == 'BOOLEAN':
- Value = Value.upper()
- if Value == 'TRUE' or Value == '1':
- Value = '1'
- elif Value == 'FALSE' or Value == '0':
- Value = '0'
- return Value
## FindExtendTool()
#
# Find location of tools to process data
#
--
2.6.1.windows.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [Patch] BaseTools: Fix the bug for CArray PCD override in command line
2017-05-12 5:11 [Patch] BaseTools: Fix the bug for CArray PCD override in command line Yonghong Zhu
@ 2017-05-12 5:24 ` Gao, Liming
0 siblings, 0 replies; 2+ messages in thread
From: Gao, Liming @ 2017-05-12 5:24 UTC (permalink / raw)
To: Zhu, Yonghong, edk2-devel@lists.01.org
Reviewed-by: Liming Gao <liming.gao@intel.com>
>-----Original Message-----
>From: Zhu, Yonghong
>Sent: Friday, May 12, 2017 1:12 PM
>To: edk2-devel@lists.01.org
>Cc: Gao, Liming <liming.gao@intel.com>
>Subject: [Patch] BaseTools: Fix the bug for CArray PCD override in command
>line
>
>This patch updated the CArray PCD override format from B"{}" to H"{}"
>which align to build spec. Besides, it also do the clean up for the
>function BuildOptionPcdValueFormat.
>
>Cc: Liming Gao <liming.gao@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.0
>Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
>---
> BaseTools/Source/Python/AutoGen/AutoGen.py | 29 ++-------------------------
>--
> BaseTools/Source/Python/AutoGen/GenMake.py | 12 ++++++++++--
> BaseTools/Source/Python/Common/Misc.py | 26
>++++++++++++++++++++++++++
> BaseTools/Source/Python/GenFds/GenFds.py | 26 +-------------------------
> 4 files changed, 39 insertions(+), 54 deletions(-)
>
>diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py
>b/BaseTools/Source/Python/AutoGen/AutoGen.py
>index 8d8957b..736c1ae 100644
>--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
>+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
>@@ -414,20 +414,20 @@ class WorkspaceAutoGen(AutoGen):
> for key in package.Pcds:
> PcdItem = package.Pcds[key]
> if HasTokenSpace:
> if (PcdItem.TokenCName, PcdItem.TokenSpaceGuidCName)
>== (TokenCName, TokenSpaceGuidCName):
> PcdDatumType = PcdItem.DatumType
>- NewValue =
>self._BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName,
>PcdDatumType, pcdvalue)
>+ NewValue =
>BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName,
>PcdDatumType, pcdvalue)
> FoundFlag = True
> else:
> if PcdItem.TokenCName == TokenCName:
> if not PcdItem.TokenSpaceGuidCName in
>TokenSpaceGuidCNameList:
> if len (TokenSpaceGuidCNameList) < 1:
>
>TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)
> PcdDatumType = PcdItem.DatumType
> TokenSpaceGuidCName =
>PcdItem.TokenSpaceGuidCName
>- NewValue =
>self._BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName,
>PcdDatumType, pcdvalue)
>+ NewValue =
>BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName,
>PcdDatumType, pcdvalue)
> FoundFlag = True
> else:
> EdkLogger.error(
> 'build',
> AUTOGEN_ERROR,
>@@ -695,35 +695,10 @@ class WorkspaceAutoGen(AutoGen):
> with open(os.path.join(self.BuildDir, 'AutoGen'), 'w+') as file:
> for f in AllWorkSpaceMetaFiles:
> print >> file, f
> return True
>
>- def _BuildOptionPcdValueFormat(self, TokenSpaceGuidCName,
>TokenCName, PcdDatumType, Value):
>- if PcdDatumType == 'VOID*':
>- if Value.startswith('L'):
>- if not Value[1]:
>- EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type
>PCD, when specify the Value in the command line, please use the following
>format: "string", L"string", B"{...}"')
>- Value = Value[0] + '"' + Value[1:] + '"'
>- elif Value.startswith('B'):
>- if not Value[1]:
>- EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type
>PCD, when specify the Value in the command line, please use the following
>format: "string", L"string", B"{...}"')
>- Value = Value[1:]
>- else:
>- if not Value[0]:
>- EdkLogger.error('build', OPTION_VALUE_INVALID, 'For Void* type
>PCD, when specify the Value in the command line, please use the following
>format: "string", L"string", B"{...}"')
>- Value = '"' + Value + '"'
>-
>- IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)
>- if not IsValid:
>- EdkLogger.error('build', FORMAT_INVALID, Cause, ExtraData="%s.%s" %
>(TokenSpaceGuidCName, TokenCName))
>- if PcdDatumType == 'BOOLEAN':
>- Value = Value.upper()
>- if Value == 'TRUE' or Value == '1':
>- Value = '1'
>- elif Value == 'FALSE' or Value == '0':
>- Value = '0'
>- return Value
>
> def _GetMetaFiles(self, Target, Toolchain, Arch):
> AllWorkSpaceMetaFiles = set()
> #
> # add fdf
>diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py
>b/BaseTools/Source/Python/AutoGen/GenMake.py
>index ac24bd8..0f3ddd5 100644
>--- a/BaseTools/Source/Python/AutoGen/GenMake.py
>+++ b/BaseTools/Source/Python/AutoGen/GenMake.py
>@@ -1,9 +1,9 @@
> ## @file
> # Create makefile for MS nmake and GNU make
> #
>-# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
>+# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
> # This program and the accompanying materials
> # are licensed and made available under the terms and conditions of the BSD
>License
> # which accompanies this distribution. The full text of the license may be
>found at
> # http://opensource.org/licenses/bsd-license.php
> #
>@@ -1451,11 +1451,19 @@ class TopLevelMakefile(BuildFile):
> ExtraOption += " --ignore-sources"
>
> if GlobalData.BuildOptionPcd:
> for index, option in enumerate(GlobalData.gCommand):
> if "--pcd" == option and GlobalData.gCommand[index+1]:
>- ExtraOption += " --pcd " + GlobalData.gCommand[index+1]
>+ pcdName, pcdValue = GlobalData.gCommand[index+1].split('=')
>+ if pcdValue.startswith('H'):
>+ pcdValue = 'H' + '"' + pcdValue[1:] + '"'
>+ ExtraOption += " --pcd " + pcdName + '=' + pcdValue
>+ elif pcdValue.startswith('L'):
>+ pcdValue = 'L' + '"' + pcdValue[1:] + '"'
>+ ExtraOption += " --pcd " + pcdName + '=' + pcdValue
>+ else:
>+ ExtraOption += " --pcd " + GlobalData.gCommand[index+1]
>
> MakefileName = self._FILE_NAME_[self._FileType]
> SubBuildCommandList = []
> for A in PlatformInfo.ArchList:
> Command = self._MAKE_TEMPLATE_[self._FileType] %
>{"file":os.path.join("$(BUILD_DIR)", A, MakefileName)}
>diff --git a/BaseTools/Source/Python/Common/Misc.py
>b/BaseTools/Source/Python/Common/Misc.py
>index 390ef36..dbb711e 100644
>--- a/BaseTools/Source/Python/Common/Misc.py
>+++ b/BaseTools/Source/Python/Common/Misc.py
>@@ -2060,10 +2060,36 @@ def PackRegistryFormatGuid(Guid):
> int(Guid[4][-6:-4], 16),
> int(Guid[4][-4:-2], 16),
> int(Guid[4][-2:], 16)
> )
>
>+def BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName,
>PcdDatumType, Value):
>+ if PcdDatumType == 'VOID*':
>+ if Value.startswith('L'):
>+ if not Value[1]:
>+ EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD,
>when specify the Value in the command line, please use the following format:
>"string", L"string", H"{...}"')
>+ Value = Value[0] + '"' + Value[1:] + '"'
>+ elif Value.startswith('H'):
>+ if not Value[1]:
>+ EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD,
>when specify the Value in the command line, please use the following format:
>"string", L"string", H"{...}"')
>+ Value = Value[1:]
>+ else:
>+ if not Value[0]:
>+ EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD,
>when specify the Value in the command line, please use the following format:
>"string", L"string", H"{...}"')
>+ Value = '"' + Value + '"'
>+
>+ IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)
>+ if not IsValid:
>+ EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" %
>(TokenSpaceGuidCName, TokenCName))
>+ if PcdDatumType == 'BOOLEAN':
>+ Value = Value.upper()
>+ if Value == 'TRUE' or Value == '1':
>+ Value = '1'
>+ elif Value == 'FALSE' or Value == '0':
>+ Value = '0'
>+ return Value
>+
> ##
> #
> # This acts like the main() function for the script, unless it is 'import'ed into
>another
> # script.
> #
>diff --git a/BaseTools/Source/Python/GenFds/GenFds.py
>b/BaseTools/Source/Python/GenFds/GenFds.py
>index aa8c041..277da35 100644
>--- a/BaseTools/Source/Python/GenFds/GenFds.py
>+++ b/BaseTools/Source/Python/GenFds/GenFds.py
>@@ -37,10 +37,11 @@ from Common.String import *
> from Common.Misc import DirCache, PathClass
> from Common.Misc import SaveFileOnChange
> from Common.Misc import ClearDuplicatedInf
> from Common.Misc import GuidStructureStringToGuidString
> from Common.Misc import CheckPcdDatum
>+from Common.Misc import BuildOptionPcdValueFormat
> from Common.BuildVersion import gBUILD_VERSION
> from Common.MultipleWorkspace import MultipleWorkspace as mws
>
> ## Version and Copyright
> versionNumber = "1.0" + ' ' + gBUILD_VERSION
>@@ -406,35 +407,10 @@ def CheckBuildOptionPcd():
> "The Pcd %s is found under multiple different
>TokenSpaceGuid: %s and %s." % (TokenCName,
>PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])
> )
>
> GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName,
>NewValue)
>
>-def BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName,
>PcdDatumType, Value):
>- if PcdDatumType == 'VOID*':
>- if Value.startswith('L'):
>- if not Value[1]:
>- EdkLogger.error('GenFds', OPTION_VALUE_INVALID, 'For Void* type
>PCD, when specify the Value in the command line, please use the following
>format: "string", L"string", B"{...}"')
>- Value = Value[0] + '"' + Value[1:] + '"'
>- elif Value.startswith('B'):
>- if not Value[1]:
>- EdkLogger.error('GenFds', OPTION_VALUE_INVALID, 'For Void* type
>PCD, when specify the Value in the command line, please use the following
>format: "string", L"string", B"{...}"')
>- Value = Value[1:]
>- else:
>- if not Value[0]:
>- EdkLogger.error('GenFds', OPTION_VALUE_INVALID, 'For Void* type
>PCD, when specify the Value in the command line, please use the following
>format: "string", L"string", B"{...}"')
>- Value = '"' + Value + '"'
>-
>- IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)
>- if not IsValid:
>- EdkLogger.error('build', FORMAT_INVALID, Cause, ExtraData="%s.%s" %
>(TokenSpaceGuidCName, TokenCName))
>- if PcdDatumType == 'BOOLEAN':
>- Value = Value.upper()
>- if Value == 'TRUE' or Value == '1':
>- Value = '1'
>- elif Value == 'FALSE' or Value == '0':
>- Value = '0'
>- return Value
>
> ## FindExtendTool()
> #
> # Find location of tools to process data
> #
>--
>2.6.1.windows.1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-05-12 5:24 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-12 5:11 [Patch] BaseTools: Fix the bug for CArray PCD override in command line Yonghong Zhu
2017-05-12 5:24 ` Gao, Liming
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox