DuetPkg: Add POSTBUILD in DSC files to run post-build automatically

https://bugzilla.tianocore.org/show_bug.cgi?id=220

Currently, the post-build scripts PostBuild.bat/PostBuild.sh in DuetPkg
need to be run manually. Especially for Windows batch script, it also
requires users to set the build options (like tool chain, target and arch)
in file Conf/target.txt. If users using command line options via '-t' or
'-a', the post-build script won't work properly.

The package DSC files now support the feature to execute post-build script
automatically by adding a 'POSTBUILD' definition. This feature also passes
the build options into the post-build script as parameters. This commit
uses this feature to make the post-build works for DuetPkg more
user-friendly. Also, ReadMe.txt is updated to reflect the new steps for
UEFI Emulation (DUET) development.

Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hao Wu <hao.a.wu@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
Hao Wu 2016-11-11 16:21:35 +08:00
parent ea4511d127
commit bab82372a9
10 changed files with 105 additions and 150 deletions

View File

@ -1,7 +1,7 @@
@echo off @echo off
@REM ## @file @REM ## @file
@REM # @REM #
@REM # Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR> @REM # Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
@REM # @REM #
@REM # This program and the accompanying materials @REM # This program and the accompanying materials
@REM # are licensed and made available under the terms and conditions of the BSD License @REM # are licensed and made available under the terms and conditions of the BSD License
@ -15,14 +15,11 @@
@REM Set up environment at first. @REM Set up environment at first.
set BASETOOLS_DIR=%WORKSPACE_TOOLS_PATH%\Bin\Win32 set BASETOOLS_DIR=%EDK_TOOLS_BIN%
set BOOTSECTOR_BIN_DIR=%WORKSPACE%\DuetPkg\BootSector\bin set BOOTSECTOR_BIN_DIR=%WORKSPACE%\DuetPkg\BootSector\bin
set DISK_LABEL=DUET set DISK_LABEL=DUET
set PROCESSOR="" set PROCESSOR=""
set STEP=1 set STEP=1
call %WORKSPACE%\DuetPkg\GetVariables.bat
echo on
if "%1"=="" goto Help if "%1"=="" goto Help
if "%2"=="" goto Help if "%2"=="" goto Help
@ -35,6 +32,7 @@ set EFI_BOOT_DISK=%2
if "%TARGET_ARCH%"=="IA32" set PROCESSOR=IA32 if "%TARGET_ARCH%"=="IA32" set PROCESSOR=IA32
if "%TARGET_ARCH%"=="X64" set PROCESSOR=X64 if "%TARGET_ARCH%"=="X64" set PROCESSOR=X64
if %PROCESSOR%=="" goto WrongArch if %PROCESSOR%=="" goto WrongArch
call %WORKSPACE%\DuetPkg\SetEnv_%PROCESSOR%.bat
set BUILD_DIR=%WORKSPACE%\Build\DuetPkg%PROCESSOR%\%TARGET%_%TOOL_CHAIN_TAG% set BUILD_DIR=%WORKSPACE%\Build\DuetPkg%PROCESSOR%\%TARGET%_%TOOL_CHAIN_TAG%
if "%1"=="floppy" goto CreateFloppy if "%1"=="floppy" goto CreateFloppy

View File

@ -34,7 +34,7 @@ if [ \
"$*" = "--help" \ "$*" = "--help" \
] ]
then then
echo "Usage: CreateBootDisk [usb|floppy|ide|file] MediaPath DevicePath [FAT12|FAT16|FAT32] [IA32|X64] [GCC44|UNIXGCC]" echo "Usage: CreateBootDisk [usb|floppy|ide|file] MediaPath DevicePath [FAT12|FAT16|FAT32] [IA32|X64]"
echo "e.g. : CreateBootDisk floppy /media/floppy0 /dev/fd0 FAT12 IA32" echo "e.g. : CreateBootDisk floppy /media/floppy0 /dev/fd0 FAT12 IA32"
PROCESS_MARK=FALSE PROCESS_MARK=FALSE
fi fi
@ -51,13 +51,7 @@ case "$5" in
return 1 return 1
esac esac
if [ -z "$6" ] . $WORKSPACE/DuetPkg/SetEnv_$PROCESSOR.sh
then
TOOLCHAIN=GCC44
else
TOOLCHAIN=$6
fi
export BUILD_DIR=$WORKSPACE/Build/DuetPkg$PROCESSOR/DEBUG_$TOOLCHAIN export BUILD_DIR=$WORKSPACE/Build/DuetPkg$PROCESSOR/DEBUG_$TOOLCHAIN

