public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Michael D Kinney <michael.d.kinney@intel.com>
To: edk2-devel@lists.01.org
Cc: Andrew Fish <afish@apple.com>,
	Supreeth Venkatesh <Supreeth.Venkatesh@arm.com>,
	Michael Kinney <michael.d.kinney@intel.com>
Subject: [edk2-staging/edk2-test Patch V3] Test*Pkg: Replace POSTBUILD batch files with a python script
Date: Tue, 15 Aug 2017 13:58:08 -0700	[thread overview]
Message-ID: <20170815205808.8060-1-michael.d.kinney@intel.com> (raw)

Update the POSTBUILD step to use a python script to create
and/or update the installer for the test framework and test
cases.  This expands the OS compatibility to include Windows,
Linux, and Mac OS X.

The python script TestFrameworkPkg/GenFramework.py is used by
the TestFrameworkPkg to generate the installer with the test
framework. This same python script is also used by packages that
provide test cases (e.g. TestCasePkg) to add the test cases to the
installer. The --package flag may be listed more than once for DSC
files that build test cases from more than one package.  The -v
flag shows messages for all the directory and file operations. The
usage for GenFramework.py is as follows:

usage: GenFramework [-h] [--version] -a ARCH [ARCH ...] -t TOOLCHAIN -p
                    PLATFORMFILE -b BUILDTARGET --conf= CONFDIRECTORY
                    [-D [DEFINE [DEFINE ...]]] [-v]
                    [--package [PACKAGE [PACKAGE ...]]]

Create EDK II Test Framework installer in build output directory. Copyright
(c) 2017, Intel Corporation. All rights reserved.

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  -a ARCH [ARCH ...], --arch ARCH [ARCH ...]
                        ARCHS is one of list: IA32, X64, IPF, ARM, AARCH64
                        or EBC, which overrides target.txt's TARGET_ARCH
                        definition. To specify more archs, please repeat
                        this option.
  -t TOOLCHAIN, --tagname TOOLCHAIN
                        Using the Tool Chain Tagname to build the platform,
                        overriding target.txt's TOOL_CHAIN_TAG definition.
  -p PLATFORMFILE, --platform PLATFORMFILE
                        Build the platform specified by the DSC file name
                        argument, overriding target.txt's ACTIVE_PLATFORM
                        definition.
  -b BUILDTARGET, --buildtarget BUILDTARGET
                        Using the TARGET to build the platform, overriding
                        target.txt's TARGET definition.
  --conf= CONFDIRECTORY
                        Specify the customized Conf directory.
  -D [DEFINE [DEFINE ...]], --define [DEFINE [DEFINE ...]]
                        Macro: "Name [= Value]".
  -v, --verbose         Turn on verbose output with informational messages
                        printed
  --package [PACKAGE [PACKAGE ...]]
                        The directory name of a package of tests to copy

Cc: Andrew Fish <afish@apple.com>
Cc: Supreeth Venkatesh <Supreeth.Venkatesh@arm.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Michael Kinney <michael.d.kinney@intel.com>
---
 TestCasePkg/GenFramework.cmd          |  86 ------------
 TestCasePkg/TestCasePkg.dsc           |   2 +-
 TestFrameworkPkg/GenFramework.cmd     | 111 ----------------
 TestFrameworkPkg/GenFramework.py      | 239 ++++++++++++++++++++++++++++++++++
 TestFrameworkPkg/TestFrameworkPkg.dsc |   2 +-
 5 files changed, 241 insertions(+), 199 deletions(-)
 delete mode 100644 TestCasePkg/GenFramework.cmd
 delete mode 100644 TestFrameworkPkg/GenFramework.cmd
 create mode 100644 TestFrameworkPkg/GenFramework.py

