[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1267818271-23154-1-git-send-email-paulmck@linux.vnet.ibm.com>
Date: Fri, 5 Mar 2010 11:44:30 -0800
From: "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>
To: linux-kernel@...r.kernel.org
Cc: zippel@...ux-m68k.org, mingo@...e.hu, akpm@...ux-foundation.org,
torvalds@...ux-foundation.org, geert@...ux-m68k.org,
elendil@...net.nl, cloos@...loos.com,
"Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>
Subject: [PATCH tip/core/rcu 1/2] kconfig: place localversion string in .config output
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@...e.hu>
Suggested-by: Geert Uytterhoeven <geert@...ux-m68k.org>
Suggested-by: Frans Pop <elendil@...net.nl>
Suggested-by: James Cloos <cloos@...loos.com>
Suggested-by: Linus Torvalds <torvalds@...ux-foundation.org>
Cc: Roman Zippel <zippel@...ux-m68k.org>
Cc: Frans Pop <elendil@...net.nl>
Signed-off-by: Paul E. McKenney <paulmck@...ux.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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists