diff --git a/Build-Engines.ps1 b/Build-Engines.ps1
new file mode 100644
index 0000000..b3c3fa3
--- /dev/null
+++ b/Build-Engines.ps1
@@ -0,0 +1,40 @@
+<#
+.SYNOPSIS
+ Builds every plugin engine under Engines/ and deploys it to the benchmark.
+
+.DESCRIPTION
+ OpenNest.Benchmark loads plugin engines from an Engines/ folder next to its own
+ build output. This builds the benchmark plus each Engines/OpenNest.Engine.*/ project
+ (test subprojects are skipped) and copies each engine DLL into that folder.
+
+.EXAMPLE
+ ./Engines/Build-Engines.ps1
+ ./Engines/Build-Engines.ps1 -Engines Opus55,Terra -Configuration Debug
+#>
+param(
+ [string]$Configuration = 'Release',
+ # Engine names without the OpenNest.Engine. prefix; default is all of them.
+ [string[]]$Engines
+)
+
+$ErrorActionPreference = 'Stop'
+$repoRoot = Split-Path $PSScriptRoot -Parent
+
+dotnet build (Join-Path $repoRoot 'OpenNest.Benchmark/OpenNest.Benchmark.csproj') -c $Configuration
+if ($LASTEXITCODE -ne 0) { throw 'OpenNest.Benchmark build failed.' }
+
+$deployDir = Join-Path $repoRoot "OpenNest.Benchmark/bin/$Configuration/net8.0/Engines"
+New-Item -ItemType Directory -Force $deployDir | Out-Null
+
+$projects = Get-ChildItem $PSScriptRoot -Directory -Filter 'OpenNest.Engine.*' |
+ Where-Object { -not $Engines -or $Engines -contains $_.Name.Substring('OpenNest.Engine.'.Length) }
+
+foreach ($dir in $projects) {
+ $csproj = Join-Path $dir.FullName "$($dir.Name).csproj"
+ dotnet build $csproj -c $Configuration
+ if ($LASTEXITCODE -ne 0) { throw "$($dir.Name) build failed." }
+
+ $dll = Join-Path $dir.FullName "bin/$Configuration/net8.0/$($dir.Name).dll"
+ Copy-Item $dll $deployDir -Force
+ Write-Host "Deployed $($dir.Name) -> $deployDir"
+}
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..eb217da
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,15 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
diff --git a/Directory.Build.targets b/Directory.Build.targets
new file mode 100644
index 0000000..8c753ea
--- /dev/null
+++ b/Directory.Build.targets
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/OpenNest.Engine.Opus55/OpenNest.Engine.Opus55.csproj b/OpenNest.Engine.Opus55/OpenNest.Engine.Opus55.csproj
index b8cab81..c9a747c 100644
--- a/OpenNest.Engine.Opus55/OpenNest.Engine.Opus55.csproj
+++ b/OpenNest.Engine.Opus55/OpenNest.Engine.Opus55.csproj
@@ -1,14 +1,6 @@
-
- net8.0
- OpenNest.Engine.Opus55
- OpenNest.Engine.Opus55
- enable
- enable
-
+
-
-
diff --git a/OpenNest.Engine.Opus55/README.md b/OpenNest.Engine.Opus55/README.md
index d648b37..b0f3cdb 100644
--- a/OpenNest.Engine.Opus55/README.md
+++ b/OpenNest.Engine.Opus55/README.md
@@ -61,8 +61,8 @@ Every placement decision (which part, which rotation, where, on which sheet) com
## Build / test
```bash
-dotnet build OpenNest.Engine.Opus55/OpenNest.Engine.Opus55.csproj -c Release
-dotnet test OpenNest.Engine.Opus55/tests/OpenNest.Engine.Opus55.Tests.csproj
+dotnet build Engines/OpenNest.Engine.Opus55/OpenNest.Engine.Opus55.csproj -c Release
+dotnet test Engines/OpenNest.Engine.Opus55/tests/OpenNest.Engine.Opus55.Tests.csproj
```
This project is intentionally **outside** `OpenNest.sln`, the same pattern as the
@@ -73,10 +73,12 @@ This project is intentionally **outside** `OpenNest.sln`, the same pattern as th
```bash
dotnet build OpenNest.Benchmark/OpenNest.Benchmark.csproj -c Release
mkdir -p OpenNest.Benchmark/bin/Release/net8.0/Engines
-cp OpenNest.Engine.Opus55/bin/Release/net8.0/OpenNest.Engine.Opus55.dll OpenNest.Benchmark/bin/Release/net8.0/Engines/
+cp Engines/OpenNest.Engine.Opus55/bin/Release/net8.0/OpenNest.Engine.Opus55.dll OpenNest.Benchmark/bin/Release/net8.0/Engines/
dotnet OpenNest.Benchmark/bin/Release/net8.0/OpenNest.Benchmark.dll
```
+Or build and deploy in one step with `./Engines/Build-Engines.ps1 -Engines Opus55`.
+
The engine reports as `Opus55NestingEngine`.
## Known limitations
diff --git a/OpenNest.Engine.Opus55/tests/OpenNest.Engine.Opus55.Tests.csproj b/OpenNest.Engine.Opus55/tests/OpenNest.Engine.Opus55.Tests.csproj
index c89db0e..74d976a 100644
--- a/OpenNest.Engine.Opus55/tests/OpenNest.Engine.Opus55.Tests.csproj
+++ b/OpenNest.Engine.Opus55/tests/OpenNest.Engine.Opus55.Tests.csproj
@@ -1,8 +1,5 @@
- net8.0
- enable
- enable
false
true
@@ -14,8 +11,7 @@
-
-
+
diff --git a/OpenNest.Engine.Qwen/OpenNest.Engine.Qwen.csproj b/OpenNest.Engine.Qwen/OpenNest.Engine.Qwen.csproj
index bb15a22..1c0be6e 100644
--- a/OpenNest.Engine.Qwen/OpenNest.Engine.Qwen.csproj
+++ b/OpenNest.Engine.Qwen/OpenNest.Engine.Qwen.csproj
@@ -1,13 +1,3 @@
-
- net8.0
- OpenNest.Engine.Qwen
- OpenNest.Engine.Qwen
- enable
- enable
-
-
-
-
-
+
diff --git a/OpenNest.Engine.Qwen/README.md b/OpenNest.Engine.Qwen/README.md
index 9c401d5..c394df1 100644
--- a/OpenNest.Engine.Qwen/README.md
+++ b/OpenNest.Engine.Qwen/README.md
@@ -31,7 +31,7 @@ engines to start; it must not be the same algorithm re-derived through indirecti
## Build
```bash
-dotnet build OpenNest.Engine.Qwen/OpenNest.Engine.Qwen.csproj
+dotnet build Engines/OpenNest.Engine.Qwen/OpenNest.Engine.Qwen.csproj
```
This project is intentionally **outside** `OpenNest.sln` (same pattern as the
@@ -44,14 +44,16 @@ as part of the main solution.
own build output:
```bash
-dotnet build OpenNest.Engine.Qwen/OpenNest.Engine.Qwen.csproj -c Release
+dotnet build Engines/OpenNest.Engine.Qwen/OpenNest.Engine.Qwen.csproj -c Release
dotnet build OpenNest.Benchmark/OpenNest.Benchmark.csproj -c Release
mkdir -p OpenNest.Benchmark/bin/Release/net8.0/Engines
-cp OpenNest.Engine.Qwen/bin/Release/net8.0/OpenNest.Engine.Qwen.dll OpenNest.Benchmark/bin/Release/net8.0/Engines/
+cp Engines/OpenNest.Engine.Qwen/bin/Release/net8.0/OpenNest.Engine.Qwen.dll OpenNest.Benchmark/bin/Release/net8.0/Engines/
dotnet OpenNest.Benchmark/bin/Release/net8.0/OpenNest.Benchmark.dll
```
+Or build and deploy in one step with `./Engines/Build-Engines.ps1 -Engines Qwen`.
+
Your engine will show up in the report under its CLR type name (`QwenNestingEngine`),
competing on equal footing against the built-in engines.
diff --git a/OpenNest.Engine.Qwen/tests/OpenNest.Engine.Qwen.Tests.csproj b/OpenNest.Engine.Qwen/tests/OpenNest.Engine.Qwen.Tests.csproj
index e3f0be9..1deae75 100644
--- a/OpenNest.Engine.Qwen/tests/OpenNest.Engine.Qwen.Tests.csproj
+++ b/OpenNest.Engine.Qwen/tests/OpenNest.Engine.Qwen.Tests.csproj
@@ -1,8 +1,5 @@
- net8.0
- enable
- enable
false
true
@@ -14,6 +11,5 @@
-
diff --git a/OpenNest.Engine.Terra/OpenNest.Engine.Terra.csproj b/OpenNest.Engine.Terra/OpenNest.Engine.Terra.csproj
index 0f958a2..1c0be6e 100644
--- a/OpenNest.Engine.Terra/OpenNest.Engine.Terra.csproj
+++ b/OpenNest.Engine.Terra/OpenNest.Engine.Terra.csproj
@@ -1,13 +1,3 @@
-
- net8.0
- OpenNest.Engine.Terra
- OpenNest.Engine.Terra
- enable
- enable
-
-
-
-
-
+
diff --git a/OpenNest.Engine.Terra/README.md b/OpenNest.Engine.Terra/README.md
index b8551ab..2911596 100644
--- a/OpenNest.Engine.Terra/README.md
+++ b/OpenNest.Engine.Terra/README.md
@@ -31,7 +31,7 @@ engines to start; it must not be the same algorithm re-derived through indirecti
## Build
```bash
-dotnet build OpenNest.Engine.Terra/OpenNest.Engine.Terra.csproj
+dotnet build Engines/OpenNest.Engine.Terra/OpenNest.Engine.Terra.csproj
```
This project is intentionally **outside** `OpenNest.sln` (same pattern as the
@@ -44,14 +44,16 @@ as part of the main solution.
own build output:
```bash
-dotnet build OpenNest.Engine.Terra/OpenNest.Engine.Terra.csproj -c Release
+dotnet build Engines/OpenNest.Engine.Terra/OpenNest.Engine.Terra.csproj -c Release
dotnet build OpenNest.Benchmark/OpenNest.Benchmark.csproj -c Release
mkdir -p OpenNest.Benchmark/bin/Release/net8.0/Engines
-cp OpenNest.Engine.Terra/bin/Release/net8.0/OpenNest.Engine.Terra.dll OpenNest.Benchmark/bin/Release/net8.0/Engines/
+cp Engines/OpenNest.Engine.Terra/bin/Release/net8.0/OpenNest.Engine.Terra.dll OpenNest.Benchmark/bin/Release/net8.0/Engines/
dotnet OpenNest.Benchmark/bin/Release/net8.0/OpenNest.Benchmark.dll
```
+Or build and deploy in one step with `./Engines/Build-Engines.ps1 -Engines Terra`.
+
Your engine will show up in the report under its CLR type name (`TerraNestingEngine`),
competing on equal footing against the built-in engines.
diff --git a/OpenNest.Engine.Terra/tests/OpenNest.Engine.Terra.Tests.csproj b/OpenNest.Engine.Terra/tests/OpenNest.Engine.Terra.Tests.csproj
index 6f9ab72..c9776ea 100644
--- a/OpenNest.Engine.Terra/tests/OpenNest.Engine.Terra.Tests.csproj
+++ b/OpenNest.Engine.Terra/tests/OpenNest.Engine.Terra.Tests.csproj
@@ -1,8 +1,5 @@
- net8.0
- enable
- enable
false
true
@@ -14,6 +11,5 @@
-