|
| 1 | +" Will do the following checks in order of precedence: |
| 2 | +" -Use $NODE or $NODE/node if they exist and are executable |
| 3 | +" -check for node as vim-plug plugin (user-specific) |
| 4 | +" -check for system-wide install of node |
| 5 | +" -If all above fail will get node as vim-plug plugin and build it |
| 6 | +" Changes $PATH to include node path |
| 7 | +function! spacevim#plug#nodejs#IsBuildRequired(maj, min) |
| 8 | + let pathsep = g:spacevim.os.windows ? ';' : ':' |
| 9 | + " Prefer $NODE override |
| 10 | + if exists('$NODE') && spacevim#util#IsVersionSufficient('$NODE', a:maj, a:min) |
| 11 | + let $PATH = fnamemodify('$NODE', ':h').pathsep.$PATH |
| 12 | + return 0 |
| 13 | + endif |
| 14 | + " Prefer user plugin Node.js if it exists |
| 15 | + if spacevim#util#IsVersionSufficient(g:spacevim_plug_home.'/repos/github.com/nodejs/node/node', a:maj, a:min) |
| 16 | + let $PATH = g:spacevim_plug_home.'/repos/github.com/nodejs/node/node'.pathsep.$PATH |
| 17 | + return 0 |
| 18 | + endif |
| 19 | + " Last check for system-wide Node.js |
| 20 | + if spacevim#util#IsVersionSufficient('node', a:maj, a:min) |
| 21 | + return 0 |
| 22 | + endif |
| 23 | + return 1 |
| 24 | +endfunction |
| 25 | + |
| 26 | +" If no valid $NODE or systemwide node.js: build node.js dependency |
| 27 | +function! spacevim#plug#nodejs#Build(info) |
| 28 | + if !dein#is_available('asyncrun.vim') |
| 29 | + echom "nodejs layer requires asyncrun.vim to build. Add 'programming' layer to .spacevim" |
| 30 | + return |
| 31 | + endif |
| 32 | + if g:spacevim.os.windows |
| 33 | + echom 'Building Node.js automatically on Windows is untested and likely to fail' |
| 34 | + echom 'Run msys2_shell.cmd or vcvars64.bat per desired ABI' |
| 35 | + return |
| 36 | + elseif (!exists('$CC') && executable('gcc') != 1) || |
| 37 | + \ executable('make') != 1 || executable('python3') != 1 |
| 38 | + echom 'Unable to build Node.js, requires a C++ compiler, make, and python3' |
| 39 | + return |
| 40 | + endif |
| 41 | + |
| 42 | + echom 'Building Node.js, please wait 60+ seconds for build to start...' |
| 43 | + let s:cwd = getcwd() |
| 44 | + |
| 45 | + if get(g:, 'spacevim.build_deps_in_tmp', 1) && getftype('out') !~# 'dir' |
| 46 | + " Build intermediate files to temp, vim will delete folder on exit |
| 47 | + let temp_dir = fnamemodify(tempname(), ':p:h') |
| 48 | + call mkdir(temp_dir.'/out', 'p') |
| 49 | + if getftype('out') =~# 'link' |
| 50 | + call delete('out') |
| 51 | + endif |
| 52 | + call system('ln -s '.temp_dir.'/out out') |
| 53 | + endif |
| 54 | + |
| 55 | + let s:jobs_flag = '' |
| 56 | + if g:spacevim.os.windows |
| 57 | + autocmd User asyncrun.vim ++once execute('AsyncRun -mode=term -pos=tab @ .\\vcbuild openssl-no-asm') |
| 58 | + else |
| 59 | + let ninja_flag = '' |
| 60 | + if executable('ninja') |
| 61 | + let ninja_flag=' --ninja' |
| 62 | + else |
| 63 | + " Determine number of cores/threads for make -j, ninja autodetects |
| 64 | + let num_threads = 4 |
| 65 | + if executable('lscpu') |
| 66 | + let result = system("lscpu | grep -E '?^(CPU\\(s\\):|Thread\\(s\\) per core:)' | tr -s ' ' | cut -f 2 -d:") |
| 67 | + if !v:shell_error |
| 68 | + let num_threads = join(split(result), '*') |
| 69 | + endif |
| 70 | + endif |
| 71 | + let s:jobs_flag = ' -j '.num_threads |
| 72 | + endif |
| 73 | + call system('./configure'.ninja_flag.' > '.temp_dir.'/nodejs_configure.log') |
| 74 | + call execute('AsyncRun -cwd='.s:cwd.' -mode=term -pos=tab -program=make -post=call\ spacevim\#plug\#nodejs\#PostBuild(code) @'.s:jobs_flag) |
| 75 | + endif |
| 76 | +endfunction |
| 77 | + |
| 78 | +function! spacevim#plug#nodejs#PostBuild(exit_code) |
| 79 | + execute 'tcd' fnameescape(s:cwd) |
| 80 | + unlet s:cwd s:jobs_flag |
| 81 | + if a:exit_code == 0 |
| 82 | + call delete('deps/icu-tmp', 'rf') |
| 83 | + call delete('node', 'rf') |
| 84 | + call rename('out/Release/node', 'node') |
| 85 | + let pathsep = g:spacevim.os.windows ? ';' : ':' |
| 86 | + let $PATH = g:spacevim_plug_home.'/repos/github.com/nodejs/node/node'.pathsep.$PATH |
| 87 | + |
| 88 | + " This sets up corepack/npm links the same as `make install` does |
| 89 | + call system('ln -s deps/corepack/dist/corepack.js corepack') |
| 90 | + call system('ln -s deps/npm/bin/npm-cli.js npm') |
| 91 | + call system('ln -s deps/npm/bin/npx-cli.js npx') |
| 92 | + call system('node corepack enable') |
| 93 | + endif |
| 94 | + if get(g:, 'spacevim.build_deps_in_tmp', 1) |
| 95 | + call delete('out') |
| 96 | + endif |
| 97 | + tcd - |
| 98 | +endfunction |
| 99 | + |
0 commit comments