]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - scripts/kconfig/confdata.c
Kbuild: add Rust support
[thirdparty/linux.git] / scripts / kconfig / confdata.c
index c4340c90e172f875739dd19a8939d812cf66c978..b7c9f1dd5e4229df71e99ae9585424155ac101f0 100644 (file)
@@ -216,6 +216,13 @@ static const char *conf_get_autoheader_name(void)
        return name ? name : "include/generated/autoconf.h";
 }
 
+static const char *conf_get_rustccfg_name(void)
+{
+       char *name = getenv("KCONFIG_RUSTCCFG");
+
+       return name ? name : "include/generated/rustc_cfg";
+}
+
 static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
 {
        char *p2;
@@ -605,6 +612,9 @@ static const struct comment_style comment_style_c = {
 
 static void conf_write_heading(FILE *fp, const struct comment_style *cs)
 {
+       if (!cs)
+               return;
+
        fprintf(fp, "%s\n", cs->prefix);
 
        fprintf(fp, "%s Automatically generated file; DO NOT EDIT.\n",
@@ -745,6 +755,65 @@ static void print_symbol_for_c(FILE *fp, struct symbol *sym)
        free(escaped);
 }
 
+static void print_symbol_for_rustccfg(FILE *fp, struct symbol *sym)
+{
+       const char *val;
+       const char *val_prefix = "";
+       char *val_prefixed = NULL;
+       size_t val_prefixed_len;
+       char *escaped = NULL;
+
+       if (sym->type == S_UNKNOWN)
+               return;
+
+       val = sym_get_string_value(sym);
+
+       switch (sym->type) {
+       case S_BOOLEAN:
+       case S_TRISTATE:
+               /*
+                * We do not care about disabled ones, i.e. no need for
+                * what otherwise are "comments" in other printers.
+                */
+               if (*val == 'n')
+                       return;
+
+               /*
+                * To have similar functionality to the C macro `IS_ENABLED()`
+                * we provide an empty `--cfg CONFIG_X` here in both `y`
+                * and `m` cases.
+                *
+                * Then, the common `fprintf()` below will also give us
+                * a `--cfg CONFIG_X="y"` or `--cfg CONFIG_X="m"`, which can
+                * be used as the equivalent of `IS_BUILTIN()`/`IS_MODULE()`.
+                */
+               fprintf(fp, "--cfg=%s%s\n", CONFIG_, sym->name);
+               break;
+       case S_HEX:
+               if (val[0] != '0' || (val[1] != 'x' && val[1] != 'X'))
+                       val_prefix = "0x";
+               break;
+       default:
+               break;
+       }
+
+       if (strlen(val_prefix) > 0) {
+               val_prefixed_len = strlen(val) + strlen(val_prefix) + 1;
+               val_prefixed = xmalloc(val_prefixed_len);
+               snprintf(val_prefixed, val_prefixed_len, "%s%s", val_prefix, val);
+               val = val_prefixed;
+       }
+
+       /* All values get escaped: the `--cfg` option only takes strings */
+       escaped = escape_string_value(val);
+       val = escaped;
+
+       fprintf(fp, "--cfg=%s%s=%s\n", CONFIG_, sym->name, val);
+
+       free(escaped);
+       free(val_prefixed);
+}
+
 /*
  * Write out a minimal config.
  * All values that has default values are skipped as this is redundant.
@@ -1132,6 +1201,12 @@ int conf_write_autoconf(int overwrite)
        if (ret)
                return ret;
 
+       ret = __conf_write_autoconf(conf_get_rustccfg_name(),
+                                   print_symbol_for_rustccfg,
+                                   NULL);
+       if (ret)
+               return ret;
+
        /*
         * Create include/config/auto.conf. This must be the last step because
         * Kbuild has a dependency on auto.conf and this marks the successful