View File

@ -31,6 +31,11 @@
BUILD_TARGETS = DEBUG BUILD_TARGETS = DEBUG
SKUID_IDENTIFIER = DEFAULT SKUID_IDENTIFIER = DEFAULT
FLASH_DEFINITION = DuetPkg/DuetPkg.fdf FLASH_DEFINITION = DuetPkg/DuetPkg.fdf
!if $(TOOL_CHAIN_TAG) == GCC47 || $(TOOL_CHAIN_TAG) == GCC48 || $(TOOL_CHAIN_TAG) == GCC49 || $(TOOL_CHAIN_TAG) == GCC5
POSTBUILD = DuetPkg/PostBuild.sh
!else
POSTBUILD = DuetPkg/PostBuild.bat
!endif
################################################################################ ################################################################################
# #

View File

@ -31,6 +31,11 @@
BUILD_TARGETS = DEBUG BUILD_TARGETS = DEBUG
SKUID_IDENTIFIER = DEFAULT SKUID_IDENTIFIER = DEFAULT
FLASH_DEFINITION = DuetPkg/DuetPkg.fdf FLASH_DEFINITION = DuetPkg/DuetPkg.fdf
!if $(TOOL_CHAIN_TAG) == GCC47 || $(TOOL_CHAIN_TAG) == GCC48 || $(TOOL_CHAIN_TAG) == GCC49 || $(TOOL_CHAIN_TAG) == GCC5
POSTBUILD = DuetPkg/PostBuild.sh
!else
POSTBUILD = DuetPkg/PostBuild.bat
!endif
################################################################################ ################################################################################
# #

View File

@ -1,39 +0,0 @@
@echo off
@REM ## @file
@REM #
@REM # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
@REM #
@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 # 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 #
@REM #
@REM ##
@REM Read the variables from Conf/target.txt
@REM Because we can't add '=' as a delimiter in 'for', each variable is read in 2 parts:
@REM First we read the "= xyz" part of the variable assignation which we use, along with
@REM the original equal sign for our first assignation. Then we trim any left whitespaces.
@REM NB: default token delimiters for "for /f" are tab and space.
set CONFIG_FILE=%WORKSPACE%\Conf\target.txt
for /f "tokens=1*" %%i in ('type %CONFIG_FILE% ^| find "TOOL_CHAIN_TAG" ^| find /V "#"') do @set TOOL_CHAIN_TAG%%j
for /f "tokens=*" %%i in ("%TOOL_CHAIN_TAG%") do @set TOOL_CHAIN_TAG=%%i
for /f "tokens=1*" %%i in ('type %CONFIG_FILE% ^| find "TARGET" ^| find /V "#" ^| find /V "TARGET_ARCH"') do @set TARGET%%j
for /f "tokens=*" %%i in ("%TARGET%") do @set TARGET=%%i
for /f "tokens=1*" %%i in ('type %CONFIG_FILE% ^| find "TARGET_ARCH" ^|find /V "#"') do @set TARGET_ARCH%%j
for /f "tokens=*" %%i in ("%TARGET_ARCH%") do @set TARGET_ARCH=%%i
REM Set defaults if above variables are undefined in target.txt
if "%TOOL_CHAIN_TAG%%"=="" @set TOOL_CHAIN_TAG=MYTOOLS
if "%TARGET%"=="" @set TARGET=DEBUG
if "%TARGET_ARCH%"=="" @set TARGET_ARCH=IA32

View File

