kconfig/util.c
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Mar 28 01:05:18 2011 +0200 (2011-03-28)
changeset 2362 0888065f8c4d
parent 1 eeea35fbf182
child 2448 a103abae1560
permissions -rw-r--r--
cc/gcc: cleanup the _or_later logic

So far, we've had a version always select appropriate _or_later option,
which in turn would select all previous _or_later options.

Because the dependencies on companion libs were cumulative, that was
working OK. But the upcoming 4.6 will no longer depend on libelf, so
we can't keep the cumulative scheme we've been using so far.

Have each release family select the corresponding dependencies, instead
of relying on selecting previous _or_later.

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