Issue #25348: Add --pgo and --pgo-job flags to PCbuild\build.bat
diff --git a/Misc/NEWS b/Misc/NEWS
index e533d55..d470780 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -85,6 +85,11 @@
 Build
 -----
 
+- Issue #25348: Added ``--pgo`` and ``--pgo-job`` arguments to
+  ``PCbuild\build.bat`` for building with Profile-Guided Optimization.  The
+  old ``PCbuild\build_pgo.bat`` script is now deprecated, and simply calls
+  ``PCbuild\build.bat --pgo %*``.
+
 - Issue #25827: Add support for building with ICC to ``configure``, including
   a new ``--with-icc`` flag.
 
diff --git a/PCbuild/build.bat b/PCbuild/build.bat
index f3dcc91..766378f 100644
--- a/PCbuild/build.bat
+++ b/PCbuild/build.bat
@@ -24,6 +24,8 @@
 echo.  -v  Increased output messages

 echo.  -k  Attempt to kill any running Pythons before building (usually done

 echo.      automatically by the pythoncore project)

+echo.  --pgo          Build with Profile-Guided Optimization.  This flag

+echo.                 overrides -c and -d

 echo.

 echo.Available flags to avoid building certain modules.

 echo.These flags have no effect if '-e' is not given:

@@ -38,6 +40,8 @@
 echo.     Set the platform (default: Win32)

 echo.  -t Build ^| Rebuild ^| Clean ^| CleanAll

 echo.     Set the target manually

+echo.  --pgo-job  The job to use for PGO training; implies --pgo

+echo.             (default: "-m test.regrtest --pgo")

 exit /b 127

 

 :Run

@@ -50,6 +54,12 @@
 set parallel=

 set verbose=/nologo /v:m

 set kill=

+set do_pgo=

+set pgo_job=-m test.regrtest --pgo

+set on_64_bit=true

+

+rem This may not be 100% accurate, but close enough.

+if "%ProgramFiles(x86)%"=="" (set on_64_bit=false)

 

 :CheckOpts

 if "%~1"=="-h" goto Usage

@@ -62,6 +72,8 @@
 if "%~1"=="-M" (set parallel=) & shift & goto CheckOpts

 if "%~1"=="-v" (set verbose=/v:n) & shift & goto CheckOpts

 if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts

+if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts

+if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts

 rem These use the actual property names used by MSBuild.  We could just let

 rem them in through the environment, but we specify them on the command line

 rem anyway for visibility so set defaults after this

@@ -77,15 +89,49 @@
 

 if "%IncludeExternals%"=="true" call "%dir%get_externals.bat"

 

-if "%platf%"=="x64" (set vs_platf=x86_amd64)

+if "%platf%"=="x64" (

+    if "%on_64_bit%"=="true" (

+        rem This ought to always be correct these days...

+        set vs_platf=amd64

+    ) else (

+        if "%do_pgo%"=="true" (

+            echo.ERROR: Cannot cross-compile with PGO

+            echo.    32bit operating system detected, if this is incorrect,

+            echo.    make sure the ProgramFiles(x86^) environment variable is set

+            exit /b 1

+        )

+        set vs_platf=x86_amd64

+    )

+)

 

 rem Setup the environment

 call "%dir%env.bat" %vs_platf% >nul

 

-if "%kill%"=="true" (

-    msbuild /v:m /nologo /target:KillPython "%dir%\pythoncore.vcxproj" /p:Configuration=%conf% /p:Platform=%platf% /p:KillPython=true

-)

+if "%kill%"=="true" call :Kill

 

+if "%do_pgo%"=="true" (

+    set conf=PGInstrument

+    call :Build

+    del /s "%dir%\*.pgc"

+    del /s "%dir%\..\Lib\*.pyc"

+    echo on

+    call "%dir%\..\python.bat" %pgo_job%

+    @echo off

+    call :Kill

+    set conf=PGUpdate

+)

+goto Build

+

+:Kill

+echo on

