v.util: extend launch_tool with auto recompilation of a folder with several .v files too
							parent
							
								
									ffd753abdc
								
							
						
					
					
						commit
						9593ad20f9
					
				| 
						 | 
					@ -129,7 +129,7 @@ pub fn launch_tool(is_verbose bool, tool_name string, args []string) {
 | 
				
			||||||
	mut tool_source := ''
 | 
						mut tool_source := ''
 | 
				
			||||||
	if os.is_dir(tool_basename) {
 | 
						if os.is_dir(tool_basename) {
 | 
				
			||||||
		tool_exe = path_of_executable(os.join_path(tool_basename, tool_name))
 | 
							tool_exe = path_of_executable(os.join_path(tool_basename, tool_name))
 | 
				
			||||||
		tool_source = os.join_path(tool_basename, tool_name + '.v')
 | 
							tool_source = tool_basename
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		tool_exe = path_of_executable(tool_basename)
 | 
							tool_exe = path_of_executable(tool_basename)
 | 
				
			||||||
		tool_source = tool_basename + '.v'
 | 
							tool_source = tool_basename + '.v'
 | 
				
			||||||
| 
						 | 
					@ -139,9 +139,10 @@ pub fn launch_tool(is_verbose bool, tool_name string, args []string) {
 | 
				
			||||||
		println('launch_tool vexe        : $vroot')
 | 
							println('launch_tool vexe        : $vroot')
 | 
				
			||||||
		println('launch_tool vroot       : $vroot')
 | 
							println('launch_tool vroot       : $vroot')
 | 
				
			||||||
		println('launch_tool tool_args   : $tool_args')
 | 
							println('launch_tool tool_args   : $tool_args')
 | 
				
			||||||
 | 
							println('launch_tool tool_source : $tool_source')
 | 
				
			||||||
		println('launch_tool tool_command: $tool_command')
 | 
							println('launch_tool tool_command: $tool_command')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	should_compile := should_recompile_tool(vexe, tool_source)
 | 
						should_compile := should_recompile_tool(vexe, tool_source, tool_name, tool_exe)
 | 
				
			||||||
	if is_verbose {
 | 
						if is_verbose {
 | 
				
			||||||
		println('launch_tool should_compile: $should_compile')
 | 
							println('launch_tool should_compile: $should_compile')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -167,13 +168,26 @@ pub fn launch_tool(is_verbose bool, tool_name string, args []string) {
 | 
				
			||||||
	exit(os.system(tool_command))
 | 
						exit(os.system(tool_command))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NB: should_recompile_tool/2 compares unix timestamps that have 1 second resolution
 | 
					// NB: should_recompile_tool/4 compares unix timestamps that have 1 second resolution
 | 
				
			||||||
// That means that a tool can get recompiled twice, if called in short succession.
 | 
					// That means that a tool can get recompiled twice, if called in short succession.
 | 
				
			||||||
// TODO: use a nanosecond mtime timestamp, if available.
 | 
					// TODO: use a nanosecond mtime timestamp, if available.
 | 
				
			||||||
pub fn should_recompile_tool(vexe string, tool_source string) bool {
 | 
					pub fn should_recompile_tool(vexe string, tool_source string, tool_name string, tool_exe string) bool {
 | 
				
			||||||
	sfolder := os.dir(tool_source)
 | 
						if os.is_dir(tool_source) {
 | 
				
			||||||
	tool_name := os.base(tool_source).replace('.v', '')
 | 
							source_files := os.walk_ext(tool_source, '.v')
 | 
				
			||||||
	tool_exe := os.join_path(sfolder, path_of_executable(tool_name))
 | 
							mut newest_sfile := ''
 | 
				
			||||||
 | 
							mut newest_sfile_mtime := 0
 | 
				
			||||||
 | 
							for sfile in source_files {
 | 
				
			||||||
 | 
								mtime := os.file_last_mod_unix(sfile)
 | 
				
			||||||
 | 
								if mtime > newest_sfile_mtime {
 | 
				
			||||||
 | 
									newest_sfile_mtime = mtime
 | 
				
			||||||
 | 
									newest_sfile = sfile
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							single_file_recompile := should_recompile_tool(vexe, newest_sfile, tool_name,
 | 
				
			||||||
 | 
								tool_exe)
 | 
				
			||||||
 | 
							// eprintln('>>> should_recompile_tool: tool_source: $tool_source | $single_file_recompile | $newest_sfile')
 | 
				
			||||||
 | 
							return single_file_recompile
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	// TODO Caching should be done on the `vlib/v` level.
 | 
						// TODO Caching should be done on the `vlib/v` level.
 | 
				
			||||||
	mut should_compile := false
 | 
						mut should_compile := false
 | 
				
			||||||
	if !os.exists(tool_exe) {
 | 
						if !os.exists(tool_exe) {
 | 
				
			||||||
| 
						 | 
					@ -212,6 +226,13 @@ pub fn should_recompile_tool(vexe string, tool_source string) bool {
 | 
				
			||||||
	return should_compile
 | 
						return should_compile
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn tool_source2name_and_exe(tool_source string) (string, string) {
 | 
				
			||||||
 | 
						sfolder := os.dir(tool_source)
 | 
				
			||||||
 | 
						tool_name := os.base(tool_source).replace('.v', '')
 | 
				
			||||||
 | 
						tool_exe := os.join_path(sfolder, path_of_executable(tool_name))
 | 
				
			||||||
 | 
						return tool_name, tool_exe
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn quote_path(s string) string {
 | 
					pub fn quote_path(s string) string {
 | 
				
			||||||
	mut qs := s
 | 
						mut qs := s
 | 
				
			||||||
	if qs.contains('&') {
 | 
						if qs.contains('&') {
 | 
				
			||||||
| 
						 | 
					@ -424,7 +445,8 @@ pub fn prepare_tool_when_needed(source_name string) {
 | 
				
			||||||
	vexe := os.getenv('VEXE')
 | 
						vexe := os.getenv('VEXE')
 | 
				
			||||||
	vroot := os.dir(vexe)
 | 
						vroot := os.dir(vexe)
 | 
				
			||||||
	stool := os.join_path(vroot, 'cmd', 'tools', source_name)
 | 
						stool := os.join_path(vroot, 'cmd', 'tools', source_name)
 | 
				
			||||||
	if should_recompile_tool(vexe, stool) {
 | 
						tool_name, tool_exe := tool_source2name_and_exe(stool)
 | 
				
			||||||
 | 
						if should_recompile_tool(vexe, stool, tool_name, tool_exe) {
 | 
				
			||||||
		time.sleep_ms(1001) // TODO: remove this when we can get mtime with a better resolution
 | 
							time.sleep_ms(1001) // TODO: remove this when we can get mtime with a better resolution
 | 
				
			||||||
		recompile_file(vexe, stool)
 | 
							recompile_file(vexe, stool)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue