kconfig/util.c
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jun 13 23:38:37 2010 +0200 (2010-06-13)
changeset 1983 198a5a6e5239
parent 1 eeea35fbf182
child 2448 a103abae1560
permissions -rw-r--r--
cc/gcc: baremetal requires a two-pass process

Here, we implement a highly ugly hack. I'm not proud of that one...

To build the libstdc++ library, the compiler requires the C library. In
case we build for non-baremetal, this is normally handled by the final
step, later.

But in the case of bare-metal, we never go through the final step (because
it does not work, and it seems complex enough to make it work), so the
baremetal compilers are issued out of the core step.
     1 /*
     2  * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
     3  * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
     4  *
     5  * Released under the terms of the GNU GPL v2.0.
     6  */
     7 
     8 #include <string.h>
     9 #include "lkc.h"
    10 
    11 /* file already present in list? If not add it */
    12 struct file *file_lookup(const char *name)
    13 {
    14 	struct file *file;
    15 
    16 	for (file = file_list; file; file = file->next) {
    17 		if (!strcmp(name, file->name))
    18 			return file;
    19 	}
    20 
    21 	file = malloc(sizeof(*file));
    22 	memset(file, 0, sizeof(*file));
    23 	file->name = strdup(name);
    24 	file->next = file_list;
    25 	file_list = file;
    26 	return file;
    27 }
    28 
    29 /* write a dependency file as used by kbuild to track dependencies */
    30 int file_write_dep(const char *name)
    31 {
    32 	struct symbol *sym, *env_sym;
    33 	struct expr *e;
    34 	struct file *file;
    35 	FILE *out;
    36 
    37 	if (!name)
    38 		name = ".kconfig.d";
    39 	out = fopen("..config.tmp", "w");
    40 	if (!out)
    41 		return 1;
    42 	fprintf(out, "deps_config := \\\n");
    43 	for (file = file_list; file; file = file->next) {
    44 		if (file->next)
    45 			fprintf(out, "\t%s \\\n", file->name);
    46 		else
    47 			fprintf(out, "\t%s\n", file->name);
    48 	}
    49 	fprintf(out, "\ninclude/config/auto.conf: \\\n"
    50 		     "\t$(deps_config)\n\n");
    51 
    52 	expr_list_for_each_sym(sym_env_list, e, sym) {
    53 		struct property *prop;
    54 		const char *value;
    55 
    56 		prop = sym_get_env_prop(sym);
    57 		env_sym = prop_get_symbol(prop);
    58 		if (!env_sym)
    59 			continue;
    60 		value = getenv(env_sym->name);
    61 		if (!value)
    62 			value = "";
    63 		fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value);
    64 		fprintf(out, "include/config/auto.conf: FORCE\n");
    65 		fprintf(out, "endif\n");
    66 	}
    67 
    68 	fprintf(out, "\n$(deps_config): ;\n");
    69 	fclose(out);
    70 	rename("..config.tmp", name);
    71 	return 0;
    72 }
    73 
    74 
    75 /* Allocate initial growable sting */
    76 struct gstr str_new(void)
    77 {
    78 	struct gstr gs;
    79 	gs.s = malloc(sizeof(char) * 64);
    80 	gs.len = 64;
    81 	strcpy(gs.s, "\0");
    82 	return gs;
    83 }
    84 
    85 /* Allocate and assign growable string */
    86 struct gstr str_assign(const char *s)
    87 {
    88 	struct gstr gs;
    89 	gs.s = strdup(s);
    90 	gs.len = strlen(s) + 1;
    91 	return gs;
    92 }
    93 
    94 /* Free storage for growable string */
    95 void str_free(struct gstr *gs)
    96 {
    97 	if (gs->s)
    98 		free(gs->s);
    99 	gs->s = NULL;
   100 	gs->len = 0;
   101 }
   102 
   103 /* Append to growable string */
   104 void str_append(struct gstr *gs, const char *s)
   105 {
   106 	size_t l;
   107 	if (s) {
   108 		l = strlen(gs->s) + strlen(s) + 1;
   109 		if (l > gs->len) {
   110 			gs->s   = realloc(gs->s, l);
   111 			gs->len = l;
   112 		}
   113 		strcat(gs->s, s);
   114 	}
   115 }
   116 
   117 /* Append printf formatted string to growable string */
   118 void str_printf(struct gstr *gs, const char *fmt, ...)
   119 {
   120 	va_list ap;
   121 	char s[10000]; /* big enough... */
   122 	va_start(ap, fmt);
   123 	vsnprintf(s, sizeof(s), fmt, ap);
   124 	str_append(gs, s);
   125 	va_end(ap);
   126 }
   127 
   128 /* Retrieve value of growable string */
   129 const char *str_get(struct gstr *gs)
   130 {
   131 	return gs->s;
   132 }
   133