From 0071ad32b8d86ea3411daf396d5c74e671cebd82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20O=2E=20S=C3=B8rensen?= Date: Wed, 5 Aug 2026 18:50:57 +0200 Subject: [PATCH 1/2] build: Convert the solution to slnx dotnet sln migrate, plus the two things that fall out of it. runtime.liblouis.crosscompile.sln is deleted rather than converted. Nothing loaded it: the build scripts pack individual csproj files, and it had not been updated to include the macOS runtime projects, so it had been quietly wrong for some time. Converting a file nobody opens would only preserve that. global.json declares an SDK floor of 9.0.200, the first release that reads slnx. This is mostly documentation: on a machine with both SDKs dotnet already picks the newer one, so nothing changes in practice. It does not buy a good error either - an unsatisfiable global.json reports that the command could not be loaded, which is no clearer than the MSB4068 an old SDK gives on an slnx. The value is that the requirement is written down where someone would look for it. Stacks on the multi-targeting change because that is what puts a .NET 10 SDK in CI. On main the workflow installs 8.0.x only, which cannot read slnx at all. Verified: build_managed_packages.sh builds, tests and packs through the slnx, on both target frameworks. Co-Authored-By: Claude Opus 5 --- LibLouis.NET.sln | 34 --------- LibLouis.NET.slnx | 5 ++ PACKAGING.md | 5 ++ build/build_managed_packages.sh | 4 +- global.json | 6 ++ runtime.liblouis.crosscompile.sln | 118 ------------------------------ 6 files changed, 18 insertions(+), 154 deletions(-) delete mode 100644 LibLouis.NET.sln create mode 100644 LibLouis.NET.slnx create mode 100644 global.json delete mode 100644 runtime.liblouis.crosscompile.sln diff --git a/LibLouis.NET.sln b/LibLouis.NET.sln deleted file mode 100644 index 17aaaf2..0000000 --- a/LibLouis.NET.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.12.35707.178 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibLouis.NET", "LibLouis.NET\LibLouis.NET.csproj", "{B1A0C040-145A-4B0E-BD5F-623D98EF578A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibLouis.NET.Test", "LibLouis.NET.Test\LibLouis.NET.Test.csproj", "{175A9E5D-8A0B-4612-8C34-5FCB2D6A9AFA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibLouis.NET.Tables", "LibLouis.NET.Tables\LibLouis.NET.Tables.csproj", "{25835F61-956A-4FC5-8DD3-4861D8B57897}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B1A0C040-145A-4B0E-BD5F-623D98EF578A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B1A0C040-145A-4B0E-BD5F-623D98EF578A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B1A0C040-145A-4B0E-BD5F-623D98EF578A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B1A0C040-145A-4B0E-BD5F-623D98EF578A}.Release|Any CPU.Build.0 = Release|Any CPU - {175A9E5D-8A0B-4612-8C34-5FCB2D6A9AFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {175A9E5D-8A0B-4612-8C34-5FCB2D6A9AFA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {175A9E5D-8A0B-4612-8C34-5FCB2D6A9AFA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {175A9E5D-8A0B-4612-8C34-5FCB2D6A9AFA}.Release|Any CPU.Build.0 = Release|Any CPU - {25835F61-956A-4FC5-8DD3-4861D8B57897}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {25835F61-956A-4FC5-8DD3-4861D8B57897}.Debug|Any CPU.Build.0 = Debug|Any CPU - {25835F61-956A-4FC5-8DD3-4861D8B57897}.Release|Any CPU.ActiveCfg = Release|Any CPU - {25835F61-956A-4FC5-8DD3-4861D8B57897}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/LibLouis.NET.slnx b/LibLouis.NET.slnx new file mode 100644 index 0000000..4cb929b --- /dev/null +++ b/LibLouis.NET.slnx @@ -0,0 +1,5 @@ + + + + + diff --git a/PACKAGING.md b/PACKAGING.md index 6089b8d..270cfd6 100644 --- a/PACKAGING.md +++ b/PACKAGING.md @@ -73,6 +73,11 @@ to the metapackage — nothing else in the repository depends on the choice. `Directory.Build.props` is the single source of truth for the upstream version and its checksum; the shell scripts read the values back out of it. +The solution is `LibLouis.NET.slnx`, the XML solution format, which needs a .NET SDK of 9.0.200 or +later — `global.json` declares that floor. An older SDK does not report it usefully: SDK 8 fails +with `MSB4068: The element is unrecognized`, which does not obviously mean the SDK is +too old. + | Command | Produces | | --- | --- | | `./build.sh` | Linux + Windows runtime packages and the metapackage, via the container. | diff --git a/build/build_managed_packages.sh b/build/build_managed_packages.sh index 6a86773..08c3ca8 100755 --- a/build/build_managed_packages.sh +++ b/build/build_managed_packages.sh @@ -21,10 +21,10 @@ if [ -n "${NUGET_LOCAL_FEED:-}" ]; then restore_args="-p:RestoreAdditionalProjectSources=$NUGET_LOCAL_FEED" fi -dotnet build --configuration Release $restore_args "$REPO_ROOT/LibLouis.NET.sln" +dotnet build --configuration Release $restore_args "$REPO_ROOT/LibLouis.NET.slnx" if [ -z "${SKIP_TESTS:-}" ]; then - dotnet test --configuration Release --no-build "$REPO_ROOT/LibLouis.NET.sln" + dotnet test --configuration Release --no-build "$REPO_ROOT/LibLouis.NET.slnx" fi dotnet pack --configuration Release --no-build \ diff --git a/global.json b/global.json new file mode 100644 index 0000000..5ce2e6e --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "9.0.200", + "rollForward": "latestMajor" + } +} diff --git a/runtime.liblouis.crosscompile.sln b/runtime.liblouis.crosscompile.sln deleted file mode 100644 index dd37ca6..0000000 --- a/runtime.liblouis.crosscompile.sln +++ /dev/null @@ -1,118 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.12.35707.178 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "runtime.liblouis", "runtime.liblouis\runtime.liblouis.csproj", "{A866FECD-8DAC-4D66-9C27-F504335B2B5F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "runtime.linux-arm64.liblouis", "runtime.linux-arm64.liblouis\runtime.linux-arm64.liblouis.csproj", "{19428C44-3D8A-45FA-916D-9505754878D9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "runtime.linux-x64.liblouis", "runtime.linux-x64.liblouis\runtime.linux-x64.liblouis.csproj", "{B6B095EC-9541-4396-903F-BAD3EB1094E7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "runtime.linux-x86.liblouis", "runtime.linux-x86.liblouis\runtime.linux-x86.liblouis.csproj", "{16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "runtime.win-x64.liblouis", "runtime.win-x64.liblouis\runtime.win-x64.liblouis.csproj", "{DD4CDD89-1C43-438E-B1A2-9091851F20B6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "runtime.win-x86.liblouis", "runtime.win-x86.liblouis\runtime.win-x86.liblouis.csproj", "{3BB6EE1E-EEAB-4885-846A-C02704F012AA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "runtime.win-arm64.liblouis", "runtime.win-arm64.liblouis\runtime.win-arm64.liblouis.csproj", "{586A3A00-2BFC-4CB0-8A26-2B2E550291F2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Debug|x64.ActiveCfg = Debug|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Debug|x64.Build.0 = Debug|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Debug|x86.ActiveCfg = Debug|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Debug|x86.Build.0 = Debug|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Release|Any CPU.Build.0 = Release|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Release|x64.ActiveCfg = Release|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Release|x64.Build.0 = Release|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Release|x86.ActiveCfg = Release|Any CPU - {A866FECD-8DAC-4D66-9C27-F504335B2B5F}.Release|x86.Build.0 = Release|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Debug|x64.ActiveCfg = Debug|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Debug|x64.Build.0 = Debug|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Debug|x86.ActiveCfg = Debug|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Debug|x86.Build.0 = Debug|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Release|Any CPU.Build.0 = Release|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Release|x64.ActiveCfg = Release|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Release|x64.Build.0 = Release|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Release|x86.ActiveCfg = Release|Any CPU - {19428C44-3D8A-45FA-916D-9505754878D9}.Release|x86.Build.0 = Release|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Debug|x64.ActiveCfg = Debug|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Debug|x64.Build.0 = Debug|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Debug|x86.Build.0 = Debug|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Release|Any CPU.Build.0 = Release|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Release|x64.ActiveCfg = Release|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Release|x64.Build.0 = Release|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Release|x86.ActiveCfg = Release|Any CPU - {B6B095EC-9541-4396-903F-BAD3EB1094E7}.Release|x86.Build.0 = Release|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Debug|x64.ActiveCfg = Debug|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Debug|x64.Build.0 = Debug|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Debug|x86.ActiveCfg = Debug|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Debug|x86.Build.0 = Debug|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Release|Any CPU.Build.0 = Release|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Release|x64.ActiveCfg = Release|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Release|x64.Build.0 = Release|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Release|x86.ActiveCfg = Release|Any CPU - {16E1D83A-AA0A-4E4E-94E8-D5B2ACD6EDFE}.Release|x86.Build.0 = Release|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Debug|x64.ActiveCfg = Debug|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Debug|x64.Build.0 = Debug|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Debug|x86.ActiveCfg = Debug|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Debug|x86.Build.0 = Debug|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Release|Any CPU.Build.0 = Release|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Release|x64.ActiveCfg = Release|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Release|x64.Build.0 = Release|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Release|x86.ActiveCfg = Release|Any CPU - {DD4CDD89-1C43-438E-B1A2-9091851F20B6}.Release|x86.Build.0 = Release|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Debug|x64.ActiveCfg = Debug|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Debug|x64.Build.0 = Debug|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Debug|x86.ActiveCfg = Debug|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Debug|x86.Build.0 = Debug|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Release|Any CPU.Build.0 = Release|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Release|x64.ActiveCfg = Release|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Release|x64.Build.0 = Release|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Release|x86.ActiveCfg = Release|Any CPU - {3BB6EE1E-EEAB-4885-846A-C02704F012AA}.Release|x86.Build.0 = Release|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Debug|x64.ActiveCfg = Debug|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Debug|x64.Build.0 = Debug|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Debug|x86.ActiveCfg = Debug|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Debug|x86.Build.0 = Debug|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Release|Any CPU.Build.0 = Release|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Release|x64.ActiveCfg = Release|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Release|x64.Build.0 = Release|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Release|x86.ActiveCfg = Release|Any CPU - {586A3A00-2BFC-4CB0-8A26-2B2E550291F2}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal From 493fbf46000debe4aa92ac39044de1a1302d1717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20O=2E=20S=C3=B8rensen?= Date: Wed, 5 Aug 2026 23:02:50 +0200 Subject: [PATCH 2/2] build: Drop the global.json floor It broke the container build: A compatible .NET SDK was not found. process "/bin/sh -c sh ./build/build_metapackage.sh" exited 145 global.json applies to every dotnet invocation in the repository, and the container runs sdk:8.0-jammy. I had reasoned about which SDK CI installs and missed that the container has its own. Nothing in the container needs a newer SDK. It packs individual project files, which any SDK handles, and never loads the solution. Only build_managed_packages.sh does, and that runs on a runner where setup-dotnet provides .NET 10. The floor is documented instead. Co-Authored-By: Claude Opus 5 --- PACKAGING.md | 10 +++++++--- global.json | 6 ------ 2 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 global.json diff --git a/PACKAGING.md b/PACKAGING.md index 270cfd6..0a3b6b8 100644 --- a/PACKAGING.md +++ b/PACKAGING.md @@ -74,9 +74,13 @@ to the metapackage — nothing else in the repository depends on the choice. the shell scripts read the values back out of it. The solution is `LibLouis.NET.slnx`, the XML solution format, which needs a .NET SDK of 9.0.200 or -later — `global.json` declares that floor. An older SDK does not report it usefully: SDK 8 fails -with `MSB4068: The element is unrecognized`, which does not obviously mean the SDK is -too old. +later. An older SDK does not report that usefully: SDK 8 fails with `MSB4068: The element +is unrecognized`, which does not obviously mean the SDK is too old. + +There is deliberately no `global.json` declaring that floor. It would apply to every `dotnet` +invocation in the repository, including inside the build container, which runs an older SDK and +never touches the solution — it packs individual project files, which any SDK handles. Pinning the +floor globally to satisfy one script would force the container's image up for no reason. | Command | Produces | | --- | --- | diff --git a/global.json b/global.json deleted file mode 100644 index 5ce2e6e..0000000 --- a/global.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "sdk": { - "version": "9.0.200", - "rollForward": "latestMajor" - } -}