@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