Merge tag 'kbuild-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 21 Mar 2024 21:41:00 +0000 (14:41 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 21 Mar 2024 21:41:00 +0000 (14:41 -0700)
Pull Kbuild updates from Masahiro Yamada:

 - Generate a list of built DTB files (arch/*/boot/dts/dtbs-list)

 - Use more threads when building Debian packages in parallel

 - Fix warnings shown during the RPM kernel package uninstallation

 - Change OBJECT_FILES_NON_STANDARD_*.o etc. to take a relative path to
   Makefile

 - Support GCC's -fmin-function-alignment flag

 - Fix a null pointer dereference bug in modpost

 - Add the DTB support to the RPM package

 - Various fixes and cleanups in Kconfig

* tag 'kbuild-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (67 commits)
  kconfig: tests: test dependency after shuffling choices
  kconfig: tests: add a test for randconfig with dependent choices
  kconfig: tests: support KCONFIG_SEED for the randconfig runner
  kbuild: rpm-pkg: add dtb files in kernel rpm
  kconfig: remove unneeded menu_is_visible() call in conf_write_defconfig()
  kconfig: check prompt for choice while parsing
  kconfig: lxdialog: remove unused dialog colors
  kconfig: lxdialog: fix button color for blackbg theme
  modpost: fix null pointer dereference
  kbuild: remove GCC's default -Wpacked-bitfield-compat flag
  kbuild: unexport abs_srctree and abs_objtree
  kbuild: Move -Wenum-{compare-conditional,enum-conversion} into W=1
  kconfig: remove named choice support
  kconfig: use linked list in get_symbol_str() to iterate over menus
  kconfig: link menus to a symbol
  kbuild: fix inconsistent indentation in top Makefile
  kbuild: Use -fmin-function-alignment when available
  alpha: merge two entries for CONFIG_ALPHA_GAMMA
  alpha: merge two entries for CONFIG_ALPHA_EV4
  kbuild: change DTC_FLAGS_<basetarget>.o to take the path relative to $(obj)
  ...

69 files changed:
.gitignore
Documentation/kbuild/kconfig-language.rst
Documentation/kbuild/kconfig.rst
Makefile
arch/Kconfig
arch/alpha/Kconfig
arch/hexagon/Kconfig
arch/parisc/Kconfig
arch/riscv/kernel/tests/Kconfig.debug
arch/x86/entry/vdso/Makefile
arch/x86/kvm/Kconfig
arch/x86/kvm/Makefile
arch/x86/xen/Kconfig
drivers/acpi/Kconfig
drivers/iommu/intel/Kconfig
drivers/md/Kconfig
include/linux/compiler_types.h
init/Kconfig
kernel/module/Kconfig
lib/Kconfig.debug
mm/Kconfig
net/dccp/ccids/Kconfig
rust/Makefile
scripts/Kbuild.include
scripts/Makefile.build
scripts/Makefile.dtbinst
scripts/Makefile.extrawarn
scripts/Makefile.lib
scripts/Makefile.package
scripts/kconfig/array_size.h [new file with mode: 0644]
scripts/kconfig/conf.c
scripts/kconfig/confdata.c
scripts/kconfig/expr.h
scripts/kconfig/hashtable.h [new file with mode: 0644]
scripts/kconfig/internal.h
scripts/kconfig/lexer.l
scripts/kconfig/list.h
scripts/kconfig/list_types.h [new file with mode: 0644]
scripts/kconfig/lkc.h
scripts/kconfig/lkc_proto.h
scripts/kconfig/lxdialog/checklist.c
scripts/kconfig/lxdialog/dialog.h
scripts/kconfig/lxdialog/util.c
scripts/kconfig/mconf.c
scripts/kconfig/menu.c
scripts/kconfig/nconf.c
scripts/kconfig/parser.y
scripts/kconfig/preprocess.c
scripts/kconfig/preprocess.h [new file with mode: 0644]
scripts/kconfig/qconf.cc
scripts/kconfig/symbol.c
scripts/kconfig/tests/choice_randomize/Kconfig [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize/__init__.py [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize/expected_config0 [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize/expected_config1 [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize/expected_config2 [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize2/Kconfig [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize2/__init__.py [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize2/expected_config0 [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize2/expected_config1 [new file with mode: 0644]
scripts/kconfig/tests/choice_randomize2/expected_config2 [new file with mode: 0644]
scripts/kconfig/tests/conftest.py
scripts/kconfig/tests/err_recursive_dep/expected_stderr
scripts/kconfig/util.c
scripts/mod/modpost.c
scripts/package/builddeb
scripts/package/debian/rules
scripts/package/kernel.spec
tools/lib/bpf/Makefile

index 689a4fa3f5477aa0fd46997eca5ee7a29cd78f8a..c59dc60ba62ef082cd027bb0a2f0d74cfebb7d71 100644 (file)
@@ -52,6 +52,7 @@
 *.xz
 *.zst
 Module.symvers
+dtbs-list
 modules.order
 
 #
index 0135905c0aa352f2d83747cc407080d0973d9bd8..79ac2e8184f6f0da6de66eb082ae69b44a85f951 100644 (file)
@@ -393,7 +393,7 @@ of C0, which doesn't depend on M::
 
 choices::
 
-       "choice" [symbol]
+       "choice"
        <choice options>
        <choice block>
        "endchoice"
@@ -412,10 +412,6 @@ the kernel, but all drivers can be compiled as modules.
 
 A choice accepts another option "optional", which allows to set the
 choice to 'n' and no entry needs to be selected.
-If no [symbol] is associated with a choice, then you can not have multiple
-definitions of that choice. If a [symbol] is associated to the choice,
-then you may define the same choice (i.e. with the same entries) in another
-place.
 
 comment::
 
index c946eb44bd138e9784c94b3a1eacf242c7dc06e5..fc4e845bc249ba87b5ce045186683848f424bced 100644 (file)
@@ -1,10 +1,10 @@
-===================
-Kconfig make config
-===================
+=================================
+Configuration targets and editors
+=================================
 
-This file contains some assistance for using `make *config`.
+This file contains some assistance for using ``make *config``.
 
-Use "make help" to list all of the possible configuration targets.
+Use ``make help`` to list all of the possible configuration targets.
 
 The xconfig ('qconf'), menuconfig ('mconf'), and nconfig ('nconf')
 programs also have embedded help text.  Be sure to check that for
@@ -12,8 +12,9 @@ navigation, search, and other general help text.
 
 The gconfig ('gconf') program has limited help text.
 
+
 General
--------
+=======
 
 New kernel releases often introduce new config symbols.  Often more
 important, new kernel releases may rename config symbols.  When
@@ -24,118 +25,102 @@ symbols have been introduced.
 
 To see a list of new config symbols, use::
 
-       cp user/some/old.config .config
-       make listnewconfig
+    cp user/some/old.config .config
+    make listnewconfig
 
 and the config program will list any new symbols, one per line.
 
 Alternatively, you can use the brute force method::
 
-       make oldconfig
-       scripts/diffconfig .config.old .config | less
-
-----------------------------------------------------------------------
-
-Environment variables for `*config`
+    make oldconfig
+    scripts/diffconfig .config.old .config | less
 
-KCONFIG_CONFIG
---------------
-This environment variable can be used to specify a default kernel config
-file name to override the default name of ".config".
 
-KCONFIG_DEFCONFIG_LIST
-----------------------
+Environment variables
+=====================
 
-This environment variable specifies a list of config files which can be used
-as a base configuration in case the .config does not exist yet. Entries in
-the list are separated with whitespaces to each other, and the first one
-that exists is used.
+Environment variables for ``*config``:
 
-KCONFIG_OVERWRITECONFIG
------------------------
-If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
-break symlinks when .config is a symlink to somewhere else.
+``KCONFIG_CONFIG``
+    This environment variable can be used to specify a default kernel config
+    file name to override the default name of ".config".
 
-KCONFIG_WARN_UNKNOWN_SYMBOLS
-----------------------------
-This environment variable makes Kconfig warn about all unrecognized
-symbols in the config input.
+``KCONFIG_DEFCONFIG_LIST``
+    This environment variable specifies a list of config files which can be
+    used as a base configuration in case the .config does not exist yet.
+    Entries in the list are separated with whitespaces to each other, and
+    the first one that exists is used.
 
-KCONFIG_WERROR
---------------
-If set, Kconfig treats warnings as errors.
+``KCONFIG_OVERWRITECONFIG``
+    If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
+    break symlinks when .config is a symlink to somewhere else.
 
-`CONFIG_`
----------
-If you set `CONFIG_` in the environment, Kconfig will prefix all symbols
-with its value when saving the configuration, instead of using the default,
-`CONFIG_`.
+``KCONFIG_WARN_UNKNOWN_SYMBOLS``
+    This environment variable makes Kconfig warn about all unrecognized
+    symbols in the config input.
 
-----------------------------------------------------------------------
+``KCONFIG_WERROR``
+    If set, Kconfig treats warnings as errors.
 
-Environment variables for '{allyes/allmod/allno/rand}config'
+``CONFIG_``
+    If you set ``CONFIG_`` in the environment, Kconfig will prefix all symbols
+    with its value when saving the configuration, instead of using the
+    default, ``CONFIG_``.
 
-KCONFIG_ALLCONFIG
------------------
-(partially based on lkml email from/by Rob Landley, re: miniconfig)
+Environment variables for ``{allyes/allmod/allno/rand}config``:
 
---------------------------------------------------
+``KCONFIG_ALLCONFIG``
+    The allyesconfig/allmodconfig/allnoconfig/randconfig variants can also
+    use the environment variable KCONFIG_ALLCONFIG as a flag or a filename
+    that contains config symbols that the user requires to be set to a
+    specific value.  If KCONFIG_ALLCONFIG is used without a filename where
+    KCONFIG_ALLCONFIG == "" or KCONFIG_ALLCONFIG == "1", ``make *config``
+    checks for a file named "all{yes/mod/no/def/random}.config"
+    (corresponding to the ``*config`` command that was used) for symbol values
+    that are to be forced.  If this file is not found, it checks for a
+    file named "all.config" to contain forced values.
 
-The allyesconfig/allmodconfig/allnoconfig/randconfig variants can also
-use the environment variable KCONFIG_ALLCONFIG as a flag or a filename
-that contains config symbols that the user requires to be set to a
-specific value.  If KCONFIG_ALLCONFIG is used without a filename where
-KCONFIG_ALLCONFIG == "" or KCONFIG_ALLCONFIG == "1", `make *config`
-checks for a file named "all{yes/mod/no/def/random}.config"
-(corresponding to the `*config` command that was used) for symbol values
-that are to be forced.  If this file is not found, it checks for a
-file named "all.config" to contain forced values.
+    This enables you to create "miniature" config (miniconfig) or custom
+    config files containing just the config symbols that you are interested
+    in.  Then the kernel config system generates the full .config file,
+    including symbols of your miniconfig file.
 
-This enables you to create "miniature" config (miniconfig) or custom
-config files containing just the config symbols that you are interested
-in.  Then the kernel config system generates the full .config file,
-including symbols of your miniconfig file.
-
-This 'KCONFIG_ALLCONFIG' file is a config file which contains
-(usually a subset of all) preset config symbols.  These variable
-settings are still subject to normal dependency checks.
-
-Examples::
+    This ``KCONFIG_ALLCONFIG`` file is a config file which contains
+    (usually a subset of all) preset config symbols.  These variable
+    settings are still subject to normal dependency checks.
 
-       KCONFIG_ALLCONFIG=custom-notebook.config make allnoconfig
+    Examples::
 
-or::
+        KCONFIG_ALLCONFIG=custom-notebook.config make allnoconfig
 
-       KCONFIG_ALLCONFIG=mini.config make allnoconfig
+    or::
 
-or::
+        KCONFIG_ALLCONFIG=mini.config make allnoconfig
 
-       make KCONFIG_ALLCONFIG=mini.config allnoconfig
+    or::
 
-These examples will disable most options (allnoconfig) but enable or
-disable the options that are explicitly listed in the specified
-mini-config files.
+        make KCONFIG_ALLCONFIG=mini.config allnoconfig
 
-----------------------------------------------------------------------
+    These examples will disable most options (allnoconfig) but enable or
+    disable the options that are explicitly listed in the specified
+    mini-config files.
 
-Environment variables for 'randconfig'
+Environment variables for ``randconfig``:
 
-KCONFIG_SEED
-------------
-You can set this to the integer value used to seed the RNG, if you want
-to somehow debug the behaviour of the kconfig parser/frontends.
-If not set, the current time will be used.
+``KCONFIG_SEED``
+    You can set this to the integer value used to seed the RNG, if you want
+    to somehow debug the behaviour of the kconfig parser/frontends.
+    If not set, the current time will be used.
 
-KCONFIG_PROBABILITY
--------------------
-This variable can be used to skew the probabilities. This variable can
-be unset or empty, or set to three different formats:
+``KCONFIG_PROBABILITY``
+    This variable can be used to skew the probabilities. This variable can
+    be unset or empty, or set to three different formats:
 
     =======================     ==================  =====================
-       KCONFIG_PROBABILITY     y:n split           y:m:n split
+    KCONFIG_PROBABILITY         y:n split           y:m:n split
     =======================     ==================  =====================
-       unset or empty          50  : 50            33  : 33  : 34
-       N                        N  : 100-N         N/2 : N/2 : 100-N
+    unset or empty              50  : 50            33  : 33  : 34
+    N                            N  : 100-N         N/2 : N/2 : 100-N
     [1] N:M                     N+M : 100-(N+M)      N  :  M  : 100-(N+M)
     [2] N:M:L                    N  : 100-N          M  :  L  : 100-(M+L)
     =======================     ==================  =====================
@@ -149,112 +134,98 @@ that:
 
 Examples::
 
-       KCONFIG_PROBABILITY=10
-               10% of booleans will be set to 'y', 90% to 'n'
-               5% of tristates will be set to 'y', 5% to 'm', 90% to 'n'
-       KCONFIG_PROBABILITY=15:25
-               40% of booleans will be set to 'y', 60% to 'n'
-               15% of tristates will be set to 'y', 25% to 'm', 60% to 'n'
-       KCONFIG_PROBABILITY=10:15:15
-               10% of booleans will be set to 'y', 90% to 'n'
-               15% of tristates will be set to 'y', 15% to 'm', 70% to 'n'
+    KCONFIG_PROBABILITY=10
+        10% of booleans will be set to 'y', 90% to 'n'
+        5% of tristates will be set to 'y', 5% to 'm', 90% to 'n'
+    KCONFIG_PROBABILITY=15:25
+        40% of booleans will be set to 'y', 60% to 'n'
+        15% of tristates will be set to 'y', 25% to 'm', 60% to 'n'
+    KCONFIG_PROBABILITY=10:15:15
+        10% of booleans will be set to 'y', 90% to 'n'
+        15% of tristates will be set to 'y', 15% to 'm', 70% to 'n'
 
-----------------------------------------------------------------------
+Environment variables for ``syncconfig``:
 
-Environment variables for 'syncconfig'
+``KCONFIG_NOSILENTUPDATE``
+    If this variable has a non-blank value, it prevents silent kernel
+    config updates (requires explicit updates).
 
-KCONFIG_NOSILENTUPDATE
-----------------------
-If this variable has a non-blank value, it prevents silent kernel
-config updates (requires explicit updates).
+``KCONFIG_AUTOCONFIG``
+    This environment variable can be set to specify the path & name of the
+    "auto.conf" file.  Its default value is "include/config/auto.conf".
 
-KCONFIG_AUTOCONFIG
-------------------
-This environment variable can be set to specify the path & name of the
-"auto.conf" file.  Its default value is "include/config/auto.conf".
+``KCONFIG_AUTOHEADER``
+    This environment variable can be set to specify the path & name of the
+    "autoconf.h" (header) file.
+    Its default value is "include/generated/autoconf.h".
 
-KCONFIG_AUTOHEADER
-------------------
-This environment variable can be set to specify the path & name of the
-"autoconf.h" (header) file.
-Its default value is "include/generated/autoconf.h".
-
-
-----------------------------------------------------------------------
 
 menuconfig
-----------
-
-SEARCHING for CONFIG symbols
+==========
 
 Searching in menuconfig:
 
-       The Search function searches for kernel configuration symbol
-       names, so you have to know something close to what you are
-       looking for.
+    The Search function searches for kernel configuration symbol
+    names, so you have to know something close to what you are
+    looking for.
 
-       Example::
+    Example::
 
-               /hotplug
-               This lists all config symbols that contain "hotplug",
-               e.g., HOTPLUG_CPU, MEMORY_HOTPLUG.
+        /hotplug
+        This lists all config symbols that contain "hotplug",
+        e.g., HOTPLUG_CPU, MEMORY_HOTPLUG.
 
-       For search help, enter / followed by TAB-TAB (to highlight
-       <Help>) and Enter.  This will tell you that you can also use
-       regular expressions (regexes) in the search string, so if you
-       are not interested in MEMORY_HOTPLUG, you could try::
+    For search help, enter / followed by TAB-TAB (to highlight
+    <Help>) and Enter.  This will tell you that you can also use
+    regular expressions (regexes) in the search string, so if you
+    are not interested in MEMORY_HOTPLUG, you could try::
 
-               /^hotplug
+        /^hotplug
 
-       When searching, symbols are sorted thus:
+    When searching, symbols are sorted thus:
 
-         - first, exact matches, sorted alphabetically (an exact match
-           is when the search matches the complete symbol name);
-         - then, other matches, sorted alphabetically.
+    - first, exact matches, sorted alphabetically (an exact match
+      is when the search matches the complete symbol name);
+    - then, other matches, sorted alphabetically.
 
-       For example: ^ATH.K matches:
+    For example, ^ATH.K matches:
 
-           ATH5K ATH9K ATH5K_AHB ATH5K_DEBUG [...] ATH6KL ATH6KL_DEBUG
-           [...] ATH9K_AHB ATH9K_BTCOEX_SUPPORT ATH9K_COMMON [...]
+        ATH5K ATH9K ATH5K_AHB ATH5K_DEBUG [...] ATH6KL ATH6KL_DEBUG
+        [...] ATH9K_AHB ATH9K_BTCOEX_SUPPORT ATH9K_COMMON [...]
 
-       of which only ATH5K and ATH9K match exactly and so are sorted
-       first (and in alphabetical order), then come all other symbols,
-       sorted in alphabetical order.
+    of which only ATH5K and ATH9K match exactly and so are sorted
+    first (and in alphabetical order), then come all other symbols,
+    sorted in alphabetical order.
 
-       In this menu, pressing the key in the (#) prefix will jump
-       directly to that location. You will be returned to the current
-       search results after exiting this new menu.
+    In this menu, pressing the key in the (#) prefix will jump
+    directly to that location. You will be returned to the current
+    search results after exiting this new menu.
 
-----------------------------------------------------------------------
+User interface options for 'menuconfig':
 
-User interface options for 'menuconfig'
+``MENUCONFIG_COLOR``
+    It is possible to select different color themes using the variable
+    MENUCONFIG_COLOR.  To select a theme use::
 
-MENUCONFIG_COLOR
-----------------
-It is possible to select different color themes using the variable
-MENUCONFIG_COLOR.  To select a theme use::
+        make MENUCONFIG_COLOR=<theme> menuconfig
 
-       make MENUCONFIG_COLOR=<theme> menuconfig
+    Available themes are::
 
-Available themes are::
+      - mono       => selects colors suitable for monochrome displays
+      - blackbg    => selects a color scheme with black background
+      - classic    => theme with blue background. The classic look
+      - bluetitle  => a LCD friendly version of classic. (default)
 
-  - mono       => selects colors suitable for monochrome displays
-  - blackbg    => selects a color scheme with black background
-  - classic    => theme with blue background. The classic look
-  - bluetitle  => a LCD friendly version of classic. (default)
+``MENUCONFIG_MODE``
+    This mode shows all sub-menus in one large tree.
 
-MENUCONFIG_MODE
----------------
-This mode shows all sub-menus in one large tree.
+    Example::
 
-Example::
+        make MENUCONFIG_MODE=single_menu menuconfig
 
-       make MENUCONFIG_MODE=single_menu menuconfig
-
-----------------------------------------------------------------------
 
 nconfig
--------
+=======
 
 nconfig is an alternate text-based configurator.  It lists function
 keys across the bottom of the terminal (window) that execute commands.
@@ -266,61 +237,59 @@ Use F1 for Global help or F3 for the Short help menu.
 
 Searching in nconfig:
 
-       You can search either in the menu entry "prompt" strings
-       or in the configuration symbols.
+    You can search either in the menu entry "prompt" strings
+    or in the configuration symbols.
+
+    Use / to begin a search through the menu entries.  This does
+    not support regular expressions.  Use <Down> or <Up> for
+    Next hit and Previous hit, respectively.  Use <Esc> to
+    terminate the search mode.
 
-       Use / to begin a search through the menu entries.  This does
-       not support regular expressions.  Use <Down> or <Up> for
-       Next hit and Previous hit, respectively.  Use <Esc> to
-       terminate the search mode.
+    F8 (SymSearch) searches the configuration symbols for the
+    given string or regular expression (regex).
 
-       F8 (SymSearch) searches the configuration symbols for the
-       given string or regular expression (regex).
+    In the SymSearch, pressing the key in the (#) prefix will
+    jump directly to that location. You will be returned to the
+    current search results after exiting this new menu.
 
-       In the SymSearch, pressing the key in the (#) prefix will
-       jump directly to that location. You will be returned to the
-       current search results after exiting this new menu.
+Environment variables:
 
-NCONFIG_MODE
-------------
-This mode shows all sub-menus in one large tree.
+``NCONFIG_MODE``
+    This mode shows all sub-menus in one large tree.
 
-Example::
+    Example::
 
-       make NCONFIG_MODE=single_menu nconfig
+        make NCONFIG_MODE=single_menu nconfig
 
-----------------------------------------------------------------------
 
 xconfig
--------
+=======
 
 Searching in xconfig:
 
-       The Search function searches for kernel configuration symbol
-       names, so you have to know something close to what you are
-       looking for.
-
-       Example::
+    The Search function searches for kernel configuration symbol
+    names, so you have to know something close to what you are
+    looking for.
 
-               Ctrl-F hotplug
+    Example::
 
-       or::
+        Ctrl-F hotplug
 
-               Menu: File, Search, hotplug
+    or::
 
-       lists all config symbol entries that contain "hotplug" in
-       the symbol name.  In this Search dialog, you may change the
-       config setting for any of the entries that are not grayed out.
-       You can also enter a different search string without having
-       to return to the main menu.
+        Menu: File, Search, hotplug
 
+    lists all config symbol entries that contain "hotplug" in
+    the symbol name.  In this Search dialog, you may change the
+    config setting for any of the entries that are not grayed out.
+    You can also enter a different search string without having
+    to return to the main menu.
 
-----------------------------------------------------------------------
 
 gconfig
--------
+=======
 
 Searching in gconfig:
 
-       There is no search command in gconfig.  However, gconfig does
-       have several different viewing choices, modes, and options.
+    There is no search command in gconfig.  However, gconfig does
+    have several different viewing choices, modes, and options.
index 6fe2ae1a6d9214a8ff31253b7ac575fb7ef78f22..5e09b53b485016d3b6a4ba2f1ded15ae84496371 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -39,8 +39,8 @@ __all:
 # prepare rule.
 
 this-makefile := $(lastword $(MAKEFILE_LIST))
-export abs_srctree := $(realpath $(dir $(this-makefile)))
-export abs_objtree := $(CURDIR)
+abs_srctree := $(realpath $(dir $(this-makefile)))
+abs_objtree := $(CURDIR)
 
 ifneq ($(sub_make_done),1)
 
@@ -295,51 +295,51 @@ single-build      :=
 
 ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
     ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
-               need-config :=
+        need-config :=
     endif
 endif
 
 ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),)
     ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),)
-               may-sync-config :=
+        may-sync-config :=
     endif
 endif
 
 need-compiler := $(may-sync-config)
 
 ifneq ($(KBUILD_EXTMOD),)
-       may-sync-config :=
+    may-sync-config :=
 endif
 
 ifeq ($(KBUILD_EXTMOD),)
-        ifneq ($(filter %config,$(MAKECMDGOALS)),)
-               config-build := 1
-                ifneq ($(words $(MAKECMDGOALS)),1)
-                       mixed-build := 1
-                endif
+    ifneq ($(filter %config,$(MAKECMDGOALS)),)
+        config-build := 1
+        ifneq ($(words $(MAKECMDGOALS)),1)
+            mixed-build := 1
         endif
+    endif
 endif
 
 # We cannot build single targets and the others at the same time
 ifneq ($(filter $(single-targets), $(MAKECMDGOALS)),)
-       single-build := 1
+    single-build := 1
     ifneq ($(filter-out $(single-targets), $(MAKECMDGOALS)),)
-               mixed-build := 1
+        mixed-build := 1
     endif
 endif
 
 # For "make -j clean all", "make -j mrproper defconfig all", etc.
 ifneq ($(filter $(clean-targets),$(MAKECMDGOALS)),)
-        ifneq ($(filter-out $(clean-targets),$(MAKECMDGOALS)),)
-               mixed-build := 1
-        endif
+    ifneq ($(filter-out $(clean-targets),$(MAKECMDGOALS)),)
+        mixed-build := 1
+    endif
 endif
 
 # install and modules_install need also be processed one by one
 ifneq ($(filter install,$(MAKECMDGOALS)),)
-        ifneq ($(filter modules_install,$(MAKECMDGOALS)),)
-               mixed-build := 1
-        endif
+    ifneq ($(filter modules_install,$(MAKECMDGOALS)),)
+        mixed-build := 1
+    endif
 endif
 
 ifdef mixed-build
@@ -965,8 +965,15 @@ export CC_FLAGS_CFI
 endif
 
 ifneq ($(CONFIG_FUNCTION_ALIGNMENT),0)
+# Set the minimal function alignment. Use the newer GCC option
+# -fmin-function-alignment if it is available, or fall back to -falign-funtions.
+# See also CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT.
+ifdef CONFIG_CC_HAS_MIN_FUNCTION_ALIGNMENT
+KBUILD_CFLAGS += -fmin-function-alignment=$(CONFIG_FUNCTION_ALIGNMENT)
+else
 KBUILD_CFLAGS += -falign-functions=$(CONFIG_FUNCTION_ALIGNMENT)
 endif
+endif
 
 # arch Makefile may override CC so keep this after arch Makefile is included
 NOSTDINC_FLAGS += -nostdinc
@@ -1384,7 +1391,7 @@ ifneq ($(dtstree),)
 
 PHONY += dtbs dtbs_prepare dtbs_install dtbs_check
 dtbs: dtbs_prepare
-       $(Q)$(MAKE) $(build)=$(dtstree)
+       $(Q)$(MAKE) $(build)=$(dtstree) need-dtbslist=1
 
 # include/config/kernel.release is actually needed when installing DTBs because
 # INSTALL_DTBS_PATH contains $(KERNELRELEASE). However, we do not want to make
@@ -1402,7 +1409,7 @@ endif
 dtbs_check: dtbs
 
 dtbs_install:
-       $(Q)$(MAKE) $(dtbinst)=$(dtstree) dst=$(INSTALL_DTBS_PATH)
+       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.dtbinst obj=$(dtstree)
 
 ifdef CONFIG_OF_EARLY_FLATTREE
 all: dtbs
@@ -1923,7 +1930,7 @@ clean: $(clean-dirs)
                -o -name '*.ko.*' \
                -o -name '*.dtb' -o -name '*.dtbo' \
                -o -name '*.dtb.S' -o -name '*.dtbo.S' \
-               -o -name '*.dt.yaml' \
+               -o -name '*.dt.yaml' -o -name 'dtbs-list' \
                -o -name '*.dwo' -o -name '*.lst' \
                -o -name '*.su' -o -name '*.mod' \
                -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
index fd18b7db2c777bb1223ffd0a4bcf0d5b11633330..59dee290d94b30b9234b4ce3f83a1801025eee3c 100644 (file)
@@ -1597,4 +1597,16 @@ config FUNCTION_ALIGNMENT
        default 4 if FUNCTION_ALIGNMENT_4B
        default 0
 
+config CC_HAS_MIN_FUNCTION_ALIGNMENT
+       # Detect availability of the GCC option -fmin-function-alignment which
+       # guarantees minimal alignment for all functions, unlike
+       # -falign-functions which the compiler ignores for cold functions.
+       def_bool $(cc-option, -fmin-function-alignment=8)
+
+config CC_HAS_SANE_FUNCTION_ALIGNMENT
+       # Set if the guaranteed alignment with -fmin-function-alignment is
+       # available or extra care is required in the kernel. Clang provides
+       # strict alignment always, even with -falign-functions.
+       def_bool CC_HAS_MIN_FUNCTION_ALIGNMENT || CC_IS_CLANG
+
 endmenu
index 4f490250d32302087a6decd3a70e0f21b9611035..3afd042150f8aff71a1709e9ab3e704a829c3a45 100644 (file)
@@ -339,6 +339,7 @@ config ALPHA_EV4
        bool
        depends on ALPHA_JENSEN || (ALPHA_SABLE && !ALPHA_GAMMA) || ALPHA_LYNX || ALPHA_NORITAKE && !ALPHA_PRIMO || ALPHA_MIKASA && !ALPHA_PRIMO || ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P_CH || ALPHA_XL || ALPHA_NONAME || ALPHA_EB66 || ALPHA_EB66P || ALPHA_P2K
        default y if !ALPHA_LYNX
+       default y if !ALPHA_EV5
 
 config ALPHA_LCA
        bool
@@ -366,10 +367,6 @@ config ALPHA_EV5
        bool "EV5 CPU(s) (model 5/xxx)?" if ALPHA_LYNX
        default y if ALPHA_RX164 || ALPHA_RAWHIDE || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_RUFFIAN || ALPHA_SABLE && ALPHA_GAMMA || ALPHA_NORITAKE && ALPHA_PRIMO || ALPHA_MIKASA && ALPHA_PRIMO || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR
 
-config ALPHA_EV4
-       bool
-       default y if ALPHA_LYNX && !ALPHA_EV5
-
 config ALPHA_CIA
        bool
        depends on ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_RUFFIAN || ALPHA_NORITAKE && ALPHA_PRIMO || ALPHA_MIKASA && ALPHA_PRIMO || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR
@@ -394,16 +391,12 @@ config ALPHA_PRIMO
          Say Y if you have an AS 1000 5/xxx or an AS 1000A 5/xxx.
 
 config ALPHA_GAMMA
-       bool "EV5 CPU(s) (model 5/xxx)?"
-       depends on ALPHA_SABLE
+       bool "EV5 CPU(s) (model 5/xxx)?" if ALPHA_SABLE
+       depends on ALPHA_SABLE || ALPHA_LYNX
+       default ALPHA_LYNX
        help
          Say Y if you have an AS 2000 5/xxx or an AS 2100 5/xxx.
 
-config ALPHA_GAMMA
-       bool
-       depends on ALPHA_LYNX
-       default y
-
 config ALPHA_T2
        bool
        depends on ALPHA_SABLE || ALPHA_LYNX
index 1414052e7d6b2ad5c22975d1cb5b002f558ebc1e..e233b5efa2761e35c416cbc147f6b6422a7c5b8f 100644 (file)
@@ -7,11 +7,13 @@ config HEXAGON
        select ARCH_32BIT_OFF_T
        select ARCH_HAS_SYNC_DMA_FOR_DEVICE
        select ARCH_NO_PREEMPT
+       select ARCH_WANT_FRAME_POINTERS
        select DMA_GLOBAL_POOL
        select HAVE_PAGE_SIZE_4KB
        select HAVE_PAGE_SIZE_16KB
        select HAVE_PAGE_SIZE_64KB
        select HAVE_PAGE_SIZE_256KB
+       select FRAME_POINTER
        # Other pending projects/to-do items.
        # select HAVE_REGS_AND_STACK_ACCESS_API
        # select HAVE_HW_BREAKPOINT if PERF_EVENTS
@@ -23,6 +25,7 @@ config HEXAGON
        select HAVE_PERF_EVENTS
        # GENERIC_ALLOCATOR is used by dma_alloc_coherent()
        select GENERIC_ALLOCATOR
+       select GENERIC_IRQ_PROBE
        select GENERIC_IRQ_SHOW
        select HAVE_ARCH_KGDB
        select HAVE_ARCH_TRACEHOOK
@@ -47,9 +50,6 @@ config HEXAGON_PHYS_OFFSET
        help
          Platforms that don't load the kernel at zero set this.
 
-config FRAME_POINTER
-       def_bool y
-
 config LOCKDEP_SUPPORT
        def_bool y
 
@@ -62,12 +62,6 @@ config MMU
 config GENERIC_CSUM
        def_bool y
 
-#
-# Use the generic interrupt handling code in kernel/irq/:
-#
-config GENERIC_IRQ_PROBE
-       def_bool y
-
 config GENERIC_HWEIGHT
        def_bool y
 
index ee29c4c8d7c1c5d3d553fa37388a4510f0fa0b9b..daafeb20f99370310feceaaeb1186e8f9fa8e74c 100644 (file)
@@ -238,9 +238,9 @@ config PARISC_HUGE_KERNEL
        def_bool y if !MODULES || UBSAN || FTRACE || COMPILE_TEST
 
 config MLONGCALLS
-       def_bool y if PARISC_HUGE_KERNEL
        bool "Enable the -mlong-calls compiler option for big kernels" if !PARISC_HUGE_KERNEL
        depends on PA8X00
+       default PARISC_HUGE_KERNEL
        help
          If you configure the kernel to include many drivers built-in instead
          as modules, the kernel executable may become too big, so that the
@@ -255,9 +255,9 @@ config MLONGCALLS
          Enabling this option will probably slow down your kernel.
 
 config 64BIT
-       def_bool y if "$(ARCH)" = "parisc64"
        bool "64-bit kernel" if "$(ARCH)" = "parisc"
        depends on PA8X00
+       default "$(ARCH)" = "parisc64"
        help
          Enable this if you want to support 64bit kernel on PA-RISC platform.
 
index 5dba64e8e977cdeab7340f023ffa2656b24636e0..78cea5d2c27022fc74ea5e9f9c1b5956f64314af 100644 (file)
@@ -6,7 +6,7 @@ config AS_HAS_ULEB128
 
 menuconfig RUNTIME_KERNEL_TESTING_MENU
        bool "arch/riscv/kernel runtime Testing"
-       def_bool y
+       default y
        help
          Enable riscv kernel runtime testing.
 
index 620f6257bbe9358ce918bbf35aff659b683a2149..fd63051bbbbb8255b8c0d24f89e90d074a51e6f2 100644 (file)
@@ -9,7 +9,9 @@ include $(srctree)/lib/vdso/Makefile
 # Sanitizer runtimes are unavailable and cannot be linked here.
 KASAN_SANITIZE                 := n
 KMSAN_SANITIZE_vclock_gettime.o := n
+KMSAN_SANITIZE_vdso32/vclock_gettime.o := n
 KMSAN_SANITIZE_vgetcpu.o       := n
+KMSAN_SANITIZE_vdso32/vgetcpu.o        := n
 
 UBSAN_SANITIZE                 := n
 KCSAN_SANITIZE                 := n
index 8c3032a96caf167b30c1fc76b91039c809bc44e4..3aaf7e86a859a2f680625b4d13b1c27d43fa5629 100644 (file)
@@ -118,8 +118,8 @@ config KVM_AMD
          will be called kvm-amd.
 
 config KVM_AMD_SEV
-       def_bool y
        bool "AMD Secure Encrypted Virtualization (SEV) support"
+       default y
        depends on KVM_AMD && X86_64
        depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=y && CRYPTO_DEV_CCP_DD=m)
        help
index 475b5fa917a62d03d1a255234833140473b9c737..a88bb14266b69fe9805cb864cbe4c02e928e460b 100644 (file)
@@ -4,7 +4,8 @@ ccflags-y += -I $(srctree)/arch/x86/kvm
 ccflags-$(CONFIG_KVM_WERROR) += -Werror
 
 ifeq ($(CONFIG_FRAME_POINTER),y)
-OBJECT_FILES_NON_STANDARD_vmenter.o := y
+OBJECT_FILES_NON_STANDARD_vmx/vmenter.o := y
+OBJECT_FILES_NON_STANDARD_svm/vmenter.o := y
 endif
 
 include $(srctree)/virt/kvm/Makefile.kvm
index a65fc2ae15b4965b12862c3becf25e65e1b0fad7..77e788e928cd4e8d07ca867bd9e2337ea57c90df 100644 (file)
@@ -81,7 +81,6 @@ config XEN_PVH
        bool "Xen PVH guest support"
        depends on XEN && XEN_PVHVM && ACPI
        select PVH
-       def_bool n
        help
          Support for running as a Xen PVH guest.
 
index c645bb453f3b7fdf16fa228c30d53d7809ea24a8..5d1fb83b2d32ec715eb40dc724e297329d78fec8 100644 (file)
@@ -460,7 +460,6 @@ config ACPI_BGRT
 
 config ACPI_REDUCED_HARDWARE_ONLY
        bool "Hardware-reduced ACPI support only" if EXPERT
-       def_bool n
        help
          This config item changes the way the ACPI code is built.  When this
          option is selected, the kernel will use a specialized version of
index 6cf9f48e7d8c8e954dd0dd026a35f6fb40d7e9dc..f52fb39c968eb1e7b38ce808cade3a0da6b32f0c 100644 (file)
@@ -87,8 +87,8 @@ config INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON
          the default value.
 
 config INTEL_IOMMU_PERF_EVENTS
-       def_bool y
        bool "Intel IOMMU performance events"
+       default y
        depends on INTEL_IOMMU && PERF_EVENTS
        help
          Selecting this option will enable the performance monitoring
index 68ce56fc61d0a4ba7fcc62a6b394c0a7d71d169d..35b1080752cd7517f481313c26667e9d2154f36b 100644 (file)
@@ -519,7 +519,6 @@ config DM_VERITY
          If unsure, say N.
 
 config DM_VERITY_VERIFY_ROOTHASH_SIG
-       def_bool n
        bool "Verity data device root hash signature verification support"
        depends on DM_VERITY
        select SYSTEM_DATA_VERIFICATION
index 3e64ec0f7ac80b03af19a4812bc97cd80396efa9..2abaa3a825a9ec3f86a69e6e9cf169ad9614b20c 100644 (file)
@@ -99,17 +99,17 @@ static inline void __chk_io_ptr(const volatile void __iomem *ptr) { }
  *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-cold-label-attribute
  *
  * When -falign-functions=N is in use, we must avoid the cold attribute as
- * contemporary versions of GCC drop the alignment for cold functions. Worse,
- * GCC can implicitly mark callees of cold functions as cold themselves, so
- * it's not sufficient to add __function_aligned here as that will not ensure
- * that callees are correctly aligned.
+ * GCC drops the alignment for cold functions. Worse, GCC can implicitly mark
+ * callees of cold functions as cold themselves, so it's not sufficient to add
+ * __function_aligned here as that will not ensure that callees are correctly
+ * aligned.
  *
  * See:
  *
  *   https://lore.kernel.org/lkml/Y77%2FqVgvaJidFpYt@FVFF77S0Q05N
  *   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88345#c9
  */
-#if !defined(CONFIG_CC_IS_GCC) || (CONFIG_FUNCTION_ALIGNMENT == 0)
+#if defined(CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT) || (CONFIG_FUNCTION_ALIGNMENT == 0)
 #define __cold                         __attribute__((__cold__))
 #else
 #define __cold
index f3ea5dea9c8510db8148d0fb5f51fc6b441dbf06..d56d71fe0f87878b5515512ab0ddc7997e322d28 100644 (file)
@@ -1499,7 +1499,7 @@ config MULTIUSER
 
 config SGETMASK_SYSCALL
        bool "sgetmask/ssetmask syscalls support" if EXPERT
-       def_bool PARISC || M68K || PPC || MIPS || X86 || SPARC || MICROBLAZE || SUPERH
+       default PARISC || M68K || PPC || MIPS || X86 || SPARC || MICROBLAZE || SUPERH
        help
          sys_sgetmask and sys_ssetmask are obsolete system calls
          no longer supported in libc but still enabled by default in some
index 0ea1b2970a23b544cd6a91c0182fa63c9c98a02d..c3ced519e14ba44b15df3d9a42ecb0102b8e3cf6 100644 (file)
@@ -362,8 +362,7 @@ config MODPROBE_PATH
          userspace can still load modules explicitly).
 
 config TRIM_UNUSED_KSYMS