@ -1,11 +1,9 @@
@echo off @echo off
@REM ## @file @REM ## @file
@REM # @REM #
@REM # Currently, Build system does not provide post build mechanism for module @REM # Post build script that will be automatically run after build.
@REM # and platform building, so just use a bat file to do post build commands.
@REM # Originally, following post building command is for EfiLoader module.
@REM # @REM #
@REM # Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR> @REM # Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
@REM # @REM #
@REM # This program and the accompanying materials @REM # This program and the accompanying materials
@REM # are licensed and made available under the terms and conditions of the BSD License @REM # are licensed and made available under the terms and conditions of the BSD License
@ -17,18 +15,38 @@
@REM # @REM #
@REM ## @REM ##
set BASETOOLS_DIR=%WORKSPACE_TOOLS_PATH%\Bin\Win32 set BASETOOLS_DIR=%EDK_TOOLS_BIN%
set BOOTSECTOR_BIN_DIR=%WORKSPACE%\DuetPkg\BootSector\bin set BOOTSECTOR_BIN_DIR=%WORKSPACE%\DuetPkg\BootSector\bin
set PROCESSOR=""
call %WORKSPACE%\DuetPkg\GetVariables.bat
if NOT "%1"=="" @set TARGET_ARCH=%1 :SetDefault
if "%TARGET_ARCH%"=="IA32" set PROCESSOR=IA32 set TARGET_ARCH=
if "%TARGET_ARCH%"=="X64" set PROCESSOR=X64 set TARGET=
if %PROCESSOR%=="" goto WrongArch set TOOL_CHAIN_TAG=
:ParseParamsLoop
if "%1"=="" goto EndPParseParamsLoop
if /I "%1"=="-p" goto ParseParamsLoopNext
if /I "%1"=="-a" set TARGET_ARCH=%2& goto ParseParamsLoopNext
if /I "%1"=="-b" set TARGET=%2& goto ParseParamsLoopNext
if /I "%1"=="-t" set TOOL_CHAIN_TAG=%2& goto ParseParamsLoopNext
if /I "%1"=="-h" goto Help
:ParseParamsLoopNext
shift
shift
goto ParseParamsLoop
:EndPParseParamsLoop
if "%TARGET_ARCH%"=="" goto Help
if "%TARGET%"=="" goto Help
if "%TOOL_CHAIN_TAG%"=="" goto Help
set PROCESSOR=%TARGET_ARCH%
set BUILD_DIR=%WORKSPACE%\Build\DuetPkg%PROCESSOR%\%TARGET%_%TOOL_CHAIN_TAG% set BUILD_DIR=%WORKSPACE%\Build\DuetPkg%PROCESSOR%\%TARGET%_%TOOL_CHAIN_TAG%
@REM Store environment variables used by CreateBootDisk.bat
echo set TARGET=%TARGET%> %WORKSPACE%\DuetPkg\SetEnv_%PROCESSOR%.bat
echo set TOOL_CHAIN_TAG=%TOOL_CHAIN_TAG%>> %WORKSPACE%\DuetPkg\SetEnv_%PROCESSOR%.bat
echo Compressing DUETEFIMainFv.FV ... echo Compressing DUETEFIMainFv.FV ...
%BASETOOLS_DIR%\LzmaCompress -e -o %BUILD_DIR%\FV\DUETEFIMAINFV.z %BUILD_DIR%\FV\DUETEFIMAINFV.Fv %BASETOOLS_DIR%\LzmaCompress -e -o %BUILD_DIR%\FV\DUETEFIMAINFV.z %BUILD_DIR%\FV\DUETEFIMAINFV.Fv
@ -60,11 +78,6 @@ copy /b %BOOTSECTOR_BIN_DIR%\St32_64.com+%BOOTSECTOR_BIN_DIR%\Efi64.com2+%BUILD_
%BASETOOLS_DIR%\GenPage.exe %BUILD_DIR%\FV\Efildr20Pure -o %BUILD_DIR%\FV\Efildr20 %BASETOOLS_DIR%\GenPage.exe %BUILD_DIR%\FV\Efildr20Pure -o %BUILD_DIR%\FV\Efildr20
goto end goto end
:WrongArch
echo Error! Wrong architecture.
goto Help
:Help :Help
echo Usage: "PostBuild [IA32|X64]" echo Usage: This script will be run automatically after build.
:end :end

View File

