Skip to content

vc6_wine_environment

Jan Boon edited this page Aug 6, 2026 · 4 revisions

title: Visual C++ 6.0 build environment on Linux using Wine (draft) description: Toolchain plan and staged scaffold for building the original CVS-era NeL (github.com/ryzom/nel_cvs) with its original compiler — the 2000s counterpart of the VS2008 reference environment published: true date: 2026-08-06T00:00:00.000Z tags: editor: markdown dateCreated: 2026-08-06T00:00:00.000Z

Status: scaffold staged, toolchain package pending. The Wine prefix, wrapper scripts and validation battery exist locally (below); the VC6 toolchain itself gets prepared on the WinXP VM (install + SP6 + dependency builds) and packaged like the VS2008 flow. Companion pages: VS2008 under Wine for the conventions this mirrors, and Windows Compatibility Targets for the runtime-side matrix (which OS each era's binaries run on — this page covers the compiler-side ceilings instead). {.is-warning}

Why

The original NeL / Ryzom / Snowballs codebase — preserved at github.com/ryzom/nel_cvs — was built with Visual C++ 6.0 (cl 12.00), with Format-6.00 .dsp/.dsw project files (55 projects: nel, nelns, snowballs2, tools). Building that tree with its original compiler under Wine gives the authentic 2000s-era x87 reference, the same role the VS2008/Wine environment plays for the Max-2010-era pipeline.

Survey of the final CVS state (2026-08-06):

  • nel/include/nel/misc/types_nl.h hard-requires STLport (#error unless __SGI_STL_PORT — any STLport 4.x defines it). VC6's native STL is not an option by the project's own gate.
  • Drivers in-tree: 3D = OpenGL only, sound = OpenAL only. No DirectX SDK requirement for the core libraries; link lines are plain system libs (opengl32.lib, odbc32.lib, ...). No freetype in 3d.dsp at this tree state.
  • No exported .mak files — building the .dsp projects needs either MSDEV.EXE /MAKE (the VC6 command-line build driver) or an external build harness.

Package preparation (WinXP VM)

Prepared on the XP VM like the VS2008 toolchain — install VC6 + Service Pack 6 (cl 12.00.8804), build the dependencies with that same compiler, then package:

Toolchain (from Program Files/Microsoft Visual Studio/):

  • VC98/BIN/ (CL.EXE, C1.DLL, C1XX.DLL, C2.DLL, LINK.EXE, LIB.EXE, NMAKE.EXE, ...), INCLUDE/, LIB/, MFC/ (INCLUDE+LIB+SRC), ATL/INCLUDE/
  • Common/MSDev98/Bin/MSPDB60.DLL (cl's PDB backend, same-install rule as the VS2008 mspdb80 trap), RC.EXE (lives here in VC6, not VC98/Bin), and — for driving the .dsw/.dsp builds — MSDEV.EXE with its DLLs/packages (DEVSHL.DLL, DEVBLD.PKG, ...); MSDEV file.dsp /MAKE "name - Win32 Release" is the era's CLI build path and the first thing to try under Wine
  • SP6 level throughout, one install (mixed-SP MSPDB60 gives the VC6 flavor of C1902)

Externals (era dependencies, built in the VM with the same VC6):

  • STLport 4.x (era-authentic 4.5.3/4.6) — headers (stlport/) + the iostreams library built with VC6 (lib/). Goes to drive_c/STLport (or NL_VC6_STLPORT override). Must be first in INCLUDE — the wrappers handle the ordering.
  • OpenAL-era SDK (only when the sound driver becomes a target).

No windows-folder supplement needed — VC6 predates SxS entirely: plain MSVCRT.DLL (Wine's builtin serves), no manifests, no winsxs, no mt.exe, no .NET.

Staged scaffold (already on the Linux box)

  • Prefix: ~/toolchain_vc6_prefix — fresh 32-bit Wine prefix, ready to receive the package into drive_c/Program Files/Microsoft Visual Studio/.
  • Wrappers: ~/bin/wine-vc6/winecl6-{cc,link,lib,rc} + shared winecl6-env, parameterized via NL_VC6_PREFIX/NL_VC6_STLPORT. Same Unix-path translate_args as the VS2008 layer; additionally drops /showIncludes (cl 12.00 predates it — relevant if CMake/Ninja ever drives this compiler: builds work, header-dependency tracking doesn't).
  • Validation battery: ~/bin/wine-vc6/validate_vc6.sh — compiler banner (12.00.*), C hello with exact x87 float bits (1.0f/3.0f3eaaaaab; VC6 printf has no %a, bits are dumped raw), C++ /GX iostream smoke, STLport smoke (gated on presence, asserts __SGI_STL_PORT), RC smoke.

Expected Wine traps (from the VS2008 experience, unverified on VC6)

  • PDB paths: avoid /Zi (MSPDB60 under Wine untested; /Z7 exists on VC6) and prefer /DEBUG:NONE-style linking until proven otherwise.
  • Case sensitivity: the lowercase-alias farm (tool/wine_vs2008/lowercase_alias.py) will likely be needed over VC98/INCLUDE + STLport once real builds start.
  • MSDEV.EXE under Wine is the big unknown — it is the IDE binary in CLI mode. Fallback if it misbehaves: a small .dsp parser emitting ninja/make (the format is simple line-based), or hand-driven cl/lib scripts per project.

Dependencies: era-accurate vs latest VC6-compilable

From nel/INSTALL (which documents the official build as Visual C++ 6.0 SP4) cross-checked against actual code usage in the final CVS state. The tree is lean: no zlib, no ogg/vorbis, no mysql/curl anywhere; snowballs2/client.dsp adds only freetype.lib beyond system libs.

Dependency Used by Era version Latest VC6-compilable Notes
STLport everything (types_nl.h hard gate) 4.0 documented; 4.5.3/4.6.2 era-practical 5.2.1 (final release; its own docs list MSVC 6 SP5+) NeL uses the SGI iostreams — the STLport library must be built, headers alone don't suffice. Era fidelity → 4.6.2; 5.x changes defaults, treat as experiment
FreeType nel3d font_generator/texture_font; snowballs client 2.0.x documented current 2.13.x plausible — the codebase remains "industry-standard ANSI C"; bundled project files are modern-VS, build via custom makefile/nmake era → 2.0.9–2.1.x
libxml2 nelmisc i_xml/o_xml ~2.4.x (2001–2003) 2.9.14 known-safe (last 2.9; win32 MSVC script era); 2.10/2.11 nominally C89 but drifting (flexible array members appear) — verify on VM; 2.12+ is C99
OpenAL sound driver openal.org 1.0 SDK 1.1 SDK headers + import lib (the API is plain C and frozen there); the runtime can be a modern soft_oal.dll — same ABI compile-side effectively version-capped by the SDK, not the implementation
Python ai/pyserver only 1.5 documented (1.5.2) 2.3.5 (last Python officially built with VC6; 2.4 moved to VC7.1) optional — NeL core, snowballs and nelns don't touch it
(Mesa 3.3) Linux GL note only Windows uses system opengl32
(DirectX SDK) not needed at this tree state; Ryzom-era client only (D3D/DInput8) 9.0b/9.0c (Ryzom shipped Sep 2004) DX9.0c SDK Update Summer 2004 — last with in-box VC6 libs (Oct 2004 works via the separate "Extras" D3DX9; Dec 2004+ links a symbol VC6's linker can't resolve) era-authentic and max-compatible coincide

Compiler: SP4 documented, SP6 recommended for the package (final servicing; one SP level throughout, see the C1902-class trap).

For the VM: era-authentic set = STLport 4.6.2 + FreeType 2.1.x + libxml2 2.4.x-era (or 2.9.14 for sanity) + OpenAL 1.1 SDK, all built with the same VC6 SP6. The "latest" column is the upgrade headroom to probe once the era build is green.

First milestones once the package lands

  1. validate_vc6.sh green.
  2. nel/src/misc.dspnlmisc.lib (smallest real target, exercises STLport + the header set).
  3. snowballs2 client/server — the era's complete shippable, and the byte-reference target the Snowballs corpus findings can be compared against.

Clone this wiki locally