-       bool "Trim unused exported kernel symbols" if EXPERT
-       depends on !COMPILE_TEST
+       bool "Trim unused exported kernel symbols"
        help
          The kernel and some modules make many symbols available for
          other modules to use via EXPORT_SYMBOL() and variants. Depending
index 733ee2ac0138e34b8da1f97956758cc9e1cba030..f4a12980a8da3406c4dc67f60ca11ff77a99b626 100644 (file)
@@ -2127,7 +2127,7 @@ config KCOV_IRQ_AREA_SIZE
 
 menuconfig RUNTIME_TESTING_MENU
        bool "Runtime Testing"
-       def_bool y
+       default y
 
 if RUNTIME_TESTING_MENU
 
index b924f4a5a3ef8a7bf71498abe4392a350191e618..b1448aa81e15f48d7a2c14d18b666485635f2df1 100644 (file)
@@ -583,7 +583,7 @@ config MEMORY_BALLOON
 # support for memory balloon compaction
 config BALLOON_COMPACTION
        bool "Allow for balloon memory compaction/migration"
-       def_bool y
+       default y
        depends on COMPACTION && MEMORY_BALLOON
        help
          Memory fragmentation introduced by ballooning might reduce
@@ -598,7 +598,7 @@ config BALLOON_COMPACTION
 # support for memory compaction
 config COMPACTION
        bool "Allow for memory compaction"
