* [PATCH] kconfig: redo fake deps at include/config/*.h
@ 2021-04-14 22:01 Alexey Dobriyan
2021-04-15 4:58 ` Masahiro Yamada
0 siblings, 1 reply; 4+ messages in thread
From: Alexey Dobriyan @ 2021-04-14 22:01 UTC (permalink / raw)
To: masahiroy; +Cc: linux-kbuild, linux-kernel, akpm
Make include/config/foo/bar.h fake deps files generation simpler.
* delete .h suffix
those aren't header files, shorten filenames,
* delete tolower()
Linux filesystems can deal with both upper and lowercase
filenames very well,
* put everything in 1 directory
Presumably 'mkdir -p' split is from dark times when filesystems
handled huge directories badly, disks were round adding to
seek times.
x86_64 allmodconfig lists 12364 files in include/config.
../obj/include/config/
├── 104_QUAD_8
├── 60XX_WDT
├── 64BIT
├── 6LOWPAN
├── 6LOWPAN_DEBUGFS
├── 6LOWPAN_GHC_EXT_HDR_DEST
├── 6LOWPAN_GHC_EXT_HDR_FRAG
├── 6LOWPAN_GHC_EXT_HDR_HOP
├── 6LOWPAN_GHC_EXT_HDR_ROUTE
...
├── ZSTD_COMPRESS
├── ZSTD_DECOMPRESS
├── ZSWAP
├── ZSWAP_COMPRESSOR_DEFAULT
├── ZSWAP_COMPRESSOR_DEFAULT_LZO
├── ZSWAP_DEFAULT_ON
├── ZSWAP_ZPOOL_DEFAULT
└── ZSWAP_ZPOOL_DEFAULT_ZBUD
0 directories, 12364 files
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
---
include/linux/compiler-version.h | 2 +-
init/Kconfig | 2 +-
scripts/Makefile.build | 4 ++--
scripts/basic/fixdep.c | 30 +++---------------------------
scripts/kconfig/confdata.c | 11 +++--------
5 files changed, 10 insertions(+), 39 deletions(-)
--- a/include/linux/compiler-version.h
+++ b/include/linux/compiler-version.h
@@ -9,6 +9,6 @@
* This header exists to force full rebuild when the compiler is upgraded.
*
* When fixdep scans this, it will find this string "CONFIG_CC_VERSION_TEXT"
- * and add dependency on include/config/cc/version/text.h, which is touched
+ * and add dependency on include/config/CC_VERSION_TEXT, which is touched
* by Kconfig when the version string from the compiler changes.
*/
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -21,7 +21,7 @@ config CC_VERSION_TEXT
- Ensure full rebuild when the compiler is updated
include/linux/compiler-version.h contains this option in the comment
- line so fixdep adds include/config/cc/version/text.h into the
+ line so fixdep adds include/config/CC_VERSION_TEXT into the
auto-generated dependency. When the compiler is updated, syncconfig
will touch it and then every file will be rebuilt.
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -238,8 +238,8 @@ endif # CONFIG_STACK_VALIDATION
# Rebuild all objects when objtool changes, or is enabled/disabled.
objtool_dep = $(objtool_obj) \
- $(wildcard include/config/orc/unwinder.h \
- include/config/stack/validation.h)
+ $(wildcard include/config/ORC_UNWINDER \
+ include/config/STACK_VALIDATION)
ifdef CONFIG_TRIM_UNUSED_KSYMS
cmd_gen_ksymdeps = \
--- a/scripts/basic/fixdep.c
+++ b/scripts/basic/fixdep.c
@@ -34,7 +34,7 @@
* the config symbols are rebuilt.
*
* So if the user changes his CONFIG_HIS_DRIVER option, only the objects
- * which depend on "include/config/his/driver.h" will be rebuilt,
+ * which depend on "include/config/HIS_DRIVER" will be rebuilt,
* so most likely only his driver ;-)
*
* The idea above dates, by the way, back to Michael E Chastain, AFAIK.
@@ -74,7 +74,7 @@
*
* and then basically copies the .<target>.d file to stdout, in the
* process filtering out the dependency on autoconf.h and adding
- * dependencies on include/config/my/option.h for every
+ * dependencies on include/config/MY_OPTION for every
* CONFIG_MY_OPTION encountered in any of the prerequisites.
*
* We don't even try to really parse the header files, but
@@ -124,36 +124,12 @@ static void xprintf(const char *format, ...)
va_end(ap);
}
-static void xputchar(int c)
-{
- int ret;
-
- ret = putchar(c);
- if (ret == EOF) {
- perror("fixdep");
- exit(1);
- }
-}
-
/*
* Print out a dependency path from a symbol name
*/
static void print_dep(const char *m, int slen, const char *dir)
{
- int c, prev_c = '/', i;
-
- xprintf(" $(wildcard %s/", dir);
- for (i = 0; i < slen; i++) {
- c = m[i];
- if (c == '_')
- c = '/';
- else
- c = tolower(c);
- if (c != '/' || prev_c != '/')
- xputchar(c);
- prev_c = c;
- }
- xprintf(".h) \\\n");
+ xprintf(" $(wildcard %s/%.*s) \\\n", dir, slen, m);
}
struct item {
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -130,19 +130,14 @@ static size_t depfile_prefix_len;
static int conf_touch_dep(const char *name)
{
int fd, ret;
- const char *s;
- char *d, c;
+ char *d;
/* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */
if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path))
return -1;
d = depfile_path + depfile_prefix_len;
- s = name;
-
- while ((c = *s++))
- *d++ = (c == '_') ? '/' : tolower(c);
- strcpy(d, ".h");
+ strcpy(d, name);
/* Assume directory path already exists. */
fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
@@ -465,7 +460,7 @@ int conf_read_simple(const char *name, int def)
* Reading from include/config/auto.conf
* If CONFIG_FOO previously existed in
* auto.conf but it is missing now,
- * include/config/foo.h must be touched.
+ * include/config/FOO must be touched.
*/
conf_touch_dep(line + strlen(CONFIG_));
else
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] kconfig: redo fake deps at include/config/*.h 2021-04-14 22:01 [PATCH] kconfig: redo fake deps at include/config/*.h Alexey Dobriyan @ 2021-04-15 4:58 ` Masahiro Yamada 2021-04-15 17:36 ` [PATCH v2] " Alexey Dobriyan 0 siblings, 1 reply; 4+ messages in thread From: Masahiro Yamada @ 2021-04-15 4:58 UTC (permalink / raw) To: Alexey Dobriyan Cc: Linux Kbuild mailing list, Linux Kernel Mailing List, Andrew Morton On Thu, Apr 15, 2021 at 7:01 AM Alexey Dobriyan <adobriyan@gmail.com> wrote: > > Make include/config/foo/bar.h fake deps files generation simpler. > > * delete .h suffix > those aren't header files, shorten filenames, > > * delete tolower() > Linux filesystems can deal with both upper and lowercase > filenames very well, > > * put everything in 1 directory > Presumably 'mkdir -p' split is from dark times when filesystems > handled huge directories badly, disks were round adding to > seek times. I am not sure about the impact of this change given various file systems in the wild, but this simplification is attractive. With a quick search, I found a comment 'performance issues past 10,000' on ext2 [1] but that may not be what we care about much... [1]: https://webmasters.stackexchange.com/questions/99539/what-is-a-recommended-maximum-number-of-files-in-a-directory-on-your-webserver > @@ -124,36 +124,12 @@ static void xprintf(const char *format, ...) > va_end(ap); > } > > -static void xputchar(int c) > -{ > - int ret; > - > - ret = putchar(c); > - if (ret == EOF) { > - perror("fixdep"); > - exit(1); > - } > -} > - > /* > * Print out a dependency path from a symbol name > */ > static void print_dep(const char *m, int slen, const char *dir) > { > - int c, prev_c = '/', i; > - > - xprintf(" $(wildcard %s/", dir); > - for (i = 0; i < slen; i++) { > - c = m[i]; > - if (c == '_') > - c = '/'; > - else > - c = tolower(c); > - if (c != '/' || prev_c != '/') > - xputchar(c); > - prev_c = c; > - } > - xprintf(".h) \\\n"); > + xprintf(" $(wildcard %s/%.*s) \\\n", dir, slen, m); Since this function now contains just one line, can you hard-code xprintf(" $(wildcard include/config/%.*s) \\\n", slen, m); in use_config() ? > } > > struct item { > --- a/scripts/kconfig/confdata.c > +++ b/scripts/kconfig/confdata.c > @@ -130,19 +130,14 @@ static size_t depfile_prefix_len; > static int conf_touch_dep(const char *name) > { > int fd, ret; > - const char *s; > - char *d, c; > + char *d; > > /* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */ > if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path)) Since you dropped the ".h" suffix, please fix up this line. Also, you can fix # changed, Kconfig touches the corresponding timestamp file include/config/*.h. in kernel/gen_kheaders.sh > return -1; > > d = depfile_path + depfile_prefix_len; > - s = name; > - > - while ((c = *s++)) > - *d++ = (c == '_') ? '/' : tolower(c); > - strcpy(d, ".h"); > + strcpy(d, name); > > /* Assume directory path already exists. */ > fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); > @@ -465,7 +460,7 @@ int conf_read_simple(const char *name, int def) > * Reading from include/config/auto.conf > * If CONFIG_FOO previously existed in > * auto.conf but it is missing now, > - * include/config/foo.h must be touched. > + * include/config/FOO must be touched. > */ > conf_touch_dep(line + strlen(CONFIG_)); > else -- Best Regards Masahiro Yamada ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2] kconfig: redo fake deps at include/config/*.h 2021-04-15 4:58 ` Masahiro Yamada @ 2021-04-15 17:36 ` Alexey Dobriyan 2021-04-16 5:57 ` Masahiro Yamada 0 siblings, 1 reply; 4+ messages in thread From: Alexey Dobriyan @ 2021-04-15 17:36 UTC (permalink / raw) To: Masahiro Yamada; +Cc: linux-kbuild, linux-kernel, Andrew Morton Make include/config/foo/bar.h fake deps files generation simpler. * delete .h suffix those aren't header files, shorten filenames, * delete tolower() Linux filesystems can deal with both upper and lowercase filenames very well, * put everything in 1 directory Presumably 'mkdir -p' split is from dark times when filesystems handled huge directories badly, disks were round adding to seek times. x86_64 allmodconfig lists 12364 files in include/config. ../obj/include/config/ ├── 104_QUAD_8 ├── 60XX_WDT ├── 64BIT ... ├── ZSWAP_DEFAULT_ON ├── ZSWAP_ZPOOL_DEFAULT └── ZSWAP_ZPOOL_DEFAULT_ZBUD 0 directories, 12364 files Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> --- include/linux/compiler-version.h | 2 +- init/Kconfig | 2 +- kernel/gen_kheaders.sh | 2 +- scripts/Makefile.build | 4 ++-- scripts/basic/fixdep.c | 39 ++++----------------------------------- scripts/kconfig/confdata.c | 15 +++++---------- 6 files changed, 14 insertions(+), 50 deletions(-) --- a/include/linux/compiler-version.h +++ b/include/linux/compiler-version.h @@ -9,6 +9,6 @@ * This header exists to force full rebuild when the compiler is upgraded. * * When fixdep scans this, it will find this string "CONFIG_CC_VERSION_TEXT" - * and add dependency on include/config/cc/version/text.h, which is touched + * and add dependency on include/config/CC_VERSION_TEXT, which is touched * by Kconfig when the version string from the compiler changes. */ --- a/init/Kconfig +++ b/init/Kconfig @@ -21,7 +21,7 @@ config CC_VERSION_TEXT - Ensure full rebuild when the compiler is updated include/linux/compiler-version.h contains this option in the comment - line so fixdep adds include/config/cc/version/text.h into the + line so fixdep adds include/config/CC_VERSION_TEXT into the auto-generated dependency. When the compiler is updated, syncconfig will touch it and then every file will be rebuilt. --- a/kernel/gen_kheaders.sh +++ b/kernel/gen_kheaders.sh @@ -36,7 +36,7 @@ all_dirs="$all_dirs $dir_list" # # When Kconfig regenerates include/generated/autoconf.h, its timestamp is # updated, but the contents might be still the same. When any CONFIG option is -# changed, Kconfig touches the corresponding timestamp file include/config/*.h. +# changed, Kconfig touches the corresponding timestamp file include/config/*. # Hence, the md5sum detects the configuration change anyway. We do not need to # check include/generated/autoconf.h explicitly. # --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -238,8 +238,8 @@ endif # CONFIG_STACK_VALIDATION # Rebuild all objects when objtool changes, or is enabled/disabled. objtool_dep = $(objtool_obj) \ - $(wildcard include/config/orc/unwinder.h \ - include/config/stack/validation.h) + $(wildcard include/config/ORC_UNWINDER \ + include/config/STACK_VALIDATION) ifdef CONFIG_TRIM_UNUSED_KSYMS cmd_gen_ksymdeps = \ --- a/scripts/basic/fixdep.c +++ b/scripts/basic/fixdep.c @@ -34,7 +34,7 @@ * the config symbols are rebuilt. * * So if the user changes his CONFIG_HIS_DRIVER option, only the objects - * which depend on "include/config/his/driver.h" will be rebuilt, + * which depend on "include/config/HIS_DRIVER" will be rebuilt, * so most likely only his driver ;-) * * The idea above dates, by the way, back to Michael E Chastain, AFAIK. @@ -74,7 +74,7 @@ * * and then basically copies the .<target>.d file to stdout, in the * process filtering out the dependency on autoconf.h and adding - * dependencies on include/config/my/option.h for every + * dependencies on include/config/MY_OPTION for every * CONFIG_MY_OPTION encountered in any of the prerequisites. * * We don't even try to really parse the header files, but @@ -124,38 +124,6 @@ static void xprintf(const char *format, ...) va_end(ap); } -static void xputchar(int c) -{ - int ret; - - ret = putchar(c); - if (ret == EOF) { - perror("fixdep"); - exit(1); - } -} - -/* - * Print out a dependency path from a symbol name - */ -static void print_dep(const char *m, int slen, const char *dir) -{ - int c, prev_c = '/', i; - - xprintf(" $(wildcard %s/", dir); - for (i = 0; i < slen; i++) { - c = m[i]; - if (c == '_') - c = '/'; - else - c = tolower(c); - if (c != '/' || prev_c != '/') - xputchar(c); - prev_c = c; - } - xprintf(".h) \\\n"); -} - struct item { struct item *next; unsigned int len; @@ -220,7 +188,8 @@ static void use_config(const char *m, int slen) return; define_config(m, slen, hash); - print_dep(m, slen, "include/config"); + /* Print out a dependency path from a symbol name. */ + xprintf(" $(wildcard include/config/%.*s) \\\n", slen, m); } /* test if s ends in sub */ --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -130,19 +130,14 @@ static size_t depfile_prefix_len; static int conf_touch_dep(const char *name) { int fd, ret; - const char *s; - char *d, c; + char *d; - /* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */ - if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path)) + /* check overflow: prefix + name + '\0' must fit in buffer. */ + if (depfile_prefix_len + strlen(name) + 1 > sizeof(depfile_path)) return -1; d = depfile_path + depfile_prefix_len; - s = name; - - while ((c = *s++)) - *d++ = (c == '_') ? '/' : tolower(c); - strcpy(d, ".h"); + strcpy(d, name); /* Assume directory path already exists. */ fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644); @@ -465,7 +460,7 @@ int conf_read_simple(const char *name, int def) * Reading from include/config/auto.conf * If CONFIG_FOO previously existed in * auto.conf but it is missing now, - * include/config/foo.h must be touched. + * include/config/FOO must be touched. */ conf_touch_dep(line + strlen(CONFIG_)); else ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] kconfig: redo fake deps at include/config/*.h 2021-04-15 17:36 ` [PATCH v2] " Alexey Dobriyan @ 2021-04-16 5:57 ` Masahiro Yamada 0 siblings, 0 replies; 4+ messages in thread From: Masahiro Yamada @ 2021-04-16 5:57 UTC (permalink / raw) To: Alexey Dobriyan Cc: Linux Kbuild mailing list, Linux Kernel Mailing List, Andrew Morton On Fri, Apr 16, 2021 at 2:36 AM Alexey Dobriyan <adobriyan@gmail.com> wrote: > > Make include/config/foo/bar.h fake deps files generation simpler. > > * delete .h suffix > those aren't header files, shorten filenames, > > * delete tolower() > Linux filesystems can deal with both upper and lowercase > filenames very well, > > * put everything in 1 directory > Presumably 'mkdir -p' split is from dark times when filesystems > handled huge directories badly, disks were round adding to > seek times. > > x86_64 allmodconfig lists 12364 files in include/config. > > ../obj/include/config/ > ├── 104_QUAD_8 > ├── 60XX_WDT > ├── 64BIT > ... > ├── ZSWAP_DEFAULT_ON > ├── ZSWAP_ZPOOL_DEFAULT > └── ZSWAP_ZPOOL_DEFAULT_ZBUD > > 0 directories, 12364 files > > Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> > --- > > include/linux/compiler-version.h | 2 +- > init/Kconfig | 2 +- > kernel/gen_kheaders.sh | 2 +- > scripts/Makefile.build | 4 ++-- > scripts/basic/fixdep.c | 39 ++++----------------------------------- > scripts/kconfig/confdata.c | 15 +++++---------- > 6 files changed, 14 insertions(+), 50 deletions(-) > > --- a/include/linux/compiler-version.h > +++ b/include/linux/compiler-version.h > @@ -9,6 +9,6 @@ > * This header exists to force full rebuild when the compiler is upgraded. > * > * When fixdep scans this, it will find this string "CONFIG_CC_VERSION_TEXT" > - * and add dependency on include/config/cc/version/text.h, which is touched > + * and add dependency on include/config/CC_VERSION_TEXT, which is touched > * by Kconfig when the version string from the compiler changes. > */ > --- a/init/Kconfig > +++ b/init/Kconfig > @@ -21,7 +21,7 @@ config CC_VERSION_TEXT > > - Ensure full rebuild when the compiler is updated > include/linux/compiler-version.h contains this option in the comment > - line so fixdep adds include/config/cc/version/text.h into the > + line so fixdep adds include/config/CC_VERSION_TEXT into the > auto-generated dependency. When the compiler is updated, syncconfig > will touch it and then every file will be rebuilt. > > --- a/kernel/gen_kheaders.sh > +++ b/kernel/gen_kheaders.sh > @@ -36,7 +36,7 @@ all_dirs="$all_dirs $dir_list" > # > # When Kconfig regenerates include/generated/autoconf.h, its timestamp is > # updated, but the contents might be still the same. When any CONFIG option is > -# changed, Kconfig touches the corresponding timestamp file include/config/*.h. > +# changed, Kconfig touches the corresponding timestamp file include/config/*. > # Hence, the md5sum detects the configuration change anyway. We do not need to > # check include/generated/autoconf.h explicitly. > # > --- a/scripts/Makefile.build > +++ b/scripts/Makefile.build > @@ -238,8 +238,8 @@ endif # CONFIG_STACK_VALIDATION > > # Rebuild all objects when objtool changes, or is enabled/disabled. > objtool_dep = $(objtool_obj) \ > - $(wildcard include/config/orc/unwinder.h \ > - include/config/stack/validation.h) > + $(wildcard include/config/ORC_UNWINDER \ > + include/config/STACK_VALIDATION) > > ifdef CONFIG_TRIM_UNUSED_KSYMS > cmd_gen_ksymdeps = \ > --- a/scripts/basic/fixdep.c > +++ b/scripts/basic/fixdep.c > @@ -34,7 +34,7 @@ > * the config symbols are rebuilt. > * > * So if the user changes his CONFIG_HIS_DRIVER option, only the objects > - * which depend on "include/config/his/driver.h" will be rebuilt, > + * which depend on "include/config/HIS_DRIVER" will be rebuilt, > * so most likely only his driver ;-) > * > * The idea above dates, by the way, back to Michael E Chastain, AFAIK. > @@ -74,7 +74,7 @@ > * > * and then basically copies the .<target>.d file to stdout, in the > * process filtering out the dependency on autoconf.h and adding > - * dependencies on include/config/my/option.h for every > + * dependencies on include/config/MY_OPTION for every > * CONFIG_MY_OPTION encountered in any of the prerequisites. > * > * We don't even try to really parse the header files, but > @@ -124,38 +124,6 @@ static void xprintf(const char *format, ...) > va_end(ap); > } > > -static void xputchar(int c) > -{ > - int ret; > - > - ret = putchar(c); > - if (ret == EOF) { > - perror("fixdep"); > - exit(1); > - } > -} > - Applied to linux-kbuild. I just found one more minor thing to fix up. fixdep no longer calls putchar(), so I squashed the following: diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c index 5bee6a80992f..44e887cff49b 100644 --- a/scripts/basic/fixdep.c +++ b/scripts/basic/fixdep.c @@ -107,8 +107,8 @@ static void usage(void) /* * In the intended usage of this program, the stdout is redirected to .*.cmd - * files. The return value of printf() and putchar() must be checked to catch - * any error, e.g. "No space left on device". + * files. The return value of printf() must be checked to catch any error, + * e.g. "No space left on device". */ static void xprintf(const char *format, ...) { -- Best Regards Masahiro Yamada ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-04-16 5:58 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-04-14 22:01 [PATCH] kconfig: redo fake deps at include/config/*.h Alexey Dobriyan 2021-04-15 4:58 ` Masahiro Yamada 2021-04-15 17:36 ` [PATCH v2] " Alexey Dobriyan 2021-04-16 5:57 ` Masahiro Yamada
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox