NXX 0.2.1 build information

Prerequisites: Go 1.26.6; Python 3 for prepare.py; .NET SDK 10.0.401 and NSIS
for Windows; Xcode/Swift for macOS. Preserve go.mod and go.sum. New build hosts
need dependency downloads. Set CGO_ENABLED=0 and GOTOOLCHAIN=go1.26.6 for Go.
The included engine is based on Tailscale 1.102.4, upstream revision
bbcd7d1fc2054b9189ebc1531acf74bd880ca0c8. Its NetExperts patches are applied.

Go components
-------------
Use prepare.py shared for Windows/Linux/FreeBSD, or prepare.py mac for macOS.
Run from the prepared directory:
  go test -mod=readonly ./cmd/private-network ./cmd/sdn-agent ./cmd/sdn-migrate ./internal/migration
  go build -mod=readonly -buildvcs=false -trimpath -ldflags "-s -w" -o artifacts/netexperts-private-network ./cmd/private-network
  go build -mod=readonly -buildvcs=false -trimpath -ldflags "-s -w" -o artifacts/netexperts-network-agent ./cmd/sdn-agent
Set GOOS/GOARCH for the intended target: windows/amd64, linux/amd64,
freebsd/amd64, darwin/amd64 or darwin/arm64. Run tests on their native OS.

From upstream/tailscale, build the 0.2.1 CLI with:
  go build -mod=readonly -buildvcs=false -trimpath -tags ts_omit_clientupdate -ldflags "-s -w -X tailscale.com/version.longStamp=1.102.4-netexperts.0.2.1 -X tailscale.com/version.shortStamp=1.102.4 -X tailscale.com/version.gitCommitStamp=bbcd7d1fc2054b9189ebc1531acf74bd880ca0c8" -o ../../artifacts/nxx ./cmd/nxx
The retained networking engine was built from ./cmd/tailscaled with the same
flags except longStamp=1.102.4-netexperts.0.2.0. Its version is intentionally
different from the 0.2.1 CLI. Preserve the matching engine/CLI pair.

Windows
-------
Build the helper as NetExpertsSDN.Enrol.exe, agent as NetExpertsSDN.Agent.exe,
engine as NetExpertsSDN.Engine.exe and CLI as nxx.exe. Also build:
  go build -mod=readonly -buildvcs=false -trimpath -ldflags "-s -w" -o artifacts/NetExpertsSDN.Migrate.exe ./cmd/sdn-migrate
Publish the WPF app:
  dotnet publish desktop/NetExpertsSDN/NetExpertsSDN.csproj -c Release -r win-x64 --self-contained true -o artifacts/windows-x64
The signed release used -p:NxxSignedRelease=true; omit that property for an
unsigned local build. Put the Go executables, a tailscale.exe copy of nxx.exe,
the official Wintun 0.14.1 x64 driver and component Licenses directory in the
same output directory. Review installer/NetExpertsSDN.nsi for the complete
payload, then run makensis NetExpertsSDN.nsi from installer/. Signing uses
separate credentials and is not part of the source distribution.

macOS Universal Binary
----------------------
The GUI and service require macOS 13. Build each for arm64-apple-macos13.0 and
x86_64-apple-macos13.0 with the installed MacOSX SDK:
  swiftc -sdk SDK -parse-as-library -O -target TARGET macos/Shared.swift macos/App.swift -o NetExpertsPrivateNetwork
  swiftc -sdk SDK -parse-as-library -O -target TARGET macos/Shared.swift macos/Service.swift -o nxx-service
Combine matching slices with lipo. Package the Swift executables and Go
engine/agent/CLI/helpers into the application bundle. The release uses
Developer ID signing and notarisation, whose credentials are not included.
Swift regression tests use -D NXX_TESTING with APITests.swift (App.swift) or
Tests.swift (Service.swift). Use isolated administrator-owned test locations for installation checks.

Linux and FreeBSD
----------------
Build the matching Go targets and include installer/unix-install.sh and licence
notices. This historical release used tar archives on Linux and FreeBSD; the
current release provides native packages. Signing services are not included.
