<< All versions

Skill v1.0.0

currentTrusted Publisher100/100
microsoft/microsoft-ui-xaml/bt-build
──Details
PublishedOctober 1, 2026 at 05:07 AM
Content Hashsha256:9d425fdf556bc673...
Git SHA
──Files
Files (1 file, 4.6 KB)
SKILL.md4.6 KBactive
SKILL.md · 111 lines · 4.6 KB

version: "1.0.0" name: bt-build description: >- Fast incremental C++/MSBuild builds using bt. Use when the user wants to compile, build, check what's dirty, or query build dependencies in a repo that has .vcxproj files. Prefer bt over invoking MSBuild directly for inner-loop source changes (.cpp, .h, .idl, .xaml, .appxmanifest). allowed-tools: shell


bt — Fast Inner-Loop Builds

bt reads an MSBuild binary log and replays only the dirty compile/link/MIDL/XAML/makepri steps directly — no MSBuild overhead.

Use bt for the edit-build-debug cycle on source files only. For anything else, use the build skill (MSBuild).

Headers not yet in the tlog (newly added #includes) bt won't trigger rebuilds until the next msbuild -bl.

Do NOT use bt when

Any of these are true → use the build skill (MSBuild) instead:

  • .vcxproj or .vcxitems files were added, removed, or edited
  • .props or .targets files were changed
  • NuGet package dependencies changed
  • WinRT runtime classes were added or removed
  • Packaging, signing, or AppX bundling is needed
  • First build of the repo (no binlog exists yet)
  • You are unsure whether bt covers the change

When in doubt, use MSBuild.

Before you start

1. Check if bt is installed

Run bt --version. If bt is missing, run the install-bt.ps1 script from this skill's directory to download and install it. Periodically run it to update bt as well.

2. Pick the right binlog

bt needs a binlog from a prior MSBuild build. The repo's build scripts all write to BuildOutput\ with names like:

BinlogScope
Microsoft.UI.Xaml.<flavor>.binlogfull product (incl. Controls DLL) — prefer for product code
MUXControls.<flavor>.binlogtest apps + infra — prefer for test code
Microsoft.ui.xaml.<flavor>.binlogMicrosoft.UI.Xaml.dll only — NOT Controls (mux subset)
Microsoft.UI.Xaml-Product.<flavor>.binlogfull product (alternate) — fallback for product code
Microsoft.UI.Xaml.Controls.<flavor>.binlogControls DLL only — narrow fallback
XamlCompilerPrerequisites.<flavor>.binlogcompiler tools — not used by bt

<flavor> is amd64chk, arm64fre, etc. Single-project builds via msb/build-clang produce <project>.<flavor>.binlog next to these.

To pick:

  1. Classify the change by edited paths — test (table below) / mux

(dxaml/xcp/ only) / product (everything else under controls/dev, controls/idl, dxaml/, src/).

  1. Pick the freshest binlog whose scope covers that classification,

preferring broader scopes (product covers Controls, etc.).

  1. Infer `<flavor>` from the chosen filename.
  2. Pass `--binlog BuildOutput\<chosen>` to every bt invocation.

bt has no useful default to fall back to.

Caveats:

  • On NTFS, Microsoft.UI.Xaml.<flavor>.binlog and

Microsoft.ui.xaml.<flavor>.binlog collide — content is whoever wrote last; trust mtime + size, not casing.

  • If product and test binlogs exist with mtimes >1h apart, warn that the

set may be inconsistent.

  • If no binlog exists, run the build skill.

Test path classification

Anything under these directories is test scope:

  • controls/test/MUXControls.Test/
  • controls/test/MUXControlsTestApp/
  • controls/test/TabViewTearOutApp/
  • controls/test/TestAppCX/
  • controls/test/IXMPTestApp/
  • controls/test/MUXTestInfra/ (if present)
  • Samples/AppTestAutomationHelpers/

Common workflows

CommandWhat it does
bt buildBuild everything dirty (always pass --binlog BuildOutput\<x>.binlog)
bt build MyFile.cppForward walk: compile + relink anything affected by this source
bt build MyApp.dllBackward walk: only what this target needs
bt build -c [target]Compile only — skip link/lib
bt build -nDry run — print commands without executing
bt watch [--run <cmd>]Build on file change; optionally run a command after
bt [--binlog some.binlog] dirty [target]What needs building now?
bt bins MyHeader.hWhat rebuilds when this header changes?
bt srcs [--headers] MyApp.dllSources (and optionally #included headers) feeding this target

Run bt --help for command options (--binlog <path>), bt <subcommand> --help for subcommand options like -j <N>, --debounce <ms>, etc.

All versions