aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorDamian Tarnawski <gthetarnav@gmail.com>2024-08-29 23:02:49 +0200
committerDamian Tarnawski <gthetarnav@gmail.com>2024-08-29 23:02:49 +0200
commita28d574272c1deb294f5ec8a30eeb6581601a71a (patch)
treeb273f39d66aa4fc26df27bdb474d9fad2e31a1a7 /core
parentf93779d4257af2535ac4e1089a3c5932c33fd3f9 (diff)
Add and test match_build_tags
Diffstat (limited to 'core')
-rw-r--r--core/odin/parser/file_tags.odin32
1 files changed, 32 insertions, 0 deletions
diff --git a/core/odin/parser/file_tags.odin b/core/odin/parser/file_tags.odin
index 514e1b046..b12c3b5fd 100644
--- a/core/odin/parser/file_tags.odin
+++ b/core/odin/parser/file_tags.odin
@@ -205,3 +205,35 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags
return
}
+
+Build_Target :: struct {
+ os: runtime.Odin_OS_Type,
+ arch: runtime.Odin_Arch_Type,
+ project_name: string,
+}
+
+@require_results
+match_build_tags :: proc(file_tags: File_Tags, target: Build_Target) -> bool {
+
+ project_name_correct := len(target.project_name) == 0 || len(file_tags.build_project_name) == 0
+
+ for group in file_tags.build_project_name {
+ group_correct := true
+ for name in group {
+ if name[0] == '!' {
+ group_correct &&= target.project_name != name[1:]
+ } else {
+ group_correct &&= target.project_name == name
+ }
+ }
+ project_name_correct ||= group_correct
+ }
+
+ os_and_arch_correct := len(file_tags.build) == 0
+
+ for kind in file_tags.build {
+ os_and_arch_correct ||= target.os in kind.os && target.arch in kind.arch
+ }
+
+ return !file_tags.ignore && project_name_correct && os_and_arch_correct
+}