compiler: cached modules - windows fixes & organise cached module path (#2302)

compiler: cached modules - windows fixes & organise cached module path (#2302)
pull/2303/head^2
joe-conigliaro 2019-10-12 16:41:41 +11:00 committed by GitHub
parent dd053d79b0
commit 40156392f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 41 additions and 39 deletions

View File

@ -64,17 +64,14 @@ fn (v mut V) 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.
out_dir := '$v_modules_path${os.PathSeparator}$v.dir' mut out_dir := if v.dir.starts_with('vlib') {
if !os.dir_exists(out_dir) { '$v_modules_path${os.PathSeparator}cache${os.PathSeparator}$v.dir'
// create recursive } else {
mut mkpath := v_modules_path '$v_modules_path${os.PathSeparator}$v.dir'
for subdir in v.dir.split(os.PathSeparator) { }
mkpath += os.PathSeparator + subdir pdir := out_dir.all_before_last(os.PathSeparator)
if !os.dir_exists(mkpath) { if !os.dir_exists(pdir) {
os.mkdir(mkpath) os.mkdir_all(pdir)
}
}
//os.mkdir(out_dir)
} }
v.out_name = '${out_dir}.o' //v.out_name v.out_name = '${out_dir}.o' //v.out_name
println('Building ${v.out_name}...') println('Building ${v.out_name}...')
@ -120,25 +117,25 @@ fn (v mut V) cc() {
} }
else if v.pref.is_debug { else if v.pref.is_debug {
vexe := os.executable() vexe := os.executable()
builtin_o_path := '$v_modules_path/cache/builtin.o' builtin_o_path := '$v_modules_path${os.PathSeparator}cache${os.PathSeparator}vlib${os.PathSeparator}builtin.o'
if os.file_exists(builtin_o_path) { if os.file_exists(builtin_o_path) {
libs = builtin_o_path libs = builtin_o_path
} else { } else {
println('$builtin_o_path not found... building module builtin') println('$builtin_o_path not found... building module builtin')
os.system('$vexe build module vlib/builtin') os.system('$vexe build module vlib${os.PathSeparator}builtin')
} }
for imp in v.table.imports { for imp in v.table.imports {
if imp.contains('vweb') { continue } // not working if imp.contains('vweb') { continue } // not working
if imp == 'webview' { continue } if imp == 'webview' { continue }
imp_path := imp.replace('.', os.PathSeparator) imp_path := imp.replace('.', os.PathSeparator)
path := '$v_modules_path/cache/${imp_path}.o' path := '$v_modules_path${os.PathSeparator}cache${os.PathSeparator}vlib${os.PathSeparator}${imp_path}.o'
println('adding ${imp_path}.o') println('adding ${imp_path}.o')
if os.file_exists(path) { if os.file_exists(path) {
libs += ' ' + path libs += ' ' + path
} else { } else {
println('$path not found... building module $imp') println('$path not found... building module $imp')
os.system('$vexe build module vlib/$imp_path') os.system('$vexe build module vlib${os.PathSeparator}$imp_path')
} }
} }
} }

View File

@ -94,13 +94,6 @@ CommonCHeaders = '
#define OPTION_CAST(x) #define OPTION_CAST(x)
#endif #endif
void pthread_mutex_lock(HANDLE *m) {
WaitForSingleObject(*m, INFINITE);
}
void pthread_mutex_unlock(HANDLE *m) {
ReleaseMutex(*m);
}
#else #else
#include <pthread.h> #include <pthread.h>
#endif #endif

View File

@ -131,6 +131,14 @@ int load_so(byteptr path) {
} }
else { else {
cgen.genln(' cgen.genln('
void pthread_mutex_lock(HANDLE *m) {
WaitForSingleObject(*m, INFINITE);
}
void pthread_mutex_unlock(HANDLE *m) {
ReleaseMutex(*m);
}
void* live_lib=0; void* live_lib=0;
int load_so(byteptr path) { int load_so(byteptr path) {
char cpath[1024]; char cpath[1024];

View File

@ -400,6 +400,9 @@ fn (v mut V) generate_init() {
if v.pref.build_mode == .default_mode { if v.pref.build_mode == .default_mode {
mut call_mod_init := '' mut call_mod_init := ''
mut call_mod_init_consts := '' mut call_mod_init_consts := ''
if 'builtin' in v.cached_mods {
call_mod_init_consts += 'builtin__init_consts();\n'
}
for mod in v.table.imports { for mod in v.table.imports {
init_fn_name := mod_gen_name(mod) + '__init' init_fn_name := mod_gen_name(mod) + '__init'
if v.table.known_fn(init_fn_name) { if v.table.known_fn(init_fn_name) {
@ -610,8 +613,9 @@ fn (v &V) v_files_from_dir(dir string) []string {
fn (v mut V) add_v_files_to_compile() { fn (v mut V) add_v_files_to_compile() {
mut builtin_files := v.get_builtin_files() mut builtin_files := v.get_builtin_files()
// Builtin cache exists? Use it. // Builtin cache exists? Use it.
builtin_vh := '$v_modules_path${os.PathSeparator}builtin.vh' builtin_vh := '$v_modules_path${os.PathSeparator}vlib${os.PathSeparator}builtin.vh'
if v.pref.is_debug && os.file_exists(builtin_vh) { if v.pref.is_debug && os.file_exists(builtin_vh) {
v.cached_mods << 'builtin'
builtin_files = [builtin_vh] builtin_files = [builtin_vh]
} }
// Parse builtin imports // Parse builtin imports
@ -653,7 +657,7 @@ fn (v mut V) add_v_files_to_compile() {
// use cached built module if exists // use cached built module if exists
if v.pref.build_mode != .build_module && !mod.contains('vweb') { if v.pref.build_mode != .build_module && !mod.contains('vweb') {
mod_path := mod.replace('.', os.PathSeparator) mod_path := mod.replace('.', os.PathSeparator)
vh_path := '$v_modules_path/${mod_path}.vh' vh_path := '$v_modules_path${os.PathSeparator}vlib${os.PathSeparator}${mod_path}.vh'
if v.pref.is_debug && os.file_exists(vh_path) { if v.pref.is_debug && os.file_exists(vh_path) {
println('using cached module `$mod`: $vh_path') println('using cached module `$mod`: $vh_path')
v.cached_mods << mod v.cached_mods << mod
@ -822,6 +826,9 @@ fn new_v(args[]string) &V {
if dir.ends_with(os.PathSeparator) { if dir.ends_with(os.PathSeparator) {
dir = dir.all_before_last(os.PathSeparator) dir = dir.all_before_last(os.PathSeparator)
} }
if dir.starts_with('.$os.PathSeparator') {
dir = dir.right(2)
}
adir := os.realpath(dir) adir := os.realpath(dir)
if args.len < 2 { if args.len < 2 {
dir = '' dir = ''
@ -918,7 +925,7 @@ fn new_v(args[]string) &V {
println('Go to https://vlang.io to install V.') println('Go to https://vlang.io to install V.')
exit(1) exit(1)
} }
//println('out_name:$out_name') // println('out_name:$out_name')
mut out_name_c := os.realpath('${out_name}.tmp.c') mut out_name_c := os.realpath('${out_name}.tmp.c')
cflags := get_cmdline_cflags(args) cflags := get_cmdline_cflags(args)

View File

@ -107,17 +107,15 @@ fn v_type_str(typ_ string) string {
fn (v &V) generate_vh() { fn (v &V) generate_vh() {
println('\n\n\n\nGenerating a V header file for module `$v.mod`') println('\n\n\n\nGenerating a V header file for module `$v.mod`')
mod_path := v.mod.replace('.', os.PathSeparator) mod_path := v.mod.replace('.', os.PathSeparator)
dir := '$v_modules_path${os.PathSeparator}$mod_path' dir := if v.dir.starts_with('vlib') {
'$v_modules_path${os.PathSeparator}$v.dir'
} else {
'$v_modules_path${os.PathSeparator}$mod_path'
}
path := dir + '.vh' path := dir + '.vh'
if !os.dir_exists(dir) { pdir := dir.all_before_last(os.PathSeparator)
// create recursive if !os.dir_exists(pdir) {
mut mkpath := v_modules_path os.mkdir_all(pdir)
for subdir in mod_path.split(os.PathSeparator) {
mkpath += os.PathSeparator + subdir
if !os.dir_exists(mkpath) {
os.mkdir(mkpath)
}
}
// os.mkdir(os.realpath(dir)) // os.mkdir(os.realpath(dir))
} }
file := os.create(path) or { panic(err) } file := os.create(path) or { panic(err) }

View File

@ -859,12 +859,11 @@ pub fn print_backtrace() {
} }
pub fn mkdir_all(path string) { pub fn mkdir_all(path string) {
mut p := '' mut p := if path.starts_with(os.PathSeparator) { os.PathSeparator } else { '' }
for subdir in path.split(os.PathSeparator) { for subdir in path.split(os.PathSeparator) {
p += os.PathSeparator + subdir p += subdir + os.PathSeparator
if !os.dir_exists(p) { if !os.dir_exists(p) {
os.mkdir(p) os.mkdir(p)
} }
} }
} }