mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Add -custom-attribute
This commit is contained in:
@@ -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
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.");
|
||||||
|
|||||||
Reference in New Issue
Block a user