windows-nt/Source/XPSP1/NT/sdktools/debuggers/debuggers.cmd
2020-09-26 16:20:57 +08:00

1707 lines
47 KiB
Batchfile

@echo off
if defined _echo echo on
if defined verbose echo on
setlocal ENABLEDELAYEDEXPANSION
REM Check the command line for /? -? or ?
for %%a in (./ .- .) do if ".%1." == "%%a?." goto Usage
goto MAIN
:BeginBuildPackage
REM Set PackageType=retail or PackageType=beta.
REM This affects "redist.txt" and whether or not it lists the files that are
REM redistributable
set PackageType=beta
REM Do a clean build of the msi things
if exist %_NTTREE%\dbg\files\msi rd /s /q %_NTTREE%\dbg\files\msi
del /s /q %_NTTREE%\dbg\redist*
REM Build the msi stuff
call logmsg "Building the redist directory"
cd redist
build -cZ
cd ..
call logmsg "Building the msi directory"
cd msi
build -cZ
cd ..
REM Make sure that mergemod.dll has been regsvr'd
call logmsg "Registering %_NTDRIVE%%_NTROOT%\tools\x86\mergemod.dll
regsvr32 /s %_NTDRIVE%%_NTROOT%\tools\x86\mergemod.dll
for %%a in (%cmdline%) do (
set CorrectEntry=no
if /i "%%a" == "debuggers" (
set CorrectEntry=yes
)
if /i "%%a" == "debuggers.cmd" (
set CorrectEntry=yes
)
if /i "!CorrectEntry!" == no (
goto Usage
)
)
set DbgErrors=no
set SRCDIR=%_NTTREE%\dbg\files
set SRCSDKLIBDIR=%_NTDRIVE%%_NTROOT%\public\sdk\lib
set SRCSDKINCDIR=%_NTDRIVE%%_NTROOT%\public\sdk\inc
set SRCSAMPLEDIR=%CD%\samples
set SDKLIBDIR=%SRCDIR%\sdk\lib
set SDKINCDIR=%SRCDIR%\sdk\inc
set SAMPLEDIR=%SRCDIR%\sdk\samples
set WEBDIR=%_NTTREE%\dbg\web
set SDKDIR=%_NTTREE%\dbg\sdk
set DOCDIR=%_NTTREE%\dbg\msi\docs
set PRICHMPATH=\\dbg\web$\docs\htmlhelp\Private_Version
set PRICHIPATH=\\dbg\web$\docs\htmlhelp\Private_Version
set PRICHM=debugMS.chm
set PRICHI=debugMS.chi
set MSIDIR=%_NTTREE%\dbg\msi
set CABDIR=%_NTTREE%\dbg\cabs
set DDFDIR=%MSIDIR%\ddfs
set IDTDIR=%MSIDIR%\idts
set TOOLPATH=%_NTDRIVE%%_NTROOT%\Tools
set DESTDIR=%_NTTREE%\dbg
set MSIIDTDIR=%MSIDIR%\msiidts
set MSMDIR=%DESTDIR%\sdk
set MAKEFILE=%MSIDIR%\ddfs\makefile
set CABLIST=%DDFDIR%\cabs.txt
REM
REM The msi that goes on the CD needs to be slightly
REM different than the one that we distribute for stress
REM
set CDMSIDIR=%DESTDIR%\sdk
set CDMSIIDTDIR=%MSIDIR%\cd\msiidts
if exist %CDMSIDIR% rd /s /q %CDMSIDIR%
if exist %CDMSIIDTDIR% rd /s /q %CDMSIIDTDIR%
REM Cleanup and create the directory where the self-extracting
REM exe that we post to the web goes.
if not exist %WEBDIR% mkdir %WEBDIR%
REM
REM Make directories
REM
if NOT EXIST %CABDIR% MD %CABDIR%
if NOT EXIST %DDFDIR% MD %DDFDIR%
if NOT EXIST %IDTDIR% MD %IDTDIR%
if NOT EXIST %DESTDIR% md %DESTDIR%
if NOT EXIST %MSIIDTDIR% md %MSIIDTDIR%
if NOT EXIST %MSMDIR% md %MSMDIR%
if NOT EXIST %CDMSIDIR% md %CDMSIDIR%
if NOT EXIST %CDMSIIDTDIR% md %CDMSIIDTDIR%
del /q /f %MSMDIR%\*
set COMPONEN=%IDTDIR%\componen.idt
set DIRECTOR=%IDTDIR%\director.idt
set FEATUREC=%IDTDIR%\featurec.idt
set FILE=%IDTDIR%\file.idt
set MEDIA=%IDTDIR%\media.idt
set MODULECO=%IDTDIR%\moduleco.idt
set MODULESI=%IDTDIR%\modulesi.idt
set SHORTCUT=%IDTDIR%\shortcut.idt
set REGISTRY=%IDTDIR%\registry.idt
set DATA=%MSIDIR%\dbgdata.txt
REM Set the MSI name according to build architecture
if /i "%_BuildArch%" == "x86" (
set MSINAME=dbg_x86
set OEMNAME=dbg_oem
set CurArch=i386
goto EndSetBuildArch
)
if /i "%_BuildArch%" == "IA64" (
set OEMNAME=
set MSINAME=dbg_ia64
set CurArch=ia64
goto EndSetBuildArch
)
call errmsg "Build architecture (_BuildArch) is unknown"
goto errend
:EndSetBuildArch
REM Make directories for the source files
REM and copy them in
call logmsg.cmd "Copying in the SDK files..."
if not exist %SDKLIBDIR%\i386 md %SDKLIBDIR%\i386
if not exist %SDKLIBDIR%\ia64 md %SDKLIBDIR%\ia64
if not exist %SDKINCDIR% md %SDKINCDIR%
if not exist %SAMPLEDIR% md %SAMPLEDIR%
for %%a in ( exts simplext dumpstk ) do (
if not exist %SAMPLEDIR%\%%a md %SAMPLEDIR%\%%a
copy %SRCSAMPLEDIR%\%%a\* %SAMPLEDIR%\%%a
)
for %%a in ( dbgeng.h wdbgexts.h dbghelp.h ) do (
copy %SRCSDKINCDIR%\%%a %SDKINCDIR%\%%a > nul
)
for %%a in ( dbgeng.lib dbghelp.lib ) do (
copy %SRCSDKLIBDIR%\i386\%%a %SDKLIBDIR%\i386\%%a > nul
copy %SRCSDKLIBDIR%\ia64\%%a %SDKLIBDIR%\ia64\%%a > nul
)
REM Get the empty ones ready
REM Prepare dbg.msi
if exist %DESTDIR%\%MSINAME%.msi del %DESTDIR%\%MSINAME%.msi
if exist %MSIDIR%\%MSINAME%.msi del %MSIDIR%\%MSINAME%.msi
copy %MSIDIR%\dbgx.msi %MSIDIR%\%MSINAME%.msi > nul
REM Get the docs copied in
call logmsg.cmd "Copying in the private docs ..."
if not exist %DOCDIR% (
call errmsg "Docs are not binplaced to %DOCDIR%"
goto errend
)
if exist %PRICHMPATH%\%PRICHM% (
copy %PRICHMPATH%\%PRICHM% %DOCDIR%\%PRICHM% > nul
) else (
call errmsg "Cannot find %PRICHMPATH%\%PRICHM%"
goto errend
)
if exist %PRICHIPATH%\%PRICHI% (
copy %PRICHIPATH%\%PRICHI% %DOCDIR%\%PRICHI% > nul
) else (
call errmsg "Cannot find %PRICHIPATH%\%PRICHI%"
goto errend
)
if not exist %DOCDIR%\%PRICHM% (
call errmsg "Copy failed for %PRICHMPATH%\%PRICHM% to %DOCDIR%\%PRICHM%"
)
if not exist %DOCDIR%\%PRICHI% (
call errmsg "Copy failed for %PRICHIPATH%\%PRICHI% to %DOCDIR%\%PRICHI%"
)
if exist %CABDIR%\dbg*.CABinet del /f /q %CABDIR%\dbg*.CABinet
if exist %MAKEFILE% del /f /q %MAKEFILE%
if exist %CABLIST% del /f /q %CABLIST%
REM Give every package that gets generated, a new product
REM and package code. MSI will always think its upgrading
call :UpdateProductCode %MSIDIR%\%MSINAME%.msi %MSIIDTDIR%
call :UpdatePackageCode %MSIDIR%\%MSINAME%.msi %MSIIDTDIR%
call :SetUpgradeCode %MSIDIR%\%MSINAME%.msi %MSIIDTDIR%
REM Update redist.txt to have the correct version number
call :UpdateRedist
REM Put the current build number into the ProductVersion
REM fields
call :SetVersion %MSIDIR%\%MSINAME%.msi %MSIIDTDIR%
REM Possible first entries are
REM 1. MergeModule
REM 2. Directory
REM 3. File
REM Put the data into the idt's
REM Arguments for "file
REM %%a = "file"
REM %%b = component
REM %%c = GUID
REM %%d = file name
REM Arguments for "directory
set /a count=0
set /a modulecount=1
set ModuleName=none
REM This variable determines whether any of the files
REM that are supposed to go into a merge module exist.
REM For example, w2kfre and w2kchk extensions do not
REM exist for alpha installs.
set FilesExist=no
call :CreateMSIHeaders
REM Start a DDF that contains all the files
call :CreateDDFHeader %MSINAME%
for /f "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13* delims=," %%a in (%DATA%) do (
if /i "%%a" == "MergeModule" (
REM Create/finish the current merge module if it exists
if /i NOT "!ModuleName!" == "none" (
REM For this architecture there may be no files in this
REM MergeModule. If this is the case don't finish it
if /i "!FilesExist!" == "yes" (
call :FinishMergeModule
set /a modulecount=!modulecount!+1
if /i "!PrevFile!" NEQ "none" (
echo !PrevFile!>>%MAKEFILE%
echo makecab /F %DDFDir%\!ModuleName!.ddf>>%MAKEFILE%
echo.>>%MAKEFILE%
)
)
set FilesExist=no
)
REM Decide if this is a correct merge module for this architecture
set skippingmodule=yes
if /i "%_BuildArch%" == "x86" (
if /i "%%b" == "32" set skippingmodule=no
)
if /i "%_BuildArch%" == "ia64" (
if /i "%%b" == "64" set skippingmodule=no
)
if /i "%%b" EQU "3264" set skippingmodule=no
call logmsg "Module %%c -- skipping=!skippingmodule!"
if /i "!skippingmodule!" == "no" (
REM CurSrcDir is the directory where the source files are found in
REM our tree
set CurSrcDir=%SRCDIR%
REM Create a new set of headers
call :CreateIDTHeaders
set ModuleName=%%c
REM set guidlet equal to the guid with _ instead of -'s
call :MungeGUID %%d
set ModuleGuidlet=!guidlet!
set ModuleSig=!ModuleName!.!guidlet!
set MergeFeature=%%e
set MergeParent=%%f
if /i "%_BuildArch%" == "ia64" (
if /i "!MergeParent!" == "SystemFolder" (
set MergeParent=System64Folder
)
)
echo !ModuleSig! 0 01.00.0000.0000>>%MODULESI%
call :CreateDDFHeader !ModuleName!
set PrevFile=none
set CabStart=yes
)
)
if /i "!skippingmodule!" == "no" (
if /i "%%a" == "file" (
call :MungeGUID %%b
set guid={%%b}
set filename=%%c
set filenamekey=!filename!.!guidlet!
set component=!ModuleName!.!guidlet!
set condition=%%d
set attributes=0
REM if we every start doing this as a one-step build we
REM can put this in and take out the call later to
REM FixComponentAttributes
REM if /i "%_BuildArch%" == "ia64" (
REM set attributes=256
REM )
echo !component! !guid! !CurInstallDir! !attributes! !condition! !filenamekey!>>%COMPONEN%
set /a count=!count!+1
echo !filenamekey! !component! !filename! 0 1033 512 !count!>>%FILE%
echo !component! !ModuleSig! ^0>>%MODULECO%
REM We have different file lists for different architectures
REM If a file is missing on this architecture, don't put it in the DDF
if /i exist !CurSrcDir!\!filename! (
set FilesExist=yes
REM Don't write out a \ unless this file is not the last one
REM Save it and write it out next
if /i "!CabStart!" EQU "yes" (
echo %CabDir%\!ModuleName!.CABinet: \>>%MAKEFILE%
echo !ModuleName!>>%CABLIST%
set CabStart=no
)
if /i "!PrevFile!" NEQ "none" (
echo !PrevFile! \>>%MAKEFILE%
)
set PrevFile=!CurSrcDir!\!filename!
echo !CurSrcDir!\!filename! !filenamekey!>>%DDFDIR%\!ModuleName!.ddf
echo !CurSrcDir!\!filename! !filenamekey!>>%DDFDIR%\%MSINAME%.ddf
) else (
call errmsg "****!CurSrcDir!\!filename! is missing!!!!"
goto errend
)
)
if /i "%%a" == "directory" (
set CurInstallDir=%%b.!ModuleGuidlet!
set CurAppend=%%e
if /i "!CurAppend!" == "*" (
set CurAppend=%CurArch%
)
if /i NOT "!CurAppend!" == "" (
if /i NOT "!CurAppend!" == "^." (
set CurSrcDir=!CurSrcDir!\!CurAppend!
)
)
set parentdir=%%c.!ModuleGuidlet!
if /i "%%d" == "*" (
set installdirname=%CurArch%
) else (
set installdirname=%%d
)
echo !CurInstallDir! !parentdir! !installdirname!:!CurAppend!>>%DIRECTOR%
)
if /i "%%a" == "registry" (
call :MungeGUID %%b
set guid={%%b}
set component=!ModuleName!.!guidlet!
set CurInstallDir=INSTDIR
set attributes=4
REM Get the root
set root=
if /i "%%c" == "HKLM" (
set root=2
)
if /i "%%c" == "HKCU" (
set root=1
)
if not defined root (
call errmsg.cmd "Root is not HKLM or HKCU for %%b registry entry
goto errend
)
set key=%%d
set name=
if /i "%%e" NEQ "none" set name=%%e
set value=
if /i "%%f" NEQ "none" set value=%%f
set condition=%%g
set filenamekey=DBG_REG_%%c.!guidlet!
echo !component! !guid! !CurInstallDir! !attributes! !condition! !filenamekey!>>%COMPONEN%
echo !filenamekey! !root! !key! !name! !value! !component!>>%REGISTRY%
echo !component! !ModuleSig! ^0>>%MODULECO%
)
if /i "%%a" == "shortcut" (
call :MungeGUID %%b
set guid={%%b}
set component=!ModuleName!.!guidlet!
set s_shortcut=DBG_SC.!guidlet!
set s_directory=%%c
set s_name=%%d
set s_target=%%e
set s_args=
if /i "%%f" NEQ "none" set s_args=%%f
set s_desc=%%g
set s_hotkey=
if /i "%%h" NEQ "none" set s_hotkey=%%h
set s_icon=
if /i "%%i" NEQ "none" set s_icon=%%i
set s_iconindex=
if /i "%%j" NEQ "none" set s_iconindex=%%j
set s_showcmd=
if /i "%%k" NEQ "none" set s_showcmd=%%k
set s_wkdir=
set c_dir=%%l.!ModuleGuidlet!
if /i "%%l" NEQ "none" (
set s_wkdir=%%l.!ModuleGuidlet!
set c_dir=%%l.!ModuleGuidlet!
)
if /i "!ModuleName!" EQU "dbgrel" (
set c_dir=DBG_RELNOTES.!ModuleGuidlet!
)
if /i "!ModuleName!" EQU "dbgrel.64" (
set c_dir=DBG_RELNOTES.!ModuleGuidlet!
)
set reg_wkdir=
if /i "%%m" NEQ "none" set reg_wkdir=%%m.!ModuleGuidlet!]
set keypath=DBG_REG_HKCU.!guidlet!
echo !s_shortcut! !s_directory! !s_name! !component! !s_target! !s_args! !s_desc! !s_hotkey! !s_icon! !s_iconindex! !s_showcmd! !s_wkdir!>>%SHORTCUT%
echo !component! !guid! !c_dir! 4 !keypath!>>%COMPONEN%
echotime /N "!keypath! 1 Software\Microsoft\DebuggingTools !s_desc! !reg_wkdir! !component!">>%REGISTRY%
)
)
)
REM Process the last module
if /i NOT "!ModuleName!" == "none" (
if /i "!skippingmodule!" == "no" (
REM For this architecture there may be no files in this
REM MergeModule. If this is the case don't finish it
if /i "!FilesExist!" == "yes" (
call :FinishMergeModule
)
REM Finish the makefile
if /i "!PrevFile!" NEQ "none" (
echo !PrevFile!>>%MAKEFILE%>>%MAKEFILE%
echo makecab /F %DDFDir%\!ModuleName!.ddf>>%MAKEFILE%
echo.>>%MAKEFILE%
)
)
)
REM Merge the media table into the msi
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %MSIDIR%\%MSINAME%.msi %IDTDIR% media.idt
REM Add all the dependencies to the feature components table
call :AddInstallationDependencies %MSIDIR%\%MSINAME%.msi %MSIIDTDIR%
REM Set the component attribute to 256 for ia64 binaries
call :FixComponentAttributes %MSIDIR%\%MSINAME%.msi %MSIIDTDIR%
REM Fix the feature table if this is ia64
call :FixFeatureTable %MSIDIR%\%MSINAME%.msi %MSIIDTDIR%
REM Add Components for features
call :AddComponentsForFeatures %MSIDIR%\%MSINAME%.msi %MSIIDTDIR%
REM Copy dbg.msi to %_NTTREE%\dbg\dbg.msi
copy %MSIDIR%\%MSINAME%.msi %DESTDIR%\%MSINAME%.msi > nul
REM
REM Convert this to the dbg.msi that goes on the Symbolcd
REM
copy %MSIDIR%\%MSINAME%.msi %CDMSIDIR%\%MSINAME%.msi > nul
REM Give every package that gets generated, a new product
REM and package code. MSI will always think its upgrading
call :UpdateProductCode %CDMSIDIR%\%MSINAME%.msi %CDMSIIDTDIR%
call :UpdatePackageCode %CDMSIDIR%\%MSINAME%.msi %CDMSIIDTDIR%
REM Fix the install mode so that it doesn't force all files to
REM install, but rather goes by the version.
call :DefaultInstallMode %CDMSIDIR%\%MSINAME%.msi %CDMSIIDTDIR%
REM Remove the Internal extensions
call :RemoveInternalExtensions %CDMSIDIR%\%MSINAME%.msi %CDMSIIDTDIR%
REM
REM Convert this to the dbg_oem.msi that goes to kanalyze
REM
if /i "%CurArch%" == "i386" (
copy %MSIDIR%\%MSINAME%.msi %CDMSIDIR%\%OEMNAME%.msi > nul
REM Give every package that gets generated, a new product
REM and package code. MSI will always think its upgrading
call :UpdateProductCode %CDMSIDIR%\%OEMNAME%.msi %CDMSIIDTDIR%
call :UpdatePackageCode %CDMSIDIR%\%OEMNAME%.msi %CDMSIIDTDIR%
REM Fix the install mode so that it doesn't force all files to
REM install, but rather goes by the version.
call :DefaultInstallMode %CDMSIDIR%\%OEMNAME%.msi %CDMSIIDTDIR%
REM Remove the Internal extensions
call :RemoveInternalExtensions %CDMSIDIR%\%OEMNAME%.msi %CDMSIIDTDIR%
)
)
REM
REM Create all the cabs
REM
:CreateCabs
if NOT EXIST %CABDIR% md %CABDIR%
if NOT EXIST %DDFDIR%\temp md %DDFDIR%\temp
if /i EXIST %DDFDir%\temp\*.txt del /f /q %DDFDir%\temp\*.txt
for /F "tokens=1" %%a in (%CABLIST%) do (
sleep 1
start "PB_SymCabGen %%a" /MIN cmd /c "%RazzleToolPath%\PostBuildScripts\SymCabGen.cmd -f:%%a.CABinet -s:%DDFDir% -t:CAB -d:%CABDIR%"
)
call logmsg.cmd "Waiting for symbol cabs to finish ... "
:wait
sleep 5
if EXIST %DDFDir%\temp\*.txt goto wait
:Verify
REM
REM Verify that all the cabs are there
REM
set AllCreated=TRUE
call logmsg.cmd "Verifying that all the cabs got created ..."
for /F "tokens=1" %%a in ( %CABLIST% ) do (
if NOT EXIST %CABDIR%\%%a.CABinet (
set AllCreated=FALSE
call logmsg.cmd "%CABDIR%\%%a.CABinet didn't get created "
)
)
if /i "%AllCreated%" == "FALSE" goto errend
call logmsg.cmd "All cabs were created"
:EndCreateCabs
REM
REM Put the cabs into the merge modules, and the msi files.
REM The private files go into the msi in
call logmsg.cmd "Add the cabs to the msi's and the merge modules"
for /f %%a in (%CABLIST%) do (
call logmsg " Adding %%a.CABinet"
set found=no
set match=0
if /i "%%a" EQU "dbgdoc" set match=1
if /i "%%a" EQU "dbgdoc.64" set match=1
if /i "%%a" EQU "dbgtriage" set match=1
if /i "%%a" EQU "dbgtriage.64" set match=1
if /i "!match!" EQU "1" (
REM Put the public one into the merge module
REM and the retail package
REM and the OEM package
msidb.exe -d %MSMDIR%\%%a.msm -a %CABDIR%\%%a.CABinet >nul
msidb.exe -d %CDMSIDIR%\%MSINAME%.msi -a %CABDIR%\%%a.CABinet >nul
if /i "%CurArch%" EQU "i386" (
msidb.exe -d %CDMSIDIR%\%OEMNAME%.msi -a %CABDIR%\%%a.CABinet >nul
)
REM Put the private one into the internal msi
msidb.exe -d %DESTDIR%\%MSINAME%.msi -a %DOCDIR%\%%a.CABinet >nul
set found=yes
)
set match=0
if /i "%%a" EQU "dbgntsd" set match=1
if /i "%%a" EQU "dbgntsd.64" set match=1
if /i "%%a" EQU "dbgextp" set match=1
if /i "%%a" EQU "dbgextp.64" set match=1
if /i "!match!" EQU "1" (
REM This only goes in the internal msi
msidb.exe -d %DESTDIR%\%MSINAME%.msi -a %CABDIR%\%%a.CABinet% >nul
set found=yes
)
if /i "%%a" EQU "dbgrel" (
REM Put the x86 one into the merge module
REM and the retail package and the internal package
msidb.exe -d %MSMDIR%\%%a.msm -a %CABDIR%\%%a.CABinet >nul
msidb.exe -d %CDMSIDIR%\%MSINAME%.msi -a %CABDIR%\%%a.CABinet >nul
msidb.exe -d %DESTDIR%\%MSINAME%.msi -a %CABDIR%\%%a.CABinet >nul
REM Put the oem one into the oem msi
msidb.exe -d %CDMSIDIR%\%OEMNAME%.msi -a %DOCDIR%\%%a.CABinet >nul
set found=yes
)
if /i "!found!" EQU "no" (
REM Put this into the merge module, the retail msi and the internal msi
REM and the OEM package
msidb.exe -d %MSMDIR%\%%a.msm -a %CABDIR%\%%a.CABinet >nul
msidb.exe -d %CDMSIDIR%\%MSINAME%.msi -a %CABDIR%\%%a.CABinet >nul
if /i "%CurArch%" EQU "i386" (
msidb.exe -d %CDMSIDIR%\%OEMNAME%.msi -a %CABDIR%\%%a.CABinet >nul
)
msidb.exe -d %DESTDIR%\%MSINAME%.msi -a %CABDIR%\%%a.CABinet >nul
set found=yes
)
)
:CreateSelfExtractingExe
REM Create the self-extracting exes for the web page release
REM
call logmsg "Creating %SDKDIR%\%MSINAME%.exe ...
if exist %WEBDIR%\%MSINAME%.exe del /f %WEBDIR%\%MSINAME%.exe
cl -DTARGET=%WEBDIR%\%MSINAME%.exe -DEXENAME=%MSINAME%.exe -DAPP="msiexec /i %MSINAME%.msi" -DMSINAME=%MSINAME%.msi -DMSIDIR=%CDMSIDIR% -EP %MSIDIR%\dbgx.sed > %MSIDIR%\dbg.sed
iexpress.exe /n %MSIDIR%\dbg.sed /q /m >nul 2>nul
if not exist %WEBDIR%\%MSINAME%.exe (
call errmsg "Errors creating the self-extracting exe %SDKDIR%\%MSINAME%.exe"
)
goto DbgFinished
REM
REM Subroutines
REM
:FinishMergeModule
if exist %MSMDIR%\%ModuleName%.msm del %MSMDIR%\%ModuleName%.msm
if /i "%ModuleName%" EQU "dbgem" (
copy %MSIDIR%\dbgemx.msm %MSMDIR%\%ModuleName%.msm > nul
) else (
copy %MSIDIR%\dbgx.msm %MSMDIR%\%ModuleName%.msm > nul
)
for %%a in (componen featurec file moduleco modulesi registry shortcut) do (
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %MSMDIR%\!ModuleName!.msm %IDTDIR% %%a.idt
)
REM Don't merge the directory table into dbgemx.msm
if /i "%ModuleName%" NEQ "dbgem" (
for %%a in ( director) do (
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %MSMDIR%\!ModuleName!.msm %IDTDIR% %%a.idt
)
)
)
REM Update the merge module with the correct file versions and sizes
REM
call logmsg "msifiler.exe -v -d %MSMDIR%\%ModuleName%.msm -s !CurSrcDir!"
msifiler.exe -v -d %MSMDIR%\%ModuleName%.msm -s !CurSrcDir!\ >nul
REM Merge the merge module into the msi
call logmsg.cmd "Merging !ModuleName!.msm"
call cscript.exe %TOOLPATH%\wimsmmerge.vbs //nologo %MSIDIR%\%MSINAME%.msi !MSMDIR!\!ModuleName!.msm !MergeFeature! %MergeParent% %LOGFILE%
REM Add the correct line to the media table
if EXIST %MSIIDTDIR%\file.idt del %MSIIDTDIR%\file.idt
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %MSIDIR%\%MSINAME%.msi %MSIIDTDIR% File
REM Figure out which number is currently the highest sequence in the file table
set /a lastsequence="0"
for /f "tokens=1,2,3,4,5,6,7,8 delims= " %%a in (%MSIIDTDIR%\File.idt) do (
set /a curlastsequence="0"
REM Some of the fields could be empty so get the last token
set found=no
for %%z in (%%h %%g %%f %%e %%d %%c %%b %%a) do (
if "!found!" == "no" (
set /a curlastsequence="%%z"
set found=yes
)
)
if !curlastsequence! GTR !lastsequence! (
set /a lastsequence="!curlastsequence!"
)
)
echo !modulecount! !lastsequence! #!ModuleName!.CABinet >>%MEDIA%
REM Create the cabs and put them into the msm's and also the msi
REM If this is the doc cab, make one for the private and for retail
set match=0
if /i "!ModuleName!" == "dbgdoc" set match=1
if /i "!ModuleName!" == "dbgdoc.64" set match=1
if /i "!match!" == "1" (
REM Make the private debugger doc cab and save it to %DOCDIR%\dbgdoc.CABinet
copy %DOCDIR%\%PRICHM% %_NTTREE%\dbg\files\bin\debugger.chm > nul
copy %DOCDIR%\%PRICHI% %_NTTREE%\dbg\files\bin\debugger.chi > nul
call logmsg.cmd "Creating private debugger documentation cab"
makecab /f %DDFDIR%\!ModuleName!.ddf > nul
if /i not exist !CABDIR!\!ModuleName!.CABinet (
call errmsg.cmd "Error creating !CABDIR!\!ModuleName!.CABinet"
set DbgErrors=yes
goto :EOF
)
copy !CABDIR!\!ModuleName!.CABinet %DOCDIR%\!ModuleName!.CABinet > nul
del /f /q !cABDIR!\!ModuleName!.CABinet
REM Now, get ready to make the public debugger doc cabinet
del /f /q %_NTTREE%\dbg\files\bin\debugger.chm
del /f /q %_NTTREE%\dbg\files\bin\debugger.chi
REM Now, get ready to make the public debugger doc cabinet
if not exist %DOCDIR%\debugger.chm (
call errmsg.cmd "Debugger.chm must be binplaced to %DOCDIR%"
goto :EOF
)
if not exist %DOCDIR%\debugger.chi (
call errmsg.cmd "Debugger.chi must be binplaced to %DOCDIR%"
goto :EOF
)
copy %DOCDIR%\debugger.chm %_NTTREE%\dbg\files\bin\debugger.chm > nul
copy %DOCDIR%\debugger.chi %_NTTREE%\dbg\files\bin\debugger.chi > nul
)
set match=0
if /i "!ModuleName!" == "dbgrel" set match=1
if /i "!match!" == "1" (
REM Make the oem relnote cab with the oem redist.txt
REM and save it to %DOCDIR%\dbgrel_oem.CABinet
copy %DOCDIR%\redist_oem.txt %_NTTREE%\dbg\files\redist.txt > nul
call logmsg.cmd "Creating OEM release notes cab"
makecab /f %DDFDIR%\!ModuleName!.ddf > nul
if /i not exist !CABDIR!\!ModuleName!.CABinet (
call errmsg.cmd "Error creating !CABDIR!\!ModuleName!.CABinet"
set DbgErrors=yes
goto :EOF
)
copy !CABDIR!\!ModuleName!.CABinet %DOCDIR%\!ModuleName!.CABinet > nul
del /f /q !cABDIR!\!ModuleName!.CABinet
REM Now, get ready to make the public release notes cabinet
del /f /q %_NTTREE%\dbg\files\redist.txt
copy %DOCDIR%\redist_x86.txt %_NTTREE%\dbg\files\redist.txt > nul
)
set match=0
if /i "!ModuleName!" == "dbgrel.64" set match=1
if /i "!match!" == "1" (
REM Now, get ready to make the public release notes cabinet
del /f /q %_NTTREE%\dbg\files\redist.txt
copy %DOCDIR%\redist_ia64.txt %_NTTREE%\dbg\files\redist.txt > nul
)
set match=0
if /i "!ModuleName!" == "dbgtriage" set match=1
if /i "!ModuleName!" == "dbgtriage.64" set match=1
if /i "!match!" == "1" (
REM Make the private cab and save it to %DOCDIR%\dbgtriage.CABinet
copy %SDXROOT%\stress\wsstress\tools\triage\triage.ini %_NTTREE%\dbg\files\bin\triage\triage.ini > nul
copy %DOCDIR%\pooltag.pri %_NTTREE%\dbg\files\bin\triage\pooltag.txt > nul
call logmsg.cmd "Creating private triage cab"
makecab /f %DDFDIR%\!ModuleName!.ddf > nul
if /i not exist !CABDIR!\!ModuleName!.CABinet (
call errmsg.cmd "Error creating !CABDIR!\!ModuleName!.CABinet"
set DbgErrors=yes
goto :EOF
)
copy !CABDIR!\!ModuleName!.CABinet %DOCDIR%\!ModuleName!.CABinet > nul
del /f /q !CABDIR!\!ModuleName!.CABinet
REM Now, get ready to make the public dbgtriage cabinet
del /f /q %_NTTREE%\dbg\files\bin\triage\pooltag.txt
del /f /q %_NTTREE%\dbg\files\bin\triage\triage.ini
REM Now, get ready to make the public debugger doc cabinet
if not exist %DOCDIR%\pooltag.txt (
call errmsg.cmd "Public pooltag.txt must be binplaced to %DOCDIR%"
goto :EOF
)
if not exist %DOCDIR%\triage.ini (
call errmsg.cmd "Public triage.ini must be binplaced to %DOCDIR%"
goto :EOF
)
copy %DOCDIR%\pooltag.txt %_NTTREE%\dbg\files\bin\triage\pooltag.txt > nul
copy %DOCDIR%\triage.ini %_NTTREE%\dbg\files\bin\triage\triage.ini > nul
)
:EndFinishMergeModule
goto :EOF
:CreateIDTHeaders
echo Component ComponentId Directory_ Attributes Condition KeyPath>%COMPONEN%
echo s72 S38 s72 i2 S255 S72>>%COMPONEN%
echo Component Component>>%COMPONEN%
echo Directory Directory_Parent DefaultDir>%DIRECTOR%
echo s72 S72 l255>>%DIRECTOR%
echo Directory Directory>>%DIRECTOR%
echo Feature_ Component_>%FEATUREC%
echo s32 s72>>%FEATUREC%
echo FeatureComponents Feature_ Component_>>%FEATUREC%
echo File Component_ FileName FileSize Version Language Attributes Sequence>%FILE%
echo s72 s72 l255 i4 S72 S20 I2 i2>>%FILE%
echo File File>>%FILE%
echo Component ModuleID Language>%MODULECO%
echo s72 s72 i2>>%MODULECO%
echo ModuleComponents Component ModuleID Language>>%MODULECO%
echo ModuleID Language Version>%MODULESI%
echo s72 i2 s32>>%MODULESI%
echo ModuleSignature ModuleID Language>>%MODULESI%
echo Shortcut Directory_ Name Component_ Target Arguments Description Hotkey Icon_ IconIndex ShowCmd WkDir>%SHORTCUT%
echo s72 s128 l128 s128 s72 S255 L255 I2 S72 I2 I2 S72>>%SHORTCUT%
echo Shortcut Shortcut>>%SHORTCUT%
echo Registry Root Key Name Value Component_>%REGISTRY%
echo s128 i2 l255 L255 L0 s128>>%REGISTRY%
echo Registry Registry>>%REGISTRY%
goto :EOF
:CreateMSIHeaders
echo DiskId LastSequence DiskPrompt Cabinet VolumeLabel Source>%MEDIA%
echo i2 i2 L64 S255 S32 S32>>%MEDIA%
echo Media DiskId>>%MEDIA%
goto :EOF
:CreateDDFHeader
set CurDDF=%DDFDIR%\%1.ddf
echo ^.Option Explicit>%CurDDF%
echo ^.Set DiskDirectoryTemplate=%CABDIR%>>%CurDDF%
echo ^.Set CabinetName1=%1.CABinet>>%CurDDF%
echo ^.Set RptFilename=nul>>%CurDDF%
echo ^.Set InfFileName=nul>>%CurDDF%
echo ^.Set InfAttr=>>%CurDDF%
echo ^.Set MaxDiskSize=CDROM>>%CurDDF%
echo ^.Set CompressionType=MSZIP>>%CurDDF%
echo ^.Set CompressionMemory=21>>%CurDDF%
echo ^.Set CompressionLevel=1 >>%CurDDF%
echo ^.Set Compress=ON>>%CurDDF%
echo ^.Set Cabinet=ON>>%CurDDF%
echo ^.Set UniqueFiles=ON>>%CurDDF%
echo ^.Set FolderSizeThreshold=1000000>>%CurDDF%
echo ^.Set MaxErrors=300>>%CurDDF%
goto :EOF
:UpdateProductCode
REM Update the product code GUID in the property table
REM
REM %1 is the msi file
REM %2 is the msi idt directory
call logmsg "Updating the product code GUID in the property table"
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Property
copy %2\Property.idt %2\Property.idt.old > nul
del /f %2\Property.idt
uuidgen.exe -c -o%2\productguid
for /f "tokens=1" %%a in (%2\productguid) do (
set NewGuid=%%a
)
call logmsg "ProductCode GUID = !NewGuid!"
for /f "tokens=1,2 delims= " %%a in (%2\Property.idt.old) do (
if /i "%%a" == "ProductCode" (
echo %%a {%NewGuid%}>>%2\Property.idt
) else (
echo %%a %%b>>%2\Property.idt
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Property.idt
goto :EOF
:SetUpgradeCode
REM Update the upgrade code GUID in the property table
REM
REM %1 is the msi file
REM %2 is the msi idt directory
call logmsg "Setting the upgrade code GUID in the property table"
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Property
copy %2\Property.idt %2\Property.idt.old > nul
del /f %2\Property.idt
if /i "!CurArch!" == "i386" (
set CurUpgradeGUID=AEBA607E-D79B-47EC-9C9B-4B3807853863
)
if /i "!CurArch!" == "ia64" (
set CurUpgradeGUID=DFA2AD24-BADF-475F-8FBC-DDE7CBB7BFFD
)
call logmsg "!CurArch! Upgrade Code GUID = !CurUpgradeGUID!"
for /f "tokens=1,2 delims= " %%a in (%2\Property.idt.old) do (
if /i "%%a" == "UpgradeCode" (
echo %%a {!CurUpgradeGuid!}>>%2\Property.idt
) else (
echo %%a %%b>>%2\Property.idt
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Property.idt
REM Update the upgrade code GUID in the Upgrade table
call logmsg "Updating the upgrade code in the Upgrade table
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Upgrade
copy %2\Upgrade.idt %2\Upgrade.idt.old > nul
del /f %2\Upgrade.idt
REM
REM Put the header to the file
REM Echo the first three lines to the file
set /a count=1
for /f "tokens=*" %%a in (%2\upgrade.idt.old) do (
if !count! LEQ 3 echo %%a>>%2\Upgrade.idt
set /a count=!count!+1
)
for /f "skip=3 tokens=1,2,3,4,5,6* delims= " %%a in (%2\Upgrade.idt.old) do (
echo {!CurUpgradeGuid!} %%b %%c %%d %%e %%f>>%2\Upgrade.idt
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Upgrade.idt
goto :EOF
:UpdatePackageCode
REM
REM Update the guid for the package code in the _SummaryInformation table
REM %1 is the msi file
REM %2 is the msiidt directory
call logmsg "Updating the package code GUID in the _SummaryInformation table"
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 _SummaryInformation
copy %2\_SummaryInformation.idt %2\_SummaryInformation.idt.old > nul
del /f %2\_SummaryInformation.idt
uuidgen.exe -c -o%2\packageguid
for /f "tokens=1" %%a in (%2\packageguid) do (
set NewGuid=%%a
)
call logmsg "ProductCode GUID (package code) = !NewGuid!"
for /f "tokens=1,2 delims= " %%a in (%2\_SummaryInformation.idt.old) do (
if "%%a" == "9" (
echo %%a {%NewGuid%}>>%2\_SummaryInformation.idt
) else (
echo %%a %%b>>%2\_SummaryInformation.idt
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 _SummaryInformation.idt
goto :EOF
:SetVersion
REM
REM Update the version in the Property table
REM and update the version in the Upgrade Table
REM
REM %1 is the msi file
REM %2 is the msiidt directory
set ntverp=%CD%\dbg-common\dbgver.h
if NOT EXIST %ntverp% (echo Can't find dbgver.h.&goto :ErrEnd)
for /f "tokens=3 delims=, " %%i in ('findstr /c:"#define VER_PRODUCTMAJORVERSION " %ntverp%') do (
set /a ProductMajor="%%i"
set BuildNum=%%i
)
for /f "tokens=3 delims=, " %%i in ('findstr /c:"#define VER_PRODUCTMINORVERSION " %ntverp%') do (
set /a ProductMinor="%%i"
set BuildNum=!BuildNum!.%%i
)
for /f "tokens=3" %%i in ('findstr /c:"#define VER_PRODUCTBUILD " %ntverp%') do (
set /a ProductBuild="%%i"
set BuildNum=!BuildNum!.%%i
)
for /f "tokens=3" %%i in ('findstr /c:"#define VER_PRODUCTBUILD_QFE " %ntverp%') do (
set /a ProductQfe="%%i"
set BuildNum=!BuildNum!.%%i
)
call logmsg "Updating the ProductVersion to !BuildNum! in the property table"
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Property
copy %2\Property.idt %2\Property.idt.old > nul
del /f %2\Property.idt
for /f "tokens=1,2 delims= " %%a in (%2\Property.idt.old) do (
if /i "%%a" == "ProductVersion" (
echo %%a !BuildNum!>>%2\Property.idt
) else (
echo %%a %%b>>%2\Property.idt
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Property.idt
call logmsg "Updating the Maximum Upgrade version in the Upgrade table
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Upgrade
copy %2\Upgrade.idt %2\Upgrade.idt.old > nul
del /f %2\Upgrade.idt
REM
REM Put the header to the file
REM Echo the first three lines to the file
set /a count=1
for /f "tokens=*" %%a in (%2\upgrade.idt.old) do (
if !count! LEQ 3 echo %%a>>%2\Upgrade.idt
set /a count=!count!+1
)
REM
REM Read in the lines after the header
REM There are supposed to be 7 fields, but right now the language field
REM is blank, so it gets skipped.
REM Echo the line back, but put the buildnum as token three for the maximum
REM version to upgrade. THen echo two tabs since we are skipping the language
REM field, which was field four. It was empty, so it didn't get read in as a
REM token. THen echo the other three tokens
REM
REM NOTE: I had problems saying tokens=1,2,3* and echo'ing %%d for the rest of
REM the line because an extra tab gets written out at the end of the line
REM
REM First figure out what the maximum upgrade build number i
REM It needs to be less than the current build num
if !ProductQfe! GTR 0 (
set /a ProductQfe="!ProductQfe!-1"
) else (
set /a ProductBuild="!ProductBuild!-1"
)
set UpgradeBuildNum=!ProductMajor!.!ProductMinor!.!ProductBuild!.!ProductQfe!
for /f "skip=3 tokens=1,2,3,4,5,6* delims= " %%a in (%2\Upgrade.idt.old) do (
echo %%a %%b !UpgradeBuildNum! %%d %%e %%f>>%2\Upgrade.idt
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Upgrade.idt
goto :EOF
REM
REM This creates redist_x86.txt and redist_oem.txt in the %DOCDIR% directory
REM
:UpdateRedist
if /i "%CurArch%" == "i386" (
set redist_list=redist_x86 redist_oem
)
if /i "%CurArch%" == "ia64" (
set redist_list=redist_ia64
)
for %%a in ( %redist_list% ) do (
call logmsg "Fixing %DOCDIR%\%%a.txt to have correct file versions"
if /i "%PackageType%" == "retail" (
if not exist %DOCDIR%\redist.txt (
call errmsg "%DOCDIR%\redist.txt does not exist."
goto :EOF
)
copy %DOCDIR%\redist.txt %DOCDIR%\%%a.txt
REM get dbghelp's version number
for /f "tokens=5 delims= " %%b in ('filever %SRCDIR%\bin\dbghelp.dll') do (
set dbghelp_ver=%%b
)
call logmsg "dbghelp.dll's file version is !dbghelp_ver!"
echotime /N "===================" >> %DOCDIR%\%%a.txt
echotime /N "DBGHELP.DLL" >> %DOCDIR%\%%a.txt
echotime /N "===================" >> %DOCDIR%\%%a.txt
echo. >> %DOCDIR%\%%a.txt
echotime /N "(1) You may redistribute dbghelp.dll version !dbghelp_ver!" >> %DOCDIR%\%%a.txt
echo. >> %DOCDIR%\%%a.txt
for /f "tokens=5 delims= " %%b in ('filever %SRCDIR%\bin\symsrv.dll') do (
set symsrv_ver=%%b
)
call logmsg "symsrv.dll's file version is !symsrv_ver!"
echotime /N "===================" >> %DOCDIR%\%%a.txt
echotime /N "SYMSRV.DLL" >> %DOCDIR%\%%a.txt
echotime /N "===================" >> %DOCDIR%\%%a.txt
echo. >> %DOCDIR%\%%a.txt
echotime /N "(1) You may redistribute symsrv.dll version !symsrv_ver!" >> %DOCDIR%\%%a.txt
echo. >> %DOCDIR%\%%a.txt
if /i "%%a" == "redist_oem" (
for /f "tokens=5 delims= " %%b in ('filever %SRCDIR%\bin\dbgeng.dll') do (
set dbgeng_ver=%%b
)
call logmsg "dbgeng.dll's file version is !dbgeng_ver!"
echotime /N "===================" >> %DOCDIR%\%%a.txt
echotime /N "DBGENG.DLL" >> %DOCDIR%\%%a.txt
echotime /N "===================" >> %DOCDIR%\%%a.txt
echo. >> %DOCDIR%\%%a.txt
echotime /N "(1) You may redistribute dbgeng.dll version !dbgeng_ver!" >> %DOCDIR%\%%a.txt
echo. >> %DOCDIR%\%%a.txt
)
) else (
echotime /N "This is a Beta package and no files in it are redistributable." > %DOCDIR%\%%a.txt
)
call logmsg "%DOCDIR%\%%a.txt is finished"
)
goto :EOF
:DefaultInstallMode
REM Update the REINSTALLMODE in the property table
REM
REM %1 is the msi file
REM %2 is the msi idt directory
call logmsg "Updating the REINSTALLMODE in the property table"
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Property
copy %2\Property.idt %2\Property.idt.old > nul
del /f %2\Property.idt
for /f "tokens=1,2 delims= " %%a in (%2\Property.idt.old) do (
if /i "%%a" == "REINSTALLMODE" (
echo %%a emus>>%2\Property.idt
) else (
echo %%a %%b>>%2\Property.idt
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Property.idt
goto :EOF
:RemoveInternalExtensions
call logmsg "Removing Internal extensions from the feature table
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Feature
copy %2\Feature.idt %2\Feature.idt.old > nul
del /f %2\Feature.idt
REM
REM Put the header to the file
REM Echo the first three lines to the file
set /a count=1
for /f "tokens=*" %%a in (%2\Feature.idt.old) do (
if !count! LEQ 3 echo %%a>>%2\Feature.idt
set /a count=!count!+1
)
REM
REM Read in the lines after the header
REM Look for DBG.DbgExts.Internal and disable it
for /f "skip=3 tokens=1,2,3,4,5,6,7* delims= " %%a in (%2\Feature.idt.old) do (
if /i "%%a" == "DBG.DbgExts.Internal" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
) else (
if /i "%%a" == "DBG.NtsdFix.Internal" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
) else (
REM Some feature don't have a parent, so print a tab for the second field
REM if the last token is a tab or equal to nothing
if /i "%%g" == " " (
echo %%a %%b %%c %%d %%e %%f>>%2\Feature.idt
) else (
if /i "%%g" == "" (
echo %%a %%b %%c %%d %%e %%f>>%2\Feature.idt
) else (
echo %%a %%b %%c %%d %%e %%f %%g>>%2\Feature.idt
)
)
)
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Feature.idt
goto :EOF
:FixFeatureTable
if /i "%_BuildArch%" == "ia64" (
call logmsg.cmd "Making ia64 specific changes to the feature table"
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Feature
if exist %2\Feature.idt.old del /q %2\Feature.idt.old
copy %2\Feature.idt %2\Feature.idt.old > nul
del /f %2\Feature.idt
REM
REM Put the header to the file
REM Echo the first three lines to the file
set /a count=1
for /f "tokens=*" %%a in (%2\Feature.idt.old) do (
if !count! LEQ 3 echo %%a>>%2\Feature.idt
set /a count=!count!+1
)
REM
REM Read in the lines after the header
REM Look for DBG.DbgExts.Internal and disable it
for /f "skip=3 tokens=1,2,3,4,5,6,7* delims= " %%a in (%2\Feature.idt.old) do (
set done=no
if /i "%%a" == "DBG.DbgExts.Nt4Chk" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
set done=yes
)
if /i "%%a" == "DBG.DbgExts.Nt4Fre" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
set done=yes
)
if /i "%%a" == "DBG.DbgExts.Nt5Chk" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
set done=yes
)
if /i "%%a" == "DBG.DbgExts.Nt5Fre" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
set done=yes
)
if /i "%%a" == "DBG.Tools.Em" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
set done=yes
)
if /i "%%a" == "DBG.Docs.Em" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
set done=yes
)
if /i "%%a" == "DBG.Tools.Adplus" (
echo %%a %%b %%c %%d 0 0 %%g>>%2\Feature.idt
set done=yes
)
if /i "!done!" == "no" (
REM Some features don't have a parent, so print a tab for the second field
REM if the last token is a tab or equal to nothing
if /i "%%g" == " " (
echo %%a %%b %%c %%d %%e %%f>>%2\Feature.idt
) else (
if /i "%%g" == "" (
echo %%a %%b %%c %%d %%e %%f>>%2\Feature.idt
) else (
echo %%a %%b %%c %%d %%e %%f %%g>>%2\Feature.idt
)
)
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Feature.idt
)
goto :EOF
:MungeGUID
for /f "tokens=1,2,3,4,5 delims=-" %%m in ("%1") do (
set guidlet=%%m_%%n_%%o_%%p_%%q
)
goto :EOF
:FixComponentAttributes
if /i "%_BuildArch%" == "ia64" (
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Component
copy %2\Component.idt %2\Component.idt.old > nul
del /q %2\Component.idt
echo Component ComponentId Directory_ Attributes Condition KeyPath>%2\Component.idt
echo s72 S38 s72 i2 S255 S72>>%2\Component.idt
echo Component Component>>%2\Component.idt
for /f "skip=3 tokens=1,2,3,4,5,6* delims= " %%a in (%2\Component.idt.old) do (
if /i "%%d" == "0" (
set num4=256
) else (
set num4=%%d
)
if "%%f" == "" (
set num5=
set num6=%%e
) else (
set num5=%%e
set num6=%%f
)
echotime /N "%%a %%b %%c !num4! !num5! !num6!">>%2\Component.idt
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Component.idt
call logmsg "Set Component attributes to 256 for 64-bit install
)
goto :EOF
REM AddInstallationDependencies
REM This reads through dbgdata.txt and adds dependencies to the feature components table
REM
:AddInstallationDependencies
if exist %2\FeatureComponents.idt del /q %2\FeatureComponents.idt
if exist %2\FeatureComponents.idt.old del /q %2\Featurecomponents.idt.old
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 FeatureComponents
copy %2\FeatureComponents.idt %2\FeatureComponents.idt.old > nul
for /f "tokens=1,2,3,4,5 delims=," %%a in (%DATA%) do (
REM Decide if this is a correct dependency for this package
set DoThisDependency=no
if /i "%%a" == "dependency" (
if /i "%%b" == "32" (
if /i "%_BuildArch%" == "x86" (
set DoThisDependency=yes
)
)
if /i "%%b" == "64" (
if /i "%_BuildArch%" == "ia64" (
set DoThisDependency=yes
)
)
if /i "%%b" == "3264" set DoThisDependency=yes
)
if /i "!DoThisDependency!" == "yes" (
REM If this dependency is for a feature, add all the components of this feature
REM to the feature listed in the dependency table
for /f "skip=3 tokens=1,2,3,4* delims= " %%f in (%2\FeatureComponents.idt.old) do (
if /i "%%f" == "%%d" (
echotime /N "%%c %%g">>%2\FeatureComponents.idt
)
if /i "%%g" == "%%d" (
echotime /N "%%c %%d">>%2\FeatureComponents.idt
)
)
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 FeatureComponents.idt
goto :EOF
REM
REM Add components for all the features
REM
:AddComponentsForFeatures
call logmsg.cmd "Adding a component for each feature"
if exist %2\FeatureComponents.idt del /q %2\FeatureComponents.idt
if exist %2\Component.idt del /q %2\Component.idt
if exist %2\CreateFolder.idt del /q %2\CreateFolder.idt
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 FeatureComponents
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 Component
call cscript.exe %TOOLPATH%\wiexport.vbs //nologo %1 %2 CreateFolder
for /f "eol=; tokens=1,2,3,4* delims=," %%a in (%DATA%) do (
if /i "%%a" == "feature" (
if /i "%CurArch%" == "i386" set ThisGuid=%%c
if /i "%CurArch%" == "ia64" set ThisGuid=%%d
call :MungeGuid !ThisGuid!
echotime /N "%%b %%b.!guidlet!">>%2\FeatureComponents.idt
echotime /N "INSTDIR %%b.!guidlet!">>%2\CreateFolder.idt
echo %%b.!guidlet! {!ThisGuid!} INSTDIR 0 >>%2\Component.idt
)
)
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 FeatureComponents.idt
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 Component.idt
call cscript.exe %TOOLPATH%\wiimport.vbs //nologo %1 %2 CreateFolder.idt
goto :EOF
:DbgFinished
if /i "%DbgErrors%" == "yes" goto errend
if NOT EXIST %DESTDIR%\%MSINAME%.msi (
call errmsg "%DESTDIR%\%MSINAME%.msi is missing"
goto errend
)
goto end
REM **************************************************************************
REM Usage
REM
REM **************************************************************************
:Usage
echo Usage:
echo debuggers.cmd ^[ template ^| full ^| update ^]
echo.
echo template Builds the package without cabs
echo full Builds the full package (default)
echo update Does an incremental build of the cabs
echo.
goto errend
REM *********************
REM End of debugger code
REM *********************
REM **********************************************************
REM
REM Template
REM
REM **********************************************************
:MAIN
REM
REM Define SCRIPT_NAME. Used by the logging scripts.
REM
for %%i in (%0) do set script_name=%%~ni.cmd
REM
REM Save the command line.
REM
set cmdline=%script_name% %*
REM
REM Define LOGFILE, to be used by the logging scripts.
REM As the build rule scripts are typically invoked from wrappers (congeal.cmd),
REM LOGFILE is already defined.
REM
REM Do not redefine LOGFILE if already defined.
REM
if defined LOGFILE goto logfile_defined
if not exist %tmp% md %tmp%
for %%i in (%script_name%) do (
set LOGFILE=%tmp%\%%~ni.log
)
if exist %LOGFILE% del /f %LOGFILE%
:logfile_defined
REM
REM Create a temporary file, to be deleted when the script finishes its execution.
REM The existence of the temporary file tells congeal.cmd that this script is still running.
REM Before the temporary file is deleted, its contents are appended to LOGFILE.
REM International builds define tmpfile based on language prior to calling the US build
REM rule script, so that multiple languages can run the same build rule script concurrently.
REM
REM Do not redefine tmpfile if already defined.
REM
if defined tmpfile goto tmpfile_defined
if not exist %tmp% md %tmp%
for %%i in (%script_name%) do (
set tmpfile=%tmp%\%%~ni.tmp
)
if exist %tmpfile% del /f %tmpfile%
:tmpfile_defined
set LOGFILE_BAK=%LOGFILE%
set LOGFILE=%tmpfile%
REM
REM Mark the beginning of script's execution.
REM
call logmsg.cmd /t "START %cmdline%"
REM
REM Execute the build rule option.
REM
call :BeginBuildPackage
if errorlevel 1 (set /A ERRORS=%errorlevel%) else (set /A ERRORS=0)
REM
REM Mark the end of script's execution.
REM
call logmsg.cmd /t "END %cmdline% (%ERRORS% errors)"
set LOGFILE=%LOGFILE_BAK%
REM
REM Append the contents of tmpfile to logfile, then delete tmpfile.
REM
type %tmpfile% >> %LOGFILE%
del /f %tmpfile%
echo.& echo %script_name% : %ERRORS% errors : see %LOGFILE%.
if "%ERRORS%" == "0" goto end_main
goto errend_main
:end_main
endlocal
goto end
:errend_main
endlocal
goto errend
:ExecuteCmd
REM Do not use setlocal/endlocal:
REM for ex., if the command itself is "pushd",
REM a "popd" will be executed automatically at the end.
set cmd_bak=cmd
set cmd=%1
REM Remove the quotes
set cmd=%cmd:~1,-1%
if "%cmd%" == "" (
call errmsg.cmd "internal error: no parameters for ExecuteCmd %1."
set cmd=cmd_bak& goto errend
)
REM Run the command.
call logmsg.cmd "Running %cmd%."
%cmd%
if not "%errorlevel%" == "0" (
call errmsg.cmd "%cmd% failed."
set cmd=%cmd_bak%& goto errend
)
set cmd=cmd_bak
goto end
:errend
seterror.exe 1
goto :EOF
:end
seterror.exe 0
goto :EOF
REM END