[PATCH tip/core/rcu 1/2] kconfig: place localversion string in .config output

From: Paul E. McKenney
Date: Fri Mar 05 2010 - 14:44:51 EST


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@xxxxxxx>
Suggested-by: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
Suggested-by: Frans Pop <elendil@xxxxxxxxx>
Suggested-by: James Cloos <cloos@xxxxxxxxxxx>
Suggested-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Cc: Roman Zippel <zippel@xxxxxxxxxxxxxx>
Cc: Frans Pop <elendil@xxxxxxxxx>
Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx>
---
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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/