2025-02-15
Clangd with cross compile toolchain
職業柄よくC/C++クロスコンパイラを使うのだが,Language ServerのClangdを使うと適切な型エイリアス等が解決されず困っていた.
VSCodeのIntelli Senseのノリで,compile_commands.json
にクロスコンパイラを渡してあげたら勝手にincludeディレクトリ等を解決してくれると思っていたのだが,そうではなかったらしい.
クロスコンパイラから適切なヘッダを読み込むには,--query-driver
オプションをclangd
の呼び出し時に与える必要があるとのこと.
System headers
自分はNeoVimにMasonを導入してLSPを管理しているので,mason-lspconfig
で設定する.
環境によってコンパイラのパスが違うので,上手いこと動的にフルパスを引っ張ってくるようにした(ロードが遅くなるのには目をつぶり…).
require("mason-lspconfig").setup_handlers({
...
["clangd"] = function()
-- Get cross compiler path for query driver
local cross_compilers = {
"riscv64-unknown-linux-gnu-gcc",
"riscv64-unknown-linux-gnu-g++",
}
local cross_compilers_path = {}
for _, val in ipairs(cross_compilers) do
local res = h.binary_path(val)
if res ~= nil then
table.insert(cross_compilers_path, res)
end
end
-- consruct clangd command args
local clangd_cmd = { "clangd" }
if next(cross_compilers_path) ~= nil then
local query_drivers = table.concat(cross_compilers_path, ",")
table.insert(clangd_cmd, "--query-driver=" .. query_drivers)
end
require("lspconfig").clangd.setup({
on_attach = on_attach,
capabilities = capabilities,
handlers = handlers,
cmd = clangd_cmd,
})
end,
})
ドキュメントによると--query-driver
はあくまでAllow Listで,compile_commands.json
内でマッチするコンパイラが指定されていた場合に発動するらしい.
ポインタサイズが正しくとれてなくて,キャストするたびに警告吐かれてたのが消えてスッキリした.
2025-02-14
Wezterm on wayland with NVIDIAの描画遅延
それなりに前からだが,weztermをNVIDIA GPU下のwayland環境で使用すると,描画遅延がひどくて使い物にならないケースがあった.
原因はやはりNVIDIA周りのようで,Intel iGPU下では同様の症状が出たことがない.ほんとにNVIDIAとLinuxの相性の悪さはいつになってのご健在だなぁ…とつくづく思う.これでも相当マシになってきてる方だけど.
GPU要因なのでGraphic Accelerationを切ればいいのだが,それはそれで問題なので,Xwayland動作でしばらく運用していた.
ただXwaylandはHiDPI環境でのスケーリングがダメで,AAなしジャギー状態のような描画になってしまう.
自分は4Kモニター複数枚運用の人なので,1xスケールでの運用は結構厳しい.しばらく使っていたものの,描画範囲が大きすぎるが故の遅延などが出ることもあって実用に耐えなかった.
なんとかWaylandネイティブで遅延が発生しないようにする術はないかと試行錯誤していたところ,wezterm側の描画フロントエンドをWebGPUにしただけで解決してしまった.なんとも拍子抜けな…
ちなみにデフォルトのフロントエンドはOpenGL.
設定はwezterm.lua
に以下を入れるだけでよい.
config.front_end = "WebGpu"
WebGPUに変更したことによる見た目の変化はほとんどない.若干フォントの鮮明さが落ちた雰囲気があるが,使用上の支障はないだろう.
ドキュメントによれば.Platformごとに適したbackendが使われるらしい.
The WebGpu front end allows wezterm to use GPU acceleration provided by a number of platform-specific backends:
- Metal (on macOS)
- Vulkan
- DirectX 12 (on Windows)