aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-06-28 11:44:05 +0100
committergingerBill <bill@gingerbill.org>2024-06-28 11:44:39 +0100
commit17efb87eef5c24bdc95da8b2406e4bde13941251 (patch)
treec1ec168e7d03efcf738d83e82c58392a9f582116 /src
parent1747fdc3f0a88ddf851c5b2a58c4f2e04e532b84 (diff)
Add `-custom-attribute`
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp4
-rw-r--r--src/checker.cpp5
-rw-r--r--src/main.cpp34
3 files changed, 41 insertions, 2 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index 1988e9cac..4b348256b 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -862,6 +862,8 @@ struct BuildContext {
bool keep_object_files;
bool disallow_do;
+ StringSet custom_attributes;
+
bool strict_style;
bool ignore_warnings;
@@ -1882,6 +1884,8 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
bc->thread_count = gb_max(bc->affinity.thread_count, 1);
}
+ string_set_init(&bc->custom_attributes);
+
bc->ODIN_VENDOR = str_lit("odin");
bc->ODIN_VERSION = ODIN_VERSION;
bc->ODIN_ROOT = odin_root_dir();
diff --git a/src/checker.cpp b/src/checker.cpp
index 8ccdcb9f7..734659510 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -3900,10 +3900,11 @@ gb_internal void check_decl_attributes(CheckerContext *c, Array<Ast *> const &at
}
if (!proc(c, elem, name, value, ac)) {
- if (!build_context.ignore_unknown_attributes) {
+ if (!build_context.ignore_unknown_attributes &&
+ !string_set_exists(&build_context.custom_attributes, name)) {
ERROR_BLOCK();
error(elem, "Unknown attribute element name '%.*s'", LIT(name));
- error_line("\tDid you forget to use build flag '-ignore-unknown-attributes'?\n");
+ error_line("\tDid you forget to use the build flag '-ignore-unknown-attributes' or '-custom-attribute:%.*s'?\n", LIT(name));
}
}
}
diff --git a/src/main.cpp b/src/main.cpp
index 1896dd0b7..b24796559 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -301,6 +301,7 @@ enum BuildFlagKind {
BuildFlag_VetStyle,
BuildFlag_VetSemicolon,
+ BuildFlag_CustomAttribute,
BuildFlag_IgnoreUnknownAttributes,
BuildFlag_ExtraLinkerFlags,
BuildFlag_ExtraAssemblerFlags,
@@ -499,6 +500,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
add_flag(&build_flags, BuildFlag_VetStyle, str_lit("vet-style"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_VetSemicolon, str_lit("vet-semicolon"), BuildFlagParam_None, Command__does_check);
+ add_flag(&build_flags, BuildFlag_CustomAttribute, str_lit("custom-attribute"), BuildFlagParam_String, Command__does_check, true);
add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_ExtraLinkerFlags, str_lit("extra-linker-flags"), BuildFlagParam_String, Command__does_build);
add_flag(&build_flags, BuildFlag_ExtraAssemblerFlags, str_lit("extra-assembler-flags"), BuildFlagParam_String, Command__does_build);
@@ -1151,6 +1153,29 @@ gb_internal bool parse_build_flags(Array<String> args) {
case BuildFlag_VetStyle: build_context.vet_flags |= VetFlag_Style; break;
case BuildFlag_VetSemicolon: build_context.vet_flags |= VetFlag_Semicolon; break;
+ case BuildFlag_CustomAttribute:
+ {
+ GB_ASSERT(value.kind == ExactValue_String);
+ String val = value.value_string;
+ String_Iterator it = {val, 0};
+ for (;;) {
+ String attr = string_split_iterator(&it, ',');
+ if (attr.len == 0) {
+ break;
+ }
+
+ attr = string_trim_whitespace(attr);
+ if (!string_is_valid_identifier(attr)) {
+ gb_printf_err("-custom-attribute '%.*s' must be a valid identifier\n", LIT(attr));
+ bad_flags = true;
+ continue;
+ }
+
+ string_set_add(&build_context.custom_attributes, attr);
+ }
+ }
+ break;
+
case BuildFlag_IgnoreUnknownAttributes:
build_context.ignore_unknown_attributes = true;
break;
@@ -2221,6 +2246,15 @@ gb_internal void print_show_help(String const arg0, String const &command) {
}
if (check) {
+ print_usage_line(1, "-custom-attribute:<string>");
+ print_usage_line(2, "Add a custom attribute which will be ignored if it is unknown.");
+ print_usage_line(2, "This can be used with metaprogramming tools.");
+ print_usage_line(2, "Examples:");
+ print_usage_line(3, "-custom-attribute:my_tag");
+ print_usage_line(3, "-custom-attribute:my_tag,the_other_thing");
+ print_usage_line(3, "-custom-attribute:my_tag -custom-attribute:the_other_thing");
+ print_usage_line(0, "");
+
print_usage_line(1, "-ignore-unknown-attributes");
print_usage_line(2, "Ignores unknown attributes.");
print_usage_line(2, "This can be used with metaprogramming tools.");