v/vlib/v/pref/should_compile.v

199 lines
4.6 KiB
V

module pref
import os
pub fn (prefs &Preferences) should_compile_filtered_files(dir string, files_ []string) []string {
mut res := []string{}
mut files := files_.clone()
files.sort()
mut all_v_files := []string{}
for file in files {
if prefs.is_bare && os.join_path(dir, file).ends_with('/vlib/builtin/builtin_nix.c.v') {
continue
}
if !file.ends_with('.v') && !file.ends_with('.vh') {
continue
}
if file.ends_with('_test.v')
|| file.all_before_last('.v').all_before_last('.').ends_with('_test') {
continue
}
if prefs.backend == .c && !prefs.should_compile_c(file) {
continue
}
if prefs.backend == .js && !prefs.should_compile_js(file) {
continue
}
if prefs.backend != .js && !prefs.should_compile_asm(file) {
continue
}
if file.contains('_d_') {
if prefs.compile_defines_all.len == 0 {
continue
}
mut allowed := false
for cdefine in prefs.compile_defines {
file_postfix := '_d_${cdefine}.v'
if file.ends_with(file_postfix) {
allowed = true
break
}
}
if !allowed {
continue
}
}
if file.contains('_notd_') {
mut allowed := true
for cdefine in prefs.compile_defines {
file_postfix := '_notd_${cdefine}.v'
if file.ends_with(file_postfix) {
allowed = false
break
}
}
if !allowed {
continue
}
}
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
}
pub fn (prefs &Preferences) should_compile_c(file string) bool {
if file.ends_with('.js.v') {
// Probably something like `a.js.v`.
return false
}
if prefs.os == .all {
return true
}
if !prefs.is_bare && file.ends_with('.freestanding.v') {
return false
}
if (file.ends_with('_windows.c.v') || file.ends_with('_windows.v')) && prefs.os != .windows {
return false
}
if (file.ends_with('_linux.c.v') || file.ends_with('_linux.v')) && prefs.os != .linux {
return false
}
if (file.ends_with('_darwin.c.v') || file.ends_with('_darwin.v')) && prefs.os != .macos {
return false
}
if (file.ends_with('_macos.c.v') || file.ends_with('_macos.v')) && prefs.os != .macos {
return false
}
if (file.ends_with('_ios.c.v') || file.ends_with('_ios.v')) && prefs.os != .ios {
return false
}
if file.ends_with('_nix.c.v') && prefs.os == .windows {
return false
}
if file.ends_with('_android.c.v') && prefs.os != .android {
return false
}
if file.ends_with('_freebsd.c.v') && prefs.os != .freebsd {
return false
}
if file.ends_with('_openbsd.c.v') && prefs.os != .openbsd {
return false
}
if file.ends_with('_netbsd.c.v') && prefs.os != .netbsd {
return false
}
if file.ends_with('_dragonfly.c.v') && prefs.os != .dragonfly {
return false
}
if file.ends_with('_solaris.c.v') && prefs.os != .solaris {
return false
}
if file.ends_with('_x64.v') && prefs.backend != .x64 {
return false
}
return true
}
pub fn (prefs &Preferences) should_compile_asm(path string) bool {
if path.count('.') != 2 || path.ends_with('c.v') || path.ends_with('js.v') {
return true
}
file := path.all_before_last('.v')
arch := arch_from_string(file.all_after_last('.')) or { Arch._auto }
if arch != prefs.arch && prefs.arch != ._auto && arch != ._auto {
return false
}
os := os_from_string(file.all_after_last('_').all_before('.')) or { OS._auto }
if os != prefs.os && prefs.os != ._auto && os != ._auto {
return false
}
return true
}
pub fn (prefs &Preferences) should_compile_js(file string) bool {
if !file.ends_with('.js.v') && file.split('.').len > 2 {
// Probably something like `a.c.v`.
return false
}
return true
}