From 97750907e29c8580cb0c95182f04f97c7897a2b3 Mon Sep 17 00:00:00 2001 From: Shun Wang Date: Wed, 14 Oct 2026 08:20:08 +0800 Subject: [PATCH 1/2] add Windows MSVC native build and tests --- .github/workflows/build.yml | 71 ++++++++++++++++++- VS17/PropertySheet.props | 2 +- VS17/ReadStat.vcxproj | 21 +++--- VS17/ReadStat.vcxproj.filters | 9 +++ VS17/ReadStat_App/ReadStat_App.vcxproj | 28 ++++---- .../ReadStat_Test_double_decimals.vcxproj | 10 +-- .../ReadStat_Test_dta_days.vcxproj | 10 +-- .../ReadStat_Test_readstat.vcxproj | 20 +++--- .../ReadStat_Test_sav_date.vcxproj | 10 +-- 9 files changed, 131 insertions(+), 50 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4de69ffd..782ed4d9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -69,7 +69,7 @@ jobs: - name: Fail if tests failed if: steps.make-check.outcome == 'failure' run: exit 1 - windows: + windows_msys: runs-on: windows-latest defaults: run: @@ -104,3 +104,72 @@ jobs: - name: Fail if tests failed if: steps.make-check.outcome == 'failure' run: exit 1 + windows_msvc: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - uses: ilammy/msvc-dev-cmd@v1 + + - name: Install dependencies + run: | + vcpkg install gettext libiconv libcsv libxlsxwriter zlib --triplet x64-windows + vcpkg integrate install + + - name: Fix library filename and paths for MSVC + shell: pwsh + run: | + $libDir = "C:\vcpkg\installed\x64-windows\lib" + + if (Test-Path "$libDir\iconv.lib") { + Copy-Item "$libDir\iconv.lib" "$libDir\libiconv.lib" -Force + } + + # Depending on the zlib port version, the import library is named + # z.lib, zlib1.lib or zlibd.lib/zlib1d.lib; the projects link + # against zlib.lib/zlibd.lib + if (Test-Path "$libDir\z.lib") { + Copy-Item "$libDir\z.lib" "$libDir\zlib.lib" -Force + } + if (Test-Path "$libDir\zd.lib") { + Copy-Item "$libDir\zd.lib" "$libDir\zlibd.lib" -Force + } + if (Test-Path "$libDir\zlib1.lib") { + Copy-Item "$libDir\zlib1.lib" "$libDir\zlib.lib" -Force + } + if (Test-Path "$libDir\zlib1d.lib") { + Copy-Item "$libDir\zlib1d.lib" "$libDir\zlibd.lib" -Force + } + + if (-not (Test-Path "$libDir\zlib.lib")) { + Write-Host "##vso[task.logissue type=error]zlib.lib not found in $libDir after fix step" + Get-ChildItem $libDir -Filter *.lib | Select-Object -ExpandProperty Name + exit 1 + } + + - name: Build + run: | + MSBuild ./VS17/ReadStat.sln /p:Configuration=Release /p:Platform=x64 /nologo + + - name: Test + id: make-check + shell: pwsh + env: + PATH: C:\vcpkg\installed\x64-windows\bin;${{ env.PATH }} + run: | + ./VS17/x64/Release/ReadStat_App.exe + ./VS17/x64/Release/ReadStat_Test_double_decimals.exe + ./VS17/x64/Release/ReadStat_Test_dta_days.exe + ./VS17/x64/Release/ReadStat_Test_sav_date.exe + ./VS17/x64/Release/ReadStat_Test_readstat.exe + continue-on-error: true + - name: Upload test log + if: steps.make-check.outcome == 'failure' + uses: actions/upload-artifact@v4 + with: + name: test-suite-log-windows + path: test-suite.log + retention-days: 5 + - name: Fail if tests failed + if: steps.make-check.outcome == 'failure' + run: exit 1 diff --git a/VS17/PropertySheet.props b/VS17/PropertySheet.props index 1cc1bc39..89b98fde 100644 --- a/VS17/PropertySheet.props +++ b/VS17/PropertySheet.props @@ -5,7 +5,7 @@ - READSTAT_VERSION="1.1.9";_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + READSTAT_VERSION="1.1.9";HAVE_ZLIB=1;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) diff --git a/VS17/ReadStat.vcxproj b/VS17/ReadStat.vcxproj index 9463c4e5..e129d8fe 100644 --- a/VS17/ReadStat.vcxproj +++ b/VS17/ReadStat.vcxproj @@ -23,32 +23,32 @@ {7D9D3258-8850-466E-8A74-4F8025E6FA49} Win32Proj ReadStat - 10.0.17763.0 + $(LatestTargetPlatformVersion) StaticLibrary true - v141 + $(DefaultPlatformToolset) Unicode StaticLibrary false - v141 + $(DefaultPlatformToolset) true Unicode StaticLibrary true - v141 + $(DefaultPlatformToolset) Unicode StaticLibrary false - v141 + $(DefaultPlatformToolset) true Unicode @@ -105,7 +105,7 @@ false - $(ProjectDir)..\..\iconv\include;%(AdditionalIncludeDirectories) + $(VcpkgRoot)\installed\$(VcpkgTriplet)\include;%(AdditionalIncludeDirectories) $(IntDir)FakePath\%(RelativeDir) $(IntDir)FakePath\%(RelativeDir)\ @@ -124,7 +124,7 @@ true - $(ProjectDir)..\..\iconv\include;%(AdditionalIncludeDirectories) + $(VcpkgRoot)\installed\$(VcpkgTriplet)\include;%(AdditionalIncludeDirectories) $(IntDir)FakePath\%(RelativeDir) $(IntDir)FakePath\%(RelativeDir)\ @@ -150,7 +150,7 @@ false - $(ProjectDir)..\..\iconv\include;%(AdditionalIncludeDirectories) + $(VcpkgRoot)\installed\$(VcpkgTriplet)\include;%(AdditionalIncludeDirectories) $(IntDir)FakePath\%(RelativeDir) $(IntDir)FakePath\%(RelativeDir)\ @@ -173,7 +173,7 @@ true - $(ProjectDir)..\..\iconv\include;%(AdditionalIncludeDirectories) + $(VcpkgRoot)\installed\$(VcpkgTriplet)\include;%(AdditionalIncludeDirectories) $(IntDir)FakePath\%(RelativeDir) $(IntDir)FakePath\%(RelativeDir)\ @@ -220,6 +220,9 @@ + + + diff --git a/VS17/ReadStat.vcxproj.filters b/VS17/ReadStat.vcxproj.filters index 88432b87..d9178318 100644 --- a/VS17/ReadStat.vcxproj.filters +++ b/VS17/ReadStat.vcxproj.filters @@ -99,6 +99,15 @@ Source Files\spss + + Source Files\spss + + + Source Files\spss + + + Source Files\spss + Source Files\spss diff --git a/VS17/ReadStat_App/ReadStat_App.vcxproj b/VS17/ReadStat_App/ReadStat_App.vcxproj index 8028214a..c8ea81cc 100644 --- a/VS17/ReadStat_App/ReadStat_App.vcxproj +++ b/VS17/ReadStat_App/ReadStat_App.vcxproj @@ -65,33 +65,33 @@ {80188B4B-81A0-4113-A848-CB6483D185EA} Win32Proj ReadStatApp - 10.0.17763.0 + $(LatestTargetPlatformVersion) ReadStat_App Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode @@ -149,8 +149,8 @@ Console true - ReadStat.lib;libiconvD.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(ProjectDir)..\..\..\iconv\lib;..\x86\$(ConfigurationName); + ReadStat.lib;libiconvD.lib;zlibd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(VcpkgRoot)\installed\$(VcpkgTriplet)\lib;$(ProjectDir)..\..\..\iconv\lib;..\x86\$(ConfigurationName);%(AdditionalLibraryDirectories) @@ -169,8 +169,8 @@ Console true - ReadStat.lib;libiconvD.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(ProjectDir)..\..\..\iconv\lib64;..\x64\$(ConfigurationName) + ReadStat.lib;libiconvD.lib;zlibd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(VcpkgRoot)\installed\$(VcpkgTriplet)\lib;$(ProjectDir)..\..\..\iconv\lib64;..\x64\$(ConfigurationName);%(AdditionalLibraryDirectories) @@ -193,8 +193,8 @@ true true false - ReadStat.lib;libiconv.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(ProjectDir)..\..\..\iconv\lib;..\x86\$(ConfigurationName); + ReadStat.lib;libiconv.lib;zlib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(VcpkgRoot)\installed\$(VcpkgTriplet)\lib;$(ProjectDir)..\..\..\iconv\lib;..\x86\$(ConfigurationName);%(AdditionalLibraryDirectories) @@ -217,11 +217,11 @@ true true false - ReadStat.lib;libiconv.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(ProjectDir)..\..\..\iconv\lib64;..\x64\$(ConfigurationName) + ReadStat.lib;libiconv.lib;zlib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(VcpkgRoot)\installed\$(VcpkgTriplet)\lib;$(ProjectDir)..\..\..\iconv\lib64;..\x64\$(ConfigurationName);%(AdditionalLibraryDirectories) - \ No newline at end of file + diff --git a/VS17/ReadStat_Test_double_decimals/ReadStat_Test_double_decimals.vcxproj b/VS17/ReadStat_Test_double_decimals/ReadStat_Test_double_decimals.vcxproj index 34280ca5..290dc171 100644 --- a/VS17/ReadStat_Test_double_decimals/ReadStat_Test_double_decimals.vcxproj +++ b/VS17/ReadStat_Test_double_decimals/ReadStat_Test_double_decimals.vcxproj @@ -23,33 +23,33 @@ {96AB8E29-11AC-40F0-871A-856DD9C78EAB} Win32Proj ReadStatTests - 10.0.17763.0 + $(LatestTargetPlatformVersion) ReadStat_Test_double_decimals Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode diff --git a/VS17/ReadStat_Test_dta_days/ReadStat_Test_dta_days.vcxproj b/VS17/ReadStat_Test_dta_days/ReadStat_Test_dta_days.vcxproj index 62b310e7..fe612443 100644 --- a/VS17/ReadStat_Test_dta_days/ReadStat_Test_dta_days.vcxproj +++ b/VS17/ReadStat_Test_dta_days/ReadStat_Test_dta_days.vcxproj @@ -23,33 +23,33 @@ {D6F08523-A8F5-4F2A-A57B-EC013A136DA6} Win32Proj ReadStatTests - 10.0.17763.0 + $(LatestTargetPlatformVersion) ReadStat_Test_dta_days Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode diff --git a/VS17/ReadStat_Test_readstat/ReadStat_Test_readstat.vcxproj b/VS17/ReadStat_Test_readstat/ReadStat_Test_readstat.vcxproj index fa583f76..dc40f4bf 100644 --- a/VS17/ReadStat_Test_readstat/ReadStat_Test_readstat.vcxproj +++ b/VS17/ReadStat_Test_readstat/ReadStat_Test_readstat.vcxproj @@ -23,33 +23,33 @@ {E9408E27-6E13-46C9-B07D-9569BD078EF6} Win32Proj ReadStatTests - 10.0.17763.0 + $(LatestTargetPlatformVersion) ReadStat_Test_readstat Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode @@ -112,8 +112,8 @@ true true false - $(ProjectDir)..\..\..\iconv\lib;..\x86\$(ConfigurationName);%(AdditionalLibraryDirectories) - ReadStat.lib;libiconv.lib;%(AdditionalDependencies) + C:\vcpkg\installed\x64-windows\lib;$(ProjectDir)..\..\..\iconv\lib64;..\x64\$(ConfigurationName) + ReadStat.lib;iconv.lib;zlib.lib;%(AdditionalDependencies) @@ -179,8 +179,8 @@ true true false - ReadStat.lib;libiconv.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - $(ProjectDir)..\..\..\iconv\lib64;..\x64\$(ConfigurationName) + ReadStat.lib;iconv.lib;zlib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + C:\vcpkg\installed\x64-windows\lib;$(ProjectDir)..\..\..\iconv\lib64;..\x64\$(ConfigurationName) @@ -210,4 +210,4 @@ - \ No newline at end of file + diff --git a/VS17/ReadStat_Test_sav_date/ReadStat_Test_sav_date.vcxproj b/VS17/ReadStat_Test_sav_date/ReadStat_Test_sav_date.vcxproj index 4ee7077a..a1ea3bc5 100644 --- a/VS17/ReadStat_Test_sav_date/ReadStat_Test_sav_date.vcxproj +++ b/VS17/ReadStat_Test_sav_date/ReadStat_Test_sav_date.vcxproj @@ -23,33 +23,33 @@ {D5265192-6034-4689-94FF-8B2060FBC309} Win32Proj ReadStatTests - 10.0.17763.0 + $(LatestTargetPlatformVersion) ReadStat_Test_sav_date Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode Application true - v141 + $(DefaultPlatformToolset) Unicode Application false - v141 + $(DefaultPlatformToolset) true Unicode From 17547c83a3f77b97b557af5dc7b11aa074b67260 Mon Sep 17 00:00:00 2001 From: Shun Wang Date: Wed, 14 Oct 2026 16:27:02 +0800 Subject: [PATCH 2/2] fix appveyor build --- appveyor.yml | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 48aa148b..244b2543 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -16,6 +16,38 @@ install: - git clone https://github.com/pffang/libiconv-for-Windows.git C:\projects\iconv - cd C:\projects\iconv - git checkout 0e36d95873 + # Mirror the GitHub Actions windows_msvc job: install libiconv and zlib + # via vcpkg so "vcpkg integrate install" can inject the include/lib paths + # (iconv.h, zlib.h) into MSBuild, just like the GH runner does. + - ps: | + $vcpkg = Get-Command vcpkg -ErrorAction SilentlyContinue + if (-not $vcpkg) { $vcpkgExe = "C:\tools\vcpkg\vcpkg.exe" } else { $vcpkgExe = $vcpkg.Source } + & $vcpkgExe install libiconv zlib --triplet x64-windows + & $vcpkgExe integrate install + $vcpkgRoot = Split-Path $vcpkgExe + $libDir = Join-Path $vcpkgRoot "installed\x64-windows\lib" + # vcpkg's libiconv installs as iconv.lib; the projects link against + # libiconv.lib/libiconvD.lib + if ((Test-Path "$libDir\iconv.lib") -and -not (Test-Path "$libDir\libiconv.lib")) { + Copy-Item "$libDir\iconv.lib" "$libDir\libiconv.lib" -Force + } + if ((Test-Path "$libDir\iconvd.lib") -and -not (Test-Path "$libDir\libiconvD.lib")) { + Copy-Item "$libDir\iconvd.lib" "$libDir\libiconvD.lib" -Force + } + # The zlib import library is named z.lib (or zlib1.lib) depending on + # the port version; the projects link against zlib.lib/zlibd.lib + if ((Test-Path "$libDir\z.lib") -and -not (Test-Path "$libDir\zlib.lib")) { + Copy-Item "$libDir\z.lib" "$libDir\zlib.lib" -Force + } + if ((Test-Path "$libDir\zlib1.lib") -and -not (Test-Path "$libDir\zlib.lib")) { + Copy-Item "$libDir\zlib1.lib" "$libDir\zlib.lib" -Force + } + if ((Test-Path "$libDir\zd.lib") -and -not (Test-Path "$libDir\zlibd.lib")) { + Copy-Item "$libDir\zd.lib" "$libDir\zlibd.lib" -Force + } + if ((Test-Path "$libDir\zlib1d.lib") -and -not (Test-Path "$libDir\zlibd.lib")) { + Copy-Item "$libDir\zlib1d.lib" "$libDir\zlibd.lib" -Force + } for: - @@ -41,6 +73,13 @@ test_script: $tests = @("readstat","double_decimals","sav_date","dta_days") Copy-Item "C:\projects\iconv\lib64\libiconvD.dll" -Destination "C:\projects\readstat\VS17\x64\Debug\" + # vcpkg's iconv.dll / zlib*.dll are also needed at run time + $dllDirs = @("C:\vcpkg\installed\x64-windows\bin", "C:\tools\vcpkg\installed\x64-windows\bin") + foreach ($dir in $dllDirs) { + Get-ChildItem "$dir\iconv*.dll","$dir\charset*.dll","$dir\zlib*.dll","$dir\z.dll" -ErrorAction SilentlyContinue | ForEach-Object { + Copy-Item $_.FullName -Destination "C:\projects\readstat\VS17\x64\Debug\" -Force + } + } for($i=0 ; $i -lt $tests.Length ; $i++) {