+msbuild "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^

+ /p:Configuration=%conf% /p:Platform=%platf%^

+ /p:KillPython=true

+

+@echo off

+goto :eof

+

+:Build

 rem Call on MSBuild to do the work, echo the command.

 rem Passing %1-9 is not the preferred option, but argument parsing in

 rem batch is, shall we say, "lackluster"

@@ -96,3 +142,6 @@
  /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^

  /p:IncludeBsddb=%IncludeBsddb%^

  %1 %2 %3 %4 %5 %6 %7 %8 %9

+

+@echo off

+goto :eof

diff --git a/PCbuild/build_pgo.bat b/PCbuild/build_pgo.bat
index 79ec267..872c382 100644
--- a/PCbuild/build_pgo.bat
+++ b/PCbuild/build_pgo.bat
@@ -1,48 +1,6 @@
 @echo off

-rem A batch program to build PGO (Profile guided optimization) by first

-rem building instrumented binaries, then running the testsuite, and

-rem finally building the optimized code.

-rem Note, after the first instrumented run, one can just keep on

-rem building the PGUpdate configuration while developing.

+echo.DeprecationWarning:

+echo.    This script is deprecated, use `build.bat --pgo` instead.

+echo.

 

-setlocal

-set platf=Win32

-set parallel=/m

-set dir=%~dp0

-

-rem use the performance testsuite.  This is quick and simple

-set job1="%dir%..\tools\pybench\pybench.py" -n 1 -C 1 --with-gc

-set path1="%dir%..\tools\pybench"

-

-rem or the whole testsuite for more thorough testing

-set job2="%dir%..\lib\test\regrtest.py"

-set path2="%dir%..\lib"

-

-set job=%job1%

-set clrpath=%path1%

-

-:CheckOpts

-if "%1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts

-if "%1"=="-2" (set job=%job2%) & (set clrpath=%path2%) & shift & goto CheckOpts

-if "%1"=="-M" (set parallel=) & shift & goto CheckOpts

-

-

-rem We cannot cross compile PGO builds, as the optimization needs to be run natively

-set vs_platf=x86

-set PGO=%dir%win32-pgo

-

-if "%platf%"=="x64" (set vs_platf=amd64) & (set PGO=%dir%amd64-pgo)

-rem Setup the environment

-call "%dir%env.bat" %vs_platf%

-

-

-rem build the instrumented version

-msbuild "%dir%pcbuild.proj" %parallel% /t:Build /p:Configuration=PGInstrument /p:Platform=%platf% %1 %2 %3 %4 %5 %6 %7 %8 %9

-

-rem remove .pyc files, .pgc files and execute the job

-"%PGO%\python.exe" "%dir%rmpyc.py" %clrpath%

-del "%PGO%\*.pgc"

-"%PGO%\python.exe" %job%

-

-rem build optimized version

-msbuild "%dir%pcbuild.proj" %parallel% /t:Build /p:Configuration=PGUpdate /p:Platform=%platf% %1 %2 %3 %4 %5 %6 %7 %8 %9

+call "%~dp0build.bat" --pgo %*

diff --git a/PCbuild/env.bat b/PCbuild/env.bat
index ec8a695..1719cc1 100644
--- a/PCbuild/env.bat
+++ b/PCbuild/env.bat
@@ -10,6 +10,12 @@
 

 echo Build environments: x86, amd64, x86_amd64

 echo.

+

+rem Set up the v90 tools first.  This is mostly needed to allow PGInstrument

+rem builds to find the PGO DLL.  Do it first so the newer MSBuild is found

+rem before the one from v90 (vcvarsall.bat prepends to PATH).

+call "%VS90COMNTOOLS%..\..\VC\vcvarsall.bat" %*

+

 set VSTOOLS=%VS140COMNTOOLS%

 if "%VSTOOLS%"=="" set VSTOOLS=%VS120COMNTOOLS%

 if "%VSTOOLS%"=="" set VSTOOLS=%VS110COMNTOOLS%