aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/old/vlib/v/pref/should_compile.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/old/vlib/v/pref/should_compile.v')
-rw-r--r--v_windows/v/old/vlib/v/pref/should_compile.v217
1 files changed, 217 insertions, 0 deletions
diff --git a/v_windows/v/old/vlib/v/pref/should_compile.v b/v_windows/v/old/vlib/v/pref/should_compile.v
new file mode 100644
index 0000000..5f69fa4
--- /dev/null
+++ b/v_windows/v/old/vlib/v/pref/should_compile.v
@@ -0,0 +1,217 @@
+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 !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.is_js() && !prefs.should_compile_js(file) {
+ continue
+ }
+ if prefs.backend == .native && !prefs.should_compile_native(file) {
+ continue
+ }
+ if !prefs.backend.is_js() && !prefs.should_compile_asm(file) {
+ continue
+ }
+ if file.starts_with('.#') {
+ 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('>>> prefs: $prefs')
+ 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',
+ '_',
+ 'native.v',
+ '_',
+ ])
+ return res
+}
+
+pub fn (prefs &Preferences) should_compile_native(file string) bool {
+ // allow custom filtering for native backends,
+ // but if there are no other rules, default to the c backend rules
+ return prefs.should_compile_c(file)
+}
+
+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.is_bare && file.ends_with('.freestanding.v') {
+ return true
+ }
+ if prefs.os == .all {
+ return true
+ }
+ if prefs.backend != .native && file.ends_with('_native.v') {
+ return false
+ }
+ if prefs.os != .windows && (file.ends_with('_windows.c.v') || file.ends_with('_windows.v')) {
+ return false
+ }
+ if prefs.os != .linux && (file.ends_with('_linux.c.v') || file.ends_with('_linux.v')) {
+ return false
+ }
+ if prefs.os != .macos && (file.ends_with('_darwin.c.v') || file.ends_with('_darwin.v')) {
+ 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 prefs.os != .macos && (file.ends_with('_macos.c.v') || file.ends_with('_macos.v')) {
+ return false
+ }
+ if prefs.os == .windows && file.ends_with('_nix.c.v') {
+ return false
+ }
+ if prefs.os != .android && file.ends_with('_android.c.v') {
+ return false
+ }
+ if prefs.os != .freebsd && file.ends_with('_freebsd.c.v') {
+ return false
+ }
+ if prefs.os != .openbsd && file.ends_with('_openbsd.c.v') {
+ return false
+ }
+ if prefs.os != .netbsd && file.ends_with('_netbsd.c.v') {
+ return false
+ }
+ if prefs.os != .dragonfly && file.ends_with('_dragonfly.c.v') {
+ return false
+ }
+ if prefs.os != .solaris && file.ends_with('_solaris.c.v') {
+ return false
+ }
+ if prefs.os != .serenity && file.ends_with('_serenity.c.v') {
+ return false
+ }
+ if prefs.os != .vinix && file.ends_with('_vinix.c.v') {
+ 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
+}