kconfig/util.c
author Remy Bohmer <linux@bohmer.net>
Thu May 27 23:18:19 2010 +0200 (2010-05-27)
changeset 2060 51e4597b07fc
parent 1 eeea35fbf182
child 2448 a103abae1560
permissions -rw-r--r--
scripts: add option to strip all toolchain executables

To reduce filesizes of the toolchain and even improve build times
of projects to be build with this toolchain it is usefull to strip
the delivered toolchain executables. Since it is not likely that we
will debug the toolchain executables itself we do not need the
debug information inside the executables itself.

Signed-off-by: Remy Bohmer <linux@bohmer.net>
     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