lkml.org 
[lkml]   [2010]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH tip/core/rcu 1/2] kconfig: place localversion string in .config output
Date
This patch appends the localversion string to the Linux kernel version.
For example, in a git tree with uncommitted changes, the .config file
might start as follows (but with leading hash marks):

Automatically generated make config: don't edit
Linux kernel version: 2.6.33-01836-g90a6501-dirty
Mon Mar 1 17:05:59 2010

The "-01836-g90a6501-dirty" string is added by this patch.

The KBUILD_CONFIG_NO_CHECK_DIRTY environment variable controls the
git "-dirty" check. If this variable is either empty or undefined,
then a "-dirty" check is performed (the default), otherwise, this
check is omitted.

Suggested-by: Ingo Molnar <mingo@elte.hu>
Suggested-by: Geert Uytterhoeven <geert@linux-m68k.org>
Suggested-by: Frans Pop <elendil@planet.nl>
Suggested-by: James Cloos <cloos@jhcloos.com>
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Frans Pop <elendil@planet.nl>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---
scripts/kconfig/confdata.c | 68 ++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index c4dec80..99d16b4 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -3,6 +3,7 @@
* Released under the terms of the GNU GPL v2.0.
*/

+#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <fcntl.h>
@@ -11,10 +12,13 @@
#include <string.h>
#include <time.h>
#include <unistd.h>
+#include <sys/wait.h>

#define LKC_DIRECT_LINK
#include "lkc.h"

+extern char **environ;
+
static void conf_warning(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2)));

@@ -399,15 +403,20 @@ int conf_read(const char *name)
int conf_write(const char *name)
{
FILE *out;
+ FILE *slv;
struct symbol *sym;
struct menu *menu;
const char *basename;
- char dirname[128], tmpname[128], newname[128];
+ char dirname[128], tmpname[128], newname[128], localversion[128];
+ char cmdline[PATH_MAX * 2 + 128];
int type, l;
const char *str;
time_t now;
int use_timestamp = 1;
+ int pipefd[2];
char *env;
+ char *path;
+ pid_t pid;

dirname[0] = 0;
if (name && name[0]) {
@@ -450,12 +459,67 @@ int conf_write(const char *name)
if (env && *env)
use_timestamp = 0;

+ sprintf(localversion, "-error: %s:%d", __FILE__, __LINE__);
+ path = getenv(SRCTREE);
+ if (path && *path) {
+ sprintf(localversion, "-error: %s:%d", __FILE__, __LINE__);
+ if (pipe(pipefd) != 0) {
+ fprintf(stderr, "%s:%d error: pipe() failed\n",
+ __FILE__, __LINE__);
+ goto nolocalversion;
+ }
+ sprintf(cmdline, "%s/scripts/setlocalversion", path);
+ sprintf(localversion, "-error: %s:%d", __FILE__, __LINE__);
+ fflush(stderr);
+ pid = fork();
+ if (pid < 0) {
+ fprintf(stderr, "%s:%d error: fork() failed\n",
+ __FILE__, __LINE__);
+ goto nolocalversion;
+ }
+ if (pid == 0) { /* child */
+ char *newargv[] = { cmdline, path, NULL };
+
+ close(1); /* stdout */
+ if (dup2(pipefd[1], 1) < 0) {
+ fprintf(stderr, "%s:%d error: dup2() failed\n",
+ __FILE__, __LINE__);
+ fflush(stderr);
+ _exit(1);
+ }
+ execve(cmdline, newargv, environ);
+ fprintf(stderr, "%s:%d error: execve() failed\n",
+ __FILE__, __LINE__);
+ fflush(stderr);
+ _exit(2);
+ } else { /* parent */
+ int chldstatus = 0;
+
+ localversion[0] = '\0';
+ slv = fdopen(pipefd[0], "r");
+ if (slv != NULL) {
+ close(pipefd[1]);
+ fscanf(slv, " %127s ", localversion);
+ /* can have EOF if no SCM. */
+ if (wait(&chldstatus) < 0 || chldstatus != 0) {
+ fprintf(stderr,
+ "%s:%d error: child failed\n",
+ __FILE__, __LINE__);
+ sprintf(localversion, "-error: %s:%d",
+ __FILE__, __LINE__);
+ }
+ }
+ }
+ }
+nolocalversion:
+
fprintf(out, _("#\n"
"# Automatically generated make config: don't edit\n"
- "# Linux kernel version: %s\n"
+ "# Linux kernel version: %s%s\n"
"%s%s"
"#\n"),
sym_get_string_value(sym),
+ localversion,
use_timestamp ? "# " : "",
use_timestamp ? ctime(&now) : "");

--
1.6.6


\
 
 \ /
  Last update: 2010-03-05 20:47    [W:0.112 / U:0.580 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site