diff --git a/plugin/build.lua b/plugin/build.lua index e924a74..e0a65dd 100644 --- a/plugin/build.lua +++ b/plugin/build.lua @@ -21,45 +21,58 @@ function build.set_dir(dirname) end build.dir = build_dir - - echo('Processing compile_commands.json with compdb ...', 'DiagnosticInfo') local compile_commands = current_dir .. '/compile_commands.json' - -- Post-process compile_commands.json with compdb as an async job to avoid - -- blocking the user interface - vim.fn.jobstart( - 'compdb -p ' .. build.dir .. ' list > ' .. compile_commands, { - -- Restart clangd language server - on_exit = function() + if vim.fn.executable('compdb') == 1 then + echo('Processing compile_commands.json with compdb ...', 'DiagnosticInfo') + -- Post-process compile_commands.json with compdb as an async job to avoid + -- blocking the user interface + vim.fn.jobstart( + 'compdb -p ' .. build.dir .. ' list > ' .. compile_commands, { + + -- Restart clangd language server + on_exit = function() + -- This is a callback so doesn't run on the main thread which causes + -- issues for running commands, so schedule that on the main thread. + vim.schedule(function() + vim.cmd('LspRestart') + echo('Build directory selected: ' .. dirname, 'DiagnosticInfo') + end) + end, + + -- Display any error messages to the user + on_stderr = function(_, output, _) + -- Remove any lines containing a compdb warning + local error = {} + local warning = 'WARNING:compdb' + for _, line in ipairs(output) do + if string.sub(line, 1, #warning) ~= warning then + table.insert(error, line) + end + end + + -- Display the error message if there was one + if table.maxn(error) > 0 then + echo(vim.fn.join(error, '\n'), 'Error') + return + end + end, + + stderr_buffered = true, + } + ) + else + vim.uv.fs_copyfile(build_dir .. '/compile_commands.json', compile_commands, nil, + function() -- This is a callback so doesn't run on the main thread which causes -- issues for running commands, so schedule that on the main thread. vim.schedule(function() vim.cmd('LspRestart') echo('Build directory selected: ' .. dirname, 'DiagnosticInfo') end) - end, - - -- Display any error messages to the user - on_stderr = function(_, output, _) - -- Remove any lines containing a compdb warning - local error = {} - local warning = 'WARNING:compdb' - for _, line in ipairs(output) do - if string.sub(line, 1, #warning) ~= warning then - table.insert(error, line) - end - end - - -- Display the error message if there was one - if table.maxn(error) > 0 then - echo(vim.fn.join(error, '\n'), 'Error') - return - end - end, - - stderr_buffered = true, - } - ) + end + ) + end end function build.select_dir(callback)