Skip to content

link manifest: record CUDA runtime libs and toolkit search dirs - #114

Open
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda
Open

link manifest: record CUDA runtime libs and toolkit search dirs#114
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda

Conversation

@peters

Copy link
Copy Markdown

transcribe-link.json omits the CUDA runtime libraries for TRANSCRIBE_CUDA builds (system_libs carries only stdc++/m/pthread/dl), so every non-CMake consumer fails to link with undefined cuda* symbols and has to hand-roll the toolkit paths (e.g. the workaround in horizon's build.rs guessing a root from CUDA_PATH/CUDA_HOME).

What changed

  • cmake/transcribe-install.cmake: a cuda backend branch mirrors ggml-cuda's own link list — cudart, cublas, and (unless GGML_CUDA_NO_VMM) the cuda driver lib — and records the CUDAToolkit library dir plus its driver-stubs subdir in a new search_dirs manifest field (configure time knows the real paths; consumers stop guessing).
  • bindings/rust/sys/build.rs: emits cargo:rustc-link-search for each search_dirs entry.
  • scripts/ci/link_smoke.py: passes -L for each entry (read with .get, so older manifests still parse).
  • docs/bindings.md: schema note.

Verified locally (Linux, CUDA 12): static TRANSCRIBE_CUDA=ON configure → manifest carries search_dirs: ["/usr/local/cuda/lib64", "/usr/local/cuda/lib64/stubs"] and system_libs: [..., "cudart", "cublas", "cuda"]; full build + install + scripts/ci/link_smoke.py → the toy C consumer links from the manifest alone and enumerates CUDA0 at runtime. CPU-only configure regression-checked: search_dirs empty, system_libs unchanged.

CUDA builds of the static archive set reference the CUDA runtime, cuBLAS,
and (unless VMM is disabled) the driver API, but transcribe-link.json
never recorded them — every non-CMake consumer failed to link with
undefined cuda* symbols and had to hand-roll the toolkit paths (e.g.
horizon's build.rs workaround).
The manifest now mirrors ggml-cuda's own link list into system_libs and
records the toolkit's library dir (+ driver-stubs dir) in a new
search_dirs field; the -sys build script and the link-smoke harness
consume it. Verified locally: static CUDA install, toy C consumer built
from the manifest alone, CUDA0 enumerated at runtime.
@peters
peters requested a review from cjpais as a code ownerJuly 28, 2026 07:20
@cjpais

Copy link
Copy Markdown
Contributor

Thank you for this, I'll take a look when I get a chance

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@peters@cjpais
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
link manifest: record CUDA runtime libs and toolkit search dirs by peters · Pull Request #114 · handy-computer/transcribe.cpp · GitHub
Skip to content

link manifest: record CUDA runtime libs and toolkit search dirs - #114

Open
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda
Open

link manifest: record CUDA runtime libs and toolkit search dirs#114
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda

Conversation

@peters

Copy link
Copy Markdown

transcribe-link.json omits the CUDA runtime libraries for TRANSCRIBE_CUDA builds (system_libs carries only stdc++/m/pthread/dl), so every non-CMake consumer fails to link with undefined cuda* symbols and has to hand-roll the toolkit paths (e.g. the workaround in horizon's build.rs guessing a root from CUDA_PATH/CUDA_HOME).

What changed

  • cmake/transcribe-install.cmake: a cuda backend branch mirrors ggml-cuda's own link list — cudart, cublas, and (unless GGML_CUDA_NO_VMM) the cuda driver lib — and records the CUDAToolkit library dir plus its driver-stubs subdir in a new search_dirs manifest field (configure time knows the real paths; consumers stop guessing).
  • bindings/rust/sys/build.rs: emits cargo:rustc-link-search for each search_dirs entry.
  • scripts/ci/link_smoke.py: passes -L for each entry (read with .get, so older manifests still parse).
  • docs/bindings.md: schema note.

Verified locally (Linux, CUDA 12): static TRANSCRIBE_CUDA=ON configure → manifest carries search_dirs: ["/usr/local/cuda/lib64", "/usr/local/cuda/lib64/stubs"] and system_libs: [..., "cudart", "cublas", "cuda"]; full build + install + scripts/ci/link_smoke.py → the toy C consumer links from the manifest alone and enumerates CUDA0 at runtime. CPU-only configure regression-checked: search_dirs empty, system_libs unchanged.

CUDA builds of the static archive set reference the CUDA runtime, cuBLAS,
and (unless VMM is disabled) the driver API, but transcribe-link.json
never recorded them — every non-CMake consumer failed to link with
undefined cuda* symbols and had to hand-roll the toolkit paths (e.g.
horizon's build.rs workaround).
The manifest now mirrors ggml-cuda's own link list into system_libs and
records the toolkit's library dir (+ driver-stubs dir) in a new
search_dirs field; the -sys build script and the link-smoke harness
consume it. Verified locally: static CUDA install, toy C consumer built
from the manifest alone, CUDA0 enumerated at runtime.
@peters
peters requested a review from cjpais as a code ownerJuly 28, 2026 07:20
@cjpais

Copy link
Copy Markdown
Contributor

Thank you for this, I'll take a look when I get a chance

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@peters@cjpais
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' link manifest: record CUDA runtime libs and toolkit search dirs by peters · Pull Request #114 · handy-computer/transcribe.cpp · GitHub
Skip to content

link manifest: record CUDA runtime libs and toolkit search dirs - #114

Open
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda
Open

link manifest: record CUDA runtime libs and toolkit search dirs#114
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda

Conversation

@peters

Copy link
Copy Markdown

transcribe-link.json omits the CUDA runtime libraries for TRANSCRIBE_CUDA builds (system_libs carries only stdc++/m/pthread/dl), so every non-CMake consumer fails to link with undefined cuda* symbols and has to hand-roll the toolkit paths (e.g. the workaround in horizon's build.rs guessing a root from CUDA_PATH/CUDA_HOME).

What changed

  • cmake/transcribe-install.cmake: a cuda backend branch mirrors ggml-cuda's own link list — cudart, cublas, and (unless GGML_CUDA_NO_VMM) the cuda driver lib — and records the CUDAToolkit library dir plus its driver-stubs subdir in a new search_dirs manifest field (configure time knows the real paths; consumers stop guessing).
  • bindings/rust/sys/build.rs: emits cargo:rustc-link-search for each search_dirs entry.
  • scripts/ci/link_smoke.py: passes -L for each entry (read with .get, so older manifests still parse).
  • docs/bindings.md: schema note.

Verified locally (Linux, CUDA 12): static TRANSCRIBE_CUDA=ON configure → manifest carries search_dirs: ["/usr/local/cuda/lib64", "/usr/local/cuda/lib64/stubs"] and system_libs: [..., "cudart", "cublas", "cuda"]; full build + install + scripts/ci/link_smoke.py → the toy C consumer links from the manifest alone and enumerates CUDA0 at runtime. CPU-only configure regression-checked: search_dirs empty, system_libs unchanged.

CUDA builds of the static archive set reference the CUDA runtime, cuBLAS,
and (unless VMM is disabled) the driver API, but transcribe-link.json
never recorded them — every non-CMake consumer failed to link with
undefined cuda* symbols and had to hand-roll the toolkit paths (e.g.
horizon's build.rs workaround).
The manifest now mirrors ggml-cuda's own link list into system_libs and
records the toolkit's library dir (+ driver-stubs dir) in a new
search_dirs field; the -sys build script and the link-smoke harness
consume it. Verified locally: static CUDA install, toy C consumer built
from the manifest alone, CUDA0 enumerated at runtime.
@peters
peters requested a review from cjpais as a code ownerJuly 28, 2026 07:20
@cjpais

Copy link
Copy Markdown
Contributor

Thank you for this, I'll take a look when I get a chance

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@peters@cjpais
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' link manifest: record CUDA runtime libs and toolkit search dirs by peters · Pull Request #114 · handy-computer/transcribe.cpp · GitHub
Skip to content

link manifest: record CUDA runtime libs and toolkit search dirs - #114

Open
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda
Open

link manifest: record CUDA runtime libs and toolkit search dirs#114
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda

Conversation

@peters

Copy link
Copy Markdown

transcribe-link.json omits the CUDA runtime libraries for TRANSCRIBE_CUDA builds (system_libs carries only stdc++/m/pthread/dl), so every non-CMake consumer fails to link with undefined cuda* symbols and has to hand-roll the toolkit paths (e.g. the workaround in horizon's build.rs guessing a root from CUDA_PATH/CUDA_HOME).

What changed

  • cmake/transcribe-install.cmake: a cuda backend branch mirrors ggml-cuda's own link list — cudart, cublas, and (unless GGML_CUDA_NO_VMM) the cuda driver lib — and records the CUDAToolkit library dir plus its driver-stubs subdir in a new search_dirs manifest field (configure time knows the real paths; consumers stop guessing).
  • bindings/rust/sys/build.rs: emits cargo:rustc-link-search for each search_dirs entry.
  • scripts/ci/link_smoke.py: passes -L for each entry (read with .get, so older manifests still parse).
  • docs/bindings.md: schema note.

Verified locally (Linux, CUDA 12): static TRANSCRIBE_CUDA=ON configure → manifest carries search_dirs: ["/usr/local/cuda/lib64", "/usr/local/cuda/lib64/stubs"] and system_libs: [..., "cudart", "cublas", "cuda"]; full build + install + scripts/ci/link_smoke.py → the toy C consumer links from the manifest alone and enumerates CUDA0 at runtime. CPU-only configure regression-checked: search_dirs empty, system_libs unchanged.

CUDA builds of the static archive set reference the CUDA runtime, cuBLAS,
and (unless VMM is disabled) the driver API, but transcribe-link.json
never recorded them — every non-CMake consumer failed to link with
undefined cuda* symbols and had to hand-roll the toolkit paths (e.g.
horizon's build.rs workaround).
The manifest now mirrors ggml-cuda's own link list into system_libs and
records the toolkit's library dir (+ driver-stubs dir) in a new
search_dirs field; the -sys build script and the link-smoke harness
consume it. Verified locally: static CUDA install, toy C consumer built
from the manifest alone, CUDA0 enumerated at runtime.
@peters
peters requested a review from cjpais as a code ownerJuly 28, 2026 07:20
@cjpais

Copy link
Copy Markdown
Contributor

Thank you for this, I'll take a look when I get a chance

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@peters@cjpais
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' link manifest: record CUDA runtime libs and toolkit search dirs by peters · Pull Request #114 · handy-computer/transcribe.cpp · GitHub
Skip to content

link manifest: record CUDA runtime libs and toolkit search dirs - #114

Open
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda
Open

link manifest: record CUDA runtime libs and toolkit search dirs#114
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda

Conversation

@peters

Copy link
Copy Markdown

transcribe-link.json omits the CUDA runtime libraries for TRANSCRIBE_CUDA builds (system_libs carries only stdc++/m/pthread/dl), so every non-CMake consumer fails to link with undefined cuda* symbols and has to hand-roll the toolkit paths (e.g. the workaround in horizon's build.rs guessing a root from CUDA_PATH/CUDA_HOME).

What changed

  • cmake/transcribe-install.cmake: a cuda backend branch mirrors ggml-cuda's own link list — cudart, cublas, and (unless GGML_CUDA_NO_VMM) the cuda driver lib — and records the CUDAToolkit library dir plus its driver-stubs subdir in a new search_dirs manifest field (configure time knows the real paths; consumers stop guessing).
  • bindings/rust/sys/build.rs: emits cargo:rustc-link-search for each search_dirs entry.
  • scripts/ci/link_smoke.py: passes -L for each entry (read with .get, so older manifests still parse).
  • docs/bindings.md: schema note.

Verified locally (Linux, CUDA 12): static TRANSCRIBE_CUDA=ON configure → manifest carries search_dirs: ["/usr/local/cuda/lib64", "/usr/local/cuda/lib64/stubs"] and system_libs: [..., "cudart", "cublas", "cuda"]; full build + install + scripts/ci/link_smoke.py → the toy C consumer links from the manifest alone and enumerates CUDA0 at runtime. CPU-only configure regression-checked: search_dirs empty, system_libs unchanged.

CUDA builds of the static archive set reference the CUDA runtime, cuBLAS,
and (unless VMM is disabled) the driver API, but transcribe-link.json
never recorded them — every non-CMake consumer failed to link with
undefined cuda* symbols and had to hand-roll the toolkit paths (e.g.
horizon's build.rs workaround).
The manifest now mirrors ggml-cuda's own link list into system_libs and
records the toolkit's library dir (+ driver-stubs dir) in a new
search_dirs field; the -sys build script and the link-smoke harness
consume it. Verified locally: static CUDA install, toy C consumer built
from the manifest alone, CUDA0 enumerated at runtime.
@peters
peters requested a review from cjpais as a code ownerJuly 28, 2026 07:20
@cjpais

Copy link
Copy Markdown
Contributor

Thank you for this, I'll take a look when I get a chance

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@peters@cjpais
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' link manifest: record CUDA runtime libs and toolkit search dirs by peters · Pull Request #114 · handy-computer/transcribe.cpp · GitHub
Skip to content

link manifest: record CUDA runtime libs and toolkit search dirs - #114

Open
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda
Open

link manifest: record CUDA runtime libs and toolkit search dirs#114
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda

Conversation

@peters

Copy link
Copy Markdown

transcribe-link.json omits the CUDA runtime libraries for TRANSCRIBE_CUDA builds (system_libs carries only stdc++/m/pthread/dl), so every non-CMake consumer fails to link with undefined cuda* symbols and has to hand-roll the toolkit paths (e.g. the workaround in horizon's build.rs guessing a root from CUDA_PATH/CUDA_HOME).

What changed

  • cmake/transcribe-install.cmake: a cuda backend branch mirrors ggml-cuda's own link list — cudart, cublas, and (unless GGML_CUDA_NO_VMM) the cuda driver lib — and records the CUDAToolkit library dir plus its driver-stubs subdir in a new search_dirs manifest field (configure time knows the real paths; consumers stop guessing).
  • bindings/rust/sys/build.rs: emits cargo:rustc-link-search for each search_dirs entry.
  • scripts/ci/link_smoke.py: passes -L for each entry (read with .get, so older manifests still parse).
  • docs/bindings.md: schema note.

Verified locally (Linux, CUDA 12): static TRANSCRIBE_CUDA=ON configure → manifest carries search_dirs: ["/usr/local/cuda/lib64", "/usr/local/cuda/lib64/stubs"] and system_libs: [..., "cudart", "cublas", "cuda"]; full build + install + scripts/ci/link_smoke.py → the toy C consumer links from the manifest alone and enumerates CUDA0 at runtime. CPU-only configure regression-checked: search_dirs empty, system_libs unchanged.

CUDA builds of the static archive set reference the CUDA runtime, cuBLAS,
and (unless VMM is disabled) the driver API, but transcribe-link.json
never recorded them — every non-CMake consumer failed to link with
undefined cuda* symbols and had to hand-roll the toolkit paths (e.g.
horizon's build.rs workaround).
The manifest now mirrors ggml-cuda's own link list into system_libs and
records the toolkit's library dir (+ driver-stubs dir) in a new
search_dirs field; the -sys build script and the link-smoke harness
consume it. Verified locally: static CUDA install, toy C consumer built
from the manifest alone, CUDA0 enumerated at runtime.
@peters
peters requested a review from cjpais as a code ownerJuly 28, 2026 07:20
@cjpais

Copy link
Copy Markdown
Contributor

Thank you for this, I'll take a look when I get a chance

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@peters@cjpais
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' link manifest: record CUDA runtime libs and toolkit search dirs by peters · Pull Request #114 · handy-computer/transcribe.cpp · GitHub
Skip to content

link manifest: record CUDA runtime libs and toolkit search dirs - #114

Open
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda
Open

link manifest: record CUDA runtime libs and toolkit search dirs#114
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda

Conversation

@peters

Copy link
Copy Markdown

transcribe-link.json omits the CUDA runtime libraries for TRANSCRIBE_CUDA builds (system_libs carries only stdc++/m/pthread/dl), so every non-CMake consumer fails to link with undefined cuda* symbols and has to hand-roll the toolkit paths (e.g. the workaround in horizon's build.rs guessing a root from CUDA_PATH/CUDA_HOME).

What changed

  • cmake/transcribe-install.cmake: a cuda backend branch mirrors ggml-cuda's own link list — cudart, cublas, and (unless GGML_CUDA_NO_VMM) the cuda driver lib — and records the CUDAToolkit library dir plus its driver-stubs subdir in a new search_dirs manifest field (configure time knows the real paths; consumers stop guessing).
  • bindings/rust/sys/build.rs: emits cargo:rustc-link-search for each search_dirs entry.
  • scripts/ci/link_smoke.py: passes -L for each entry (read with .get, so older manifests still parse).
  • docs/bindings.md: schema note.

Verified locally (Linux, CUDA 12): static TRANSCRIBE_CUDA=ON configure → manifest carries search_dirs: ["/usr/local/cuda/lib64", "/usr/local/cuda/lib64/stubs"] and system_libs: [..., "cudart", "cublas", "cuda"]; full build + install + scripts/ci/link_smoke.py → the toy C consumer links from the manifest alone and enumerates CUDA0 at runtime. CPU-only configure regression-checked: search_dirs empty, system_libs unchanged.

CUDA builds of the static archive set reference the CUDA runtime, cuBLAS,
and (unless VMM is disabled) the driver API, but transcribe-link.json
never recorded them — every non-CMake consumer failed to link with
undefined cuda* symbols and had to hand-roll the toolkit paths (e.g.
horizon's build.rs workaround).
The manifest now mirrors ggml-cuda's own link list into system_libs and
records the toolkit's library dir (+ driver-stubs dir) in a new
search_dirs field; the -sys build script and the link-smoke harness
consume it. Verified locally: static CUDA install, toy C consumer built
from the manifest alone, CUDA0 enumerated at runtime.
@peters
peters requested a review from cjpais as a code ownerJuly 28, 2026 07:20
@cjpais

Copy link
Copy Markdown
Contributor

Thank you for this, I'll take a look when I get a chance

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@peters@cjpais
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); link manifest: record CUDA runtime libs and toolkit search dirs by peters · Pull Request #114 · handy-computer/transcribe.cpp · GitHub
Skip to content

link manifest: record CUDA runtime libs and toolkit search dirs - #114

Open
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda
Open

link manifest: record CUDA runtime libs and toolkit search dirs#114
peters wants to merge 1 commit into
handy-computer:mainfrom
peters:fix/link-manifest-cuda

Conversation

@peters

Copy link
Copy Markdown

transcribe-link.json omits the CUDA runtime libraries for TRANSCRIBE_CUDA builds (system_libs carries only stdc++/m/pthread/dl), so every non-CMake consumer fails to link with undefined cuda* symbols and has to hand-roll the toolkit paths (e.g. the workaround in horizon's build.rs guessing a root from CUDA_PATH/CUDA_HOME).

What changed

  • cmake/transcribe-install.cmake: a cuda backend branch mirrors ggml-cuda's own link list — cudart, cublas, and (unless GGML_CUDA_NO_VMM) the cuda driver lib — and records the CUDAToolkit library dir plus its driver-stubs subdir in a new search_dirs manifest field (configure time knows the real paths; consumers stop guessing).
  • bindings/rust/sys/build.rs: emits cargo:rustc-link-search for each search_dirs entry.
  • scripts/ci/link_smoke.py: passes -L for each entry (read with .get, so older manifests still parse).
  • docs/bindings.md: schema note.

Verified locally (Linux, CUDA 12): static TRANSCRIBE_CUDA=ON configure → manifest carries search_dirs: ["/usr/local/cuda/lib64", "/usr/local/cuda/lib64/stubs"] and system_libs: [..., "cudart", "cublas", "cuda"]; full build + install + scripts/ci/link_smoke.py → the toy C consumer links from the manifest alone and enumerates CUDA0 at runtime. CPU-only configure regression-checked: search_dirs empty, system_libs unchanged.

CUDA builds of the static archive set reference the CUDA runtime, cuBLAS,
and (unless VMM is disabled) the driver API, but transcribe-link.json
never recorded them — every non-CMake consumer failed to link with
undefined cuda* symbols and had to hand-roll the toolkit paths (e.g.
horizon's build.rs workaround).
The manifest now mirrors ggml-cuda's own link list into system_libs and
records the toolkit's library dir (+ driver-stubs dir) in a new
search_dirs field; the -sys build script and the link-smoke harness
consume it. Verified locally: static CUDA install, toy C consumer built
from the manifest alone, CUDA0 enumerated at runtime.
@peters
peters requested a review from cjpais as a code ownerJuly 28, 2026 07:20
@cjpais

Copy link
Copy Markdown
Contributor

Thank you for this, I'll take a look when I get a chance

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@peters@cjpais