-       def_bool y
+       default y
        select MIGRATION
        depends on MMU
        help
@@ -621,7 +621,6 @@ config COMPACT_UNEVICTABLE_DEFAULT
 # support for free page reporting
 config PAGE_REPORTING
        bool "Free page reporting"
-       def_bool n
        help
          Free page reporting allows for the incremental acquisition of
          free pages from the buddy allocator for the purpose of reporting
@@ -633,7 +632,7 @@ config PAGE_REPORTING
 #
 config MIGRATION
        bool "Page migration"
-       def_bool y
+       default y
        depends on (NUMA || ARCH_ENABLE_MEMORY_HOTREMOVE || COMPACTION || CMA) && MMU
        help
          Allows the migration of the physical location of pages of processes
index a3eeb84d16f9c6d5f110cb8a811f66b3e626ae06..e3d388c33d256c3733e2f432b451961afee39661 100644 (file)
@@ -13,7 +13,7 @@ config IP_DCCP_CCID2_DEBUG
 
 config IP_DCCP_CCID3
        bool "CCID-3 (TCP-Friendly)"
-       def_bool y if (IP_DCCP = y || IP_DCCP = m)
+       default IP_DCCP = y || IP_DCCP = m
        help
          CCID-3 denotes TCP-Friendly Rate Control (TFRC), an equation-based
          rate-controlled congestion control mechanism.  TFRC is designed to
index 1eaefc34f4b73c7bb26d0de5180f01b77906cf56..846e6ab9d5a9b660fd871a13c8f984260a1b105a 100644 (file)
@@ -100,7 +100,7 @@ rustdoc: rustdoc-core rustdoc-macros rustdoc-compiler_builtins \
                -e 's:rust-logo-[0-9a-f]+\.svg:logo.svg:g' \
                -e 's:favicon-[0-9a-f]+\.svg:logo.svg:g' \
                -e 's:<link rel="alternate icon" type="image/png" href="[/.]+/static\.files/favicon-(16x16|32x32)-[0-9a-f]+\.png">::g' \
-               -e 's:<a href="srctree/([^"]+)">:<a href="$(abs_srctree)/\1">:g'
+               -e 's:<a href="srctree/([^"]+)">:<a href="$(realpath $(srctree))/\1">:g'
        $(Q)for f in $(rustdoc_output)/static.files/rustdoc-*.css; do \
                echo ".logo-container > img { object-fit: contain; }" >> $$f; done
 
@@ -414,7 +414,7 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L
 rust-analyzer:
        $(Q)$(srctree)/scripts/generate_rust_analyzer.py \
                --cfgs='core=$(core-cfgs)' --cfgs='alloc=$(alloc-cfgs)' \
-               $(abs_srctree) $(abs_objtree) \
+               $(realpath $(srctree)) $(realpath $(objtree)) \
                $(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \
                $(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json
 
index 7778cc97a4e042cd763fb2f743e542a0c91d71ee..2f331879816b8e2bf6c07f98572cb7c4ac1fec36 100644 (file)
@@ -113,12 +113,6 @@ endef
 # $(Q)$(MAKE) $(build)=dir
 build := -f $(srctree)/scripts/Makefile.build obj
 
-###
-# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj=
-# Usage:
-# $(Q)$(MAKE) $(dtbinst)=dir
-dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
-
 ###
 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=
 # Usage:
index 0fb7a785594c961ee2157be94e28172bdbb71666..baf86c0880b6d7d548f4a6a21cd6305acc717078 100644 (file)
@@ -71,6 +71,7 @@ endif
 # subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
 subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
 subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
+subdir-dtbslist := $(sort $(filter %/dtbs-list, $(dtb-y)))
 
 targets-for-builtin := $(extra-y)
 
@@ -213,7 +214,7 @@ endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
 # 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file
 # 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
 
-is-standard-object = $(if $(filter-out y%, $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y)
+is-standard-object = $(if $(filter-out y%, $(OBJECT_FILES_NON_STANDARD_$(target-stem).o)$(OBJECT_FILES_NON_STANDARD)n),y)
 
 $(obj)/%.o: objtool-enabled = $(if $(is-standard-object),$(if $(delay-objtool),$(is-single-obj-m),y))
 
@@ -388,6 +389,7 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
 # To build objects in subdirs, we need to descend into the directories
 $(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
 $(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
+$(subdir-dtbslist): $(obj)/%/dtbs-list: $(obj)/% ;
 
 #
 # Rule to compile a set of .o files into one .a file (without symbol table)
@@ -404,19 +406,21 @@ $(obj)/built-in.a: $(real-obj-y) FORCE
        $(call if_changed,ar_builtin)
 
 #
-# Rule to create modules.order file
+# Rule to create modules.order and dtbs-list
 #
-# Create commands to either record .ko file or cat modules.order from
-# a subdirectory
-# Add $(obj-m) as the prerequisite to avoid updating the timestamp of
-# modules.order unless contained modules are updated.
+# This is a list of build artifacts (module or dtb) from the current Makefile
+# and its sub-directories. The timestamp should be updated when any of the
+# member files.
 
-cmd_modules_order = { $(foreach m, $(real-prereqs), \
-       $(if $(filter %/modules.order, $m), cat $m, echo $m);) :; } \
+cmd_gen_order = { $(foreach m, $(real-prereqs), \
+       $(if $(filter %/$(notdir $@), $m), cat $m, echo $m);) :; } \
        > $@
 
 $(obj)/modules.order: $(obj-m) FORCE
-       $(call if_changed,modules_order)
+       $(call if_changed,gen_order)
+
+$(obj)/dtbs-list: $(dtb-y) FORCE
+       $(call if_changed,gen_order)
 
 #
 # Rule to compile a set of .o files into one .a file (with symbol table)
index 4405d5b67578d6fdd30f2ec2b5b6e0de985cb231..67956f6496a5c062c65375dcd8c712d0be91d771 100644 (file)
@@ -8,32 +8,36 @@
 #   $INSTALL_PATH/dtbs/$KERNELRELEASE
 # ==========================================================================
 
-src := $(obj)
-
 PHONY := __dtbs_install
 __dtbs_install:
 
 include include/config/auto.conf
 include $(srctree)/scripts/Kbuild.include
-include $(kbuild-file)
-
-dtbs    := $(addprefix $(dst)/, $(dtb-y) $(if $(CONFIG_OF_ALL_DTBS),$(dtb-)))
-subdirs := $(addprefix $(obj)/, $(subdir-y) $(subdir-m))
 
-__dtbs_install: $(dtbs) $(subdirs)
-       @:
+dst := $(INSTALL_DTBS_PATH)
 
 quiet_cmd_dtb_install = INSTALL $@
       cmd_dtb_install = install -D $< $@
 
-$(dst)/%.dtb: $(obj)/%.dtb
+$(dst)/%: $(obj)/%
        $(call cmd,dtb_install)
 
-$(dst)/%.dtbo: $(obj)/%.dtbo
-       $(call cmd,dtb_install)
+dtbs := $(patsubst $(obj)/%,%,$(call read-file, $(obj)/dtbs-list))
+
+ifdef CONFIG_ARCH_WANT_FLAT_DTB_INSTALL
 
-PHONY += $(subdirs)
-$(subdirs):
-       $(Q)$(MAKE) $(dtbinst)=$@ dst=$(if $(CONFIG_ARCH_WANT_FLAT_DTB_INSTALL),$(dst),$(patsubst $(obj)/%,$(dst)/%,$@))
+define gen_install_rules
+$(dst)/%: $(obj)/$(1)%
+       $$(call cmd,dtb_install)
+endef
+
+$(foreach d, $(sort $(dir $(dtbs))), $(eval $(call gen_install_rules,$(d))))
+
+dtbs := $(notdir $(dtbs))
+
+endif # CONFIG_ARCH_WANT_FLAT_DTB_INSTALL
+
+__dtbs_install: $(addprefix $(dst)/, $(dtbs))
+       @:
 
 .PHONY: $(PHONY)
index a9e552a1e9105b5efb559a23e4a2943c102b12a2..3ce5d503a6da98efe3b7ec8b62138c5e12eb258c 100644 (file)
@@ -132,6 +132,8 @@ KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast)
 KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare
 KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
 KBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict)
+KBUILD_CFLAGS += -Wno-enum-compare-conditional
+KBUILD_CFLAGS += -Wno-enum-enum-conversion
 endif
 
 endif
@@ -185,7 +187,6 @@ KBUILD_CFLAGS += -Wpointer-arith
 KBUILD_CFLAGS += -Wredundant-decls
 KBUILD_CFLAGS += -Wsign-compare
 KBUILD_CFLAGS += -Wswitch-default
-KBUILD_CFLAGS += $(call cc-option, -Wpacked-bitfield-compat)
 
 KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3
 
index 1bd59b8db05f0b8e89a140ee724ec799c3922b86..3179747cbd2cc014d0a8ba98cff008f28fbbc050 100644 (file)
@@ -45,6 +45,11 @@ else
 obj-y          := $(filter-out %/, $(obj-y))
 endif
 
+ifdef need-dtbslist
+dtb-y          += $(addsuffix /dtbs-list, $(subdir-ym))
+always-y       += dtbs-list
+endif
+
 # Expand $(foo-objs) $(foo-y) etc. by replacing their individuals
 suffix-search = $(strip $(foreach s, $3, $($(1:%$(strip $2)=%$s))))
 # List composite targets that are constructed by combining other targets
@@ -99,6 +104,7 @@ lib-y                := $(addprefix $(obj)/,$(lib-y))
 real-obj-y     := $(addprefix $(obj)/,$(real-obj-y))
 real-obj-m     := $(addprefix $(obj)/,$(real-obj-m))
 multi-obj-m    := $(addprefix $(obj)/, $(multi-obj-m))
+dtb-y          := $(addprefix $(obj)/, $(dtb-y))
 multi-dtb-y    := $(addprefix $(obj)/, $(multi-dtb-y))
 real-dtb-y     := $(addprefix $(obj)/, $(real-dtb-y))
 subdir-ym      := $(addprefix $(obj)/,$(subdir-ym))
@@ -148,7 +154,7 @@ _cpp_flags     = $(KBUILD_CPPFLAGS) $(cppflags-y) $(CPPFLAGS_$(target-stem).lds)
 #
 ifeq ($(CONFIG_GCOV_KERNEL),y)
 _c_flags += $(if $(patsubst n%,, \
-               $(GCOV_PROFILE_$(basetarget).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)), \
+               $(GCOV_PROFILE_$(target-stem).o)$(GCOV_PROFILE)$(CONFIG_GCOV_PROFILE_ALL)), \
                $(CFLAGS_GCOV))
 endif
 
@@ -159,32 +165,32 @@ endif
 ifeq ($(CONFIG_KASAN),y)
 ifneq ($(CONFIG_KASAN_HW_TAGS),y)
 _c_flags += $(if $(patsubst n%,, \
-               $(KASAN_SANITIZE_$(basetarget).o)$(KASAN_SANITIZE)y), \
+               $(KASAN_SANITIZE_$(target-stem).o)$(KASAN_SANITIZE)y), \
                $(CFLAGS_KASAN), $(CFLAGS_KASAN_NOSANITIZE))
 endif
 endif
 
 ifeq ($(CONFIG_KMSAN),y)
 _c_flags += $(if $(patsubst n%,, \
-               $(KMSAN_SANITIZE_$(basetarget).o)$(KMSAN_SANITIZE)y), \
+               $(KMSAN_SANITIZE_$(target-stem).o)$(KMSAN_SANITIZE)y), \
                $(CFLAGS_KMSAN))
 _c_flags += $(if $(patsubst n%,, \
-               $(KMSAN_ENABLE_CHECKS_$(basetarget).o)$(KMSAN_ENABLE_CHECKS)y), \
+               $(KMSAN_ENABLE_CHECKS_$(target-stem).o)$(KMSAN_ENABLE_CHECKS)y), \
                , -mllvm -msan-disable-checks=1)
 endif
 
 ifeq ($(CONFIG_UBSAN),y)
 _c_flags += $(if $(patsubst n%,, \
-               $(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)y), \
+               $(UBSAN_SANITIZE_$(target-stem).o)$(UBSAN_SANITIZE)y), \
                $(CFLAGS_UBSAN))
 _c_flags += $(if $(patsubst n%,, \
-               $(UBSAN_SIGNED_WRAP_$(basetarget).o)$(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SIGNED_WRAP)$(UBSAN_SANITIZE)y), \
+               $(UBSAN_SIGNED_WRAP_$(target-stem).o)$(UBSAN_SANITIZE_$(target-stem).o)$(UBSAN_SIGNED_WRAP)$(UBSAN_SANITIZE)y), \
                $(CFLAGS_UBSAN_SIGNED_WRAP))
 endif
 
 ifeq ($(CONFIG_KCOV),y)
 _c_flags += $(if $(patsubst n%,, \
-       $(KCOV_INSTRUMENT_$(basetarget).o)$(KCOV_INSTRUMENT)$(CONFIG_KCOV_INSTRUMENT_ALL)), \
+       $(KCOV_INSTRUMENT_$(target-stem).o)$(KCOV_INSTRUMENT)$(CONFIG_KCOV_INSTRUMENT_ALL)), \
        $(CFLAGS_KCOV))
 endif
 
