Add Windows support for cl.exe

Co-authored-by: Stephan Seitz <stephan.seitz@fau.de>
This commit is contained in:
Jozef Grajciar 2021-02-26 20:41:05 +01:00 committed by Stephan Seitz
parent a74da044a8
commit c7422dd257
2 changed files with 41 additions and 24 deletions

View file

@ -11,7 +11,7 @@ local shell = require'nvim-treesitter.shell_command_selectors'
local M = {} local M = {}
local lockfile = {} local lockfile = {}
M.compilers = { vim.fn.getenv('CC'), "cc", "gcc", "clang" } M.compilers = { vim.fn.getenv('CC'), "cc", "gcc", "clang", "cl" }
local started_commands = 0 local started_commands = 0
local finished_commands = 0 local finished_commands = 0
@ -93,13 +93,6 @@ function M.iter_cmd(cmd_list, i, lang, success_message)
end end
local function get_command(cmd) local function get_command(cmd)
local ret = ''
if cmd.opts and cmd.opts.cwd then
ret = string.format('cd %s;\n', cmd.opts.cwd)
end
ret = string.format('%s%s ', ret, cmd.cmd)
local options = "" local options = ""
if cmd.opts and cmd.opts.args then if cmd.opts and cmd.opts.args then
for _, opt in ipairs(cmd.opts.args) do for _, opt in ipairs(cmd.opts.args) do
@ -107,7 +100,11 @@ local function get_command(cmd)
end end
end end
return string.format('%s%s', ret, options) local final = string.format('%s %s', cmd.cmd, options)
if cmd.opts and cmd.opts.cwd then
final = shell.make_directory_change_for_command(cmd.opts.cwd, final)
end
return final
end end
local function iter_cmd_sync(cmd_list) local function iter_cmd_sync(cmd_list)
@ -151,7 +148,8 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync,
if from_local_path then if from_local_path then
compile_location = repo.url compile_location = repo.url
else else
compile_location = cache_folder..path_sep..(repo.location or project_name) local repo_location = string.gsub(repo.location or project_name, '/', path_sep)
compile_location = cache_folder..path_sep..repo_location
end end
local parser_lib_name = install_folder..path_sep..lang..".so" local parser_lib_name = install_folder..path_sep..lang..".so"
@ -192,7 +190,7 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync,
info = 'Compiling...', info = 'Compiling...',
err = 'Error during compilation', err = 'Error during compilation',
opts = { opts = {
args = vim.tbl_flatten(shell.select_compiler_args(repo)), args = vim.tbl_flatten(shell.select_compiler_args(repo, cc)),
cwd = compile_location cwd = compile_location
} }
}, },

View file

@ -53,20 +53,31 @@ function M.select_executable(executables)
return vim.tbl_filter(function(c) return c ~= vim.NIL and fn.executable(c) == 1 end, executables)[1] return vim.tbl_filter(function(c) return c ~= vim.NIL and fn.executable(c) == 1 end, executables)[1]
end end
function M.select_compiler_args(repo) function M.select_compiler_args(repo, compiler)
local args = { if (string.match(compiler, 'cl$') or string.match(compiler, 'cl.exe$')) then
'-o', return {
'parser.so', '/Fe:',
'-I./src', 'parser.so',
repo.files, '/Isrc',
'-shared', repo.files,
'-Os', '-Os',
'-lstdc++', '/LD',
} }
if fn.has('win32') == 0 then else
table.insert(args, '-fPIC') local args = {
'-o',
'parser.so',
'-I./src',
repo.files,
'-shared',
'-Os',
'-lstdc++',
}
if fn.has('win32') == 0 then
table.insert(args, '-fPIC')
end
return args
end end
return args
end end
function M.select_install_rm_cmd(cache_folder, project_name) function M.select_install_rm_cmd(cache_folder, project_name)
@ -179,4 +190,12 @@ function M.select_download_commands(repo, project_name, cache_folder, revision)
end end
end end
function M.make_directory_change_for_command(dir, command)
if fn.has('win32') == 1 then
return string.format("pushd %s & %s & popd", dir, command)
else
return string.format("cd %s;\n %s", dir, command)
end
end
return M return M