diff options
| author | Damian Tarnawski <gthetarnav@gmail.com> | 2024-08-29 23:02:49 +0200 |
|---|---|---|
| committer | Damian Tarnawski <gthetarnav@gmail.com> | 2024-08-29 23:02:49 +0200 |
| commit | a28d574272c1deb294f5ec8a30eeb6581601a71a (patch) | |
| tree | b273f39d66aa4fc26df27bdb474d9fad2e31a1a7 /core | |
| parent | f93779d4257af2535ac4e1089a3c5932c33fd3f9 (diff) | |
Add and test match_build_tags
Diffstat (limited to 'core')
| -rw-r--r-- | core/odin/parser/file_tags.odin | 32 |
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 +} |