vc6_wine_environment - ryzom/ryzomcore GitHub Wiki
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}
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.hhard-requires STLport (#errorunless__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 in3d.dspat this tree state. - No exported
.makfiles — building the.dspprojects needs eitherMSDEV.EXE /MAKE(the VC6 command-line build driver) or an external build harness.
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/.dspbuilds — 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
MSPDB60gives 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 todrive_c/STLport(orNL_VC6_STLPORToverride). Must be first inINCLUDE— 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.
-
Prefix:
~/toolchain_vc6_prefix— fresh 32-bit Wine prefix, ready to receive the package intodrive_c/Program Files/Microsoft Visual Studio/. -
Wrappers:
~/bin/wine-vc6/winecl6-{cc,link,lib,rc}+ sharedwinecl6-env, parameterized viaNL_VC6_PREFIX/NL_VC6_STLPORT. Same Unix-pathtranslate_argsas 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.0f→3eaaaaab; VC6 printf has no%a, bits are dumped raw), C++/GXiostream smoke, STLport smoke (gated on presence, asserts__SGI_STL_PORT), RC smoke.
- PDB paths: avoid
/Zi(MSPDB60 under Wine untested;/Z7exists 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 overVC98/INCLUDE+ STLport once real builds start. -
MSDEV.EXEunder Wine is the big unknown — it is the IDE binary in CLI mode. Fallback if it misbehaves: a small.dspparser emitting ninja/make (the format is simple line-based), or hand-drivencl/libscripts per project.
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.
-
validate_vc6.shgreen. -
nel/src/misc.dsp→nlmisc.lib(smallest real target, exercises STLport + the header set). -
snowballs2client/server — the era's complete shippable, and the byte-reference target the Snowballs corpus findings can be compared against.