Every reusable build tool lives in S:/eclipse-build/tools and is listed in tools/tools.toml. Stages use only those.
eb tool build gives you the folder of a tool, building it the first time.
The commands and the tool list are checked against the code and tools.toml. The one-line descriptions come from the
comments in tools.toml; the tools themselves were not run for this page.
EB means py -3.12 -I -B S:/eclipse-build/eb.py.
Steps
-
Build or restore the tool. Give one or more names from the list below, or
all.EB tool build skillport behedit ds3retargetEach line of output is
<name>: <folder>. The program is in that folder under the file name in the "Run" column below, for example<folder>/SkillPort.exe. -
Run the tool from that folder as an eb job (run-heavy-jobs.md). Pass absolute paths: several of these tools resolve relative paths against their own folder.
-
To see the tool paths and environment variables the release pipeline gets:
EB tool envIt prints one
--tool=<name>=<path>line per pipeline tool, thenEB_REGQ,EB_LEDA_DIR,EB_PARAMDEFSandAI_LUA_VANILLA_DIR. It never builds: a tool that is not built yet stops it with<name> <key> is not built (eb.py tool build <name>).
How a tool folder is made
Kind in tools.toml |
What eb tool build does |
Folder |
|---|---|---|
dotnet |
Builds tools/dotnet/<src> with dotnet build -c Release -m:1 as a 1 GB eb job. |
S:/eclipse-build-out/tools/<name>/<key> |
frozen |
Copies a frozen build out of the store. | S:/eclipse-build-out/sets/<set>-<first 12 of the list hash> |
data |
Copies a frozen input folder out of the store. | same as frozen |
<key>is a hash of the tool's source files,tools/dotnet/Directory.Build.props,tools/dotnet/global.json, its dependencies and itstools.tomlentry. Change any of them and you get a new folder.- A folder is made once and never overwritten. Every session that needs that exact version shares it. A finished
folder has a
.eb-okfile. - A failed build prints
<name>: build failedand the end of the compiler output.
The tools
Built from source (kind = "dotnet"):
| Name | Run | What it is |
|---|---|---|
polish |
Polish.dll |
Applies rowlists to the regulation. One tool for the pipeline's polish and polish_delrow. |
regq |
RegQ.exe |
Reads the regulation (queries used by the release checks). |
tablerows |
TableRows.exe |
Applies tablerows rowlists. |
mimicopen |
MimicOpen.exe |
The seed mimic's Open prompt: MSB entity and two EMEVD events. |
ds2humanport |
Ds2HumanPort.exe |
DS2 humanoid to NR converter steps (TaeBuild, ParamsBuild, FlverNr, ...). |
npcport |
NpcPort.exe |
DS3 to NR port steps (param-port-npc, param-dump, tae-port, ds3-extract, ...). |
ds2port |
Ds2Port.exe |
DS2 port steps: bnd-x, flver-bind, nsa-dump, hks. |
ds2unpack |
Ds2Unpack.exe |
DS2 BHD/BDT unpack. |
havok2014 |
Havok2014.exe |
relayout, tagcheck, behbnd --havok; an input of critfix, addlayers and kneelretarget. |
portlint |
port-lint.exe |
Port fix and lint. |
kneelretarget |
KneelRetarget.exe |
track (used by pose_cancels.py). |
critfix |
CritFix.exe |
verify, @crits. |
addlayers |
AddLayers.exe |
The additive step of the DS2 port script. |
statport |
StatPort.exe |
The port step (stats). |
aiport |
AiPort.exe |
The localize step (AI scripts). |
fxbnd |
FxBnd.exe |
Effect binders for build_fx.mjs. |
materialfix |
MaterialFix.exe |
gloss (used by apply_tex.py). |
skillport |
SkillPort.exe |
ER skill TAE and clip port into NR c0000 (convert, event-add, event-del, res-add, ...). |
behedit |
BehEdit.exe |
Byte-level edits of the NR player graph c0000.behbnd (apply, interval, selfix, ...). |
ds3retarget |
Ds3Retarget.exe |
DS3 c0000 clips to the NR skeleton (build, pack). |
fxmodelsgen |
FxModelsGen.exe |
DS3 effect models to NR sfx-model materials and textures. |
castlevariants_src |
CastleVariants.exe |
CastleVariants built from source: the MSB/EMEVD builder, with operations the frozen build lacks. |
dummyaim |
DummyAim.exe |
FLVER dummies rigid with a bone, turned to another pitch. |
bndset |
BndSet.exe |
Replaces entries of a binder by file name, with a read-back. |
mapkit |
MapKit.exe |
flvermats, tpfls, bndnames, matadd, msbparts. |
terraincut |
TerrainCut.exe |
Openings through map terrain: collision and map-piece triangles in boxes. |
invtool |
InvTool.exe |
Eclipse invasions tool: common.emevd events, invader maps, msgadd, probes. |
Frozen builds (kind = "frozen", source not moved here yet):
| Name | Run | What it is |
|---|---|---|
idreg |
idreg.exe |
By-entry merges (allmaterial, msg, banks). |
castlevariants |
CastleVariants.exe |
The 0.0.86 build, used for fmgadd merges. |
ledaport |
LedaPort.exe |
dump for dup_order.py. |
ssk_checks |
(folder) | The release check scripts from souls-script-kt with their data: ai_lua_budget.py, check_gaol_drops.py. |
Frozen inputs (kind = "data"):
| Name | What it is |
|---|---|
andre |
Andre SoulsFormats build of 2026-07-07 that Polish, RegQ and TableRows link. |
andre_pin, hklib_pin |
Andre and Havok.HKLib from Smithbox-havok-pin, linked by Ds2HumanPort and NpcPort. |
hklib_sbx |
Havok.HKLib of Smithbox before its Havok rewrite, linked by the DS2-family and DS3 arts tools. |
andre_io |
Andre.IO.dll for Ds2Unpack. |
directxtex |
DirectXTexNet with natives and oo2core_9. |
paramdefs |
NR paramdef XMLs read by Polish, RegQ and TableRows. |
aicommon |
Vanilla aicommon luabnd files for ai_lua_budget.py. |
vanilla_regulation |
Vanilla regulation.bin. |
oo2core_9 |
Oodle 2.9, used by eb dcx. |
oo2core_6, lua502, bhd5_decrypt_rust |
DLLs that AiPort, Ds2Unpack, MaterialFix and SkillPort need. |
vgmstream |
vgmstream CLI r1776 (vgmstream_cmd.exe), the decoder for the DS3 sound jobs. |
ds3_fdp_main_sound |
DS3 fdp_main.fsb and fdp_main.fev, read by tools/snd-py/snd_bank.py. |
Scripts that are not in tools.toml but live in tools/: release-py/ (dcxnorm.py, readback.py, lotchain.py,
dup_order.py), arts-py/tae_ds3.py, snd-py/snd_bank.py (DS3 sounds into cs_c4340.bnk; see tools/snd-py/README.md),
ds2/ (npmirror.py, anim_stage.py), skins/preflight.py.
The shared-tools-only rule
Stan's rule since 2026-11-10 (written in docs/AGENTS-GUIDE.md):
- Stages use only tools from
eclipse-build/tools. Do not build a private copy into.tmpor a stagetool/folder. - Fixes and speed-ups go into the shared source here, not into a stage copy.
- An old tool that still lives only in a stage folder,
.tmpor souls-script-kt gets imported here before you use it again. The pattern istools/dotnet/DS3-ARTS-IMPORT.md. If the import is too big for your job, use the old copy unchanged and say so in your report.tools/README.mdkeeps the list of tools waiting to be imported.
Writing a new tool so it can be imported
- No hard-coded stage paths.
- Absolute paths come in as arguments.
- Per-stage data goes in a file beside the stage, not in the script.
- Name the tool in your report so it gets carried in.
To add a dotnet tool to the list: put its project in tools/dotnet/<Name>, add an entry to tools/tools.toml with
kind = "dotnet", src, run and deps, then run EB tool build <name>. A deps entry is either "andre" or
"<property>=<tool>"; each one reaches the project as the MSBuild property Eb<Property>Dir holding that tool's
folder (for example "hklib=hklib_sbx" gives EbHklibDir).
Kotlin .nr.kts scripts
Run them with the installed script host:
S:/souls-script-kt/script-host/build/install/script-host/bin/script-host.bat <script> <args>
- Do not use
gradlew --no-daemon :script-host:run --args=.... It starts a cold Gradle every time.docs/AGENTS-GUIDE.mdgives about 3 s of overhead for the installed host against about 15.6 s for Gradle (measured 2026-11-09, not re-measured for this page). - Rebuild the install with
gradlew :script-host:installDistinS:/souls-script-ktonly after you change script-host or the script libraries.