瀏覽代碼

Add `-custom-attribute`

gingerBill 1 年之前
父節點
當前提交
17efb87eef
共有 3 個文件被更改,包括 41 次插入2 次删除
  1. 4 0
      src/build_settings.cpp
  2. 3 2
      src/checker.cpp
  3. 34 0
      src/main.cpp

+ 4 - 0
src/build_settings.cpp

@@ -862,6 +862,8 @@ struct BuildContext {
 	bool   keep_object_files;
 	bool   keep_object_files;
 	bool   disallow_do;
 	bool   disallow_do;
 
 
+	StringSet custom_attributes;
+
 	bool   strict_style;
 	bool   strict_style;
 
 
 	bool   ignore_warnings;
 	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);
 		bc->thread_count = gb_max(bc->affinity.thread_count, 1);
 	}
 	}
 
 
+	string_set_init(&bc->custom_attributes);
+
 	bc->ODIN_VENDOR  = str_lit("odin");
 	bc->ODIN_VENDOR  = str_lit("odin");
 	bc->ODIN_VERSION = ODIN_VERSION;
 	bc->ODIN_VERSION = ODIN_VERSION;
 	bc->ODIN_ROOT    = odin_root_dir();
 	bc->ODIN_ROOT    = odin_root_dir();

+ 3 - 2
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 (!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_BLOCK();
 					error(elem, "Unknown attribute element name '%.*s'", LIT(name));
 					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));
 				}
 				}
 			}
 			}
 		}
 		}

+ 34 - 0
src/main.cpp

@@ -301,6 +301,7 @@ enum BuildFlagKind {
 	BuildFlag_VetStyle,
 	BuildFlag_VetStyle,
 	BuildFlag_VetSemicolon,
 	BuildFlag_VetSemicolon,
 
 
+	BuildFlag_CustomAttribute,
 	BuildFlag_IgnoreUnknownAttributes,
 	BuildFlag_IgnoreUnknownAttributes,
 	BuildFlag_ExtraLinkerFlags,
 	BuildFlag_ExtraLinkerFlags,
 	BuildFlag_ExtraAssemblerFlags,
 	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_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_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_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_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);
 	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_VetStyle:           build_context.vet_flags |= VetFlag_Style;           break;
 						case BuildFlag_VetSemicolon:       build_context.vet_flags |= VetFlag_Semicolon;       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:
 						case BuildFlag_IgnoreUnknownAttributes:
 							build_context.ignore_unknown_attributes = true;
 							build_context.ignore_unknown_attributes = true;
 							break;
 							break;
@@ -2221,6 +2246,15 @@ gb_internal void print_show_help(String const arg0, String const &command) {
 	}
 	}
 
 
 	if (check) {
 	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(1, "-ignore-unknown-attributes");
 		print_usage_line(2, "Ignores unknown attributes.");
 		print_usage_line(2, "Ignores unknown attributes.");
 		print_usage_line(2, "This can be used with metaprogramming tools.");
 		print_usage_line(2, "This can be used with metaprogramming tools.");