@@ -194,12 +200,12 @@ endif
 #
 ifeq ($(CONFIG_KCSAN),y)
 _c_flags += $(if $(patsubst n%,, \
-       $(KCSAN_SANITIZE_$(basetarget).o)$(KCSAN_SANITIZE)y), \
+       $(KCSAN_SANITIZE_$(target-stem).o)$(KCSAN_SANITIZE)y), \
        $(CFLAGS_KCSAN))
 # Some uninstrumented files provide implied barriers required to avoid false
 # positives: set KCSAN_INSTRUMENT_BARRIERS for barrier instrumentation only.
 _c_flags += $(if $(patsubst n%,, \
-       $(KCSAN_INSTRUMENT_BARRIERS_$(basetarget).o)$(KCSAN_INSTRUMENT_BARRIERS)n), \
+       $(KCSAN_INSTRUMENT_BARRIERS_$(target-stem).o)$(KCSAN_INSTRUMENT_BARRIERS)n), \
        -D__KCSAN_INSTRUMENT_BARRIERS__)
 endif
 
@@ -364,7 +370,7 @@ DTC_FLAGS += -Wnode_name_chars_strict \
        -Wunique_unit_address
 endif
 
-DTC_FLAGS += $(DTC_FLAGS_$(basetarget))
+DTC_FLAGS += $(DTC_FLAGS_$(target-stem))
 
 # Set -@ if the target is a base DTB that overlay is applied onto
 DTC_FLAGS += $(if $(filter $(patsubst $(obj)/%,%,$@), $(base-dtb-y)), -@)
index a81dfb1f518106e50d8ebdb2014be1fcb028bba5..38653f3e81088906177b72f22994e57a6cd98068 100644 (file)
@@ -135,7 +135,7 @@ snap-pkg:
        mkdir $(objtree)/snap
        $(MAKE) clean
        sed "s@KERNELRELEASE@$(KERNELRELEASE)@; \
-               s@SRCTREE@$(abs_srctree)@" \
+               s@SRCTREE@$(realpath $(srctree))@" \
                $(srctree)/scripts/package/snapcraft.template > \
                $(objtree)/snap/snapcraft.yaml
        cd $(objtree)/snap && \
diff --git a/scripts/kconfig/array_size.h b/scripts/kconfig/array_size.h
new file mode 100644 (file)
index 0000000..26ba78d
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef ARRAY_SIZE_H
+#define ARRAY_SIZE_H
+
+/**
+ * ARRAY_SIZE - get the number of elements in array @arr
+ * @arr: array to be sized
+ */
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+#endif /* ARRAY_SIZE_H */
index 662a5e7c37c28539ce7104085478c718848c4fc3..b5730061872baea05947ca95ec94391a0a468e36 100644 (file)
@@ -14,6 +14,7 @@
 #include <sys/time.h>
 #include <errno.h>
 
+#include "internal.h"
 #include "lkc.h"
 
 static void conf(struct menu *menu);
