v/v.v

121 lines
3.1 KiB
V
Raw Normal View History

2019-06-23 04:21:30 +02:00
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
2019-06-22 20:20:28 +02:00
module main
2019-08-29 00:52:32 +02:00
import (
compiler
benchmark
2019-10-30 15:07:41 +01:00
os
2019-10-18 19:49:34 +02:00
//time
2019-08-29 00:52:32 +02:00
)
2019-06-22 20:20:28 +02:00
fn main() {
2019-10-18 19:49:34 +02:00
//t := time.ticks()
//defer { println(time.ticks() - t) }
2019-07-03 13:20:43 +02:00
// There's no `flags` module yet, so args have to be parsed manually
args := compiler.env_vflags_and_os_args()
options := args.filter(it.starts_with('-'))
//NB: commands should be explicitly set by the command line (os.args)
// NOT passed through VFLAGS, otherwise the naked `v` invocation for
// the repl does not work when you have VFLAGS with -cc or -cflags set
// which may be surprising to v users.
stuff_after_executable := os.args[1..]
commands := stuff_after_executable.filter(!it.starts_with('-'))
2019-06-22 20:20:28 +02:00
// Print the version and exit.
if '-v' in options || '--version' in options || 'version' in commands {
version_hash := compiler.vhash()
println('V $compiler.Version $version_hash')
2019-06-22 20:20:28 +02:00
return
}
else if '-h' in options || '--help' in options || 'help' in commands {
println(compiler.help_text)
return
}
else if 'translate' in commands {
2019-08-17 21:19:37 +02:00
println('Translating C to V will be available in V 0.3')
return
}
else if 'up' in commands {
compiler.launch_tool('vup')
2019-08-17 21:19:37 +02:00
return
}
else if 'search' in commands || 'install' in commands || 'update' in commands || 'remove' in commands {
compiler.launch_tool('vpm')
return
}
else if ('get' in commands) { // obsoleted
println('use `v install` to install modules from vpm.vlang.io ')
2019-08-17 21:19:37 +02:00
return
}
else if 'symlink' in commands {
compiler.create_symlink()
2019-08-27 18:35:48 +02:00
return
}
// TODO quit if the v compiler is too old
// u := os.file_last_mod_unix('v')
2019-06-22 22:00:38 +02:00
// If there's no tmp path with current version yet, the user must be using a pre-built package
//
2019-06-22 20:20:28 +02:00
// Just fmt and exit
else if 'fmt' in commands {
compiler.vfmt(args)
2019-06-22 20:20:28 +02:00
return
}
else if 'test' in commands {
compiler.launch_tool('vtest')
return
}
// No args? REPL
else if 'runrepl' in commands || commands.len == 0 || (args.len == 2 && args[1] == '-') {
compiler.launch_tool('vrepl')
return
}
// Generate the docs and exit
else if 'doc' in commands {
2019-10-30 15:07:41 +01:00
vexe := os.executable()
vdir := os.dir(os.executable())
os.chdir(vdir)
mod := args.last()
os.system('$vexe build module vlib/' + args.last())
txt := os.read_file('$compiler.v_modules_path/vlib/${mod}.vh') or {
panic(err)
}
2019-10-30 15:07:41 +01:00
println(txt)
exit(0)
2019-10-30 15:07:41 +01:00
// v.gen_doc_html_for_module(args.last())
}
else {
//println('unknown command/argument\n')
//println(compiler.help_text)
}
// Construct the V object from command line arguments
mut v := compiler.new_v(args)
if v.pref.is_verbose {
2019-06-22 20:20:28 +02:00
println(args)
}
2019-08-17 21:19:37 +02:00
if 'run' in args {
2019-08-09 22:37:31 +02:00
// always recompile for now, too error prone to skip recompilation otherwise
// for example for -repl usage, especially when piping lines to v
2019-08-17 21:19:37 +02:00
v.compile()
v.run_compiled_executable_and_exit()
}
2019-08-17 21:19:37 +02:00
mut tmark := benchmark.new_benchmark()
v.compile()
if v.pref.is_stats {
tmark.stop()
println( 'compilation took: ' + tmark.total_duration().str() + 'ms')
}
2019-08-17 21:19:37 +02:00
if v.pref.is_test {
v.run_compiled_executable_and_exit()
}
v.finalize_compilation()
}
2019-10-14 04:18:48 +02:00