@ -2,9 +2,7 @@
## @file ## @file
# #
# Currently, Build system does not provide post build mechanism for module # Post build script that will be automatically run after build.
# and platform building, so just use a sh file to do post build commands.
# Originally, following post building command is for EfiLoader module.
# #
# Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
# #
@ -26,43 +24,33 @@ fi
export BOOTSECTOR_BIN_DIR=$WORKSPACE/DuetPkg/BootSector/bin export BOOTSECTOR_BIN_DIR=$WORKSPACE/DuetPkg/BootSector/bin
export PROCESSOR="" export PROCESSOR=""
if [ \ export TOOLTAG=""
-z "$1" -o \
"$1" = "-?" -o \
"$1" = "-h" -o \
"$1" = "--help" \
]
then
echo Error! Please specific the architecture.
echo Usage: "./PostBuild.sh [IA32|X64] [UNIXGCC|GCC44]"
fi
case "$1" in while [ $# -gt 0 ]; do
IA32) if [ "$1" = "-a" ]; then
export PROCESSOR=IA32 export PROCESSOR=$2
;; elif [ "$1" = "-t" ]; then
X64)
export PROCESSOR=X64
;;
*)
echo Invalid Architecture string, should be only IA32 or X64
return 1
esac
case "$2" in
UNIXGCC)
export TOOLTAG=UNIXGCC
;;
GCC4*)
export TOOLTAG=$2 export TOOLTAG=$2
;; elif [ "$1" = "-h" ]; then
*) echo Usage: This script will be run automatically after build.
echo Invalid tool tag, should be only UNIXGCC or GCC4\*
return 1 return 1
esac fi
shift
shift
done
if [ "$PROCESSOR" = "" -o "$TOOLTAG" = "" ]; then
echo Usage: This script will be run automatically after build.
return 1
fi
export BUILD_DIR=$WORKSPACE/Build/DuetPkg$PROCESSOR/DEBUG_$TOOLTAG export BUILD_DIR=$WORKSPACE/Build/DuetPkg$PROCESSOR/DEBUG_$TOOLTAG
#
# Store environment variables used by CreateBootDisk.sh
#
echo export TOOLCHAIN=$TOOLTAG> $WORKSPACE/DuetPkg/SetEnv_$PROCESSOR.sh
chmod +x $WORKSPACE/DuetPkg/SetEnv_$PROCESSOR.sh
# #
# Boot sector module could only be built under IA32 tool chain # Boot sector module could only be built under IA32 tool chain

View File

@ -4,28 +4,22 @@ A. Build DUET image on Windows Platform
======================================== ========================================
1. Tools preparation 1. Tools preparation
To build DUET image, following tools are required: To build DUET image, Visual Studio is required:
1). Base on below link to create Visual Studio build environment.
https://github.com/tianocore/tianocore.github.io/wiki/Windows-systems
1). *Visual Studio 2005* 2. Build Duet Platform module
Assume installed at <VS_PATH>,
e.g.: C:\Program Files\Microsoft Visual Studio .NET 2003\.
2). WinDDK
Assume installed at <WIN_DDK_PATH>, e.g.: C:\WINDDK\3790.1830\.
2. Build steps
2.1 Build Duet Platform module
1). run cmd.exe to open command line window. 1). run cmd.exe to open command line window.
2). enter workspace root directory such as c:\edk2_tree 2). enter workspace root directory such as c:\edk2_tree
2). run "edksetup.bat" 3). set the environment variable EDK_TOOLS_BIN to point at the BaseTools binaries directory
3). run "build -p DuetPkg\DuetPkg.dsc -a IA32" for IA32 architecture platform or i.e., "set EDK_TOOLS_BIN=c:\edk2-BaseTools-win32"
"build -p DuetPkg\DuetPkg.dsc -a X64" for X64 architecture platform. 4). run "edksetup.bat"
5). run "build -p DuetPkg\DuetPkgIa32.dsc -a IA32 -t VS2015x86" for IA32 architecture platform (using 64-bit VS2015 for example) or
"build -p DuetPkg\DuetPkgX64.dsc -a X64 -t VS2015x86" for X64 architecture platform.
NOTE: The post build script 'PostBuild.sh' will be automatically called after the build command.
2.2 Execute post build actions
1). enter <Workspace>\DuetPkg directory.
2). run "PostBuild.bat IA32" for IA32 architecture platform or
"PostBuild.bat X64" for X64 architecture platform.
Create bootable disk Create bootable disk
====================== ======================
@ -56,34 +50,35 @@ B. Build DUET image on Linux Platform
====================================== ======================================
1. Tools preparation 1. Tools preparation
To build DUET image, GCC44 is required: To build DUET image, GCC installation (4.4+) is required:
1). Base on below link to create GCC44 build environment. 1). Base on below link to create GCC build environment.
http://tianocore.sourceforge.net/wiki/Using_EDK_II_with_Native_GCC https://github.com/tianocore/tianocore.github.io/wiki/Using-EDK-II-with-Native-GCC
2. Build steps 2. Build Duet Platform module
2.1 Build Duet Platform module
1). Open the terminal. 1). Open the terminal.
2). enter workspace root directory such as /edk2_tree 2). enter workspace root directory such as /edk2_tree
3). run ". edksetup.sh BaseTools" 3). run ". edksetup.sh BaseTools"
4). run "build -p DuetPkg/DuetPkg.dsc -a IA32 -t GCC44" for IA32 architecture platform or 4). run "build -p DuetPkg/DuetPkgIa32.dsc -a IA32 -t GCC49" for IA32 architecture platform (using GCC 4.9 for example) or
"build -p DuetPkg/DuetPkg.dsc -a X64 -t GCC44" for X64 architecture platform. "build -p DuetPkg/DuetPkgX64.dsc -a X64 -t GCC49" for X64 architecture platform.
2.2 Execute post build actions NOTE: The post build script 'PostBuild.sh' will be automatically called after the build command.
1). enter /edk2_tree/DuetPkg directory. After post build action, you should check the size of EfiLdr at $WORKSPACE/Build/DuetPkgIA32(DuetPkgX64)/DEBUG_GCC49 directory, it must less than 470k.
2). run "./PostBuild.sh IA32 GCC44" for IA32 architecture platform or
"./PostBuild.sh X64 GCC44" for X64 architecture platform.
NOTE: After post build action, you should check the size of EfiLdr at $WORKSPACE/Build/DuetPkg/DEBUG_GCC44 directory, it must less than 470k.
If not, you should manually remove some unnecessary drivers at DuetPkg.fdf file. If not, you should manually remove some unnecessary drivers at DuetPkg.fdf file.
3. Create bootable disk 3. Create bootable disk
The following steps are same for IA32 architecture platform or X64 architecture platform. The following steps are same for IA32 architecture platform or X64 architecture platform.
Now only support floopy.
3.1 Create floppy boot disk 3.1 Create floppy boot disk
1). enter /edk2_tree/DuetPkg directory. 1). enter /edk2_tree/DuetPkg directory.
2). Insert a floppy disk to drive 2). Insert a floppy disk to drive
3). run "CreateBootDisk.sh" to build floppy drive 3). run "CreateBootDisk.sh" to build floppy drive
such as "./CreateBootDisk.sh floppy /media/floppy0 /dev/fd0 FAT12 IA32" such as "./CreateBootDisk.sh floppy /media/floppy0 /dev/fd0 FAT12 IA32"
3.2 Create usb boot disk
1). enter /edk2_tree/DuetPkg directory.
2). Plugin usb disk
3). run "CreateBootDisk.sh" to build usb drive
such as "./CreateBootDisk.sh usb /media/usb0 /dev/sdb0 FAT16 IA32"
4). UnPlug usb disk and plugin it again.
5). run "./CreateBootDisk.sh usb /media/usb0 /dev/sdb0 FAT16 IA32 step2"