diff --git a/TestCasePkg/GenFramework.cmd b/TestCasePkg/GenFramework.cmd
deleted file mode 100644
index 280ca70aa..000000000
--- a/TestCasePkg/GenFramework.cmd
+++ /dev/null
@@ -1,86 +0,0 @@
-@REM @file
-@REM Windows batch file used to create installer in build output directory
-@REM
-@REM Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
-@REM This program and the accompanying materials
-@REM are licensed and made available under the terms and conditions of the BSD License
-@REM which accompanies this distribution.  The full text of the license may be found at
-@REM http://opensource.org/licenses/bsd-license.php
-@REM
-@REM THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-@REM
-
-@echo off
-
-::**********************************************************************
-:: Parse command line arguments
-::**********************************************************************
-set ARCHLIST=
-set CLEAN=""
-:ArgLoop
-if /i "%~1"=="" (goto Done)
-if /i "%~1"=="clean" (
-    set CLEAN=%~1
-    shift
-    goto ArgLoop
-)
-if /i "%~2"=="" (goto Done)
-if /i "%~1"=="-a" (
-    set ARCHLIST=%ARCHLIST% %~2
-    shift
-    shift
-    goto ArgLoop
-)
-if /i "%~1"=="-b" (
-    set TARGET=%~2
-    shift
-    shift
-    goto ArgLoop
-)
-if /i "%~1"=="-t" (
-    set TOOLCHAIN=%~2
-    shift
-    shift
-    goto ArgLoop
-)
-shift
-goto ArgLoop
-:Done
-
-for %%G in (%ARCHLIST%) do (
-  set ARCH=%%G
-  call :CopyFiles
-)
-
-goto Finished
-
-:CopyFiles
-set Framework=%WORKSPACE%\Build\SctPackage\%ARCH%
-set BuildOutput=%WORKSPACE%\Build\TestCasePkg\%TARGET%_%TOOLCHAIN%\%ARCH%
-
-if not %CLEAN%=="" (
-  if exist %Framework%\Test rmdir /s/q %Framework%\Test
-  exit /b
-)
-
-rem *********************************************
-rem Create target directories
-rem *********************************************
-
-if not exist %Framework% mkdir %Framework%
-for %%G in (Data, Dependency, Support, Test, Sequence, Report, Proxy) do (
-  if not exist %Framework%\%%G mkdir %Framework%\%%G
-)
-
-::*****************************************************
-:: Copy all test cases
-::*****************************************************
-
-copy %BuildOutput%\*.efi       %Framework%\Test          > NUL
-exit /b
-
-:Finished
-
-
-
diff --git a/TestCasePkg/TestCasePkg.dsc b/TestCasePkg/TestCasePkg.dsc
index c2f1832ae..7ef656c27 100644
--- a/TestCasePkg/TestCasePkg.dsc
+++ b/TestCasePkg/TestCasePkg.dsc
@@ -22,7 +22,7 @@
   SUPPORTED_ARCHITECTURES        = IA32|IPF|X64|EBC|ARM
   BUILD_TARGETS                  = DEBUG|RELEASE
   SKUID_IDENTIFIER               = DEFAULT
-  POSTBUILD                      = TestCasePkg/GenFramework.cmd
+  POSTBUILD                      = python TestFrameworkPkg/GenFramework.py --package TestCasePkg
 
 [LibraryClasses]
   UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
