diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index 8a44870da3..d96b5c1890 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -292,47 +292,58 @@ fn (mut v Builder) cc() { if v.pref.build_mode == .build_module { args << '-c' } else if v.pref.use_cache { - /* - QTODO - builtin_o_path := os.join_path(pref.default_module_path, 'cache', 'vlib', 'builtin.o') - args << builtin_o_path.replace('builtin.o', 'strconv.o') // TODO hack no idea why this is needed - if os.exists(builtin_o_path) { - libs = builtin_o_path + mut built_modules := []string{} + builtin_obj_path := pref.default_module_path + os.path_separator + 'cache' + os.path_separator + 'vlib' + os.path_separator + 'builtin.o' + if !os.exists(builtin_obj_path) { + os.system('$vexe build-module vlib/builtin') } - else { - println('$builtin_o_path not found... building module 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 { - if imp !in unique_imports { - unique_imports << imp - } - } - for imp in unique_imports { - if imp.contains('vweb') { - continue - } - // not working - if imp == 'webview' { - continue - } - // println('cache: import "$imp"') - imp_path := imp.replace('.', os.path_separator) - path := '$pref.default_module_path${os.path_separator}cache${os.path_separator}vlib$os.path_separator${imp_path}.o' - // println('adding ${imp_path}.o') - if os.exists(path) { - libs += ' ' + path - } else { - println('$path not found... building module $imp') - os.system('$vexe build-module vlib$os.path_separator$imp_path') - } - if path.ends_with('vlib/ui.o') { - args << '-framework Cocoa -framework Carbon' + libs += ' ' + builtin_obj_path + for ast_file in v.parsed_files { + for imp_stmt in ast_file.imports { + imp := imp_stmt.mod + if imp in built_modules { + continue + } + // not working + if imp == 'webview' { + continue + } + // println('cache: import "$imp"') + mod_path := imp.replace('.', os.path_separator) + + // TODO: to get import path all imports (even relative) we can use: + // import_path := v.find_module_path(imp, ast_file.path) or { + // verror('cannot import module "$imp" (not found)') + // break + // } + + // The problem is cmd/v is in module main and imports + // the relative module named help, which is built as cmd.v.help not help + // currently this got this workign by building into main, see ast.FnDecl in cgen + if imp == 'help' { + continue + } + // we are skipping help manually above, this code will skip all relative imports + // if os.is_dir(af_base_dir + os.path_separator + mod_path) { + // continue + // } + + imp_path := 'vlib' + os.path_separator + mod_path + cache_path := pref.default_module_path + os.path_separator + 'cache' + obj_path := cache_path + os.path_separator + '${imp_path}.o' + if os.exists(obj_path) { + libs += ' ' + obj_path + } else { + println('$obj_path not found... building module $imp') + os.system('$vexe build-module $imp_path') + } + if obj_path.ends_with('vlib/ui.o') { + args << '-framework Cocoa -framework Carbon' + } + built_modules << imp } } + } if v.pref.sanitize { args << '-fsanitize=leak' @@ -386,19 +397,20 @@ fn (mut v Builder) cc() { args << '-fpermissive' args << '-w' } + // TODO: why is this duplicated from above? if v.pref.use_cache { // vexe := pref.vexe_path() - cached_modules := ['builtin', 'os', 'math', 'strconv', 'strings', 'hash'] // , 'strconv.ftoa'] - for cfile in cached_modules { - ofile := os.join_path(pref.default_module_path, 'cache', 'vlib', cfile.replace('.', '/') + - '.o') - if !os.exists(ofile) { - println('${cfile}.o is missing. Building...') - println('$vexe build-module vlib/$cfile') - os.system('$vexe build-module vlib/$cfile') - } - args << ofile - } + // cached_modules := ['builtin', 'os', 'math', 'strconv', 'strings', 'hash'], // , 'strconv.ftoa'] + // for cfile in cached_modules { + // ofile := os.join_path(pref.default_module_path, 'cache', 'vlib', cfile.replace('.', '/') + + // '.o') + // if !os.exists(ofile) { + // println('${cfile}.o is missing. Building...') + // println('$vexe build-module vlib/$cfile') + // os.system('$vexe build-module vlib/$cfile') + // } + // args << ofile + // } if !is_cc_tcc { $if linux { linker_flags << '-Xlinker -z' diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index e7dd915d75..e91300ff51 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -755,7 +755,7 @@ fn (mut g Gen) stmt(node ast.Stmt) { if g.pref.use_cache { // We are using prebuilt modules, we do not need to generate // their functions in main.c. - if node.mod != 'main' { + if node.mod != 'main' && node.mod != 'help' { skip = true } }