View File

@ -126,10 +126,8 @@ done
# #
echo Running edk2 build for DuetPkg$Processor echo Running edk2 build for DuetPkg$Processor
build -p $WORKSPACE/DuetPkg/DuetPkg$Processor.dsc -a $PROCESSOR -t $TARGET_TOOLS -n 3 $* build -p $WORKSPACE/DuetPkg/DuetPkg$Processor.dsc -a $PROCESSOR -t $TARGET_TOOLS -n 3 $*
echo Running DuetPkg/PostBuild.sh
$WORKSPACE/DuetPkg/PostBuild.sh $PROCESSOR $TARGET_TOOLS
echo Running DuetPkg/CreateBootDisk.sh echo Running DuetPkg/CreateBootDisk.sh
$WORKSPACE/DuetPkg/CreateBootDisk.sh file $FLOPPY_IMAGE /dev/null FAT12 $PROCESSOR $TARGET_TOOLS $WORKSPACE/DuetPkg/CreateBootDisk.sh file $FLOPPY_IMAGE /dev/null FAT12 $PROCESSOR
exit $? exit $?

View File

@ -125,10 +125,8 @@ done
# #
echo Running edk2 build for DuetPkg$PROCESSOR echo Running edk2 build for DuetPkg$PROCESSOR
build -p $WORKSPACE/DuetPkg/DuetPkg$PROCESSOR.dsc -a $PROCESSOR -t $TARGET_TOOLS -n 3 $* build -p $WORKSPACE/DuetPkg/DuetPkg$PROCESSOR.dsc -a $PROCESSOR -t $TARGET_TOOLS -n 3 $*
echo Running DuetPkg/PostBuild.sh
$WORKSPACE/DuetPkg/PostBuild.sh $PROCESSOR $TARGET_TOOLS
echo Running DuetPkg/CreateBootDisk.sh echo Running DuetPkg/CreateBootDisk.sh
$WORKSPACE/DuetPkg/CreateBootDisk.sh file $FLOPPY_IMAGE /dev/null FAT12 $PROCESSOR $TARGET_TOOLS $WORKSPACE/DuetPkg/CreateBootDisk.sh file $FLOPPY_IMAGE /dev/null FAT12 $PROCESSOR
exit $? exit $?