@@ -171,7 +172,7 @@ enum conf_def_mode {
 static bool conf_set_all_new_symbols(enum conf_def_mode mode)
 {
        struct symbol *sym, *csym;
-       int i, cnt;
+       int cnt;
        /*
         * can't go as the default in switch-case below, otherwise gcc whines
         * about -Wmaybe-uninitialized
@@ -226,7 +227,7 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode)
                }
        }
 
-       for_all_symbols(i, sym) {
+       for_all_symbols(sym) {
                if (sym_has_value(sym) || sym->flags & SYMBOL_VALID)
                        continue;
                switch (sym_get_type(sym)) {
@@ -278,14 +279,14 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode)
         * and the rest to no.
         */
        if (mode != def_random) {
-               for_all_symbols(i, csym) {
+               for_all_symbols(csym) {
                        if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
                            sym_is_choice_value(csym))
                                csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
                }
        }
 
-       for_all_symbols(i, csym) {
+       for_all_symbols(csym) {
                if (sym_has_value(csym) || !sym_is_choice(csym))
                        continue;
 
@@ -304,9 +305,8 @@ static bool conf_set_all_new_symbols(enum conf_def_mode mode)
 static void conf_rewrite_tristates(tristate old_val, tristate new_val)
 {
        struct symbol *sym;
-       int i;
 
-       for_all_symbols(i, sym) {
+       for_all_symbols(sym) {
                if (sym_get_type(sym) == S_TRISTATE &&
                    sym->def[S_DEF_USER].tri == old_val)
                        sym->def[S_DEF_USER].tri = new_val;
index f53dcdd445976aa8759e13e6e3103ef02f76ead1..0e35c4819cf1d2f71e998b11cac56cdfea9fbbc4 100644 (file)
 #include <time.h>
 #include <unistd.h>
 
+#include "internal.h"
 #include "lkc.h"
 
+struct gstr autoconf_cmd;
+
 /* return true if 'path' exists, false otherwise */
 static bool is_present(const char *path)
 {
@@ -293,63 +296,12 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
        return 0;
 }
 
-#define LINE_GROWTH 16
-static int add_byte(int c, char **lineptr, size_t slen, size_t *n)
-{
-       size_t new_size = slen + 1;
-
-       if (new_size > *n) {
-               new_size += LINE_GROWTH - 1;
-               new_size *= 2;
-               *lineptr = xrealloc(*lineptr, new_size);
-               *n = new_size;
-       }
-
-       (*lineptr)[slen] = c;
-
-       return 0;
-}
-
-static ssize_t compat_getline(char **lineptr, size_t *n, FILE *stream)
-{
-       char *line = *lineptr;
-       size_t slen = 0;
-
-       for (;;) {
-               int c = getc(stream);
-
-               switch (c) {
-               case '\n':
-                       if (add_byte(c, &line, slen, n) < 0)
-                               goto e_out;
-                       slen++;
-                       /* fall through */
-               case EOF:
-                       if (add_byte('\0', &line, slen, n) < 0)
-                               goto e_out;
-                       *lineptr = line;
-                       if (slen == 0)
-                               return -1;
-                       return slen;
-               default:
-                       if (add_byte(c, &line, slen, n) < 0)
-                               goto e_out;
-                       slen++;
-               }
-       }
-
-e_out:
-       line[slen-1] = '\0';
-       *lineptr = line;
-       return -1;
-}
-
 /* like getline(), but the newline character is stripped away */
 static ssize_t getline_stripped(char **lineptr, size_t *n, FILE *stream)
 {
        ssize_t len;
 
-       len = compat_getline(lineptr, n, stream);
+       len = getline(lineptr, n, stream);
 
        if (len > 0 && (*lineptr)[len - 1] == '\n') {
                len--;
@@ -371,7 +323,7 @@ int conf_read_simple(const char *name, int def)
        size_t  line_asize = 0;
        char *p, *val;
        struct symbol *sym;
-       int i, def_flags;
+       int def_flags;
        const char *warn_unknown, *sym_name;
 
        warn_unknown = getenv("KCONFIG_WARN_UNKNOWN_SYMBOLS");
@@ -429,7 +381,7 @@ load:
        conf_warnings = 0;
 
        def_flags = SYMBOL_DEF << def;
-       for_all_symbols(i, sym) {
+       for_all_symbols(sym) {
                sym->flags |= SYMBOL_CHANGED;
                sym->flags &= ~(def_flags|SYMBOL_VALID);
                if (sym_is_choice(sym))
@@ -538,7 +490,6 @@ int conf_read(const char *name)
 {
        struct symbol *sym;
        int conf_unsaved = 0;
-       int i;
 
        conf_set_changed(false);
 
@@ -549,7 +500,7 @@ int conf_read(const char *name)
 
        sym_calc_value(modules_sym);
 
-       for_all_symbols(i, sym) {
+       for_all_symbols(sym) {
                sym_calc_value(sym);
                if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE))
                        continue;
@@ -573,7 +524,7 @@ int conf_read(const char *name)
                /* maybe print value in verbose mode... */
        }
 
-       for_all_symbols(i, sym) {
+       for_all_symbols(sym) {
                if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
                        /* Reset values of generates values, so they'll appear
                         * as new, if they should become visible, but that
@@ -848,10 +799,7 @@ int conf_write_defconfig(const char *filename)
        while (menu != NULL)
        {
                sym = menu->sym;
-               if (sym == NULL) {
-                       if (!menu_is_visible(menu))
-                               goto next_menu;
-               } else if (!sym_is_choice(sym)) {
+               if (sym && !sym_is_choice(sym)) {
                        sym_calc_value(sym);
                        if (!(sym->flags & SYMBOL_WRITE))
                                goto next_menu;
@@ -911,7 +859,6 @@ int conf_write(const char *name)
        const char *str;
        char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1];
        char *env;
-       int i;
        bool need_newline = false;
 
        if (!name)
@@ -995,7 +942,7 @@ end_check:
        }
        fclose(out);
 
-       for_all_symbols(i, sym)
+       for_all_symbols(sym)
                sym->flags &= ~SYMBOL_WRITTEN;
 
        if (*tmpname) {
@@ -1023,7 +970,6 @@ end_check:
 static int conf_write_autoconf_cmd(const char *autoconf_name)
 {
        char name[PATH_MAX], tmp[PATH_MAX];
-       struct file *file;
        FILE *out;
        int ret;
 
@@ -1044,15 +990,9 @@ static int conf_write_autoconf_cmd(const char *autoconf_name)
                return -1;
        }
 
-       fprintf(out, "deps_config := \\\n");
-       for (file = file_list; file; file = file->next)
-               fprintf(out, "\t%s \\\n", file->name);
-
-       fprintf(out, "\n%s: $(deps_config)\n\n", autoconf_name);
+       fprintf(out, "autoconfig := %s\n", autoconf_name);
 
-       env_write_dep(out, autoconf_name);
-
-       fprintf(out, "\n$(deps_config): ;\n");
+       fputs(str_get(&autoconf_cmd), out);
 
        fflush(out);
        ret = ferror(out); /* error check for all fprintf() calls */
@@ -1072,7 +1012,7 @@ static int conf_touch_deps(void)
 {
        const char *name, *tmp;
        struct symbol *sym;
-       int res, i;
+       int res;
 
        name = conf_get_autoconfig_name();
        tmp = strrchr(name, '/');
@@ -1086,7 +1026,7 @@ static int conf_touch_deps(void)
        conf_read_simple(name, S_DEF_AUTO);
        sym_calc_value(modules_sym);
 
-       for_all_symbols(i, sym) {
+       for_all_symbols(sym) {
                sym_calc_value(sym);
                if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name)
                        continue;
@@ -1152,7 +1092,7 @@ static int __conf_write_autoconf(const char *filename,
        char tmp[PATH_MAX];
        FILE *file;
        struct symbol *sym;
-       int ret, i;
+       int ret;
 
        if (make_parent_dir(filename))
                return -1;
@@ -1169,7 +1109,7 @@ static int __conf_write_autoconf(const char *filename,
 
        conf_write_heading(file, comment_style);
 
-       for_all_symbols(i, sym)
+       for_all_symbols(sym)
                if ((sym->flags & SYMBOL_WRITE) && sym->name)
                        print_symbol(file, sym);
 
@@ -1192,7 +1132,7 @@ int conf_write_autoconf(int overwrite)
 {
        struct symbol *sym;
        const char *autoconf_name = conf_get_autoconfig_name();
-       int ret, i;
+       int ret;
 
        if (!overwrite && is_present(autoconf_name))
                return 0;
@@ -1204,7 +1144,7 @@ int conf_write_autoconf(int overwrite)
        if (conf_touch_deps())
                return 1;
 
-       for_all_symbols(i, sym)
+       for_all_symbols(sym)
                sym_calc_value(sym);
 
        ret = __conf_write_autoconf(conf_get_autoheader_name(),
index 4a9a23b1b7e1f91315f17675685d11dd97c4aa4d..0158f5eac45428eb01ec5525abac7016ba7814de 100644 (file)
@@ -12,17 +12,12 @@ extern "C" {
 
 #include <assert.h>
 #include <stdio.h>
-#include "list.h"
+#include "list_types.h"
 #ifndef __cplusplus
 #include <stdbool.h>
 #endif
 
-struct file {
-       struct file *next;
-       struct file *parent;
-       const char *name;
-       int lineno;
-};
+#include "list_types.h"
 
 typedef enum tristate {
        no, mod, yes
@@ -81,8 +76,8 @@ enum {
  * SYMBOL_CHOICE bit set in 'flags'.
  */
 struct symbol {
-       /* The next symbol in the same bucket in the symbol hash table */
-       struct symbol *next;
+       /* link node for the hash table */
+       struct hlist_node node;
 
        /* The name of the symbol, e.g. "FOO" for 'config FOO' */
        char *name;
@@ -113,6 +108,9 @@ struct symbol {
         */
        tristate visible;
 
+       /* config entries associated with this symbol */
+       struct list_head menus;
+
        /* SYMBOL_* flags */
        int flags;
 
@@ -131,8 +129,6 @@ struct symbol {
        struct expr_value implied;
 };
 
-#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next)
-
 #define SYMBOL_CONST      0x0001  /* symbol is const */
 #define SYMBOL_CHECK      0x0008  /* used during dependency checking */
 #define SYMBOL_CHOICE     0x0010  /* start of a choice block (null name) */
@@ -157,7 +153,6 @@ struct symbol {
 #define SYMBOL_NEED_SET_CHOICE_VALUES  0x100000
 
 #define SYMBOL_MAXLENGTH       256
-#define SYMBOL_HASHSIZE                9973
 
 /* A property represent the config options that can be associated
  * with a config "symbol".
@@ -195,7 +190,7 @@ struct property {
        struct menu *menu;         /* the menu the property are associated with
                                    * valid for: P_SELECT, P_RANGE, P_CHOICE,
                                    * P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */
-       struct file *file;         /* what file was this property defined */
+       const char *filename;      /* what file was this property defined */
        int lineno;                /* what lineno was this property defined */
 };
 
@@ -230,6 +225,8 @@ struct menu {
         */
        struct symbol *sym;
 
+       struct list_head link;  /* link to symbol::menus */
+
        /*
         * The prompt associated with the node. This holds the prompt for a
         * symbol as well as the text for a menu or comment, along with the
@@ -256,7 +253,7 @@ struct menu {
        char *help;
 
        /* The location where the menu node appears in the Kconfig files */
-       struct file *file;
+       const char *filename;
        int lineno;
 
        /* For use by front ends that need to store auxiliary data */
@@ -277,10 +274,6 @@ struct jump_key {
        struct menu *target;
 };
 
-extern struct file *file_list;
-extern struct file *current_file;
-struct file *lookup_file(const char *name);
-
 extern struct symbol symbol_yes, symbol_no, symbol_mod;
 extern struct symbol *modules_sym;
 extern int cdebug;
diff --git a/scripts/kconfig/hashtable.h b/scripts/kconfig/hashtable.h
new file mode 100644 (file)
index 0000000..a0a2c8f
--- /dev/null
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef HASHTABLE_H
+#define HASHTABLE_H
+
+#include "array_size.h"
+#include "list.h"
+
+#define HASH_SIZE(name) (ARRAY_SIZE(name))
+
+#define HASHTABLE_DECLARE(name, size)          struct hlist_head name[size]
+
+#define HASHTABLE_DEFINE(name, size)                                           \
+       HASHTABLE_DECLARE(name, size) =                                         \
+                       { [0 ... ((size) - 1)] = HLIST_HEAD_INIT }
+
+#define hash_head(table, key)          (&(table)[(key) % HASH_SIZE(table)])
+
+/**
+ * hash_add - add an object to a hashtable
+ * @table: hashtable to add to
+ * @node: the &struct hlist_node of the object to be added
+ * @key: the key of the object to be added
+ */
+#define hash_add(table, node, key)                                             \
+       hlist_add_head(node, hash_head(table, key))
+
+/**
+ * hash_for_each - iterate over a hashtable
+ * @table: hashtable to iterate
+ * @obj: the type * to use as a loop cursor for each entry
+ * @member: the name of the hlist_node within the struct
+ */
+#define hash_for_each(table, obj, member)                              \
+       for (int _bkt = 0; _bkt < HASH_SIZE(table); _bkt++)             \
+               hlist_for_each_entry(obj, &table[_bkt], member)
+
+/**
+ * hash_for_each_possible - iterate over all possible objects hashing to the
+ * same bucket
+ * @table: hashtable to iterate
+ * @obj: the type * to use as a loop cursor for each entry
+ * @member: the name of the hlist_node within the struct
+ * @key: the key of the objects to iterate over
+ */
+#define hash_for_each_possible(table, obj, member, key)                        \
+       hlist_for_each_entry(obj, hash_head(table, key), member)
+
+#endif /* HASHTABLE_H */
index 2f7298c21b64d3cdc48197bc35057994c9a0ff35..6c721c4cfd72bd94370cc7e8c7f61332169bf3bd 100644 (file)
@@ -2,8 +2,20 @@
 #ifndef INTERNAL_H
 #define INTERNAL_H
 
+#include "hashtable.h"
+
+#define SYMBOL_HASHSIZE                (1U << 14)
+
+extern HASHTABLE_DECLARE(sym_hashtable, SYMBOL_HASHSIZE);
+
+#define for_all_symbols(sym) \
+       hash_for_each(sym_hashtable, sym, node)
+
 struct menu;
 
 extern struct menu *current_menu, *current_entry;
 
+extern const char *cur_filename;
+extern int cur_lineno;
+
 #endif /* INTERNAL_H */
index cc386e44368346c2309d2f60aab3cad10a5cefb0..89544c3a1a2995d0daf817adbc7ad2d588ccf76d 100644 (file)
 #include <string.h>
 
 #include "lkc.h"
+#include "preprocess.h"
+
 #include "parser.tab.h"
 
 #define YY_DECL                static int yylex1(void)
 
 #define START_STRSIZE  16
 
-static struct {
-       struct file *file;
-       int lineno;
-} current_pos;
+/* The Kconfig file currently being parsed.  */
+const char *cur_filename;
+
+/*
+ * The line number of the current statement. This does not match yylineno.
+ * yylineno is used by the lexer, while cur_lineno is used by the parser.
+ */
+int cur_lineno;
 
 static int prev_prev_token = T_EOL;
 static int prev_token = T_EOL;
@@ -33,6 +39,9 @@ static int text_size, text_asize;
 struct buffer {
        struct buffer *parent;
        YY_BUFFER_STATE state;
+       int yylineno;
+       const char *filename;
+       int source_lineno;
 };
 
 static struct buffer *current_buf;
@@ -77,7 +86,7 @@ static void warn_ignored_character(char chr)
 {
        fprintf(stderr,
                "%s:%d:warning: ignoring unsupported character '%c'\n",
-               current_file->name, yylineno, chr);
+               cur_filename, yylineno, chr);
 }
 %}
 
@@ -180,7 +189,7 @@ n   [A-Za-z0-9_-]
        \n      {
                fprintf(stderr,
                        "%s:%d:warning: multi-line strings not supported\n",
-                       zconf_curname(), zconf_lineno());
+                       cur_filename, cur_lineno);
                unput('\n');
                BEGIN(INITIAL);
                yylval.string = text;
@@ -246,9 +255,9 @@ n   [A-Za-z0-9_-]
 
        if (prev_token != T_EOL && prev_token != T_HELPTEXT)
                fprintf(stderr, "%s:%d:warning: no new line at end of file\n",
-                       current_file->name, yylineno);
+                       cur_filename, yylineno);
 
-       if (current_file) {
+       if (current_buf) {
                zconf_endfile();
                return T_EOL;
        }
@@ -267,19 +276,17 @@ repeat:
        token = yylex1();
 
        if (prev_token == T_EOL || prev_token == T_HELPTEXT) {
-               if (token == T_EOL) {
+               if (token == T_EOL)
                        /* Do not pass unneeded T_EOL to the parser. */
                        goto repeat;
-               } else {
+               else
                        /*
-                        * For the parser, update file/lineno at the first token
+                        * For the parser, update lineno at the first token
                         * of each statement. Generally, \n is a statement
                         * terminator in Kconfig, but it is not always true
                         * because \n could be escaped by a backslash.
                         */
-                       current_pos.file = current_file;
-                       current_pos.lineno = yylineno;
-               }
+                       cur_lineno = yylineno;
        }
 
        if (prev_prev_token == T_EOL && prev_token == T_WORD &&
@@ -302,8 +309,11 @@ static char *expand_token(const char *in, size_t n)
        new_string();
        append_string(in, n);
 
-       /* get the whole line because we do not know the end of token. */
-       while ((c = input()) != EOF) {
+       /*
+        * get the whole line because we do not know the end of token.
+        * input() returns 0 (not EOF!) when it reachs the end of file.
+        */
+       while ((c = input()) != 0) {
                if (c == '\n') {
                        unput(c);
                        break;
@@ -391,78 +401,60 @@ void zconf_initscan(const char *name)
                exit(1);
        }
 
-       current_buf = xmalloc(sizeof(*current_buf));
-       memset(current_buf, 0, sizeof(*current_buf));
-
-       current_file = file_lookup(name);
+       cur_filename = file_lookup(name);
        yylineno = 1;
 }
 
 void zconf_nextfile(const char *name)
 {
-       struct file *iter;
-       struct file *file = file_lookup(name);
        struct buffer *buf = xmalloc(sizeof(*buf));
-       memset(buf, 0, sizeof(*buf));
+       bool recur_include = false;
 
-       current_buf->state = YY_CURRENT_BUFFER;
-       yyin = zconf_fopen(file->name);
+       buf->state = YY_CURRENT_BUFFER;
+       buf->yylineno = yylineno;
+       buf->filename = cur_filename;
+       buf->source_lineno = cur_lineno;
+       buf->parent = current_buf;
+       current_buf = buf;
+       yyin = zconf_fopen(name);
        if (!yyin) {
                fprintf(stderr, "%s:%d: can't open file \"%s\"\n",
-                       zconf_curname(), zconf_lineno(), file->name);
+                       cur_filename, cur_lineno, name);
                exit(1);
        }
        yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
-       buf->parent = current_buf;
-       current_buf = buf;
 
-       current_file->lineno = yylineno;
-       file->parent = current_file;
-
-       for (iter = current_file; iter; iter = iter->parent) {
-               if (!strcmp(iter->name, file->name)) {
-                       fprintf(stderr,
-                               "Recursive inclusion detected.\n"
-                               "Inclusion path:\n"
-                               "  current file : %s\n", file->name);
-                       iter = file;
-                       do {
-                               iter = iter->parent;
-                               fprintf(stderr, "  included from: %s:%d\n",
-                                       iter->name, iter->lineno - 1);
-                       } while (strcmp(iter->name, file->name));
-                       exit(1);
-               }
+       for (buf = current_buf; buf; buf = buf->parent) {
+               if (!strcmp(buf->filename, name))
+                       recur_include = true;
        }
 
-       yylineno = 1;
-       current_file = file;
-}
-
-static void zconf_endfile(void)
-{
-       struct buffer *parent;
-
-       current_file = current_file->parent;
-       if (current_file)
-               yylineno = current_file->lineno;
+       if (recur_include) {
+               fprintf(stderr,
+                       "Recursive inclusion detected.\n"
+                       "Inclusion path:\n"
+                       "  current file : %s\n", name);
 
-       parent = current_buf->parent;
-       if (parent) {
-               fclose(yyin);
-               yy_delete_buffer(YY_CURRENT_BUFFER);
-               yy_switch_to_buffer(parent->state);
+               for (buf = current_buf; buf; buf = buf->parent)
+                       fprintf(stderr, "  included from: %s:%d\n",
+                               buf->filename, buf->source_lineno);
+               exit(1);
        }
-       free(current_buf);
-       current_buf = parent;
-}
 
-int zconf_lineno(void)
-{
-       return current_pos.lineno;
+       yylineno = 1;
+       cur_filename = file_lookup(name);
 }
 
-const char *zconf_curname(void)
+static void zconf_endfile(void)
 {
-       return current_pos.file ? current_pos.file->name : "<none>";
+       struct buffer *tmp;
+
+       fclose(yyin);
+       yy_delete_buffer(YY_CURRENT_BUFFER);
+       yy_switch_to_buffer(current_buf->state);
+       yylineno = current_buf->yylineno;
+       cur_filename = current_buf->filename;
+       tmp = current_buf;
+       current_buf = current_buf->parent;
+       free(tmp);
 }
index 45cb237ab7ef7a9f17779647220da6a30afd06fc..882859ddf9f4f94cba26f3d5ab41fe9be04448d4 100644 (file)
@@ -2,29 +2,39 @@
 #ifndef LIST_H
 #define LIST_H
 
-/*
- * Copied from include/linux/...
- */
+#include <stddef.h>
 
-#undef offsetof
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#include "list_types.h"
+
+/* Are two types/vars the same type (ignoring qualifiers)? */
+#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 
 /**
  * container_of - cast a member of a structure out to the containing structure
- * @ptr:        the pointer to the member.
- * @type:       the type of the container struct this is embedded in.
- * @member:     the name of the member within the struct.
+ * @ptr:       the pointer to the member.
+ * @type:      the type of the container struct this is embedded in.
+ * @member:    the name of the member within the struct.
  *
  */
-#define container_of(ptr, type, member) ({                      \
-       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
-       (type *)( (char *)__mptr - offsetof(type,member) );})
-
+#define container_of(ptr, type, member) ({                             \
+       void *__mptr = (void *)(ptr);                                   \
+       _Static_assert(__same_type(*(ptr), ((type *)0)->member) ||      \
+                     __same_type(*(ptr), void),                        \
+                     "pointer type mismatch in container_of()");       \
+       ((type *)(__mptr - offsetof(type, member))); })
 
-struct list_head {
-       struct list_head *next, *prev;
-};
+#define LIST_POISON1  ((void *) 0x100)
+#define LIST_POISON2  ((void *) 0x122)
 
+/*
+ * Circular doubly linked list implementation.
+ *
+ * Some of the internal functions ("__xxx") are useful when
+ * manipulating whole lists rather than single entries, as
+ * sometimes we already know the next/prev entries and we can
+ * generate better code by using them directly rather than
+ * using the generic single-entry routines.
+ */
 
 #define LIST_HEAD_INIT(name) { &(name), &(name) }
 
@@ -32,45 +42,16 @@ struct list_head {
        struct list_head name = LIST_HEAD_INIT(name)
 
 /**
- * list_entry - get the struct for this entry
- * @ptr:       the &struct list_head pointer.
- * @type:      the type of the struct this is embedded in.
- * @member:    the name of the list_head within the struct.
- */
-#define list_entry(ptr, type, member) \
-       container_of(ptr, type, member)
-
-/**
- * list_for_each_entry -       iterate over list of given type
- * @pos:       the type * to use as a loop cursor.
- * @head:      the head for your list.
- * @member:    the name of the list_head within the struct.
- */
-#define list_for_each_entry(pos, head, member)                         \
-       for (pos = list_entry((head)->next, typeof(*pos), member);      \
-            &pos->member != (head);    \
-            pos = list_entry(pos->member.next, typeof(*pos), member))
-
-/**
- * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @pos:       the type * to use as a loop cursor.
- * @n:         another type * to use as temporary storage
- * @head:      the head for your list.
- * @member:    the name of the list_head within the struct.
- */
-#define list_for_each_entry_safe(pos, n, head, member)                 \
-       for (pos = list_entry((head)->next, typeof(*pos), member),      \
-               n = list_entry(pos->member.next, typeof(*pos), member); \
-            &pos->member != (head);                                    \
-            pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-/**
- * list_empty - tests whether a list is empty
- * @head: the list to test.
+ * INIT_LIST_HEAD - Initialize a list_head structure
+ * @list: list_head structure to be initialized.
+ *
+ * Initializes the list_head to point to itself.  If it is a list header,
+ * the result is an empty list.
  */
-static inline int list_empty(const struct list_head *head)
+static inline void INIT_LIST_HEAD(struct list_head *list)
 {
-       return head->next == head;
+       list->next = list;
+       list->prev = list;
 }
 
 /*
@@ -79,14 +60,27 @@ static inline int list_empty(const struct list_head *head)
  * This is only for internal list manipulation where we know
  * the prev/next entries already!
  */
-static inline void __list_add(struct list_head *_new,
+static inline void __list_add(struct list_head *new,
                              struct list_head *prev,
                              struct list_head *next)
 {
-       next->prev = _new;
-       _new->next = next;
-       _new->prev = prev;
-       prev->next = _new;
+       next->prev = new;
+       new->next = next;
+       new->prev = prev;
+       prev->next = new;
+}
+
+/**
+ * list_add - add a new entry
+ * @new: new entry to be added
+ * @head: list head to add it after
+ *
+ * Insert a new entry after the specified head.
+ * This is good for implementing stacks.
+ */
+static inline void list_add(struct list_head *new, struct list_head *head)
+{
+       __list_add(new, head, head->next);
 }
 
 /**
@@ -97,9 +91,9 @@ static inline void __list_add(struct list_head *_new,
  * Insert a new entry before the specified head.
  * This is useful for implementing queues.
  */
-static inline void list_add_tail(struct list_head *_new, struct list_head *head)
+static inline void list_add_tail(struct list_head *new, struct list_head *head)
 {
-       __list_add(_new, head->prev, head);
+       __list_add(new, head->prev, head);
 }
 
 /*
@@ -115,8 +109,11 @@ static inline void __list_del(struct list_head *prev, struct list_head *next)
        prev->next = next;
 }
 
-#define LIST_POISON1  ((void *) 0x00100100)
-#define LIST_POISON2  ((void *) 0x00200200)
+static inline void __list_del_entry(struct list_head *entry)
+{
+       __list_del(entry->prev, entry->next);
+}
+
 /**
  * list_del - deletes entry from list.
  * @entry: the element to delete from the list.
@@ -125,8 +122,135 @@ static inline void __list_del(struct list_head *prev, struct list_head *next)
  */
 static inline void list_del(struct list_head *entry)
 {
-       __list_del(entry->prev, entry->next);
-       entry->next = (struct list_head*)LIST_POISON1;
-       entry->prev = (struct list_head*)LIST_POISON2;
+       __list_del_entry(entry);
+       entry->next = LIST_POISON1;
+       entry->prev = LIST_POISON2;
+}
+
+/**
+ * list_is_head - tests whether @list is the list @head
+ * @list: the entry to test
+ * @head: the head of the list
+ */
+static inline int list_is_head(const struct list_head *list, const struct list_head *head)
+{
+       return list == head;
+}
+
+/**
+ * list_empty - tests whether a list is empty
+ * @head: the list to test.
+ */
+static inline int list_empty(const struct list_head *head)
+{
+       return head->next == head;
+}
+
+/**
+ * list_entry - get the struct for this entry
+ * @ptr:       the &struct list_head pointer.
+ * @type:      the type of the struct this is embedded in.
+ * @member:    the name of the list_head within the struct.
+ */
+#define list_entry(ptr, type, member) \
+       container_of(ptr, type, member)
+
+/**
+ * list_first_entry - get the first element from a list
+ * @ptr:       the list head to take the element from.
+ * @type:      the type of the struct this is embedded in.
+ * @member:    the name of the list_head within the struct.
+ *
+ * Note, that list is expected to be not empty.
+ */
+#define list_first_entry(ptr, type, member) \
+       list_entry((ptr)->next, type, member)
+
+/**
+ * list_next_entry - get the next element in list
+ * @pos:       the type * to cursor
+ * @member:    the name of the list_head within the struct.
+ */
+#define list_next_entry(pos, member) \
+       list_entry((pos)->member.next, typeof(*(pos)), member)
+
+/**
+ * list_entry_is_head - test if the entry points to the head of the list
+ * @pos:       the type * to cursor
+ * @head:      the head for your list.
+ * @member:    the name of the list_head within the struct.
+ */
+#define list_entry_is_head(pos, head, member)                          \
+       (&pos->member == (head))
+
+/**
+ * list_for_each_entry - iterate over list of given type
+ * @pos:       the type * to use as a loop cursor.
+ * @head:      the head for your list.
+ * @member:    the name of the list_head within the struct.
+ */
+#define list_for_each_entry(pos, head, member)                         \
+       for (pos = list_first_entry(head, typeof(*pos), member);        \
+            !list_entry_is_head(pos, head, member);                    \
+            pos = list_next_entry(pos, member))
+
+/**
+ * list_for_each_entry_safe - iterate over list of given type. Safe against removal of list entry
+ * @pos:       the type * to use as a loop cursor.
+ * @n:         another type * to use as temporary storage
+ * @head:      the head for your list.
+ * @member:    the name of the list_head within the struct.
+ */
+#define list_for_each_entry_safe(pos, n, head, member)                 \
+       for (pos = list_first_entry(head, typeof(*pos), member),        \
+               n = list_next_entry(pos, member);                       \
+            !list_entry_is_head(pos, head, member);                    \
+            pos = n, n = list_next_entry(n, member))
+
+/*
+ * Double linked lists with a single pointer list head.
+ * Mostly useful for hash tables where the two pointer list head is
+ * too wasteful.
+ * You lose the ability to access the tail in O(1).
+ */
+
+#define HLIST_HEAD_INIT { .first = NULL }
+
+/**
+ * hlist_add_head - add a new entry at the beginning of the hlist
+ * @n: new entry to be added
+ * @h: hlist head to add it after
+ *
+ * Insert a new entry after the specified head.
+ * This is good for implementing stacks.
+ */
+static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
+{
+       struct hlist_node *first = h->first;
+
+       n->next = first;
+       if (first)
+               first->pprev = &n->next;
+       h->first = n;
+       n->pprev = &h->first;
 }
-#endif
+
+#define hlist_entry(ptr, type, member) container_of(ptr, type, member)
+
+#define hlist_entry_safe(ptr, type, member) \
+       ({ typeof(ptr) ____ptr = (ptr); \
+          ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
+       })
+
+/**
+ * hlist_for_each_entry        - iterate over list of given type
+ * @pos:       the type * to use as a loop cursor.
+ * @head:      the head for your list.
+ * @member:    the name of the hlist_node within the struct.
+ */
+#define hlist_for_each_entry(pos, head, member)                                \
+       for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
+            pos;                                                       \
+            pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
+
+#endif /* LIST_H */
diff --git a/scripts/kconfig/list_types.h b/scripts/kconfig/list_types.h
new file mode 100644 (file)
index 0000000..d935b7c
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef LIST_TYPES_H
+#define LIST_TYPES_H
+
+struct list_head {
+       struct list_head *next, *prev;
+};
+
+struct hlist_head {
+       struct hlist_node *first;
+};
+
+struct hlist_node {
+       struct hlist_node *next, **pprev;
+};
+
+#endif /* LIST_TYPES_H */
index 5cdc8f5e6446ab55e42ce21dfbe728b0ab22aee7..e69d7c59d930272e177618e440c42bee1e8bbce6 100644 (file)
@@ -36,10 +36,9 @@ void zconf_starthelp(void);
 FILE *zconf_fopen(const char *name);
 void zconf_initscan(const char *name);
 void zconf_nextfile(const char *name);
-int zconf_lineno(void);
-const char *zconf_curname(void);
 
 /* confdata.c */
+extern struct gstr autoconf_cmd;
 const char *conf_get_configname(void);
 void set_all_choice_values(struct symbol *csym);
 
@@ -53,7 +52,8 @@ static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
 }
 
 /* util.c */
-struct file *file_lookup(const char *name);
+unsigned int strhash(const char *s);
+const char *file_lookup(const char *name);
 void *xmalloc(size_t size);
 void *xcalloc(size_t nmemb, size_t size);
 void *xrealloc(void *p, size_t size);
index a4ae5e9eadadb8758b5911d0f38c028b0622d937..2807fa584c2b01a37e7fb13bd2c4d570b22798fe 100644 (file)
@@ -18,8 +18,6 @@ void conf_set_message_callback(void (*fn)(const char *s));
 bool conf_errors(void);
 
 /* symbol.c */
-extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
-
 struct symbol * sym_lookup(const char *name, int flags);
 struct symbol * sym_find(const char *name);
 void print_symbol_for_listconfig(struct symbol *sym);
@@ -40,19 +38,6 @@ const char * sym_get_string_value(struct symbol *sym);
 
 const char * prop_get_type_name(enum prop_type type);
 
-/* preprocess.c */
-enum variable_flavor {
-       VAR_SIMPLE,
-       VAR_RECURSIVE,
-       VAR_APPEND,
-};
-void env_write_dep(FILE *f, const char *auto_conf_name);
-void variable_add(const char *name, const char *value,
-                 enum variable_flavor flavor);
-void variable_all_del(void);
-char *expand_dollar(const char **str);
-char *expand_one_token(const char **str);
-
 /* expr.c */
 void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken);
 
index fd161cfff121fd15e45aebce45bbc38f311d3709..31d0a89fbeb7ac69e2348b902047226cd9551ba0 100644 (file)
@@ -188,9 +188,8 @@ do_resize:
 
        print_buttons(dialog, height, width, 0);
 
-       wnoutrefresh(dialog);
-       wnoutrefresh(list);
-       doupdate();
+       wmove(list, choice, check_x + 1);
+       wrefresh(list);
 
        while (key != KEY_ESC) {
                key = wgetch(dialog);
index a501abf9fa313b04faf379aff9244f7e8bb1d180..2d15ba893fbf8945147e15b43190bd60cbf0ecfa 100644 (file)
@@ -91,10 +91,6 @@ struct dialog_info {
        struct dialog_color button_label_active;
        struct dialog_color button_label_inactive;
        struct dialog_color inputbox;
-       struct dialog_color inputbox_border;
-       struct dialog_color searchbox;
-       struct dialog_color searchbox_title;
-       struct dialog_color searchbox_border;
        struct dialog_color position_indicator;
        struct dialog_color menubox;
        struct dialog_color menubox_border;
index 3f78fb265136381c8b4dbdc1b611f2d4d47d7548..3fb7508b68a240f69e31f06c5f9c753fc7129a34 100644 (file)
@@ -29,10 +29,6 @@ static void set_mono_theme(void)
        dlg.button_label_active.atr = A_REVERSE;
        dlg.button_label_inactive.atr = A_NORMAL;
        dlg.inputbox.atr = A_NORMAL;
-       dlg.inputbox_border.atr = A_NORMAL;
-       dlg.searchbox.atr = A_NORMAL;
-       dlg.searchbox_title.atr = A_BOLD;
-       dlg.searchbox_border.atr = A_NORMAL;
        dlg.position_indicator.atr = A_BOLD;
        dlg.menubox.atr = A_NORMAL;
        dlg.menubox_border.atr = A_NORMAL;
@@ -69,10 +65,6 @@ static void set_classic_theme(void)
        DLG_COLOR(button_label_active,   COLOR_YELLOW, COLOR_BLUE,   true);
        DLG_COLOR(button_label_inactive, COLOR_BLACK,  COLOR_WHITE,  true);
        DLG_COLOR(inputbox,              COLOR_BLACK,  COLOR_WHITE,  false);
-       DLG_COLOR(inputbox_border,       COLOR_BLACK,  COLOR_WHITE,  false);
-       DLG_COLOR(searchbox,             COLOR_BLACK,  COLOR_WHITE,  false);
-       DLG_COLOR(searchbox_title,       COLOR_YELLOW, COLOR_WHITE,  true);
-       DLG_COLOR(searchbox_border,      COLOR_WHITE,  COLOR_WHITE,  true);
        DLG_COLOR(position_indicator,    COLOR_YELLOW, COLOR_WHITE,  true);
        DLG_COLOR(menubox,               COLOR_BLACK,  COLOR_WHITE,  false);
        DLG_COLOR(menubox_border,        COLOR_WHITE,  COLOR_WHITE,  true);
@@ -101,14 +93,9 @@ static void set_blackbg_theme(void)
        DLG_COLOR(button_key_active,     COLOR_YELLOW, COLOR_RED,   true);
        DLG_COLOR(button_key_inactive,   COLOR_RED,    COLOR_BLACK, false);
        DLG_COLOR(button_label_active,   COLOR_WHITE,  COLOR_RED,   false);
-       DLG_COLOR(button_label_inactive, COLOR_BLACK,  COLOR_BLACK, true);
+       DLG_COLOR(button_label_inactive, COLOR_WHITE,  COLOR_BLACK, false);
 
        DLG_COLOR(inputbox,         COLOR_YELLOW, COLOR_BLACK, false);
-       DLG_COLOR(inputbox_border,  COLOR_YELLOW, COLOR_BLACK, false);
-
-       DLG_COLOR(searchbox,        COLOR_YELLOW, COLOR_BLACK, false);
-       DLG_COLOR(searchbox_title,  COLOR_YELLOW, COLOR_BLACK, true);
-       DLG_COLOR(searchbox_border, COLOR_BLACK,  COLOR_BLACK, true);
 
        DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK,  false);
 
@@ -136,7 +123,6 @@ static void set_bluetitle_theme(void)
        DLG_COLOR(title,               COLOR_BLUE,   COLOR_WHITE, true);
        DLG_COLOR(button_key_active,   COLOR_YELLOW, COLOR_BLUE,  true);
        DLG_COLOR(button_label_active, COLOR_WHITE,  COLOR_BLUE,  true);
-       DLG_COLOR(searchbox_title,     COLOR_BLUE,   COLOR_WHITE, true);
        DLG_COLOR(position_indicator,  COLOR_BLUE,   COLOR_WHITE, true);
        DLG_COLOR(tag,                 COLOR_BLUE,   COLOR_WHITE, true);
        DLG_COLOR(tag_key,             COLOR_BLUE,   COLOR_WHITE, true);
@@ -189,10 +175,6 @@ static void init_dialog_colors(void)
        init_one_color(&dlg.button_label_active);
        init_one_color(&dlg.button_label_inactive);
        init_one_color(&dlg.inputbox);
-       init_one_color(&dlg.inputbox_border);
-       init_one_color(&dlg.searchbox);
-       init_one_color(&dlg.searchbox_title);
-       init_one_color(&dlg.searchbox_border);
        init_one_color(&dlg.position_indicator);
        init_one_color(&dlg.menubox);
        init_one_color(&dlg.menubox_border);
index 5df32148a86951f78dca309db7d06d77f2364259..f4bb391d50cf997c0a66ca3e54ceb062f6cea54e 100644 (file)
@@ -19,6 +19,7 @@
 #include <signal.h>
 #include <unistd.h>
 
+#include "list.h"
 #include "lkc.h"
 #include "lxdialog/dialog.h"
 #include "mnconf-common.h"
index 2cce8b651f6154197af3b5332a64ea3ecdac344d..8498481e6afe36786b969efb6551528c1156ea05 100644 (file)
 
 #include "lkc.h"
 #include "internal.h"
+#include "list.h"
 
 static const char nohelp_text[] = "There is no help available for this option.";
 
 struct menu rootmenu;
 static struct menu **last_entry_ptr;
 
-struct file *file_list;
-struct file *current_file;
-
 void menu_warn(struct menu *menu, const char *fmt, ...)
 {
        va_list ap;
        va_start(ap, fmt);
-       fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno);
+       fprintf(stderr, "%s:%d:warning: ", menu->filename, menu->lineno);
        vfprintf(stderr, fmt, ap);
        fprintf(stderr, "\n");
        va_end(ap);
@@ -33,7 +31,7 @@ static void prop_warn(struct property *prop, const char *fmt, ...)
 {
        va_list ap;
        va_start(ap, fmt);
-       fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno);
+       fprintf(stderr, "%s:%d:warning: ", prop->filename, prop->lineno);
        vfprintf(stderr, fmt, ap);
        fprintf(stderr, "\n");
        va_end(ap);
@@ -53,14 +51,16 @@ void menu_add_entry(struct symbol *sym)
        memset(menu, 0, sizeof(*menu));
        menu->sym = sym;
        menu->parent = current_menu;
-       menu->file = current_file;
-       menu->lineno = zconf_lineno();
+       menu->filename = cur_filename;
+       menu->lineno = cur_lineno;
 
        *last_entry_ptr = menu;
        last_entry_ptr = &menu->next;
        current_entry = menu;
-       if (sym)
+       if (sym) {
                menu_add_symbol(P_SYMBOL, sym, NULL);
+               list_add_tail(&menu->link, &sym->menus);
+       }
 }
 
 struct menu *menu_add_menu(void)
@@ -134,8 +134,8 @@ static struct property *menu_add_prop(enum prop_type type, struct expr *expr,
        prop = xmalloc(sizeof(*prop));
        memset(prop, 0, sizeof(*prop));
        prop->type = type;
-       prop->file = current_file;
-       prop->lineno = zconf_lineno();
+       prop->filename = cur_filename;
+       prop->lineno = cur_lineno;
        prop->menu = current_entry;
        prop->expr = expr;
        prop->visible.expr = dep;
@@ -307,12 +307,6 @@ void menu_finalize(struct menu *parent)
                                        }
                                }
                        }
-                       /* set the type of the remaining choice values */
-                       for (menu = parent->list; menu; menu = menu->next) {
-                               current_entry = menu;
-                               if (menu->sym && menu->sym->type == S_UNKNOWN)
-                                       menu_set_type(sym->type);
-                       }
 
                        /*
                         * Use the choice itself as the parent dependency of
@@ -567,9 +561,6 @@ void menu_finalize(struct menu *parent)
                if (sym->type == S_UNKNOWN)
                        menu_warn(parent, "config symbol defined without type");
 
-               if (sym_is_choice(sym) && !parent->prompt)
-                       menu_warn(parent, "choice must have a prompt");
-
                /* Check properties connected to this symbol */
                sym_check_prop(sym);
                sym->flags |= SYMBOL_WARNED;
@@ -676,7 +667,7 @@ struct menu *menu_get_parent_menu(struct menu *menu)
 static void get_def_str(struct gstr *r, struct menu *menu)
 {
        str_printf(r, "Defined at %s:%d\n",
-                  menu->file->name, menu->lineno);
+                  menu->filename, menu->lineno);
 }
 
 static void get_dep_str(struct gstr *r, struct expr *expr, const char *prefix)
@@ -777,6 +768,7 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym,
                    struct list_head *head)
 {
        struct property *prop;
+       struct menu *menu;
 
        if (sym && sym->name) {
                str_printf(r, "Symbol: %s [=%s]\n", sym->name,
@@ -793,17 +785,17 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym,
        }
 
        /* Print the definitions with prompts before the ones without */
-       for_all_properties(sym, prop, P_SYMBOL) {
-               if (prop->menu->prompt) {
-                       get_def_str(r, prop->menu);
-                       get_prompt_str(r, prop->menu->prompt, head);
+       list_for_each_entry(menu, &sym->menus, link) {
+               if (menu->prompt) {
+                       get_def_str(r, menu);
+                       get_prompt_str(r, menu->prompt, head);
                }
        }
 
-       for_all_properties(sym, prop, P_SYMBOL) {
-               if (!prop->menu->prompt) {
-                       get_def_str(r, prop->menu);
-                       get_dep_str(r, prop->menu->dep, "  Depends on: ");
+       list_for_each_entry(menu, &sym->menus, link) {
+               if (!menu->prompt) {
+                       get_def_str(r, menu);
+                       get_dep_str(r, menu->dep, "  Depends on: ");
                }
        }
 
index 1148163cfa7e71c037ba28eab8183cf304fc5b85..9d22b0f3197b8740c29d10af7de341c7b1d1c14c 100644 (file)
@@ -11,6 +11,7 @@
 #include <strings.h>
 #include <stdlib.h>
 
+#include "list.h"
 #include "lkc.h"
 #include "mnconf-common.h"
 #include "nconf.h"
index 2af7ce4e15315722e76113c55003beab0baba526..b45bfaf0a02b1234f49dd328a350a1de8f2641df 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "lkc.h"
 #include "internal.h"
+#include "preprocess.h"
 
 #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
 
@@ -27,8 +28,6 @@ static void zconf_error(const char *err, ...);
 static bool zconf_endtoken(const char *tokenname,
                           const char *expected_tokenname);
 
-struct symbol *symbol_hash[SYMBOL_HASHSIZE];
-
 struct menu *current_menu, *current_entry;
 
 %}
@@ -95,12 +94,12 @@ struct menu *current_menu, *current_entry;
 %type <expr> if_expr
 %type <string> end
 %type <menu> if_entry menu_entry choice_entry
-%type <string> word_opt assign_val
+%type <string> assign_val
 %type <flavor> assign_op
 
 %destructor {
        fprintf(stderr, "%s:%d: missing end statement for this entry\n",
-               $$->file->name, $$->lineno);
+               $$->filename, $$->lineno);
        if (current_menu == $$)
                menu_end_menu();
 } if_entry menu_entry choice_entry
@@ -143,19 +142,19 @@ config_entry_start: T_CONFIG nonconst_symbol T_EOL
 {
        $2->flags |= SYMBOL_OPTIONAL;
        menu_add_entry($2);
-       printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name);
+       printd(DEBUG_PARSE, "%s:%d:config %s\n", cur_filename, cur_lineno, $2->name);
 };
 
 config_stmt: config_entry_start config_option_list
 {
-       printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:endconfig\n", cur_filename, cur_lineno);
 };
 
 menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
 {
        $2->flags |= SYMBOL_OPTIONAL;
        menu_add_entry($2);
-       printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name);
+       printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", cur_filename, cur_lineno, $2->name);
 };
 
 menuconfig_stmt: menuconfig_entry_start config_option_list
@@ -164,7 +163,7 @@ menuconfig_stmt: menuconfig_entry_start config_option_list
                current_entry->prompt->type = P_MENU;
        else
                zconfprint("warning: menuconfig statement without prompt");
-       printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:endconfig\n", cur_filename, cur_lineno);
 };
 
 config_option_list:
@@ -177,15 +176,13 @@ config_option_list:
 config_option: type prompt_stmt_opt T_EOL
 {
        menu_set_type($1);
-       printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
-               zconf_curname(), zconf_lineno(),
-               $1);
+       printd(DEBUG_PARSE, "%s:%d:type(%u)\n", cur_filename, cur_lineno, $1);
 };
 
 config_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL
 {
        menu_add_prompt(P_PROMPT, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:prompt\n", cur_filename, cur_lineno);
 };
 
 config_option: default expr if_expr T_EOL
@@ -193,27 +190,26 @@ config_option: default expr if_expr T_EOL
        menu_add_expr(P_DEFAULT, $2, $3);
        if ($1 != S_UNKNOWN)
                menu_set_type($1);
-       printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
-               zconf_curname(), zconf_lineno(),
+       printd(DEBUG_PARSE, "%s:%d:default(%u)\n", cur_filename, cur_lineno,
                $1);
 };
 
 config_option: T_SELECT nonconst_symbol if_expr T_EOL
 {
        menu_add_symbol(P_SELECT, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:select\n", cur_filename, cur_lineno);
 };
 
 config_option: T_IMPLY nonconst_symbol if_expr T_EOL
 {
        menu_add_symbol(P_IMPLY, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:imply\n", cur_filename, cur_lineno);
 };
 
 config_option: T_RANGE symbol symbol if_expr T_EOL
 {
        menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
-       printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:range\n", cur_filename, cur_lineno);
 };
 
 config_option: T_MODULES T_EOL
@@ -226,18 +222,23 @@ config_option: T_MODULES T_EOL
 
 /* choice entry */
 
-choice: T_CHOICE word_opt T_EOL
+choice: T_CHOICE T_EOL
 {
-       struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
+       struct symbol *sym = sym_lookup(NULL, SYMBOL_CHOICE);
        sym->flags |= SYMBOL_NO_WRITE;
        menu_add_entry(sym);
        menu_add_expr(P_CHOICE, NULL, NULL);
-       free($2);
-       printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:choice\n", cur_filename, cur_lineno);
 };
 
 choice_entry: choice choice_option_list
 {
+       if (!current_entry->prompt) {
+               fprintf(stderr, "%s:%d: error: choice must have a prompt\n",
+                       current_entry->filename, current_entry->lineno);
+               yynerrs++;
+       }
+
        $$ = menu_add_menu();
 };
 
@@ -245,7 +246,7 @@ choice_end: end
 {
        if (zconf_endtoken($1, "choice")) {
                menu_end_menu();
-               printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
+               printd(DEBUG_PARSE, "%s:%d:endchoice\n", cur_filename, cur_lineno);
        }
 };
 
@@ -262,27 +263,25 @@ choice_option_list:
 choice_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL
 {
        menu_add_prompt(P_PROMPT, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:prompt\n", cur_filename, cur_lineno);
 };
 
 choice_option: logic_type prompt_stmt_opt T_EOL
 {
        menu_set_type($1);
-       printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
-              zconf_curname(), zconf_lineno(), $1);
+       printd(DEBUG_PARSE, "%s:%d:type(%u)\n", cur_filename, cur_lineno, $1);
 };
 
 choice_option: T_OPTIONAL T_EOL
 {
        current_entry->sym->flags |= SYMBOL_OPTIONAL;
-       printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:optional\n", cur_filename, cur_lineno);
 };
 
 choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
 {
        menu_add_symbol(P_DEFAULT, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:default\n",
-              zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:default\n", cur_filename, cur_lineno);
 };
 
 type:
@@ -304,7 +303,7 @@ default:
 
 if_entry: T_IF expr T_EOL
 {
-       printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:if\n", cur_filename, cur_lineno);
        menu_add_entry(NULL);
        menu_add_dep($2);
        $$ = menu_add_menu();
@@ -314,7 +313,7 @@ if_end: end
 {
        if (zconf_endtoken($1, "if")) {
                menu_end_menu();
-               printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+               printd(DEBUG_PARSE, "%s:%d:endif\n", cur_filename, cur_lineno);
        }
 };
 
@@ -330,7 +329,7 @@ menu: T_MENU T_WORD_QUOTE T_EOL
 {
        menu_add_entry(NULL);
        menu_add_prompt(P_MENU, $2, NULL);
-       printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:menu\n", cur_filename, cur_lineno);
 };
 
 menu_entry: menu menu_option_list
@@ -342,7 +341,7 @@ menu_end: end
 {
        if (zconf_endtoken($1, "menu")) {
                menu_end_menu();
-               printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
+               printd(DEBUG_PARSE, "%s:%d:endmenu\n", cur_filename, cur_lineno);
        }
 };
 
@@ -357,7 +356,7 @@ menu_option_list:
 
 source_stmt: T_SOURCE T_WORD_QUOTE T_EOL
 {
-       printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
+       printd(DEBUG_PARSE, "%s:%d:source %s\n", cur_filename, cur_lineno, $2);
        zconf_nextfile($2);
        free($2);
 };
@@ -368,7 +367,7 @@ comment: T_COMMENT T_WORD_QUOTE T_EOL
 {
        menu_add_entry(NULL);
        menu_add_prompt(P_COMMENT, $2, NULL);
-       printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:comment\n", cur_filename, cur_lineno);
 };
 
 comment_stmt: comment comment_option_list
@@ -383,7 +382,7 @@ comment_option_list:
 
 help_start: T_HELP T_EOL
 {
-       printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:help\n", cur_filename, cur_lineno);
        zconf_starthelp();
 };
 
@@ -408,7 +407,7 @@ help: help_start T_HELPTEXT
 depends: T_DEPENDS T_ON expr T_EOL
 {
        menu_add_dep($3);
-       printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
+       printd(DEBUG_PARSE, "%s:%d:depends on\n", cur_filename, cur_lineno);
 };
 
 /* visibility option */
@@ -455,9 +454,6 @@ symbol:       nonconst_symbol
        | T_WORD_QUOTE  { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
 ;
 
-word_opt: /* empty */                  { $$ = NULL; }
-       | T_WORD
-
 /* assignment statement */
 
 assignment_stmt:  T_WORD assign_op assign_val T_EOL    { variable_add($1, $3, $2); free($1); free($3); }
@@ -477,8 +473,11 @@ assign_val:
 
 void conf_parse(const char *name)
 {
-       struct symbol *sym;
-       int i;
+       struct menu *menu;
+
+       autoconf_cmd = str_new();
+
+       str_printf(&autoconf_cmd, "\ndeps_config := \\\n");
 
        zconf_initscan(name);
 
@@ -488,13 +487,28 @@ void conf_parse(const char *name)
                yydebug = 1;
        yyparse();
 
+       /*
+        * FIXME:
+        * cur_filename and cur_lineno are used even after yyparse();
+        * menu_finalize() calls menu_add_symbol(). This should be fixed.
+        */
+       cur_filename = "<none>";
+       cur_lineno = 0;
+
+       str_printf(&autoconf_cmd,
+                  "\n"
+                  "$(autoconfig): $(deps_config)\n"
+                  "$(deps_config): ;\n");
+
+       env_write_dep(&autoconf_cmd);
+
        /* Variables are expanded in the parse phase. We can free them here. */
        variable_all_del();
 
        if (yynerrs)
                exit(1);
        if (!modules_sym)
-               modules_sym = sym_find( "n" );
+               modules_sym = &symbol_no;
 
        if (!menu_has_prompt(&rootmenu)) {
                current_entry = &rootmenu;
@@ -502,10 +516,23 @@ void conf_parse(const char *name)
        }
 
        menu_finalize(&rootmenu);
-       for_all_symbols(i, sym) {
-               if (sym_check_deps(sym))
+
+       menu = &rootmenu;
+       while (menu) {
+               if (menu->sym && sym_check_deps(menu->sym))
                        yynerrs++;
+
+               if (menu->list) {
+                       menu = menu->list;
+                       continue;
+               }
+
+               while (!menu->next && menu->parent)
+                       menu = menu->parent;
+
+               menu = menu->next;
        }
+
        if (yynerrs)
                exit(1);
        conf_set_changed(true);
@@ -520,11 +547,11 @@ static bool zconf_endtoken(const char *tokenname,
                yynerrs++;
                return false;
        }
-       if (current_menu->file != current_file) {
+       if (strcmp(current_menu->filename, cur_filename)) {
                zconf_error("'%s' in different file than '%s'",
                            tokenname, expected_tokenname);
                fprintf(stderr, "%s:%d: location of the '%s'\n",
-                       current_menu->file->name, current_menu->lineno,
+                       current_menu->filename, current_menu->lineno,
                        expected_tokenname);
                yynerrs++;
                return false;
@@ -536,7 +563,7 @@ static void zconfprint(const char *err, ...)
 {
        va_list ap;
 
-       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+       fprintf(stderr, "%s:%d: ", cur_filename, cur_lineno);
        va_start(ap, err);
        vfprintf(stderr, err, ap);
        va_end(ap);
@@ -548,7 +575,7 @@ static void zconf_error(const char *err, ...)
        va_list ap;
 
        yynerrs++;
-       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+       fprintf(stderr, "%s:%d: ", cur_filename, cur_lineno);
        va_start(ap, err);
        vfprintf(stderr, err, ap);
        va_end(ap);
@@ -557,7 +584,7 @@ static void zconf_error(const char *err, ...)
 
 static void yyerror(const char *err)
 {
-       fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
+       fprintf(stderr, "%s:%d: %s\n", cur_filename, cur_lineno, err);
 }
 
 static void print_quoted_string(FILE *out, const char *str)
index d1f5bcff4b62d68d83e6134b0c883876619f07a2..f0a4a218c4a5178a87722cc12e6ed6cb71baa82d 100644 (file)
@@ -9,10 +9,11 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "array_size.h"
+#include "internal.h"
 #include "list.h"
 #include "lkc.h"
-
-#define ARRAY_SIZE(arr)                (sizeof(arr) / sizeof((arr)[0]))
+#include "preprocess.h"
 
 static char *expand_string_with_args(const char *in, int argc, char *argv[]);
 static char *expand_string(const char *in);
@@ -21,7 +22,7 @@ static void __attribute__((noreturn)) pperror(const char *format, ...)
 {
        va_list ap;
 
-       fprintf(stderr, "%s:%d: ", current_file->name, yylineno);
+       fprintf(stderr, "%s:%d: ", cur_filename, yylineno);
        va_start(ap, format);
        vfprintf(stderr, format, ap);
        va_end(ap);
@@ -87,14 +88,17 @@ static char *env_expand(const char *name)
        return xstrdup(value);
 }
 
-void env_write_dep(FILE *f, const char *autoconfig_name)
+void env_write_dep(struct gstr *s)
 {
        struct env *e, *tmp;
 
        list_for_each_entry_safe(e, tmp, &env_list, node) {
-               fprintf(f, "ifneq \"$(%s)\" \"%s\"\n", e->name, e->value);
-               fprintf(f, "%s: FORCE\n", autoconfig_name);
-               fprintf(f, "endif\n");
+               str_printf(s,
+                          "\n"
+                          "ifneq \"$(%s)\" \"%s\"\n"
+                          "$(autoconfig): FORCE\n"
+                          "endif\n",
+                          e->name, e->value);
                env_del(e);
        }
 }
@@ -119,7 +123,7 @@ static char *do_error_if(int argc, char *argv[])
 
 static char *do_filename(int argc, char *argv[])
 {
-       return xstrdup(current_file->name);
+       return xstrdup(cur_filename);
 }
 
 static char *do_info(int argc, char *argv[])
@@ -181,8 +185,7 @@ static char *do_shell(int argc, char *argv[])
 static char *do_warning_if(int argc, char *argv[])
 {
        if (!strcmp(argv[0], "y"))
-               fprintf(stderr, "%s:%d: %s\n",
-                       current_file->name, yylineno, argv[1]);
+               fprintf(stderr, "%s:%d: %s\n", cur_filename, yylineno, argv[1]);
 
        return xstrdup("");
 }
diff --git a/scripts/kconfig/preprocess.h b/scripts/kconfig/preprocess.h
new file mode 100644 (file)
index 0000000..a7e4a55
--- /dev/null
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef PREPROCESS_H
+#define PREPROCESS_H
+
+enum variable_flavor {
+       VAR_SIMPLE,
+       VAR_RECURSIVE,
+       VAR_APPEND,
+};
+
+struct gstr;
+void env_write_dep(struct gstr *gs);
+void variable_add(const char *name, const char *value,
+                 enum variable_flavor flavor);
+void variable_all_del(void);
+char *expand_dollar(const char **str);
+char *expand_one_token(const char **str);
+
+#endif /* PREPROCESS_H */
index 620a3527c767af47e6cac0f36ee7533171626f2f..c6c42c0f4e5d588b49da9c38d494c57b2f4233c0 100644 (file)
@@ -1058,7 +1058,7 @@ void ConfigInfoView::menuInfo(void)
                                stream << "<br><br>";
                        }
 
-                       stream << "defined at " << _menu->file->name << ":"
+                       stream << "defined at " << _menu->filename << ":"
                               << _menu->lineno << "<br><br>";
                }
        }
index e9e9fb8d86746460c893a51a2989ca4061fc8e52..81fe1884ef8ae30f0051905ef2495ad324dc86b1 100644 (file)
@@ -9,23 +9,27 @@
 #include <string.h>
 #include <regex.h>
 
+#include "internal.h"
 #include "lkc.h"
 
 struct symbol symbol_yes = {
        .name = "y",
        .curr = { "y", yes },
+       .menus = LIST_HEAD_INIT(symbol_yes.menus),
        .flags = SYMBOL_CONST|SYMBOL_VALID,
 };
 
 struct symbol symbol_mod = {
        .name = "m",
        .curr = { "m", mod },
+       .menus = LIST_HEAD_INIT(symbol_mod.menus),
        .flags = SYMBOL_CONST|SYMBOL_VALID,
 };
 
 struct symbol symbol_no = {
        .name = "n",
        .curr = { "n", no },
+       .menus = LIST_HEAD_INIT(symbol_no.menus),
        .flags = SYMBOL_CONST|SYMBOL_VALID,
 };
 
@@ -160,9 +164,8 @@ static void sym_set_changed(struct symbol *sym)
 static void sym_set_all_changed(void)
 {
        struct symbol *sym;
-       int i;
 
-       for_all_symbols(i, sym)
+       for_all_symbols(sym)
                sym_set_changed(sym);
 }
 
@@ -475,9 +478,8 @@ void sym_calc_value(struct symbol *sym)
 void sym_clear_all_valid(void)
 {
        struct symbol *sym;
-       int i;
 
-       for_all_symbols(i, sym)
+       for_all_symbols(sym)
                sym->flags &= ~SYMBOL_VALID;
        conf_set_changed(true);
        sym_calc_value(modules_sym);
@@ -803,14 +805,7 @@ bool sym_is_changeable(struct symbol *sym)
        return sym->visible > sym->rev_dep.tri;
 }
 
-static unsigned strhash(const char *s)
-{
-       /* fnv32 hash */
-       unsigned hash = 2166136261U;
-       for (; *s; s++)
-               hash = (hash ^ *s) * 0x01000193;
-       return hash;
-}
+HASHTABLE_DEFINE(sym_hashtable, SYMBOL_HASHSIZE);
 
 struct symbol *sym_lookup(const char *name, int flags)
 {
@@ -826,9 +821,9 @@ struct symbol *sym_lookup(const char *name, int flags)
                        case 'n': return &symbol_no;
                        }
                }
-               hash = strhash(name) % SYMBOL_HASHSIZE;
+               hash = strhash(name);
 
-               for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+               hash_for_each_possible(sym_hashtable, symbol, node, hash) {
                        if (symbol->name &&
                            !strcmp(symbol->name, name) &&
                            (flags ? symbol->flags & flags
@@ -846,9 +841,9 @@ struct symbol *sym_lookup(const char *name, int flags)
        symbol->name = new_name;
        symbol->type = S_UNKNOWN;
        symbol->flags = flags;
+       INIT_LIST_HEAD(&symbol->menus);
 
-       symbol->next = symbol_hash[hash];
-       symbol_hash[hash] = symbol;
+       hash_add(sym_hashtable, &symbol->node, hash);
 
        return symbol;
 }
@@ -868,9 +863,9 @@ struct symbol *sym_find(const char *name)
                case 'n': return &symbol_no;
                }
        }
-       hash = strhash(name) % SYMBOL_HASHSIZE;
+       hash = strhash(name);
 
-       for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+       hash_for_each_possible(sym_hashtable, symbol, node, hash) {
                if (symbol->name &&
                    !strcmp(symbol->name, name) &&
                    !(symbol->flags & SYMBOL_CONST))
@@ -930,7 +925,7 @@ struct symbol **sym_re_search(const char *pattern)
        if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE))
                return NULL;
 
-       for_all_symbols(i, sym) {
+       for_all_symbols(sym) {
                if (sym->flags & SYMBOL_CONST || !sym->name)
                        continue;
                if (regexec(&re, sym->name, 1, match, 0))
@@ -1041,42 +1036,42 @@ static void sym_check_print_recursive(struct symbol *last_sym)
                }
                if (stack->sym == last_sym)
                        fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
-                               prop->file->name, prop->lineno);
+                               prop->filename, prop->lineno);
 
                if (sym_is_choice(sym)) {
                        fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
-                               menu->file->name, menu->lineno,
+                               menu->filename, menu->lineno,
                                sym->name ? sym->name : "<choice>",
                                next_sym->name ? next_sym->name : "<choice>");
                } else if (sym_is_choice_value(sym)) {
                        fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n",
-                               menu->file->name, menu->lineno,
+                               menu->filename, menu->lineno,
                                sym->name ? sym->name : "<choice>",
                                next_sym->name ? next_sym->name : "<choice>");
                } else if (stack->expr == &sym->dir_dep.expr) {
                        fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n",
-                               prop->file->name, prop->lineno,
+                               prop->filename, prop->lineno,
                                sym->name ? sym->name : "<choice>",
                                next_sym->name ? next_sym->name : "<choice>");
                } else if (stack->expr == &sym->rev_dep.expr) {
                        fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n",
-                               prop->file->name, prop->lineno,
+                               prop->filename, prop->lineno,
                                sym->name ? sym->name : "<choice>",
                                next_sym->name ? next_sym->name : "<choice>");
                } else if (stack->expr == &sym->implied.expr) {
                        fprintf(stderr, "%s:%d:\tsymbol %s is implied by %s\n",
-                               prop->file->name, prop->lineno,
+                               prop->filename, prop->lineno,
                                sym->name ? sym->name : "<choice>",
                                next_sym->name ? next_sym->name : "<choice>");
                } else if (stack->expr) {
                        fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
-                               prop->file->name, prop->lineno,
+                               prop->filename, prop->lineno,
                                sym->name ? sym->name : "<choice>",
                                prop_get_type_name(prop->type),
                                next_sym->name ? next_sym->name : "<choice>");
                } else {
                        fprintf(stderr, "%s:%d:\tsymbol %s %s is visible depending on %s\n",
-                               prop->file->name, prop->lineno,
+                               prop->filename, prop->lineno,
                                sym->name ? sym->name : "<choice>",
                                prop_get_type_name(prop->type),
                                next_sym->name ? next_sym->name : "<choice>");
diff --git a/scripts/kconfig/tests/choice_randomize/Kconfig b/scripts/kconfig/tests/choice_randomize/Kconfig
new file mode 100644 (file)
index 0000000..93a1699
--- /dev/null
@@ -0,0 +1,22 @@
+choice
+       prompt "choose A or B"
+
+config A
+       bool "A"
+
+config B
+       bool "B"
+
+endchoice
+
+choice
+       prompt "choose X or Y"
+       depends on B
+
+config X
+       bool "X"
+
+config Y
+       bool "Y"
+
+endchoice
diff --git a/scripts/kconfig/tests/choice_randomize/__init__.py b/scripts/kconfig/tests/choice_randomize/__init__.py
new file mode 100644 (file)
index 0000000..d380045
--- /dev/null
@@ -0,0 +1,34 @@
+# SPDX-License-Identifier: GPL-2.0-only
+"""
+Randomize all dependent choices
+
+This is a somewhat tricky case for randconfig; the visibility of one choice is
+determined by a member of another choice. Randconfig should be able to generate
+all possible patterns.
+"""
+
+
+def test(conf):
+
+    expected0 = False
+    expected1 = False
+    expected2 = False
+
+    for i in range(100):
+        assert conf.randconfig(seed=i) == 0
+
+        if conf.config_matches('expected_config0'):
+            expected0 = True
+        elif conf.config_matches('expected_config1'):
+            expected1 = True
+        elif conf.config_matches('expected_config2'):
+            expected2 = True
+        else:
+            assert False
+
+        if expected0 and expected1 and expected2:
+            break
+
+    assert expected0
+    assert expected1
+    assert expected2
diff --git a/scripts/kconfig/tests/choice_randomize/expected_config0 b/scripts/kconfig/tests/choice_randomize/expected_config0
new file mode 100644 (file)
index 0000000..f692273
--- /dev/null
@@ -0,0 +1,6 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Main menu
+#
+CONFIG_A=y
+# CONFIG_B is not set
diff --git a/scripts/kconfig/tests/choice_randomize/expected_config1 b/scripts/kconfig/tests/choice_randomize/expected_config1
new file mode 100644 (file)
index 0000000..bf83784
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Main menu
+#
+# CONFIG_A is not set
+CONFIG_B=y
+CONFIG_X=y
+# CONFIG_Y is not set
diff --git a/scripts/kconfig/tests/choice_randomize/expected_config2 b/scripts/kconfig/tests/choice_randomize/expected_config2
new file mode 100644 (file)
index 0000000..38f93a8
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Main menu
+#
+# CONFIG_A is not set
+CONFIG_B=y
+# CONFIG_X is not set
+CONFIG_Y=y
diff --git a/scripts/kconfig/tests/choice_randomize2/Kconfig b/scripts/kconfig/tests/choice_randomize2/Kconfig
new file mode 100644 (file)
index 0000000..530cf2e
--- /dev/null
@@ -0,0 +1,32 @@
+choice
+       prompt "This is always invisible"
+       depends on n
+
+config DUMMY
+       bool "DUMMY"
+
+endchoice
+
+choice
+       prompt "Choose A or B"
+
+config A
+       bool "A"
+
+config B
+       bool "B"
+
+endchoice
+
+config FOO
+       bool "FOO"
+       depends on A
+
+choice
+       prompt "Choose X"
+       depends on FOO
+
+config X
+       bool "X"
+
+endchoice
diff --git a/scripts/kconfig/tests/choice_randomize2/__init__.py b/scripts/kconfig/tests/choice_randomize2/__init__.py
new file mode 100644 (file)
index 0000000..2066757
--- /dev/null
@@ -0,0 +1,18 @@
+# SPDX-License-Identifier: GPL-2.0-only
+"""
+Randomize choices with correct dependencies
+
+When shuffling a choice may potentially disrupt certain dependencies, symbol
+values must be recalculated.
+
+Related Linux commits:
+  - c8fb7d7e48d11520ad24808cfce7afb7b9c9f798
+"""
+
+
+def test(conf):
+    for i in range(20):
+        assert conf.randconfig(seed=i) == 0
+        assert (conf.config_matches('expected_config0') or
+                conf.config_matches('expected_config1') or
+                conf.config_matches('expected_config2'))
diff --git a/scripts/kconfig/tests/choice_randomize2/expected_config0 b/scripts/kconfig/tests/choice_randomize2/expected_config0
new file mode 100644 (file)
index 0000000..5c9e1c1
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Main menu
+#
+CONFIG_A=y
+# CONFIG_B is not set
+CONFIG_FOO=y
+CONFIG_X=y
diff --git a/scripts/kconfig/tests/choice_randomize2/expected_config1 b/scripts/kconfig/tests/choice_randomize2/expected_config1
new file mode 100644 (file)
index 0000000..5b975d9
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Main menu
+#
+CONFIG_A=y
+# CONFIG_B is not set
+# CONFIG_FOO is not set
diff --git a/scripts/kconfig/tests/choice_randomize2/expected_config2 b/scripts/kconfig/tests/choice_randomize2/expected_config2
new file mode 100644 (file)
index 0000000..5a5ebb9
--- /dev/null
@@ -0,0 +1,6 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Main menu
+#
+# CONFIG_A is not set
+CONFIG_B=y
index af8774a5697c8d0b83a577f4de702505242d74fd..2a2a7e2da06087524badbe3c5a12ad2c8c9ae8b8 100644 (file)
@@ -154,12 +154,10 @@ class Conf:
         defconfig_path = os.path.join(self._test_dir, defconfig)
         return self._run_conf('--defconfig={}'.format(defconfig_path))
 
-    def _allconfig(self, mode, all_config):
+    def _allconfig(self, mode, all_config, extra_env={}):
         if all_config:
             all_config_path = os.path.join(self._test_dir, all_config)
-            extra_env = {'KCONFIG_ALLCONFIG': all_config_path}
-        else:
-            extra_env = {}
+            extra_env['KCONFIG_ALLCONFIG'] = all_config_path
 
         return self._run_conf('--{}config'.format(mode), extra_env=extra_env)
 
@@ -195,13 +193,19 @@ class Conf:
         """
         return self._allconfig('alldef', all_config)
 
-    def randconfig(self, all_config=None):
+    def randconfig(self, all_config=None, seed=None):
         """Run randconfig.
 
         all_config: fragment config file for KCONFIG_ALLCONFIG (optional)
+        seed: the seed for randconfig (optional)
         returncode: exit status of the Kconfig executable
         """
-        return self._allconfig('rand', all_config)
+        if seed is not None:
+            extra_env = {'KCONFIG_SEED': hex(seed)}
+        else:
+            extra_env = {}
+
+        return self._allconfig('rand', all_config, extra_env=extra_env)
 
     def savedefconfig(self, dot_config):
         """Run savedefconfig.
index c9f4abf9a79160652691f465b67a2e0029ec6645..05d4ced703206f8d10ed0d34f78a4957bb53b678 100644 (file)
@@ -1,10 +1,10 @@
-Kconfig:11:error: recursive dependency detected!
-Kconfig:11:    symbol B is selected by B
+Kconfig:5:error: recursive dependency detected!
+Kconfig:5:     symbol A depends on A
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
-Kconfig:5:error: recursive dependency detected!
-Kconfig:5:     symbol A depends on A
+Kconfig:11:error: recursive dependency detected!
+Kconfig:11:    symbol B is selected by B
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
@@ -14,9 +14,9 @@ Kconfig:21:   symbol C2 depends on C1
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
-Kconfig:32:error: recursive dependency detected!
-Kconfig:32:    symbol D2 is selected by D1
+Kconfig:27:error: recursive dependency detected!
 Kconfig:27:    symbol D1 depends on D2
+Kconfig:32:    symbol D2 is selected by D1
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
@@ -26,13 +26,13 @@ Kconfig:42: symbol E2 is implied by E1
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
-Kconfig:60:error: recursive dependency detected!
-Kconfig:60:    symbol G depends on G
+Kconfig:49:error: recursive dependency detected!
+Kconfig:49:    symbol F1 default value contains F2
+Kconfig:51:    symbol F2 depends on F1
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
 
-Kconfig:51:error: recursive dependency detected!
-Kconfig:51:    symbol F2 depends on F1
-Kconfig:49:    symbol F1 default value contains F2
+Kconfig:60:error: recursive dependency detected!
+Kconfig:60:    symbol G depends on G
 For a resolution refer to Documentation/kbuild/kconfig-language.rst
 subsection "Kconfig recursive dependency limitations"
index 92e5b2b9761d70966279ac0159769adf580110fa..439c131b424e7e6f82abbd0788c59cb90f6b3a52 100644 (file)
@@ -7,25 +7,50 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
+
+#include "hashtable.h"
 #include "lkc.h"
 
+unsigned int strhash(const char *s)
+{
+       /* fnv32 hash */
+       unsigned int hash = 2166136261U;
+
+       for (; *s; s++)
+               hash = (hash ^ *s) * 0x01000193;
+       return hash;
+}
+
+/* hash table of all parsed Kconfig files */
+static HASHTABLE_DEFINE(file_hashtable, 1U << 11);
+
+struct file {
+       struct hlist_node node;
+       char name[];
+};
+
 /* file already present in list? If not add it */
-struct file *file_lookup(const char *name)
+const char *file_lookup(const char *name)
 {
        struct file *file;
+       size_t len;
+       int hash = strhash(name);
 
-       for (file = file_list; file; file = file->next) {
-               if (!strcmp(name, file->name)) {
-                       return file;
-               }
-       }
+       hash_for_each_possible(file_hashtable, file, node, hash)
+               if (!strcmp(name, file->name))
+                       return file->name;
 
-       file = xmalloc(sizeof(*file));
+       len = strlen(name);
+       file = xmalloc(sizeof(*file) + len + 1);
        memset(file, 0, sizeof(*file));
-       file->name = xstrdup(name);
-       file->next = file_list;
-       file_list = file;
-       return file;
+       memcpy(file->name, name, len);
+       file->name[len] = '\0';
+
+       hash_add(file_hashtable, &file->node, hash);
+
+       str_printf(&autoconf_cmd, "\t%s \\\n", name);
+
+       return file->name;
 }
 
 /* Allocate initial growable string */
index bf7c4b4b5ff45694322af0d6b221b6735ea1a739..6b37039c9e927bc3ffcad77b82e3e9f95d7bf0a7 100644 (file)
@@ -1050,7 +1050,9 @@ static void default_mismatch_handler(const char *modname, struct elf_info *elf,
        sec_mismatch_count++;
 
        warn("%s: section mismatch in reference: %s+0x%x (section: %s) -> %s (section: %s)\n",
-            modname, fromsym, (unsigned int)(faddr - from->st_value), fromsec, tosym, tosec);
+            modname, fromsym,
+            (unsigned int)(faddr - (from ? from->st_value : 0)),
+            fromsec, tosym, tosec);
 
        if (mismatch->mismatch == EXTABLE_TO_NON_TEXT) {
                if (match(tosec, mismatch->bad_tosec))
index bf96a3c2460814febe85a0a49fe2e9a8e90ea1ad..e797ad360f7a5b0493892630b330c8084a7770b0 100755 (executable)
@@ -24,24 +24,10 @@ if_enabled_echo() {
        fi
 }
 
-create_package() {
-       export DH_OPTIONS="-p${1}"
-
-       dh_installdocs
-       dh_installchangelogs
-       dh_compress
-       dh_fixperms
-       dh_gencontrol
-       dh_md5sums
-       dh_builddeb -- ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS}
-}
-
 install_linux_image () {
        pname=$1
        pdir=debian/$1
 
-       rm -rf ${pdir}
-
        # Only some architectures with OF support have this target
        if is_enabled CONFIG_OF_EARLY_FLATTREE && [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then
                ${MAKE} -f ${srctree}/Makefile INSTALL_DTBS_PATH="${pdir}/usr/lib/linux-image-${KERNELRELEASE}" dtbs_install
@@ -109,8 +95,6 @@ install_linux_image () {
 install_linux_image_dbg () {
        pdir=debian/$1
 
-       rm -rf ${pdir}
-
        # Parse modules.order directly because 'make modules_install' may sign,
        # compress modules, and then run unneeded depmod.
        while read -r mod; do
@@ -140,8 +124,6 @@ install_kernel_headers () {
        pdir=debian/$1
        version=${1#linux-headers-}
 
-       rm -rf $pdir
-
        "${srctree}/scripts/package/install-extmod-build" "${pdir}/usr/src/linux-headers-${version}"
 
        mkdir -p $pdir/lib/modules/$version/
@@ -151,8 +133,6 @@ install_kernel_headers () {
 install_libc_headers () {
        pdir=debian/$1
 
-       rm -rf $pdir
-
        $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr
 
        # move asm headers to /usr/include/<libc-machine>/asm to match the structure
@@ -161,21 +141,15 @@ install_libc_headers () {
        mv "$pdir/usr/include/asm" "$pdir/usr/include/${DEB_HOST_MULTIARCH}"
 }
 
-rm -f debian/files
-
-packages_enabled=$(dh_listpackages)
-
-for package in ${packages_enabled}
-do
-       case ${package} in
-       *-dbg)
-               install_linux_image_dbg "${package}";;
-       linux-image-*|user-mode-linux-*)
-               install_linux_image "${package}";;
-       linux-libc-dev)
-               install_libc_headers "${package}";;
-       linux-headers-*)
-               install_kernel_headers "${package}";;
-       esac
-       create_package "${package}"
-done
+package=$1
+
+case "${package}" in
+*-dbg)
+       install_linux_image_dbg "${package}";;
+linux-image-*|user-mode-linux-*)
+       install_linux_image "${package}";;
+linux-libc-dev)
+       install_libc_headers "${package}";;
+linux-headers-*)
+       install_kernel_headers "${package}";;
+esac
index 09830778006227f5854580bba5099e21b09b8d1e..ca07243bd5cdf6e02c99bff0c5cb681111fa2fae 100755 (executable)
@@ -11,28 +11,73 @@ ifneq (,$(filter-out parallel=1,$(filter parallel=%,$(DEB_BUILD_OPTIONS))))
     MAKEFLAGS += -j$(NUMJOBS)
 endif
 
+# When KBUILD_VERBOSE is undefined (presumably you are directly working with
+# the debianized tree), show verbose logs unless DEB_BUILD_OPTION=terse is set.
+ifeq ($(origin KBUILD_VERBOSE),undefined)
+    ifeq (,$(filter terse,$(DEB_BUILD_OPTIONS)))
+        export KBUILD_VERBOSE := 1
+    else
+        Q := @
+    endif
+endif
+
 revision = $(lastword $(subst -, ,$(shell dpkg-parsechangelog -S Version)))
 CROSS_COMPILE ?= $(filter-out $(DEB_BUILD_GNU_TYPE)-, $(DEB_HOST_GNU_TYPE)-)
 make-opts = ARCH=$(ARCH) KERNELRELEASE=$(KERNELRELEASE) KBUILD_BUILD_VERSION=$(revision) $(addprefix CROSS_COMPILE=,$(CROSS_COMPILE))
 
+binary-targets := $(addprefix binary-, image image-dbg headers libc-dev)
+
+all-packages = $(shell dh_listpackages)
+image-package = $(filter linux-image-% user-%, $(filter-out %-dbg, $(all-packages)))
+image-dbg-package = $(filter %-dbg, $(all-packages))
+libc-dev-package = $(filter linux-libc-dev, $(all-packages))
+headers-package = $(filter linux-headers-%, $(all-packages))
+
+mk-files = $(patsubst binary-%,debian/%.files,$1)
+package = $($(@:binary-%=%-package))
+
+# DH_OPTION is an environment variable common for all debhelper commands.
+# We could 'export' it, but here it is passed from the command line to clarify
+# which package is being processed in the build log.
+DH_OPTIONS = -p$(package)
+
+define binary
+       $(Q)dh_testdir $(DH_OPTIONS)
+       $(Q)dh_testroot $(DH_OPTIONS)
+       $(Q)dh_prep $(DH_OPTIONS)
+       $(Q)+$(MAKE) $(make-opts) run-command KBUILD_RUN_COMMAND='+$$(srctree)/scripts/package/builddeb $(package)'
+       $(Q)dh_installdocs $(DH_OPTIONS)
+       $(Q)dh_installchangelogs $(DH_OPTIONS)
+       $(Q)dh_compress $(DH_OPTIONS)
+       $(Q)dh_fixperms $(DH_OPTIONS)
+       $(Q)dh_gencontrol $(DH_OPTIONS) -- -f$(call mk-files,$@)
+       $(Q)dh_md5sums $(DH_OPTIONS)
+       $(Q)dh_builddeb $(DH_OPTIONS) -- $(addprefix -Z,$(KDEB_COMPRESS))
+endef
+
+.PHONY: $(binary-targets)
+$(binary-targets): build-arch
+       $(Q)truncate -s0 $(call mk-files,$@)
+       $(if $(package),$(binary))
+
 .PHONY: binary binary-indep binary-arch
 binary: binary-arch binary-indep
 binary-indep: build-indep
-binary-arch: build-arch
-       $(MAKE) $(make-opts) \
-       run-command KBUILD_RUN_COMMAND='+$$(srctree)/scripts/package/builddeb'
+binary-arch: $(binary-targets)
+       $(Q)cat $(call mk-files,$^) > debian/files
 
 .PHONY: build build-indep build-arch
 build: build-arch build-indep
 build-indep:
 build-arch:
-       $(MAKE) $(make-opts) olddefconfig
-       $(MAKE) $(make-opts) $(if $(filter um,$(ARCH)),,headers) all
+       $(Q)$(MAKE) $(make-opts) olddefconfig
+       $(Q)$(MAKE) $(make-opts) $(if $(filter um,$(ARCH)),,headers) all
 
 .PHONY: clean
 clean:
-       rm -rf debian/files debian/linux-* debian/deb-env.vars*
-       $(MAKE) ARCH=$(ARCH) clean
+       $(Q)dh_clean
+       $(Q)rm -rf debian/deb-env.vars* debian/*.files
+       $(Q)$(MAKE) ARCH=$(ARCH) clean
 
 # If DEB_HOST_ARCH is empty, it is likely that debian/rules was executed
 # directly. Run 'dpkg-architecture --print-set --print-format=make' to
@@ -41,6 +86,6 @@ ifndef DEB_HOST_ARCH
 include debian/deb-env.vars
 
 debian/deb-env.vars:
-       dpkg-architecture -a$$(cat debian/arch) --print-set --print-format=make > $@.tmp
-       mv $@.tmp $@
+       $(Q)dpkg-architecture -a$$(cat debian/arch) --print-set --print-format=make > $@.tmp
+       $(Q)mv $@.tmp $@
 endif
index f58726671fb37424308c678126e5edd4a22dc5f3..e095eb1e290ec0be0e960d6c4c2b411f4c8a9030 100644 (file)
@@ -61,11 +61,37 @@ cp $(%{make} %{makeflags} -s image_name) %{buildroot}/lib/modules/%{KERNELRELEAS
 %{make} %{makeflags} INSTALL_HDR_PATH=%{buildroot}/usr headers_install
 cp System.map %{buildroot}/lib/modules/%{KERNELRELEASE}
 cp .config %{buildroot}/lib/modules/%{KERNELRELEASE}/config
+if %{make} %{makeflags} run-command KBUILD_RUN_COMMAND='test -d ${srctree}/arch/${SRCARCH}/boot/dts' 2>/dev/null; then
+       %{make} %{makeflags} INSTALL_DTBS_PATH=%{buildroot}/lib/modules/%{KERNELRELEASE}/dtb dtbs_install
+fi
 ln -fns /usr/src/kernels/%{KERNELRELEASE} %{buildroot}/lib/modules/%{KERNELRELEASE}/build
 %if %{with_devel}
 %{make} %{makeflags} run-command KBUILD_RUN_COMMAND='${srctree}/scripts/package/install-extmod-build %{buildroot}/usr/src/kernels/%{KERNELRELEASE}'
 %endif
 
+{
+       for x in System.map config kernel modules.builtin \
+                       modules.builtin.modinfo modules.order vmlinuz; do
+               echo "/lib/modules/%{KERNELRELEASE}/${x}"
+       done
+
+       for x in alias alias.bin builtin.alias.bin builtin.bin dep dep.bin \
+                                       devname softdep symbols symbols.bin; do
+               echo "%ghost /lib/modules/%{KERNELRELEASE}/modules.${x}"
+       done
+
+       for x in System.map config vmlinuz; do
+               echo "%ghost /boot/${x}-%{KERNELRELEASE}"
+       done
+
+       if [ -d "%{buildroot}/lib/modules/%{KERNELRELEASE}/dtb" ];then
+               echo "/lib/modules/%{KERNELRELEASE}/dtb"
+               find "%{buildroot}/lib/modules/%{KERNELRELEASE}/dtb" -printf "%%%ghost /boot/dtb-%{KERNELRELEASE}/%%P\n"
+       fi
+
+       echo "%exclude /lib/modules/%{KERNELRELEASE}/build"
+} > %{buildroot}/kernel.list
+
 %clean
 rm -rf %{buildroot}
 
@@ -78,23 +104,23 @@ for file in vmlinuz System.map config; do
                cp "/lib/modules/%{KERNELRELEASE}/${file}" "/boot/${file}-%{KERNELRELEASE}"
        fi
 done
+if [ -d "/lib/modules/%{KERNELRELEASE}/dtb" ] && \
+   ! diff -rq "/lib/modules/%{KERNELRELEASE}/dtb" "/boot/dtb-%{KERNELRELEASE}" >/dev/null 2>&1; then
+       rm -rf "/boot/dtb-%{KERNELRELEASE}"
+       cp -r "/lib/modules/%{KERNELRELEASE}/dtb" "/boot/dtb-%{KERNELRELEASE}"
+fi
+if [ ! -e "/lib/modules/%{KERNELRELEASE}/modules.dep" ]; then
+       /usr/sbin/depmod %{KERNELRELEASE}
+fi
 
 %preun
-if [ -x /sbin/new-kernel-pkg ]; then
-new-kernel-pkg --remove %{KERNELRELEASE} --rminitrd --initrdfile=/boot/initramfs-%{KERNELRELEASE}.img
-elif [ -x /usr/bin/kernel-install ]; then
+if [ -x /usr/bin/kernel-install ]; then
 kernel-install remove %{KERNELRELEASE}
 fi
 
-%postun
-if [ -x /sbin/update-bootloader ]; then
-/sbin/update-bootloader --remove %{KERNELRELEASE}
-fi
-
-%files
+%files -f %{buildroot}/kernel.list
 %defattr (-, root, root)
-/lib/modules/%{KERNELRELEASE}
-%exclude /lib/modules/%{KERNELRELEASE}/build
+%exclude /kernel.list
 
 %files headers
 %defattr (-, root, root)
index 4be7144e4803ddf1b8bfd6d85e85af68407c1a51..2cf892774346ceb962e4b01ebce07f617694da35 100644 (file)
@@ -2,7 +2,7 @@
 # Most of this file is copied from tools/lib/traceevent/Makefile
 
 RM ?= rm
-srctree = $(abs_srctree)
+srctree := $(realpath $(srctree))
 
 VERSION_SCRIPT := libbpf.map
 LIBBPF_VERSION := $(shell \