diff --git a/TestFrameworkPkg/GenFramework.cmd b/TestFrameworkPkg/GenFramework.cmd
deleted file mode 100644
index 256294801..000000000
--- a/TestFrameworkPkg/GenFramework.cmd
+++ /dev/null
@@ -1,111 +0,0 @@
-@REM @file
-@REM Windows batch file used to create installer in build output directory
-@REM
-@REM Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
-@REM This program and the accompanying materials
-@REM are licensed and made available under the terms and conditions of the BSD License
-@REM which accompanies this distribution.  The full text of the license may be found at
-@REM http://opensource.org/licenses/bsd-license.php
-@REM
-@REM THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-@REM
-
-@echo off
-
-::**********************************************************************
-:: Parse command line arguments
-::**********************************************************************
-set ARCHLIST=
-set CLEAN=""
-:ArgLoop
-if /i "%~1"=="" (goto Done)
-if /i "%~1"=="clean" (
-    set CLEAN=%~1
-    shift
-    goto ArgLoop
-)
-if /i "%~2"=="" (goto Done)
-if /i "%~1"=="-a" (
-    set ARCHLIST=%ARCHLIST% %~2
-    shift
-    shift
-    goto ArgLoop
-)
-if /i "%~1"=="-b" (
-    set TARGET=%~2
-    shift
-    shift
-    goto ArgLoop
-)
-if /i "%~1"=="-t" (
-    set TOOLCHAIN=%~2
-    shift
-    shift
-    goto ArgLoop
-)
-shift
-goto ArgLoop
-:Done
-
-
-@set TEST_FRAMEWORK_PKG_PATH=%WORKSPACE%\TestFrameworkPkg
-@if defined PACKAGES_PATH (
-  @for %%i IN (%PACKAGES_PATH%) DO (
-    @if exist %%~fi\TestFrameworkPkg (
-      @set TEST_FRAMEWORK_PKG_PATH=%%~fi\TestFrameworkPkg
-      @goto ProcessArchList
-    )
-  )
-)
-
-:ProcessArchList
-for %%G in (%ARCHLIST%) do (
-  set ARCH=%%G
-  call :CopyFiles
-)
-
-goto Finished
-
-:CopyFiles
-set Framework=%WORKSPACE%\Build\SctPackage\%ARCH%
-set BuildOutput=%WORKSPACE%\Build\TestFrameworkPkg\%TARGET%_%TOOLCHAIN%\%ARCH%
-if not %CLEAN%=="" (
-  if exist %Framework%\..  rmdir /s/q %Framework%\..
-  exit /b
-)
-
-rem *********************************************
-rem Create target directories
-rem *********************************************
-
-if not exist %Framework% mkdir %Framework%
-for %%G in (Data, Dependency, Support, Test, Sequence, Report, Proxy) do (
-  if not exist %Framework%\%%G mkdir %Framework%\%%G
-)
-
-::*****************************************************
-:: Copy the SCT framework and the related application
-::*****************************************************
-
-copy %BuildOutput%\InstallSct.efi       %Framework%          > NUL
-copy %BuildOutput%\StallForKey.efi      %Framework%          > NUL
-
-copy %BuildOutput%\SCT.efi              %Framework%          > NUL
-
-copy %BuildOutput%\StandardTest.efi     %Framework%\Support  > NUL
-copy %BuildOutput%\TestProfile.efi      %Framework%\Support  > NUL
-copy %BuildOutput%\TestRecovery.efi     %Framework%\Support  > NUL
-copy %BuildOutput%\TestLogging.efi      %Framework%\Support  > NUL
-
-
-::*********************************************
-:: Copy the SCT configuration data
-::*********************************************
-
-copy %TEST_FRAMEWORK_PKG_PATH%\Scripts\SctStartup.nsh  %Framework%\..    
-copy %TEST_FRAMEWORK_PKG_PATH%\Data\Category.ini       %Framework%\Data  > NUL
-copy %TEST_FRAMEWORK_PKG_PATH%\Data\GuidFile.txt       %Framework%\Data  > NUL
-exit /b
-
-:Finished
diff --git a/TestFrameworkPkg/GenFramework.py b/TestFrameworkPkg/GenFramework.py
new file mode 100644
index 000000000..8a1527883
--- /dev/null
+++ b/TestFrameworkPkg/GenFramework.py
@@ -0,0 +1,239 @@
+## @file
+# Create EDK II Test Framework installer in build output directory
+#
+# Copyright (c) 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
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+'''
+GenFramework
+'''
+
+import os
+import sys
+import argparse
+import glob
+import shutil
+
+#
+# Globals for help information
+#
+__prog__        = 'GenFramework'
+__version__     = '%s Version %s' % (__prog__, '1.0')
+__copyright__   = 'Copyright (c) 2017, Intel Corporation. All rights reserved.'
+__description__ = 'Create EDK II Test Framework installer in build output directory.\n'
+
+#
+# Globals
+#
+gWorkspace = ''
+gArgs      = None
+
+def Log(Message):
+  if not gArgs.Verbose:
+    return
+  sys.stdout.write (__prog__ + ': ' + Message + '\n')
+
+def Error(Message, ExitValue=1):
+  sys.stderr.write (__prog__ + ': ERROR: ' + Message + '\n')
+  sys.exit (ExitValue)
+
+def RelativePath(target):
+  return os.path.relpath (target, gWorkspace)
+
+def NormalizePath(target):
+  if isinstance(target, tuple):
+    return os.path.normpath (os.path.join (*target))
+  else:
+    return os.path.normpath (target)
+
+def RemoveDirectory(target):
+  target = NormalizePath(target)
+  if not target or target == os.pathsep:
+    Error ('RemoveDirectory() invalid target')
+  if os.path.exists(target):
+    Log ('rmdir %s' % (RelativePath (target)))
+    shutil.rmtree(target)
+
+def CreateDirectory(target):
+  target = NormalizePath(target)
+  if not os.path.exists(target):
+    Log ('mkdir %s' % (RelativePath (target)))
+    os.makedirs (target)
+
+def Copy(src, dst):
+  src = NormalizePath(src)
+  dst = NormalizePath(dst)
+  for File in glob.glob(src):
+    Log ('copy %s -> %s' % (RelativePath (File), RelativePath (dst)))
+    shutil.copy (File, dst)
+
+if __name__ == '__main__':
+  #
+  # Create command line argument parser object
+  #
+  parser = argparse.ArgumentParser (
+                      prog = __prog__,
+                      version = __version__,
+                      description = __description__ + __copyright__,
+                      conflict_handler = 'resolve'
+                      )
+  parser.add_argument (
+           '-a', '--arch', dest = 'Arch', nargs = '+', action = 'append',
+           required = True,
+           help = '''ARCHS is one of list: IA32, X64, IPF, ARM, AARCH64 or EBC,
+                     which overrides target.txt's TARGET_ARCH definition. To
+                     specify more archs, please repeat this option.'''
+           )
+  parser.add_argument (
+           '-t', '--tagname', dest = 'ToolChain', required = True,
+           help = '''Using the Tool Chain Tagname to build the platform,
+                     overriding target.txt's TOOL_CHAIN_TAG definition.'''
+           )
+  parser.add_argument (
+           '-p', '--platform', dest = 'PlatformFile', required = True,
+           help = '''Build the platform specified by the DSC file name argument,
+                     overriding target.txt's ACTIVE_PLATFORM definition.'''
+           )
+  parser.add_argument (
+           '-b', '--buildtarget', dest = 'BuildTarget', required = True,
+           help = '''Using the TARGET to build the platform, overriding
+                     target.txt's TARGET definition.'''
+           )
+  parser.add_argument (
+           '--conf=', dest = 'ConfDirectory', required = True,
+           help = '''Specify the customized Conf directory.'''
+           )
+  parser.add_argument (
+           '-D', '--define', dest = 'Define', nargs='*', action = 'append',
+           help = '''Macro: "Name [= Value]".'''
+           )
+  parser.add_argument (
+           '-v', '--verbose', dest = 'Verbose', action = 'store_true',
+           help = '''Turn on verbose output with informational messages printed'''
+           )
+  parser.add_argument (
+           '--package', dest = 'Package', nargs = '*', action = 'append',
+           help = '''The directory name of a package of tests to copy'''
+           )
+
+  #
+  # Parse command line arguments
+  #
+  gArgs, remaining = parser.parse_known_args()
+  gArgs.BuildType = 'all'
+  for BuildType in ['all', 'fds', 'genc', 'genmake', 'clean', 'cleanall', 'modules', 'libraries', 'run']:
+    if BuildType in remaining:
+      gArgs.BuildType = BuildType
+      remaining.remove(BuildType)
+      break
+  gArgs.Remaining = ' '.join(remaining)
+
+  #
+  # Start
+  #
+  Log ('Start')
+
+  #
+  # Get WORKSPACE environment variable
+  #
+  try:
+    gWorkspace = os.environ['WORKSPACE']
+  except:
+    Error ('WORKSPACE environment variable not set')
+
+  #
+  # Find test framework package directory in WORKSPACE or PACKAGES_PATH
+  #
+  PathList = [gWorkspace]
+  try:
+    PathList += os.environ['PACKAGES_PATH'].split(os.pathsep)
+  except:
+    pass
+  for Path in PathList:
+    TestFrameworkPkgPath = NormalizePath((Path, 'TestFrameworkPkg'))
+    if os.path.exists(TestFrameworkPkgPath):
+      break
+  if not os.path.exists(TestFrameworkPkgPath):
+    Error ('TestFrameworkPkg directory not found in WORKSPACE or PACKAGES_PATH')
+
+  #
+  # Process build target
+  #
+  InstallerPath = NormalizePath((gWorkspace, 'Build', 'SctPackage'))
+  if gArgs.BuildType == 'clean':
+    if gArgs.Package:
+      #
+      # Remove test cases for each package and CPU architecture
+      #
+      for Arch in gArgs.Arch:
+        Arch = Arch[0]
+        for Package in gArgs.Package:
+          Package = Package[0]
+          Log ('Remove test cases from %s from test framework installer in %s' % (Package, InstallerPath))
+          RemoveDirectory ((InstallerPath, Arch, 'Test', Package))
+    else:
+      #
+      # Remove the installer
+      #
+      Log ('Remove test framework installer in %s' % (InstallerPath))
+      RemoveDirectory (InstallerPath)
+  else:
+    if gArgs.Package:
+      #
+      # Copy test cases for each package and CPU architcture
+      #
+      for Package in gArgs.Package:
+        Package = Package[0]
+        Log ('Add test cases from %s to test framework installer in %s' % (Package, InstallerPath))
+        for Arch in gArgs.Arch:
+          Arch = Arch[0]
+          BuildOutput = NormalizePath((
+                          gWorkspace,
+                          'Build',
+                          Package,
+                          gArgs.BuildTarget + '_' + gArgs.ToolChain,
+                          Arch
+                          ))
+          if os.path.exists(BuildOutput):
+            CreateDirectory ((InstallerPath, Arch, 'Test', Package))
+            Copy ((BuildOutput, '*.efi'), (InstallerPath, Arch, 'Test', Package))
+    else:
+      #
+      # Copy test framework files for each CPU architcture
+      #
+      Log ('Create test framework installer in %s' % (InstallerPath))
+      CreateDirectory ((InstallerPath))
+      Copy ((TestFrameworkPkgPath, 'Scripts', 'SctStartup.nsh'), (InstallerPath))
+      for Arch in gArgs.Arch:
+        Arch = Arch[0]
+        for Directory in ['Data', 'Dependency', 'Support', 'Test', 'Sequence', 'Report', 'Proxy']:
+          CreateDirectory ((InstallerPath, Arch, Directory))
+
+        BuildOutput = NormalizePath((
+                        gWorkspace,
+                        'Build',
+                        'TestFrameworkPkg',
+                        gArgs.BuildTarget + '_' + gArgs.ToolChain,
+                        Arch
+                        ))
+        if os.path.exists(BuildOutput):
+          for File in ['InstallSct.efi', 'StallForKey.efi', 'Sct.efi']:
+            Copy ((BuildOutput, File), (InstallerPath, Arch))
+          for File in ['StandardTest.efi', 'TestProfile.efi', 'TestRecovery.efi', 'TestLogging.efi']:
+            Copy ((BuildOutput, File), (InstallerPath, Arch, 'Support'))
+
+        Copy ((TestFrameworkPkgPath, 'Data/Category.ini'), (InstallerPath, Arch, 'Data'))
+        Copy ((TestFrameworkPkgPath, 'Data/GuidFile.txt'), (InstallerPath, Arch, 'Data'))
+        Copy ((TestFrameworkPkgPath, 'Data/GuidFile.txt'), (InstallerPath, Arch, 'Data'))
+
+  #
+  # Done
+  #
+  Log ('Done')
diff --git a/TestFrameworkPkg/TestFrameworkPkg.dsc b/TestFrameworkPkg/TestFrameworkPkg.dsc
index 93c8886af..b906839a1 100644
--- a/TestFrameworkPkg/TestFrameworkPkg.dsc
+++ b/TestFrameworkPkg/TestFrameworkPkg.dsc
@@ -22,7 +22,7 @@
   SUPPORTED_ARCHITECTURES        = IA32|IPF|X64|EBC|ARM
   BUILD_TARGETS                  = DEBUG|RELEASE
   SKUID_IDENTIFIER               = DEFAULT
-  POSTBUILD                      = TestFrameworkPkg/GenFramework.cmd
+  POSTBUILD                      = python TestFrameworkPkg/GenFramework.py
 
 [LibraryClasses]
   UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
-- 
2.13.1.windows.2



                 reply	other threads:[~2017-08-15 20:55 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170815205808.8060-1-michael.d.kinney@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox