Write each clone's clangd compile database on setup, sync and toolchain install
This commit is contained in:
parent
fb7f8f7295
commit
45016b05af
1 changed files with 31 additions and 0 deletions
|
|
@ -72,6 +72,7 @@ export async function setup({ server, dir, token, exe, runner, vc, sdk, image, t
|
||||||
log(`WARNING: your cl.exe (sha256 ${ws.config.envDigest}) is not the pinned one (${lock.clSha256}); results may differ from the server`);
|
log(`WARNING: your cl.exe (sha256 ${ws.config.envDigest}) is not the pinned one (${lock.clSha256}); results may differ from the server`);
|
||||||
}
|
}
|
||||||
ws.save();
|
ws.save();
|
||||||
|
writeEditorCompileDb(ws);
|
||||||
return ws;
|
return ws;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,6 +134,34 @@ export async function refreshSymbols(ws) {
|
||||||
return r.data;
|
return r.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the clangd compile database the repo's `.clangd` points at (`CompilationDatabase:`), from
|
||||||
|
* data/compile.json with this clone's paths and the local toolchain. Every clone (main or worker
|
||||||
|
* slot) gets its own, so editor diagnostics resolve includes of the clone being edited.
|
||||||
|
*/
|
||||||
|
export function writeEditorCompileDb(ws) {
|
||||||
|
const clangd = path.join(ws.dir, '.clangd');
|
||||||
|
const compile = ws.project.compile;
|
||||||
|
const runner = ws.config.runners?.[ws.project.toolchain];
|
||||||
|
if (!compile?.units || !runner?.toolchainRoot || !fs.existsSync(clangd)) return null;
|
||||||
|
const dbDir = /^\s*CompilationDatabase:\s*(\S+)\s*$/m.exec(fs.readFileSync(clangd, 'utf8'))?.[1];
|
||||||
|
if (!dbDir) return null;
|
||||||
|
const toolchain = (runner.type === 'wine' ? runner.toolchainRoot.replace(/^Z:/i, '') : runner.toolchainRoot).replace(/\\/g, '/');
|
||||||
|
const source = path.resolve(ws.dir).replace(/\\/g, '/');
|
||||||
|
const expand = (s) => s.replaceAll('${TC}', toolchain).replaceAll('${SRC}', source);
|
||||||
|
const compiler = expand(compile.compiler ?? runner.clPath);
|
||||||
|
const includes = (compile.env?.INCLUDE ?? '').split(';').filter(Boolean).map((p) => `/imsvc${expand(p)}`);
|
||||||
|
const entries = Object.entries(compile.units).map(([unit, shape]) => {
|
||||||
|
const file = `${source}/${unit}`;
|
||||||
|
const flags = compile.shapes[shape].filter((f) => !/^[/-]execution-charset:\./i.test(f)).map(expand);
|
||||||
|
return { directory: source, file, arguments: [compiler, ...flags, ...includes, file] };
|
||||||
|
});
|
||||||
|
const out = path.join(ws.dir, dbDir, 'compile_commands.json');
|
||||||
|
fs.mkdirSync(path.dirname(out), { recursive: true });
|
||||||
|
fs.writeFileSync(out, JSON.stringify(entries, null, 1));
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fast-forwards the clone to the server's main and refreshes the symbol snapshot. Only a clean
|
* Fast-forwards the clone to the server's main and refreshes the symbol snapshot. Only a clean
|
||||||
* working tree moves: in a shared checkout, uncommitted files may be someone's unfinished work.
|
* working tree moves: in a shared checkout, uncommitted files may be someone's unfinished work.
|
||||||
|
|
@ -158,6 +187,7 @@ export async function sync(ws) {
|
||||||
const note = changed.length
|
const note = changed.length
|
||||||
? `not fast-forwarded: ${changed.length} uncommitted files (${changed.slice(0, 5).join(', ')}); submit or set them aside first`
|
? `not fast-forwarded: ${changed.length} uncommitted files (${changed.slice(0, 5).join(', ')}); submit or set them aside first`
|
||||||
: 'could not fast-forward (local commits or conflicting changes); merge origin/main yourself';
|
: 'could not fast-forward (local commits or conflicting changes); merge origin/main yourself';
|
||||||
|
writeEditorCompileDb(ws);
|
||||||
return { head: ws.head(), fastForwarded: pulled, symbols: snap.symbols.length, ghidra, note: pulled ? null : note };
|
return { head: ws.head(), fastForwarded: pulled, symbols: snap.symbols.length, ghidra, note: pulled ? null : note };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -400,6 +430,7 @@ export async function toolchainInstall(ws, { log = console.log } = {}) {
|
||||||
ws.config.runners = { [ws.project.toolchain]: runnerConfig({ toolchain: root, project: ws.project }) };
|
ws.config.runners = { [ws.project.toolchain]: runnerConfig({ toolchain: root, project: ws.project }) };
|
||||||
ws.config.envDigest = await computeEnvDigest(ws, ws.project.toolchain);
|
ws.config.envDigest = await computeEnvDigest(ws, ws.project.toolchain);
|
||||||
ws.save();
|
ws.save();
|
||||||
|
writeEditorCompileDb(ws);
|
||||||
const pinned = loadToolchainLock(ws.dir)[ws.project.toolchain]?.clSha256;
|
const pinned = loadToolchainLock(ws.dir)[ws.project.toolchain]?.clSha256;
|
||||||
return {
|
return {
|
||||||
installed: root,
|
installed: root,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue