kconfig/util.c
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Jul 12 23:52:24 2011 +0200 (2011-07-12)
branch1.11
changeset 2558 b7317d2fe0e9
parent 1 eeea35fbf182
child 2448 a103abae1560
permissions -rw-r--r--
scripts, cc/gcc: do not fail on existing symlinks or build.log

If the user builds a toolchain over an existing one, so, without removing
CT_PREFIX_DIR, the build fails as the symlinks already exist, as does the
build.log.

This can also happen (for build.log) if the user first ran in download-
or extract-only.

Patch (with no SoB) originally from:
Phil Wilshire <phil.wilshire@overturenetworks.com>

Modified by me as it did not apply cleanly.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
(transplanted from 1ebc2248cc60230cd53ff94ae8f8f1e3261461a3)
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