Skip to content

Commit

Permalink
kconfig: do not write .config if the content is the same
Browse files Browse the repository at this point in the history
Kconfig updates the .config when it exits even if its content is
exactly the same as before. Since its timestamp becomes newer than
that of other build artifacts, additional processing is invoked,
which is annoying.

- syncconfig is invoked to update include/config/auto.conf, etc.

- kernel/configs.o is recompiled if CONFIG_IKCONFIG is enabled,
  then vmlinux is relinked as well.

If the .config is not changed at all, we do not have to even
touch it. Just bail out showing "No change to .config".

  $ make allmodconfig
  scripts/kconfig/conf  --allmodconfig Kconfig
  #
  # configuration written to .config
  #
  $ make allmodconfig
  scripts/kconfig/conf  --allmodconfig Kconfig
  #
  # No change to .config
  #

Reported-by: Linus Torvalds <[email protected]>
Signed-off-by: Masahiro Yamada <[email protected]>
Reviewed-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
masahir0y committed May 10, 2019
1 parent ceb7f32 commit 67424f6
Showing 1 changed file with 54 additions and 0 deletions.
54 changes: 54 additions & 0 deletions scripts/kconfig/confdata.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2002 Roman Zippel <[email protected]>
*/

#include <sys/mman.h>
#include <sys/stat.h>
#include <ctype.h>
#include <errno.h>
Expand Down Expand Up @@ -36,6 +37,52 @@ static bool is_dir(const char *path)
return S_ISDIR(st.st_mode);
}

/* return true if the given two files are the same, false otherwise */
static bool is_same(const char *file1, const char *file2)
{
int fd1, fd2;
struct stat st1, st2;
void *map1, *map2;
bool ret = false;

fd1 = open(file1, O_RDONLY);
if (fd1 < 0)
return ret;

fd2 = open(file2, O_RDONLY);
if (fd2 < 0)
goto close1;

ret = fstat(fd1, &st1);
if (ret)
goto close2;
ret = fstat(fd2, &st2);
if (ret)
goto close2;

if (st1.st_size != st2.st_size)
goto close2;

map1 = mmap(NULL, st1.st_size, PROT_READ, MAP_PRIVATE, fd1, 0);
if (map1 == MAP_FAILED)
goto close2;

map2 = mmap(NULL, st2.st_size, PROT_READ, MAP_PRIVATE, fd2, 0);
if (map2 == MAP_FAILED)
goto close2;

if (bcmp(map1, map2, st1.st_size))
goto close2;

ret = true;
close2:
close(fd2);
close1:
close(fd1);

return ret;
}

/*
* Create the parent directory of the given path.
*
Expand Down Expand Up @@ -888,6 +935,13 @@ int conf_write(const char *name)
fclose(out);

if (*tmpname) {
if (is_same(name, tmpname)) {
conf_message("No change to %s", name);
unlink(tmpname);
sym_set_change_count(0);
return 0;
}

snprintf(oldname, sizeof(oldname), "%s.old", name);
rename(name, oldname);
if (rename(tmpname, name))
Expand Down

0 comments on commit 67424f6

Please sign in to comment.