v/v.v

140 lines
3.3 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
filepath
// v.types
2019-12-19 22:29:37 +01:00
// time
2019-08-29 00:52:32 +02:00
)
2019-06-22 20:20:28 +02:00
2019-12-15 02:51:18 +01:00
const (
known_commands = ['run', 'build', 'version', 'doc']
simple_tools = ['fmt',
'up',
'create',
'test', 'test-fmt', 'test-compiler',
'bin2v',
'repl',
'build-tools', 'build-examples', 'build-vbinaries']
2019-12-15 02:51:18 +01:00
)
2019-06-22 20:20:28 +02:00
fn main() {
2019-12-30 09:23:17 +01:00
is_verbose := '-verbose' in os.args || '--verbose' in os.args
2019-12-19 22:29:37 +01:00
// t := time.ticks()
// defer { println(time.ticks() - t) }
args := compiler.env_vflags_and_os_args()
2019-12-30 09:23:17 +01:00
options,command := compiler.get_v_options_and_main_command(args)
if is_verbose {
eprintln('v args: $args')
eprintln('v command: $command')
eprintln('v options: $options')
}
2019-12-15 02:51:18 +01:00
// external tool
if command in simple_tools {
compiler.launch_tool('v' + command, command)
2019-12-15 02:51:18 +01:00
return
}
// v run, v doc, etc
2019-12-15 03:51:00 +01:00
if !command.starts_with('-') && !command.ends_with('.v') && !os.exists(command) {
2019-12-15 02:51:18 +01:00
v_command(command, args)
2019-12-01 10:50:13 +01:00
}
2019-06-22 20:20:28 +02:00
// Print the version and exit.
2019-12-15 02:51:18 +01:00
if '-v' in options || '--version' in options {
version_hash := compiler.vhash()
println('V $compiler.Version $version_hash')
2019-06-22 20:20:28 +02:00
return
}
2019-12-15 02:51:18 +01:00
else if '-h' in options || '--help' in options {
println(compiler.help_text)
return
}
// No args? REPL
2019-12-15 02:51:18 +01:00
else if command == '' || (args.len == 2 && args[1] == '-') {
compiler.launch_tool('vrepl', '')
return
}
// 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-12-15 02:51:18 +01:00
if command == 'run' {
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()
}
mut tmark := benchmark.new_benchmark()
2019-11-19 07:53:52 +01:00
if v.pref.x64 {
v.compile_x64()
2019-12-19 22:29:37 +01:00
}
2019-12-31 19:42:16 +01:00
else if v.pref.v2 {
v.compile2()
}
2019-12-19 22:29:37 +01:00
else {
2019-11-19 07:53:52 +01:00
v.compile()
}
if v.pref.is_stats {
tmark.stop()
2019-12-15 02:51:18 +01:00
println('compilation took: ' + tmark.total_duration().str() + 'ms')
}
if v.pref.is_test {
v.run_compiled_executable_and_exit()
}
v.finalize_compilation()
}
2019-10-14 04:18:48 +02:00
2019-12-15 02:51:18 +01:00
fn v_command(command string, args []string) {
match command {
2019-12-19 22:29:37 +01:00
'', '.', 'run', 'build' {
// handled later in vlib/compiler/main.v
2019-12-15 03:44:34 +01:00
return
2019-12-15 02:51:18 +01:00
}
'version' {
println('V $compiler.Version $compiler.vhash()')
}
'help' {
println(compiler.help_text)
}
'translate' {
println('Translating C to V will be available in V 0.3 (January)')
}
'search', 'install', 'update', 'remove' {
compiler.launch_tool('vpm', command)
2019-12-15 02:51:18 +01:00
}
'get' {
println('use `v install` to install modules from vpm.vlang.io ')
}
'symlink' {
compiler.create_symlink()
}
'runrepl' {
//TODO: remove this after 2020/02/01
eprintln('`v runrepl` has been deprecated. Please use `v repl` instead.')
compiler.launch_tool('vrepl', 'runrepl')
2019-12-15 02:51:18 +01:00
}
'doc' {
vexe := os.executable()
2019-12-23 11:09:22 +01:00
vdir := filepath.dir(os.executable())
2019-12-15 02:51:18 +01:00
os.chdir(vdir)
mod := args.last()
os.system('$vexe build module vlib$os.path_separator' + args.last())
vhfile := filepath.join(compiler.v_modules_path,'vlib','${mod}.vh')
2019-12-30 09:23:17 +01:00
txt := os.read_file(vhfile) or {
panic(err)
}
2019-12-15 02:51:18 +01:00
println(txt)
// v.gen_doc_html_for_module(args.last())
}
else {
panic('v $command: unknown command\nRun "v help" for usage.')
}
}
2019-12-15 03:44:34 +01:00
exit(0)
2019-12-15 02:51:18 +01:00
}