Skip to content

Commit 41b9339

Browse files
authored
feat: use specific version of msvc (#17)
1 parent ea7fc76 commit 41b9339

File tree

4 files changed

+126
-10
lines changed

4 files changed

+126
-10
lines changed

.github/workflows/main.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222

2323
build-script-windows:
2424
name: 'build.cmd'
25-
runs-on: windows-latest
25+
runs-on: windows-2025
2626
steps:
2727
- uses: actions/checkout@v4
2828
- run: .\build.cmd
@@ -36,7 +36,7 @@ jobs:
3636
build-self-windows:
3737
name: 'build self (windows)'
3838
needs: build-script-windows
39-
runs-on: windows-latest
39+
runs-on: windows-2025
4040
steps:
4141
- uses: actions/checkout@v4
4242
- uses: actions/download-artifact@v4

build.cmd

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,37 @@ for /f "usebackq tokens=*" %%i in (`%vswhere% -latest -products * -requires Micr
2222
set vs_install_dir=%%i
2323
)
2424

25-
call "%vs_install_dir%\Common7\Tools\vsdevcmd.bat" /no_logo
25+
if exist "%vs_install_dir%\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt" (
26+
set /p Version=<"%vs_install_dir%\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"
27+
set LatestVCToolsVersion=!Version: =!
28+
)
29+
30+
31+
set "msvc_root=%vs_install_dir%\VC\Tools\MSVC"
32+
set "chosen_minor=0"
33+
set "chosen_patch=0"
34+
35+
:: Iterate over all MSVC versions installed
36+
for /f "delims=" %%v in ('dir /b /ad "%msvc_root%"') do (
37+
call :check_version "%%v"
38+
)
39+
40+
if not defined chosen_version (
41+
echo ERROR: MSVC version less than or equal to 14.43 not found
42+
exit 1
43+
)
44+
45+
echo INFO: using chosen version !chosen_version!
46+
47+
call "%vs_install_dir%\Common7\Tools\vsdevcmd.bat" -arch=x64 -host_arch=x64 -no_logo -vcvars_ver=!chosen_version!
2648

2749
if "%VCToolsInstallDir%"=="" (
2850
echo ERROR: missing VCToolsInstallDir after running vsdevcmd.bat
2951
exit 1
3052
)
3153

54+
echo INFO: using vs tools %VCToolsVersion%
55+
3256
set vs_tools_dir=%VCToolsInstallDir%
3357

3458
if exist .cache\repos\cppfront\ (
@@ -152,3 +176,38 @@ cl /nologo "%root_dir%.cache/cpp2/source/src/main.cpp" ^
152176
if %ERRORLEVEL% neq 0 exit %ERRORLEVEL%
153177

154178
echo %cpp2b_dist%.exe
179+
180+
:: -------------------------------
181+
:: Subroutine: check_version
182+
:: %1 = version string like 14.43.32706
183+
:: -------------------------------
184+
:check_version
185+
set "ver=%~1"
186+
for /f "tokens=1-3 delims=." %%a in ("!ver!") do (
187+
set "major=%%a"
188+
set "minor=%%b"
189+
set "patch=%%c"
190+
)
191+
192+
if "%major%"=="14" (
193+
set /a m=!minor!
194+
set /a p=!patch!
195+
if !m! LEQ 43 (
196+
if not defined chosen_version (
197+
set "chosen_version=!ver!"
198+
set "chosen_minor=!m!"
199+
set "chosen_patch=!p!"
200+
) else (
201+
if !m! GTR !chosen_minor! (
202+
set "chosen_version=!ver!"
203+
set "chosen_minor=!m!"
204+
set "chosen_patch=!p!"
205+
) else if !m! EQU !chosen_minor! if !p! GTR !chosen_patch! (
206+
set "chosen_version=!ver!"
207+
set "chosen_minor=!m!"
208+
set "chosen_patch=!p!"
209+
)
210+
)
211+
)
212+
)
213+
goto :eof

share/cpp2b/run_with_msvc_env.cmd

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@echo off
2+
setlocal enabledelayedexpansion
23

34
set vswhere="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
45

@@ -7,18 +8,60 @@ for /f "usebackq tokens=*" %%i in (`%vswhere% -latest -products * -requires Micr
78
)
89

910
if exist "%vs_install_dir%\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt" (
10-
set /p vs_tools_version=<"%vs_install_dir%\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"
11+
set /p Version=<"%vs_install_dir%\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"
12+
set LatestVCToolsVersion=!Version: =!
1113
)
1214

13-
if "%vs_tools_version%"=="" (
14-
echo ERROR: cannot find VC tools installed on your system
15-
exit 1
15+
set "msvc_root=%vs_install_dir%\VC\Tools\MSVC"
16+
set "chosen_minor=0"
17+
set "chosen_patch=0"
18+
19+
for /f "delims=" %%v in ('dir /b /ad "%msvc_root%"') do (
20+
call :check_version "%%v"
1621
)
1722

18-
set vs_tools_dir=%vs_install_dir%\VC\Tools\MSVC\%vs_tools_version%
23+
if not defined ChosenMSVC (
24+
set "ChosenMSVC=%LatestVCToolsVersion%"
25+
)
1926

20-
call "%vs_install_dir%\Common7\Tools\vsdevcmd.bat" /no_logo
27+
:: Call vsdevcmd with selected version
28+
call "%vs_install_dir%\Common7\Tools\vsdevcmd.bat" -arch=x64 -host_arch=x64 -no_logo -vcvars_ver=%ChosenMSVC%
2129

2230
for /f "tokens=1,* delims= " %%a in ("%*") do set FORWARD_ARGS=%%b
2331

2432
%1 %FORWARD_ARGS%
33+
34+
:: -------------------------------
35+
:: Subroutine: check_version
36+
:: %1 = version string like 14.43.32706
37+
:: -------------------------------
38+
:check_version
39+
set "ver=%~1"
40+
for /f "tokens=1-3 delims=." %%a in ("!ver!") do (
41+
set "major=%%a"
42+
set "minor=%%b"
43+
set "patch=%%c"
44+
)
45+
46+
if "%major%"=="14" (
47+
set /a m=!minor!
48+
set /a p=!patch!
49+
if !m! LEQ 43 (
50+
if not defined ChosenMSVC (
51+
set "ChosenMSVC=!ver!"
52+
set "chosen_minor=!m!"
53+
set "chosen_patch=!p!"
54+
) else (
55+
if !m! GTR !chosen_minor! (
56+
set "ChosenMSVC=!ver!"
57+
set "chosen_minor=!m!"
58+
set "chosen_patch=!p!"
59+
) else if !m! EQU !chosen_minor! if !p! GTR !chosen_patch! (
60+
set "ChosenMSVC=!ver!"
61+
set "chosen_minor=!m!"
62+
set "chosen_patch=!p!"
63+
)
64+
)
65+
)
66+
)
67+
goto :eof

src/main.cpp2

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,21 @@ main: (args) -> int = {
428428
if !has_msvc_env_vars() {
429429
return run_with_msvc_env_vars(argz);
430430
} else {
431-
log_info("using vs tools {}", cpp2b::env::get_var("VCToolsVersion").expect("msvc env internal error"));
431+
vc_tools_version := cpp2b::env::get_var("VCToolsVersion").expect("msvc env internal error");
432+
433+
after_major_index := vc_tools_version.find(".");
434+
after_minor_index := vc_tools_version.find(".", after_major_index + 1);
435+
436+
major_version := vc_tools_version.substr(0, after_major_index).std::stoi();
437+
minor_version := vc_tools_version.substr(after_major_index + 1, after_minor_index - after_major_index - 1).std::stoi();
438+
439+
if major_version == 14 && minor_version >= 44 {
440+
log_error("vs tools version {} is unsupported", vc_tools_version);
441+
log_error("please install vs tools 14.42 or 14.43");
442+
std::exit(1);
443+
}
444+
445+
log_info("using vs tools {}", vc_tools_version);
432446

433447
if !fs::exists(".cache/cpp2/.env") {
434448
log_info("saving environment variables");

0 commit comments

Comments
 (0)