all: fix current module in build-module mode
parent
b58b15993c
commit
3c1427a4e8
|
@ -176,8 +176,8 @@ fn (mut v Builder) cc() {
|
||||||
verror('-fast is only supported on Linux right now')
|
verror('-fast is only supported on Linux right now')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !v.pref.is_shared && v.pref.build_mode != .build_module &&
|
if !v.pref.is_shared && v.pref.build_mode != .build_module && os.user_os() == 'windows' &&
|
||||||
os.user_os() == 'windows' && !v.pref.out_name.ends_with('.exe') {
|
!v.pref.out_name.ends_with('.exe') {
|
||||||
v.pref.out_name += '.exe'
|
v.pref.out_name += '.exe'
|
||||||
}
|
}
|
||||||
// linux_host := os.user_os() == 'linux'
|
// linux_host := os.user_os() == 'linux'
|
||||||
|
@ -199,13 +199,15 @@ fn (mut v Builder) cc() {
|
||||||
}
|
}
|
||||||
if v.pref.build_mode == .build_module {
|
if v.pref.build_mode == .build_module {
|
||||||
// Create the modules & out directory if it's not there.
|
// Create the modules & out directory if it's not there.
|
||||||
mut out_dir := if v.pref.path.starts_with('vlib') { '$pref.default_module_path${os.path_separator}cache$os.path_separator$v.pref.path' } else { '$pref.default_module_path$os.path_separator$v.pref.path' }
|
mut out_dir := if v.pref.path.starts_with('vlib') { '$pref.default_module_path${os.path_separator}cache$os.path_separator$v.pref.path' } else { '$pref.default_module_path${os.path_separator}cache/$v.pref.path' }
|
||||||
pdir := out_dir.all_before_last(os.path_separator)
|
pdir := out_dir.all_before_last(os.path_separator)
|
||||||
if !os.is_dir(pdir) {
|
if !os.is_dir(pdir) {
|
||||||
os.mkdir_all(pdir)
|
os.mkdir_all(pdir)
|
||||||
}
|
}
|
||||||
v.pref.out_name = '${out_dir}.o' // v.out_name
|
v.pref.out_name = '${out_dir}.o' // v.out_name
|
||||||
println('Building ${v.pref.out_name}...')
|
println('Building ${v.pref.out_name}...')
|
||||||
|
// println('v.table.imports:')
|
||||||
|
// println(v.table.imports)
|
||||||
}
|
}
|
||||||
debug_mode := v.pref.is_debug
|
debug_mode := v.pref.is_debug
|
||||||
mut debug_options := '-g3'
|
mut debug_options := '-g3'
|
||||||
|
@ -290,7 +292,14 @@ fn (mut v Builder) cc() {
|
||||||
os.system('$vexe build module vlib${os.path_separator}builtin')
|
os.system('$vexe build module vlib${os.path_separator}builtin')
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
// TODO add `.unique()` to V arrays
|
||||||
|
mut unique_imports := []string{cap: v.table.imports.len}
|
||||||
for imp in v.table.imports {
|
for imp in v.table.imports {
|
||||||
|
if imp !in unique_imports {
|
||||||
|
unique_imports << imp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for imp in unique_imports {
|
||||||
if imp.contains('vweb') {
|
if imp.contains('vweb') {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -385,8 +394,8 @@ fn (mut v Builder) cc() {
|
||||||
}
|
}
|
||||||
// Without these libs compilation will fail on Linux
|
// Without these libs compilation will fail on Linux
|
||||||
// || os.user_os() == 'linux'
|
// || os.user_os() == 'linux'
|
||||||
if !v.pref.is_bare && v.pref.build_mode != .build_module &&
|
if !v.pref.is_bare && v.pref.build_mode != .build_module && v.pref.os in
|
||||||
v.pref.os in [.linux, .freebsd, .openbsd, .netbsd, .dragonfly, .solaris, .haiku] {
|
[.linux, .freebsd, .openbsd, .netbsd, .dragonfly, .solaris, .haiku] {
|
||||||
linker_flags << '-lm'
|
linker_flags << '-lm'
|
||||||
linker_flags << '-lpthread'
|
linker_flags << '-lpthread'
|
||||||
// -ldl is a Linux only thing. BSDs have it in libc.
|
// -ldl is a Linux only thing. BSDs have it in libc.
|
||||||
|
@ -529,7 +538,8 @@ fn (mut v Builder) cc() {
|
||||||
println('install upx with `brew install upx`')
|
println('install upx with `brew install upx`')
|
||||||
}
|
}
|
||||||
$if linux {
|
$if linux {
|
||||||
println('install upx\n' + 'for example, on Debian/Ubuntu run `sudo apt install upx`')
|
println('install upx\n' +
|
||||||
|
'for example, on Debian/Ubuntu run `sudo apt install upx`')
|
||||||
}
|
}
|
||||||
$if windows {
|
$if windows {
|
||||||
// :)
|
// :)
|
||||||
|
|
|
@ -132,7 +132,7 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string
|
||||||
fn_decl: 0
|
fn_decl: 0
|
||||||
autofree: true
|
autofree: true
|
||||||
indent: -1
|
indent: -1
|
||||||
module_built: pref.path.after('vlib/')
|
module_built: pref.path.after('vlib/').replace('/', '.')
|
||||||
}
|
}
|
||||||
for mod in g.table.modules {
|
for mod in g.table.modules {
|
||||||
g.inits[mod] = strings.new_builder(100)
|
g.inits[mod] = strings.new_builder(100)
|
||||||
|
@ -740,6 +740,7 @@ fn (mut g Gen) stmt(node ast.Stmt) {
|
||||||
if !node.name.starts_with(g.module_built + '.') && node.mod != g.module_built.after('/') {
|
if !node.name.starts_with(g.module_built + '.') && node.mod != g.module_built.after('/') {
|
||||||
// Skip functions that don't have to be generated
|
// Skip functions that don't have to be generated
|
||||||
// for this module.
|
// for this module.
|
||||||
|
println('skip bm $node.name mode=$node.mod module_built=$g.module_built')
|
||||||
skip = true
|
skip = true
|
||||||
}
|
}
|
||||||
if g.is_builtin_mod && g.module_built == 'builtin' {
|
if g.is_builtin_mod && g.module_built == 'builtin' {
|
||||||
|
|
|
@ -7,6 +7,9 @@ import v.ast
|
||||||
import v.table
|
import v.table
|
||||||
import v.util
|
import v.util
|
||||||
|
|
||||||
|
pub fn kek_cheburek() {
|
||||||
|
}
|
||||||
|
|
||||||
fn (mut g Gen) gen_fn_decl(it ast.FnDecl, skip bool) {
|
fn (mut g Gen) gen_fn_decl(it ast.FnDecl, skip bool) {
|
||||||
if it.language == .c {
|
if it.language == .c {
|
||||||
// || it.no_body {
|
// || it.no_body {
|
||||||
|
@ -277,9 +280,8 @@ fn (mut g Gen) call_expr(node ast.CallExpr) {
|
||||||
g.write('$styp $tmp_opt = ')
|
g.write('$styp $tmp_opt = ')
|
||||||
}
|
}
|
||||||
if node.is_method && !node.is_field {
|
if node.is_method && !node.is_field {
|
||||||
if node.name == 'writeln' && g.pref.experimental &&
|
if node.name == 'writeln' && g.pref.experimental && node.args.len > 0 && node.args[0].expr is
|
||||||
node.args.len > 0 && node.args[0].expr is ast.StringInterLiteral &&
|
ast.StringInterLiteral && g.table.get_type_symbol(node.receiver_type).name == 'strings.Builder' {
|
||||||
g.table.get_type_symbol(node.receiver_type).name == 'strings.Builder' {
|
|
||||||
g.string_inter_literal_sb_optimized(node)
|
g.string_inter_literal_sb_optimized(node)
|
||||||
} else {
|
} else {
|
||||||
g.method_call(node)
|
g.method_call(node)
|
||||||
|
|
|
@ -9,6 +9,7 @@ pub fn (p &Parser) known_import(mod string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (p &Parser) prepend_mod(name string) string {
|
fn (p &Parser) prepend_mod(name string) string {
|
||||||
|
// println('prepend_mod() name=$name p.mod=$p.mod expr_mod=$p.expr_mod')
|
||||||
if p.expr_mod != '' {
|
if p.expr_mod != '' {
|
||||||
return p.expr_mod + '.' + name
|
return p.expr_mod + '.' + name
|
||||||
}
|
}
|
||||||
|
|
|
@ -1342,7 +1342,20 @@ fn (mut p Parser) module_decl() ast.Module {
|
||||||
}
|
}
|
||||||
module_pos = module_pos.extend(pos)
|
module_pos = module_pos.extend(pos)
|
||||||
}
|
}
|
||||||
full_mod := p.table.qualify_module(name, p.file_name)
|
mut full_mod := p.table.qualify_module(name, p.file_name)
|
||||||
|
if p.pref.build_mode == .build_module && !full_mod.contains('.') {
|
||||||
|
// A hack to make building vlib modules work
|
||||||
|
// `v build-module v.gen` will result in `full_mod = "gen"`, not "v.gen",
|
||||||
|
// because the module being built
|
||||||
|
// is not imported.
|
||||||
|
// So here we fetch the name of the module by looking at the path that's being built.
|
||||||
|
word := p.pref.path.after('/')
|
||||||
|
if full_mod == word {
|
||||||
|
full_mod = p.pref.path.after('vlib/').replace('/', '.')
|
||||||
|
// println('new full mod =$full_mod')
|
||||||
|
}
|
||||||
|
// println('file_name=$p.file_name path=$p.pref.path')
|
||||||
|
}
|
||||||
p.mod = full_mod
|
p.mod = full_mod
|
||||||
p.builtin_mod = p.mod == 'builtin'
|
p.builtin_mod = p.mod == 'builtin'
|
||||||
return ast.Module{
|
return ast.Module{
|
||||||
|
|
|
@ -489,6 +489,7 @@ pub fn (t &Table) mktyp(typ Type) Type {
|
||||||
// this is not optimal
|
// this is not optimal
|
||||||
pub fn (table &Table) qualify_module(mod, file_path string) string {
|
pub fn (table &Table) qualify_module(mod, file_path string) string {
|
||||||
for m in table.imports {
|
for m in table.imports {
|
||||||
|
//if m.contains('gen') { println('qm=$m') }
|
||||||
if m.contains('.') && m.contains(mod) {
|
if m.contains('.') && m.contains(mod) {
|
||||||
m_parts := m.split('.')
|
m_parts := m.split('.')
|
||||||
m_path := m_parts.join(os.path_separator)
|
m_path := m_parts.join(os.path_separator)
|
||||||
|
|
Loading…
Reference in New Issue