diff --git a/vlib/v/pref/should_compile.v b/vlib/v/pref/should_compile.v index c1ba4c9ba0..2a71c51dfb 100644 --- a/vlib/v/pref/should_compile.v +++ b/vlib/v/pref/should_compile.v @@ -6,6 +6,7 @@ pub fn (prefs &Preferences) should_compile_filtered_files(dir string, files_ []s mut res := []string{} mut files := files_.clone() files.sort() + mut all_v_files := []string{} for file in files { if !file.ends_with('.v') && !file.ends_with('.vh') { continue @@ -32,8 +33,65 @@ pub fn (prefs &Preferences) should_compile_filtered_files(dir string, files_ []s continue } } - res << os.join_path(dir, file) + all_v_files << os.join_path(dir, file) } + // + mut defaults := []string{} + mut fnames_no_postfixes := map[string][]string{} + for file in all_v_files { + if file.contains('default.c.v') { + defaults << file + } else { + res << file + no_postfix_key := fname_without_platform_postfix(file) + mut candidates := fnames_no_postfixes[no_postfix_key] + candidates << file + fnames_no_postfixes[no_postfix_key] = candidates + } + } + for file in defaults { + no_postfix_key := fname_without_platform_postfix(file) + if no_postfix_key in fnames_no_postfixes { + if prefs.is_verbose { + println('>>> should_compile_filtered_files: skipping _default.c.v file $file ; the specialized versions are: ${fnames_no_postfixes[no_postfix_key]}') + } + continue + } + res << file + } + if prefs.is_verbose { + println('>>> should_compile_filtered_files: res: $res') + } + return res +} + +fn fname_without_platform_postfix(file string) string { + res := file.replace_each([ + 'default.c.v', + '_', + 'nix.c.v', + '_', + 'windows.c.v', + '_', + 'linux.c.v', + '_', + 'darwin.c.v', + '_', + 'macos.c.v', + '_', + 'android.c.v', + '_', + 'freebsd.c.v', + '_', + 'netbsd.c.v', + '_', + 'dragonfly.c.v', + '_', + 'solaris.c.v', + '_', + 'x64.v', + '_', + ]) return res }