kconfig/util.c
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 1 eeea35fbf182
child 2448 a103abae1560
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
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