Add :Build command to invoke ninja or make
The `:Build [<target> ...]` command utilises the `$BUILD_DIR` variable set
by `:BuildDir {directory}` to invoke `ninja` or `make` based on the
existence of `$BUILD_DIR/build.ninja` or `$BUILD_DIR/Makefile`
respectively. The following commands are invoked in a new `:terminal`
window.
* `ninja -C $BUILD_DIR [<target> ...]` when `$BUILD_DIR/build.ninja` exists
* `make -C $BUILD_DIR [<target> ...]` when `$BUILD_DIR/Makefile` exists
In the case of `ninja`, completion for the targets supplied to the
`:Build` command is made available by the `build#targets()` function.
The list of targets returned by `ninja -C $BUILD_DIR -t targets` is
processed to generate the list of targets. Support for `make` target
completion is less straight forwards so has been omitted for now.
			
			
This commit is contained in:
		
							parent
							
								
									0cd93f1823
								
							
						
					
					
						commit
						a0df92852a
					
				@ -4,3 +4,24 @@ function! build#dir(dir) abort
 | 
				
			|||||||
  let g:ycm_clangd_args = ['--compile-commands-dir='.$BUILD_DIR]
 | 
					  let g:ycm_clangd_args = ['--compile-commands-dir='.$BUILD_DIR]
 | 
				
			||||||
  YcmRestartServer
 | 
					  YcmRestartServer
 | 
				
			||||||
endfunction
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! build#targets(ArgLead, CmdLine, CursorPos) abort
 | 
				
			||||||
 | 
					  let l:targets = []
 | 
				
			||||||
 | 
					  if filereadable($BUILD_DIR.'/build.ninja')
 | 
				
			||||||
 | 
					    for l:target in split(system('ninja -C '.$BUILD_DIR.' -t targets'), '\n')
 | 
				
			||||||
 | 
					      call add(l:targets, substitute(l:target, ':.*$', '', ''))
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					  elseif filereadable($BUILD_DIR.'/Makefile')
 | 
				
			||||||
 | 
					    " TODO: support make
 | 
				
			||||||
 | 
					  endif
 | 
				
			||||||
 | 
					  return join(l:targets, "\n")
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! build#run(...) abort
 | 
				
			||||||
 | 
					  let l:build_dir = substitute($BUILD_DIR, '\/$', '', '')
 | 
				
			||||||
 | 
					  if filereadable($BUILD_DIR.'/build.ninja')
 | 
				
			||||||
 | 
					    execute 'terminal ninja -C '.l:build_dir.' '.join(a:000, ' ')
 | 
				
			||||||
 | 
					  elseif filereadable($BUILD_DIR.'/Makefile')
 | 
				
			||||||
 | 
					    execute 'terminal make -C '.l:build_dir.' '.join(a:000, ' ')
 | 
				
			||||||
 | 
					  endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
				
			|||||||
@ -32,3 +32,4 @@ command! TodoFile lvimgrep /todo/ %
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
" Change build directory
 | 
					" Change build directory
 | 
				
			||||||
command! -nargs=1 -complete=dir BuildDir call build#dir(<f-args>)
 | 
					command! -nargs=1 -complete=dir BuildDir call build#dir(<f-args>)
 | 
				
			||||||
 | 
					command! -nargs=* -complete=custom,build#targets Build call build#run(<f-args>)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user