mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
Kbuild updates for v6.9
- 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 -----BEGIN PGP SIGNATURE----- iQJJBAABCgAzFiEEbmPs18K1szRHjPqEPYsBB53g2wYFAmX8HGIVHG1hc2FoaXJv eUBrZXJuZWwub3JnAAoJED2LAQed4NsGYfIQAIl/zEFoNVSHGR4TIvO7SIwkT4MM VAm0W6XRFaXfIGw8HL/MXe+U9jAyeQ9yL9uUVv8PqFTO+LzBbW1X1X97tlmrlQsC 7mdxbA1KJXwkwt4wH/8/EZQMwHr327vtVH4AilSm+gAaWMXaSKAye3ulKQQ2gevz vP6aOcfbHIWOPdxA53cLdSl9LOGrYNczKySHXKV9O39T81F+ko7wPpdkiMWw5LWG ISRCV8bdXli8j10Pmg8jlbevSKl4Z5FG2BVw/Cl8rQ5tBBoCzFsUPnnp9A29G8QP OqRhbwxtkSm67BMJAYdHnhjp/l0AOEbmetTGpna+R06hirOuXhR3vc6YXZxhQjff LmKaqfG5YchRALS1fNDsRUNIkQxVJade+tOUG+V4WbxHQKWX7Ghu5EDlt2/x7P0p +XLPE48HoNQLQOJ+pgIOkaEDl7WLfGhoEtEgprZBuEP2h39xcdbYJyF10ZAAR4UZ FF6J9lDHbf7v1uqD2YnAQJQ6jJ06CvN6/s6SdiJnCWSs5cYRW0fnYigSIuwAgGHZ c/QFECoGEflXGGuqZDl5iXiIjhWKzH2nADSVEs7maP47vapcMWb9gA7VBNoOr5M0 IXuFo1khChF4V2pxqlDj3H5TkDlFENYT/Wjh+vvjx8XplKCRKaSh+LaZ39hja61V dWH7BPecS44h4KXx =tFdl -----END PGP SIGNATURE----- Merge tag 'kbuild-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild 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) ...
This commit is contained in:
commit
1d35aae78f
1
.gitignore
vendored
1
.gitignore
vendored
@ -52,6 +52,7 @@
|
|||||||
*.xz
|
*.xz
|
||||||
*.zst
|
*.zst
|
||||||
Module.symvers
|
Module.symvers
|
||||||
|
dtbs-list
|
||||||
modules.order
|
modules.order
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -393,7 +393,7 @@ of C0, which doesn't depend on M::
|
|||||||
|
|
||||||
choices::
|
choices::
|
||||||
|
|
||||||
"choice" [symbol]
|
"choice"
|
||||||
<choice options>
|
<choice options>
|
||||||
<choice block>
|
<choice block>
|
||||||
"endchoice"
|
"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
|
A choice accepts another option "optional", which allows to set the
|
||||||
choice to 'n' and no entry needs to be selected.
|
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::
|
comment::
|
||||||
|
|
||||||
|
@ -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')
|
The xconfig ('qconf'), menuconfig ('mconf'), and nconfig ('nconf')
|
||||||
programs also have embedded help text. Be sure to check that for
|
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.
|
The gconfig ('gconf') program has limited help text.
|
||||||
|
|
||||||
|
|
||||||
General
|
General
|
||||||
-------
|
=======
|
||||||
|
|
||||||
New kernel releases often introduce new config symbols. Often more
|
New kernel releases often introduce new config symbols. Often more
|
||||||
important, new kernel releases may rename config symbols. When
|
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::
|
To see a list of new config symbols, use::
|
||||||
|
|
||||||
cp user/some/old.config .config
|
cp user/some/old.config .config
|
||||||
make listnewconfig
|
make listnewconfig
|
||||||
|
|
||||||
and the config program will list any new symbols, one per line.
|
and the config program will list any new symbols, one per line.
|
||||||
|
|
||||||
Alternatively, you can use the brute force method::
|
Alternatively, you can use the brute force method::
|
||||||
|
|
||||||
make oldconfig
|
make oldconfig
|
||||||
scripts/diffconfig .config.old .config | less
|
scripts/diffconfig .config.old .config | less
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
|
|
||||||
Environment variables for `*config`
|
Environment variables
|
||||||
|
=====================
|
||||||
|
|
||||||
KCONFIG_CONFIG
|
Environment variables for ``*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
|
``KCONFIG_CONFIG``
|
||||||
----------------------
|
This environment variable can be used to specify a default kernel config
|
||||||
|
file name to override the default name of ".config".
|
||||||
|
|
||||||
This environment variable specifies a list of config files which can be used
|
``KCONFIG_DEFCONFIG_LIST``
|
||||||
as a base configuration in case the .config does not exist yet. Entries in
|
This environment variable specifies a list of config files which can be
|
||||||
the list are separated with whitespaces to each other, and the first one
|
used as a base configuration in case the .config does not exist yet.
|
||||||
that exists is used.
|
Entries in the list are separated with whitespaces to each other, and
|
||||||
|
the first one that exists is used.
|
||||||
|
|
||||||
KCONFIG_OVERWRITECONFIG
|
``KCONFIG_OVERWRITECONFIG``
|
||||||
-----------------------
|
If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
|
||||||
If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
|
break symlinks when .config is a symlink to somewhere else.
|
||||||
break symlinks when .config is a symlink to somewhere else.
|
|
||||||
|
|
||||||
KCONFIG_WARN_UNKNOWN_SYMBOLS
|
``KCONFIG_WARN_UNKNOWN_SYMBOLS``
|
||||||
----------------------------
|
This environment variable makes Kconfig warn about all unrecognized
|
||||||
This environment variable makes Kconfig warn about all unrecognized
|
symbols in the config input.
|
||||||
symbols in the config input.
|
|
||||||
|
|
||||||
KCONFIG_WERROR
|
``KCONFIG_WERROR``
|
||||||
--------------
|
If set, Kconfig treats warnings as errors.
|
||||||
If set, Kconfig treats warnings as errors.
|
|
||||||
|
|
||||||
`CONFIG_`
|
``CONFIG_``
|
||||||
---------
|
If you set ``CONFIG_`` in the environment, Kconfig will prefix all symbols
|
||||||
If you set `CONFIG_` in the environment, Kconfig will prefix all symbols
|
with its value when saving the configuration, instead of using the
|
||||||
with its value when saving the configuration, instead of using the default,
|
default, ``CONFIG_``.
|
||||||
`CONFIG_`.
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
Environment variables for ``{allyes/allmod/allno/rand}config``:
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
KCONFIG_ALLCONFIG
|
This enables you to create "miniature" config (miniconfig) or custom
|
||||||
-----------------
|
config files containing just the config symbols that you are interested
|
||||||
(partially based on lkml email from/by Rob Landley, re: miniconfig)
|
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.
|
||||||
|
|
||||||
The allyesconfig/allmodconfig/allnoconfig/randconfig variants can also
|
Examples::
|
||||||
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
|
KCONFIG_ALLCONFIG=custom-notebook.config make allnoconfig
|
||||||
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
|
or::
|
||||||
(usually a subset of all) preset config symbols. These variable
|
|
||||||
settings are still subject to normal dependency checks.
|
|
||||||
|
|
||||||
Examples::
|
KCONFIG_ALLCONFIG=mini.config make allnoconfig
|
||||||
|
|
||||||
KCONFIG_ALLCONFIG=custom-notebook.config make allnoconfig
|
or::
|
||||||
|
|
||||||
or::
|
make KCONFIG_ALLCONFIG=mini.config allnoconfig
|
||||||
|
|
||||||
KCONFIG_ALLCONFIG=mini.config make allnoconfig
|
These examples will disable most options (allnoconfig) but enable or
|
||||||
|
disable the options that are explicitly listed in the specified
|
||||||
|
mini-config files.
|
||||||
|
|
||||||
or::
|
Environment variables for ``randconfig``:
|
||||||
|
|
||||||
make KCONFIG_ALLCONFIG=mini.config allnoconfig
|
``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.
|
||||||
|
|
||||||
These examples will disable most options (allnoconfig) but enable or
|
``KCONFIG_PROBABILITY``
|
||||||
disable the options that are explicitly listed in the specified
|
This variable can be used to skew the probabilities. This variable can
|
||||||
mini-config files.
|
be unset or empty, or set to three different formats:
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
|
|
||||||
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_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
|
unset or empty 50 : 50 33 : 33 : 34
|
||||||
N N : 100-N N/2 : N/2 : 100-N
|
N N : 100-N N/2 : N/2 : 100-N
|
||||||
[1] N:M N+M : 100-(N+M) N : M : 100-(N+M)
|
[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)
|
[2] N:M:L N : 100-N M : L : 100-(M+L)
|
||||||
======================= ================== =====================
|
======================= ================== =====================
|
||||||
@ -149,112 +134,98 @@ that:
|
|||||||
|
|
||||||
Examples::
|
Examples::
|
||||||
|
|
||||||
KCONFIG_PROBABILITY=10
|
KCONFIG_PROBABILITY=10
|
||||||
10% of booleans will be set to 'y', 90% to 'n'
|
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'
|
5% of tristates will be set to 'y', 5% to 'm', 90% to 'n'
|
||||||
KCONFIG_PROBABILITY=15:25
|
KCONFIG_PROBABILITY=15:25
|
||||||
40% of booleans will be set to 'y', 60% to 'n'
|
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'
|
15% of tristates will be set to 'y', 25% to 'm', 60% to 'n'
|
||||||
KCONFIG_PROBABILITY=10:15:15
|
KCONFIG_PROBABILITY=10:15:15
|
||||||
10% of booleans will be set to 'y', 90% to 'n'
|
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'
|
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
|
``KCONFIG_AUTOCONFIG``
|
||||||
----------------------
|
This environment variable can be set to specify the path & name of the
|
||||||
If this variable has a non-blank value, it prevents silent kernel
|
"auto.conf" file. Its default value is "include/config/auto.conf".
|
||||||
config updates (requires explicit updates).
|
|
||||||
|
|
||||||
KCONFIG_AUTOCONFIG
|
``KCONFIG_AUTOHEADER``
|
||||||
------------------
|
This environment variable can be set to specify the path & name of the
|
||||||
This environment variable can be set to specify the path & name of the
|
"autoconf.h" (header) file.
|
||||||
"auto.conf" file. Its default value is "include/config/auto.conf".
|
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
|
menuconfig
|
||||||
----------
|
==========
|
||||||
|
|
||||||
SEARCHING for CONFIG symbols
|
|
||||||
|
|
||||||
Searching in menuconfig:
|
Searching in menuconfig:
|
||||||
|
|
||||||
The Search function searches for kernel configuration symbol
|
The Search function searches for kernel configuration symbol
|
||||||
names, so you have to know something close to what you are
|
names, so you have to know something close to what you are
|
||||||
looking for.
|
looking for.
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
|
|
||||||
/hotplug
|
/hotplug
|
||||||
This lists all config symbols that contain "hotplug",
|
This lists all config symbols that contain "hotplug",
|
||||||
e.g., HOTPLUG_CPU, MEMORY_HOTPLUG.
|
e.g., HOTPLUG_CPU, MEMORY_HOTPLUG.
|
||||||
|
|
||||||
For search help, enter / followed by TAB-TAB (to highlight
|
For search help, enter / followed by TAB-TAB (to highlight
|
||||||
<Help>) and Enter. This will tell you that you can also use
|
<Help>) and Enter. This will tell you that you can also use
|
||||||
regular expressions (regexes) in the search string, so if you
|
regular expressions (regexes) in the search string, so if you
|
||||||
are not interested in MEMORY_HOTPLUG, you could try::
|
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
|
- first, exact matches, sorted alphabetically (an exact match
|
||||||
is when the search matches the complete symbol name);
|
is when the search matches the complete symbol name);
|
||||||
- then, other matches, sorted alphabetically.
|
- then, other matches, sorted alphabetically.
|
||||||
|
|
||||||
For example: ^ATH.K matches:
|
For example, ^ATH.K matches:
|
||||||
|
|
||||||
ATH5K ATH9K ATH5K_AHB ATH5K_DEBUG [...] ATH6KL ATH6KL_DEBUG
|
ATH5K ATH9K ATH5K_AHB ATH5K_DEBUG [...] ATH6KL ATH6KL_DEBUG
|
||||||
[...] ATH9K_AHB ATH9K_BTCOEX_SUPPORT ATH9K_COMMON [...]
|
[...] ATH9K_AHB ATH9K_BTCOEX_SUPPORT ATH9K_COMMON [...]
|
||||||
|
|
||||||
of which only ATH5K and ATH9K match exactly and so are sorted
|
of which only ATH5K and ATH9K match exactly and so are sorted
|
||||||
first (and in alphabetical order), then come all other symbols,
|
first (and in alphabetical order), then come all other symbols,
|
||||||
sorted in alphabetical order.
|
sorted in alphabetical order.
|
||||||
|
|
||||||
In this menu, pressing the key in the (#) prefix will jump
|
In this menu, pressing the key in the (#) prefix will jump
|
||||||
directly to that location. You will be returned to the current
|
directly to that location. You will be returned to the current
|
||||||
search results after exiting this new menu.
|
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
|
make MENUCONFIG_COLOR=<theme> menuconfig
|
||||||
----------------
|
|
||||||
It is possible to select different color themes using the variable
|
|
||||||
MENUCONFIG_COLOR. To select a theme use::
|
|
||||||
|
|
||||||
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
|
``MENUCONFIG_MODE``
|
||||||
- blackbg => selects a color scheme with black background
|
This mode shows all sub-menus in one large tree.
|
||||||
- classic => theme with blue background. The classic look
|
|
||||||
- bluetitle => a LCD friendly version of classic. (default)
|
|
||||||
|
|
||||||
MENUCONFIG_MODE
|
Example::
|
||||||
---------------
|
|
||||||
This mode shows all sub-menus in one large tree.
|
|
||||||
|
|
||||||
Example::
|
make MENUCONFIG_MODE=single_menu menuconfig
|
||||||
|
|
||||||
make MENUCONFIG_MODE=single_menu menuconfig
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
|
|
||||||
nconfig
|
nconfig
|
||||||
-------
|
=======
|
||||||
|
|
||||||
nconfig is an alternate text-based configurator. It lists function
|
nconfig is an alternate text-based configurator. It lists function
|
||||||
keys across the bottom of the terminal (window) that execute commands.
|
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:
|
Searching in nconfig:
|
||||||
|
|
||||||
You can search either in the menu entry "prompt" strings
|
You can search either in the menu entry "prompt" strings
|
||||||
or in the configuration symbols.
|
or in the configuration symbols.
|
||||||
|
|
||||||
Use / to begin a search through the menu entries. This does
|
Use / to begin a search through the menu entries. This does
|
||||||
not support regular expressions. Use <Down> or <Up> for
|
not support regular expressions. Use <Down> or <Up> for
|
||||||
Next hit and Previous hit, respectively. Use <Esc> to
|
Next hit and Previous hit, respectively. Use <Esc> to
|
||||||
terminate the search mode.
|
terminate the search mode.
|
||||||
|
|
||||||
F8 (SymSearch) searches the configuration symbols for the
|
F8 (SymSearch) searches the configuration symbols for the
|
||||||
given string or regular expression (regex).
|
given string or regular expression (regex).
|
||||||
|
|
||||||
In the SymSearch, pressing the key in the (#) prefix will
|
In the SymSearch, pressing the key in the (#) prefix will
|
||||||
jump directly to that location. You will be returned to the
|
jump directly to that location. You will be returned to the
|
||||||
current search results after exiting this new menu.
|
current search results after exiting this new menu.
|
||||||
|
|
||||||
NCONFIG_MODE
|
Environment variables:
|
||||||
------------
|
|
||||||
This mode shows all sub-menus in one large tree.
|
|
||||||
|
|
||||||
Example::
|
``NCONFIG_MODE``
|
||||||
|
This mode shows all sub-menus in one large tree.
|
||||||
|
|
||||||
make NCONFIG_MODE=single_menu nconfig
|
Example::
|
||||||
|
|
||||||
|
make NCONFIG_MODE=single_menu nconfig
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
|
|
||||||
xconfig
|
xconfig
|
||||||
-------
|
=======
|
||||||
|
|
||||||
Searching in xconfig:
|
Searching in xconfig:
|
||||||
|
|
||||||
The Search function searches for kernel configuration symbol
|
The Search function searches for kernel configuration symbol
|
||||||
names, so you have to know something close to what you are
|
names, so you have to know something close to what you are
|
||||||
looking for.
|
looking for.
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
|
|
||||||
Ctrl-F hotplug
|
Ctrl-F hotplug
|
||||||
|
|
||||||
or::
|
or::
|
||||||
|
|
||||||
Menu: File, Search, hotplug
|
Menu: File, Search, hotplug
|
||||||
|
|
||||||
lists all config symbol entries that contain "hotplug" in
|
lists all config symbol entries that contain "hotplug" in
|
||||||
the symbol name. In this Search dialog, you may change the
|
the symbol name. In this Search dialog, you may change the
|
||||||
config setting for any of the entries that are not grayed out.
|
config setting for any of the entries that are not grayed out.
|
||||||
You can also enter a different search string without having
|
You can also enter a different search string without having
|
||||||
to return to the main menu.
|
to return to the main menu.
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
|
||||||
|
|
||||||
gconfig
|
gconfig
|
||||||
-------
|
=======
|
||||||
|
|
||||||
Searching in gconfig:
|
Searching in gconfig:
|
||||||
|
|
||||||
There is no search command in gconfig. However, gconfig does
|
There is no search command in gconfig. However, gconfig does
|
||||||
have several different viewing choices, modes, and options.
|
have several different viewing choices, modes, and options.
|
||||||
|
49
Makefile
49
Makefile
@ -39,8 +39,8 @@ __all:
|
|||||||
# prepare rule.
|
# prepare rule.
|
||||||
|
|
||||||
this-makefile := $(lastword $(MAKEFILE_LIST))
|
this-makefile := $(lastword $(MAKEFILE_LIST))
|
||||||
export abs_srctree := $(realpath $(dir $(this-makefile)))
|
abs_srctree := $(realpath $(dir $(this-makefile)))
|
||||||
export abs_objtree := $(CURDIR)
|
abs_objtree := $(CURDIR)
|
||||||
|
|
||||||
ifneq ($(sub_make_done),1)
|
ifneq ($(sub_make_done),1)
|
||||||
|
|
||||||
@ -295,51 +295,51 @@ single-build :=
|
|||||||
|
|
||||||
ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
|
ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
|
||||||
ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
|
ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
|
||||||
need-config :=
|
need-config :=
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),)
|
ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),)
|
||||||
ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),)
|
ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),)
|
||||||
may-sync-config :=
|
may-sync-config :=
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
need-compiler := $(may-sync-config)
|
need-compiler := $(may-sync-config)
|
||||||
|
|
||||||
ifneq ($(KBUILD_EXTMOD),)
|
ifneq ($(KBUILD_EXTMOD),)
|
||||||
may-sync-config :=
|
may-sync-config :=
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(KBUILD_EXTMOD),)
|
ifeq ($(KBUILD_EXTMOD),)
|
||||||
ifneq ($(filter %config,$(MAKECMDGOALS)),)
|
ifneq ($(filter %config,$(MAKECMDGOALS)),)
|
||||||
config-build := 1
|
config-build := 1
|
||||||
ifneq ($(words $(MAKECMDGOALS)),1)
|
ifneq ($(words $(MAKECMDGOALS)),1)
|
||||||
mixed-build := 1
|
mixed-build := 1
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# We cannot build single targets and the others at the same time
|
# We cannot build single targets and the others at the same time
|
||||||
ifneq ($(filter $(single-targets), $(MAKECMDGOALS)),)
|
ifneq ($(filter $(single-targets), $(MAKECMDGOALS)),)
|
||||||
single-build := 1
|
single-build := 1
|
||||||
ifneq ($(filter-out $(single-targets), $(MAKECMDGOALS)),)
|
ifneq ($(filter-out $(single-targets), $(MAKECMDGOALS)),)
|
||||||
mixed-build := 1
|
mixed-build := 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# For "make -j clean all", "make -j mrproper defconfig all", etc.
|
# For "make -j clean all", "make -j mrproper defconfig all", etc.
|
||||||
ifneq ($(filter $(clean-targets),$(MAKECMDGOALS)),)
|
ifneq ($(filter $(clean-targets),$(MAKECMDGOALS)),)
|
||||||
ifneq ($(filter-out $(clean-targets),$(MAKECMDGOALS)),)
|
ifneq ($(filter-out $(clean-targets),$(MAKECMDGOALS)),)
|
||||||
mixed-build := 1
|
mixed-build := 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# install and modules_install need also be processed one by one
|
# install and modules_install need also be processed one by one
|
||||||
ifneq ($(filter install,$(MAKECMDGOALS)),)
|
ifneq ($(filter install,$(MAKECMDGOALS)),)
|
||||||
ifneq ($(filter modules_install,$(MAKECMDGOALS)),)
|
ifneq ($(filter modules_install,$(MAKECMDGOALS)),)
|
||||||
mixed-build := 1
|
mixed-build := 1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef mixed-build
|
ifdef mixed-build
|
||||||
@ -965,8 +965,15 @@ export CC_FLAGS_CFI
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(CONFIG_FUNCTION_ALIGNMENT),0)
|
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)
|
KBUILD_CFLAGS += -falign-functions=$(CONFIG_FUNCTION_ALIGNMENT)
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# arch Makefile may override CC so keep this after arch Makefile is included
|
# arch Makefile may override CC so keep this after arch Makefile is included
|
||||||
NOSTDINC_FLAGS += -nostdinc
|
NOSTDINC_FLAGS += -nostdinc
|
||||||
@ -1384,7 +1391,7 @@ ifneq ($(dtstree),)
|
|||||||
|
|
||||||
PHONY += dtbs dtbs_prepare dtbs_install dtbs_check
|
PHONY += dtbs dtbs_prepare dtbs_install dtbs_check
|
||||||
dtbs: dtbs_prepare
|
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
|
# include/config/kernel.release is actually needed when installing DTBs because
|
||||||
# INSTALL_DTBS_PATH contains $(KERNELRELEASE). However, we do not want to make
|
# INSTALL_DTBS_PATH contains $(KERNELRELEASE). However, we do not want to make
|
||||||
@ -1402,7 +1409,7 @@ endif
|
|||||||
dtbs_check: dtbs
|
dtbs_check: dtbs
|
||||||
|
|
||||||
dtbs_install:
|
dtbs_install:
|
||||||
$(Q)$(MAKE) $(dtbinst)=$(dtstree) dst=$(INSTALL_DTBS_PATH)
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.dtbinst obj=$(dtstree)
|
||||||
|
|
||||||
ifdef CONFIG_OF_EARLY_FLATTREE
|
ifdef CONFIG_OF_EARLY_FLATTREE
|
||||||
all: dtbs
|
all: dtbs
|
||||||
@ -1923,7 +1930,7 @@ clean: $(clean-dirs)
|
|||||||
-o -name '*.ko.*' \
|
-o -name '*.ko.*' \
|
||||||
-o -name '*.dtb' -o -name '*.dtbo' \
|
-o -name '*.dtb' -o -name '*.dtbo' \
|
||||||
-o -name '*.dtb.S' -o -name '*.dtbo.S' \
|
-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 '*.dwo' -o -name '*.lst' \
|
||||||
-o -name '*.su' -o -name '*.mod' \
|
-o -name '*.su' -o -name '*.mod' \
|
||||||
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
||||||
|
12
arch/Kconfig
12
arch/Kconfig
@ -1597,4 +1597,16 @@ config FUNCTION_ALIGNMENT
|
|||||||
default 4 if FUNCTION_ALIGNMENT_4B
|
default 4 if FUNCTION_ALIGNMENT_4B
|
||||||
default 0
|
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
|
endmenu
|
||||||
|
@ -339,6 +339,7 @@ config ALPHA_EV4
|
|||||||
bool
|
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
|
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_LYNX
|
||||||
|
default y if !ALPHA_EV5
|
||||||
|
|
||||||
config ALPHA_LCA
|
config ALPHA_LCA
|
||||||
bool
|
bool
|
||||||
@ -366,10 +367,6 @@ config ALPHA_EV5
|
|||||||
bool "EV5 CPU(s) (model 5/xxx)?" if ALPHA_LYNX
|
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
|
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
|
config ALPHA_CIA
|
||||||
bool
|
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
|
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.
|
Say Y if you have an AS 1000 5/xxx or an AS 1000A 5/xxx.
|
||||||
|
|
||||||
config ALPHA_GAMMA
|
config ALPHA_GAMMA
|
||||||
bool "EV5 CPU(s) (model 5/xxx)?"
|
bool "EV5 CPU(s) (model 5/xxx)?" if ALPHA_SABLE
|
||||||
depends on ALPHA_SABLE
|
depends on ALPHA_SABLE || ALPHA_LYNX
|
||||||
|
default ALPHA_LYNX
|
||||||
help
|
help
|
||||||
Say Y if you have an AS 2000 5/xxx or an AS 2100 5/xxx.
|
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
|
config ALPHA_T2
|
||||||
bool
|
bool
|
||||||
depends on ALPHA_SABLE || ALPHA_LYNX
|
depends on ALPHA_SABLE || ALPHA_LYNX
|
||||||
|
@ -7,11 +7,13 @@ config HEXAGON
|
|||||||
select ARCH_32BIT_OFF_T
|
select ARCH_32BIT_OFF_T
|
||||||
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
||||||
select ARCH_NO_PREEMPT
|
select ARCH_NO_PREEMPT
|
||||||
|
select ARCH_WANT_FRAME_POINTERS
|
||||||
select DMA_GLOBAL_POOL
|
select DMA_GLOBAL_POOL
|
||||||
select HAVE_PAGE_SIZE_4KB
|
select HAVE_PAGE_SIZE_4KB
|
||||||
select HAVE_PAGE_SIZE_16KB
|
select HAVE_PAGE_SIZE_16KB
|
||||||
select HAVE_PAGE_SIZE_64KB
|
select HAVE_PAGE_SIZE_64KB
|
||||||
select HAVE_PAGE_SIZE_256KB
|
select HAVE_PAGE_SIZE_256KB
|
||||||
|
select FRAME_POINTER
|
||||||
# Other pending projects/to-do items.
|
# Other pending projects/to-do items.
|
||||||
# select HAVE_REGS_AND_STACK_ACCESS_API
|
# select HAVE_REGS_AND_STACK_ACCESS_API
|
||||||
# select HAVE_HW_BREAKPOINT if PERF_EVENTS
|
# select HAVE_HW_BREAKPOINT if PERF_EVENTS
|
||||||
@ -23,6 +25,7 @@ config HEXAGON
|
|||||||
select HAVE_PERF_EVENTS
|
select HAVE_PERF_EVENTS
|
||||||
# GENERIC_ALLOCATOR is used by dma_alloc_coherent()
|
# GENERIC_ALLOCATOR is used by dma_alloc_coherent()
|
||||||
select GENERIC_ALLOCATOR
|
select GENERIC_ALLOCATOR
|
||||||
|
select GENERIC_IRQ_PROBE
|
||||||
select GENERIC_IRQ_SHOW
|
select GENERIC_IRQ_SHOW
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
@ -47,9 +50,6 @@ config HEXAGON_PHYS_OFFSET
|
|||||||
help
|
help
|
||||||
Platforms that don't load the kernel at zero set this.
|
Platforms that don't load the kernel at zero set this.
|
||||||
|
|
||||||
config FRAME_POINTER
|
|
||||||
def_bool y
|
|
||||||
|
|
||||||
config LOCKDEP_SUPPORT
|
config LOCKDEP_SUPPORT
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
@ -62,12 +62,6 @@ config MMU
|
|||||||
config GENERIC_CSUM
|
config GENERIC_CSUM
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
#
|
|
||||||
# Use the generic interrupt handling code in kernel/irq/:
|
|
||||||
#
|
|
||||||
config GENERIC_IRQ_PROBE
|
|
||||||
def_bool y
|
|
||||||
|
|
||||||
config GENERIC_HWEIGHT
|
config GENERIC_HWEIGHT
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
|
@ -238,9 +238,9 @@ config PARISC_HUGE_KERNEL
|
|||||||
def_bool y if !MODULES || UBSAN || FTRACE || COMPILE_TEST
|
def_bool y if !MODULES || UBSAN || FTRACE || COMPILE_TEST
|
||||||
|
|
||||||
config MLONGCALLS
|
config MLONGCALLS
|
||||||
def_bool y if PARISC_HUGE_KERNEL
|
|
||||||
bool "Enable the -mlong-calls compiler option for big kernels" if !PARISC_HUGE_KERNEL
|
bool "Enable the -mlong-calls compiler option for big kernels" if !PARISC_HUGE_KERNEL
|
||||||
depends on PA8X00
|
depends on PA8X00
|
||||||
|
default PARISC_HUGE_KERNEL
|
||||||
help
|
help
|
||||||
If you configure the kernel to include many drivers built-in instead
|
If you configure the kernel to include many drivers built-in instead
|
||||||
as modules, the kernel executable may become too big, so that the
|
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.
|
Enabling this option will probably slow down your kernel.
|
||||||
|
|
||||||
config 64BIT
|
config 64BIT
|
||||||
def_bool y if "$(ARCH)" = "parisc64"
|
|
||||||
bool "64-bit kernel" if "$(ARCH)" = "parisc"
|
bool "64-bit kernel" if "$(ARCH)" = "parisc"
|
||||||
depends on PA8X00
|
depends on PA8X00
|
||||||
|
default "$(ARCH)" = "parisc64"
|
||||||
help
|
help
|
||||||
Enable this if you want to support 64bit kernel on PA-RISC platform.
|
Enable this if you want to support 64bit kernel on PA-RISC platform.
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ config AS_HAS_ULEB128
|
|||||||
|
|
||||||
menuconfig RUNTIME_KERNEL_TESTING_MENU
|
menuconfig RUNTIME_KERNEL_TESTING_MENU
|
||||||
bool "arch/riscv/kernel runtime Testing"
|
bool "arch/riscv/kernel runtime Testing"
|
||||||
def_bool y
|
default y
|
||||||
help
|
help
|
||||||
Enable riscv kernel runtime testing.
|
Enable riscv kernel runtime testing.
|
||||||
|
|
||||||
|
@ -9,7 +9,9 @@ include $(srctree)/lib/vdso/Makefile
|
|||||||
# Sanitizer runtimes are unavailable and cannot be linked here.
|
# Sanitizer runtimes are unavailable and cannot be linked here.
|
||||||
KASAN_SANITIZE := n
|
KASAN_SANITIZE := n
|
||||||
KMSAN_SANITIZE_vclock_gettime.o := n
|
KMSAN_SANITIZE_vclock_gettime.o := n
|
||||||
|
KMSAN_SANITIZE_vdso32/vclock_gettime.o := n
|
||||||
KMSAN_SANITIZE_vgetcpu.o := n
|
KMSAN_SANITIZE_vgetcpu.o := n
|
||||||
|
KMSAN_SANITIZE_vdso32/vgetcpu.o := n
|
||||||
|
|
||||||
UBSAN_SANITIZE := n
|
UBSAN_SANITIZE := n
|
||||||
KCSAN_SANITIZE := n
|
KCSAN_SANITIZE := n
|
||||||
|
@ -118,8 +118,8 @@ config KVM_AMD
|
|||||||
will be called kvm-amd.
|
will be called kvm-amd.
|
||||||
|
|
||||||
config KVM_AMD_SEV
|
config KVM_AMD_SEV
|
||||||
def_bool y
|
|
||||||
bool "AMD Secure Encrypted Virtualization (SEV) support"
|
bool "AMD Secure Encrypted Virtualization (SEV) support"
|
||||||
|
default y
|
||||||
depends on KVM_AMD && X86_64
|
depends on KVM_AMD && X86_64
|
||||||
depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=y && CRYPTO_DEV_CCP_DD=m)
|
depends on CRYPTO_DEV_SP_PSP && !(KVM_AMD=y && CRYPTO_DEV_CCP_DD=m)
|
||||||
help
|
help
|
||||||
|
@ -4,7 +4,8 @@ ccflags-y += -I $(srctree)/arch/x86/kvm
|
|||||||
ccflags-$(CONFIG_KVM_WERROR) += -Werror
|
ccflags-$(CONFIG_KVM_WERROR) += -Werror
|
||||||
|
|
||||||
ifeq ($(CONFIG_FRAME_POINTER),y)
|
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
|
endif
|
||||||
|
|
||||||
include $(srctree)/virt/kvm/Makefile.kvm
|
include $(srctree)/virt/kvm/Makefile.kvm
|
||||||
|
@ -81,7 +81,6 @@ config XEN_PVH
|
|||||||
bool "Xen PVH guest support"
|
bool "Xen PVH guest support"
|
||||||
depends on XEN && XEN_PVHVM && ACPI
|
depends on XEN && XEN_PVHVM && ACPI
|
||||||
select PVH
|
select PVH
|
||||||
def_bool n
|
|
||||||
help
|
help
|
||||||
Support for running as a Xen PVH guest.
|
Support for running as a Xen PVH guest.
|
||||||
|
|
||||||
|
@ -460,7 +460,6 @@ config ACPI_BGRT
|
|||||||
|
|
||||||
config ACPI_REDUCED_HARDWARE_ONLY
|
config ACPI_REDUCED_HARDWARE_ONLY
|
||||||
bool "Hardware-reduced ACPI support only" if EXPERT
|
bool "Hardware-reduced ACPI support only" if EXPERT
|
||||||
def_bool n
|
|
||||||
help
|
help
|
||||||
This config item changes the way the ACPI code is built. When this
|
This config item changes the way the ACPI code is built. When this
|
||||||
option is selected, the kernel will use a specialized version of
|
option is selected, the kernel will use a specialized version of
|
||||||
|
@ -87,8 +87,8 @@ config INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON
|
|||||||
the default value.
|
the default value.
|
||||||
|
|
||||||
config INTEL_IOMMU_PERF_EVENTS
|
config INTEL_IOMMU_PERF_EVENTS
|
||||||
def_bool y
|
|
||||||
bool "Intel IOMMU performance events"
|
bool "Intel IOMMU performance events"
|
||||||
|
default y
|
||||||
depends on INTEL_IOMMU && PERF_EVENTS
|
depends on INTEL_IOMMU && PERF_EVENTS
|
||||||
help
|
help
|
||||||
Selecting this option will enable the performance monitoring
|
Selecting this option will enable the performance monitoring
|
||||||
|
@ -519,7 +519,6 @@ config DM_VERITY
|
|||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
config DM_VERITY_VERIFY_ROOTHASH_SIG
|
config DM_VERITY_VERIFY_ROOTHASH_SIG
|
||||||
def_bool n
|
|
||||||
bool "Verity data device root hash signature verification support"
|
bool "Verity data device root hash signature verification support"
|
||||||
depends on DM_VERITY
|
depends on DM_VERITY
|
||||||
select SYSTEM_DATA_VERIFICATION
|
select SYSTEM_DATA_VERIFICATION
|
||||||
|
@ -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
|
* 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
|
* 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 drops the alignment for cold functions. Worse, GCC can implicitly mark
|
||||||
* GCC can implicitly mark callees of cold functions as cold themselves, so
|
* callees of cold functions as cold themselves, so it's not sufficient to add
|
||||||
* it's not sufficient to add __function_aligned here as that will not ensure
|
* __function_aligned here as that will not ensure that callees are correctly
|
||||||
* that callees are correctly aligned.
|
* aligned.
|
||||||
*
|
*
|
||||||
* See:
|
* See:
|
||||||
*
|
*
|
||||||
* https://lore.kernel.org/lkml/Y77%2FqVgvaJidFpYt@FVFF77S0Q05N
|
* https://lore.kernel.org/lkml/Y77%2FqVgvaJidFpYt@FVFF77S0Q05N
|
||||||
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88345#c9
|
* 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__))
|
#define __cold __attribute__((__cold__))
|
||||||
#else
|
#else
|
||||||
#define __cold
|
#define __cold
|
||||||
|
@ -1499,7 +1499,7 @@ config MULTIUSER
|
|||||||
|
|
||||||
config SGETMASK_SYSCALL
|
config SGETMASK_SYSCALL
|
||||||
bool "sgetmask/ssetmask syscalls support" if EXPERT
|
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
|
help
|
||||||
sys_sgetmask and sys_ssetmask are obsolete system calls
|
sys_sgetmask and sys_ssetmask are obsolete system calls
|
||||||
no longer supported in libc but still enabled by default in some
|
no longer supported in libc but still enabled by default in some
|
||||||
|
@ -362,8 +362,7 @@ config MODPROBE_PATH
|
|||||||
userspace can still load modules explicitly).
|
userspace can still load modules explicitly).
|
||||||
|
|
||||||
config TRIM_UNUSED_KSYMS
|
config TRIM_UNUSED_KSYMS
|
||||||
bool "Trim unused exported kernel symbols" if EXPERT
|
bool "Trim unused exported kernel symbols"
|
||||||
depends on !COMPILE_TEST
|
|
||||||
help
|
help
|
||||||
The kernel and some modules make many symbols available for
|
The kernel and some modules make many symbols available for
|
||||||
other modules to use via EXPORT_SYMBOL() and variants. Depending
|
other modules to use via EXPORT_SYMBOL() and variants. Depending
|
||||||
|
@ -2127,7 +2127,7 @@ config KCOV_IRQ_AREA_SIZE
|
|||||||
|
|
||||||
menuconfig RUNTIME_TESTING_MENU
|
menuconfig RUNTIME_TESTING_MENU
|
||||||
bool "Runtime Testing"
|
bool "Runtime Testing"
|
||||||
def_bool y
|
default y
|
||||||
|
|
||||||
if RUNTIME_TESTING_MENU
|
if RUNTIME_TESTING_MENU
|
||||||
|
|
||||||
|
@ -583,7 +583,7 @@ config MEMORY_BALLOON
|
|||||||
# support for memory balloon compaction
|
# support for memory balloon compaction
|
||||||
config BALLOON_COMPACTION
|
config BALLOON_COMPACTION
|
||||||
bool "Allow for balloon memory compaction/migration"
|
bool "Allow for balloon memory compaction/migration"
|
||||||
def_bool y
|
default y
|
||||||
depends on COMPACTION && MEMORY_BALLOON
|
depends on COMPACTION && MEMORY_BALLOON
|
||||||
help
|
help
|
||||||
Memory fragmentation introduced by ballooning might reduce
|
Memory fragmentation introduced by ballooning might reduce
|
||||||
@ -598,7 +598,7 @@ config BALLOON_COMPACTION
|
|||||||
# support for memory compaction
|
# support for memory compaction
|
||||||
config COMPACTION
|
config COMPACTION
|
||||||
bool "Allow for memory compaction"
|
bool "Allow for memory compaction"
|
||||||
def_bool y
|
default y
|
||||||
select MIGRATION
|
select MIGRATION
|
||||||
depends on MMU
|
depends on MMU
|
||||||
help
|
help
|
||||||
@ -621,7 +621,6 @@ config COMPACT_UNEVICTABLE_DEFAULT
|
|||||||
# support for free page reporting
|
# support for free page reporting
|
||||||
config PAGE_REPORTING
|
config PAGE_REPORTING
|
||||||
bool "Free page reporting"
|
bool "Free page reporting"
|
||||||
def_bool n
|
|
||||||
help
|
help
|
||||||
Free page reporting allows for the incremental acquisition of
|
Free page reporting allows for the incremental acquisition of
|
||||||
free pages from the buddy allocator for the purpose of reporting
|
free pages from the buddy allocator for the purpose of reporting
|
||||||
@ -633,7 +632,7 @@ config PAGE_REPORTING
|
|||||||
#
|
#
|
||||||
config MIGRATION
|
config MIGRATION
|
||||||
bool "Page migration"
|
bool "Page migration"
|
||||||
def_bool y
|
default y
|
||||||
depends on (NUMA || ARCH_ENABLE_MEMORY_HOTREMOVE || COMPACTION || CMA) && MMU
|
depends on (NUMA || ARCH_ENABLE_MEMORY_HOTREMOVE || COMPACTION || CMA) && MMU
|
||||||
help
|
help
|
||||||
Allows the migration of the physical location of pages of processes
|
Allows the migration of the physical location of pages of processes
|
||||||
|
@ -13,7 +13,7 @@ config IP_DCCP_CCID2_DEBUG
|
|||||||
|
|
||||||
config IP_DCCP_CCID3
|
config IP_DCCP_CCID3
|
||||||
bool "CCID-3 (TCP-Friendly)"
|
bool "CCID-3 (TCP-Friendly)"
|
||||||
def_bool y if (IP_DCCP = y || IP_DCCP = m)
|
default IP_DCCP = y || IP_DCCP = m
|
||||||
help
|
help
|
||||||
CCID-3 denotes TCP-Friendly Rate Control (TFRC), an equation-based
|
CCID-3 denotes TCP-Friendly Rate Control (TFRC), an equation-based
|
||||||
rate-controlled congestion control mechanism. TFRC is designed to
|
rate-controlled congestion control mechanism. TFRC is designed to
|
||||||
|
@ -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:rust-logo-[0-9a-f]+\.svg:logo.svg:g' \
|
||||||
-e 's:favicon-[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:<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 \
|
$(Q)for f in $(rustdoc_output)/static.files/rustdoc-*.css; do \
|
||||||
echo ".logo-container > img { object-fit: contain; }" >> $$f; done
|
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:
|
rust-analyzer:
|
||||||
$(Q)$(srctree)/scripts/generate_rust_analyzer.py \
|
$(Q)$(srctree)/scripts/generate_rust_analyzer.py \
|
||||||
--cfgs='core=$(core-cfgs)' --cfgs='alloc=$(alloc-cfgs)' \
|
--cfgs='core=$(core-cfgs)' --cfgs='alloc=$(alloc-cfgs)' \
|
||||||
$(abs_srctree) $(abs_objtree) \
|
$(realpath $(srctree)) $(realpath $(objtree)) \
|
||||||
$(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \
|
$(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \
|
||||||
$(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json
|
$(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json
|
||||||
|
|
||||||
|
@ -113,12 +113,6 @@ endef
|
|||||||
# $(Q)$(MAKE) $(build)=dir
|
# $(Q)$(MAKE) $(build)=dir
|
||||||
build := -f $(srctree)/scripts/Makefile.build obj
|
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=
|
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=
|
||||||
# Usage:
|
# Usage:
|
||||||
|
@ -71,6 +71,7 @@ endif
|
|||||||
# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
|
# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
|
||||||
subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
|
subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
|
||||||
subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
|
subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
|
||||||
|
subdir-dtbslist := $(sort $(filter %/dtbs-list, $(dtb-y)))
|
||||||
|
|
||||||
targets-for-builtin := $(extra-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 := 'y': skip objtool checking for a file
|
||||||
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip 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))
|
$(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
|
# To build objects in subdirs, we need to descend into the directories
|
||||||
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
|
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
|
||||||
$(subdir-modorder): $(obj)/%/modules.order: $(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)
|
# 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)
|
$(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
|
# This is a list of build artifacts (module or dtb) from the current Makefile
|
||||||
# a subdirectory
|
# and its sub-directories. The timestamp should be updated when any of the
|
||||||
# Add $(obj-m) as the prerequisite to avoid updating the timestamp of
|
# member files.
|
||||||
# modules.order unless contained modules are updated.
|
|
||||||
|
|
||||||
cmd_modules_order = { $(foreach m, $(real-prereqs), \
|
cmd_gen_order = { $(foreach m, $(real-prereqs), \
|
||||||
$(if $(filter %/modules.order, $m), cat $m, echo $m);) :; } \
|
$(if $(filter %/$(notdir $@), $m), cat $m, echo $m);) :; } \
|
||||||
> $@
|
> $@
|
||||||
|
|
||||||
$(obj)/modules.order: $(obj-m) FORCE
|
$(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)
|
# Rule to compile a set of .o files into one .a file (with symbol table)
|
||||||
|
@ -8,32 +8,36 @@
|
|||||||
# $INSTALL_PATH/dtbs/$KERNELRELEASE
|
# $INSTALL_PATH/dtbs/$KERNELRELEASE
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
|
|
||||||
src := $(obj)
|
|
||||||
|
|
||||||
PHONY := __dtbs_install
|
PHONY := __dtbs_install
|
||||||
__dtbs_install:
|
__dtbs_install:
|
||||||
|
|
||||||
include include/config/auto.conf
|
include include/config/auto.conf
|
||||||
include $(srctree)/scripts/Kbuild.include
|
include $(srctree)/scripts/Kbuild.include
|
||||||
include $(kbuild-file)
|
|
||||||
|
|
||||||
dtbs := $(addprefix $(dst)/, $(dtb-y) $(if $(CONFIG_OF_ALL_DTBS),$(dtb-)))
|
dst := $(INSTALL_DTBS_PATH)
|
||||||
subdirs := $(addprefix $(obj)/, $(subdir-y) $(subdir-m))
|
|
||||||
|
|
||||||
__dtbs_install: $(dtbs) $(subdirs)
|
|
||||||
@:
|
|
||||||
|
|
||||||
quiet_cmd_dtb_install = INSTALL $@
|
quiet_cmd_dtb_install = INSTALL $@
|
||||||
cmd_dtb_install = install -D $< $@
|
cmd_dtb_install = install -D $< $@
|
||||||
|
|
||||||
$(dst)/%.dtb: $(obj)/%.dtb
|
$(dst)/%: $(obj)/%
|
||||||
$(call cmd,dtb_install)
|
$(call cmd,dtb_install)
|
||||||
|
|
||||||
$(dst)/%.dtbo: $(obj)/%.dtbo
|
dtbs := $(patsubst $(obj)/%,%,$(call read-file, $(obj)/dtbs-list))
|
||||||
$(call cmd,dtb_install)
|
|
||||||
|
|
||||||
PHONY += $(subdirs)
|
ifdef CONFIG_ARCH_WANT_FLAT_DTB_INSTALL
|
||||||
$(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)
|
.PHONY: $(PHONY)
|
||||||
|
@ -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 += -Wno-tautological-constant-out-of-range-compare
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
|
KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict)
|
KBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict)
|
||||||
|
KBUILD_CFLAGS += -Wno-enum-compare-conditional
|
||||||
|
KBUILD_CFLAGS += -Wno-enum-enum-conversion
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
@ -185,7 +187,6 @@ KBUILD_CFLAGS += -Wpointer-arith
|
|||||||
KBUILD_CFLAGS += -Wredundant-decls
|
KBUILD_CFLAGS += -Wredundant-decls
|
||||||
KBUILD_CFLAGS += -Wsign-compare
|
KBUILD_CFLAGS += -Wsign-compare
|
||||||
KBUILD_CFLAGS += -Wswitch-default
|
KBUILD_CFLAGS += -Wswitch-default
|
||||||
KBUILD_CFLAGS += $(call cc-option, -Wpacked-bitfield-compat)
|
|
||||||
|
|
||||||
KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3
|
KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3
|
||||||
|
|
||||||
|
@ -45,6 +45,11 @@ else
|
|||||||
obj-y := $(filter-out %/, $(obj-y))
|
obj-y := $(filter-out %/, $(obj-y))
|
||||||
endif
|
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
|
# Expand $(foo-objs) $(foo-y) etc. by replacing their individuals
|
||||||
suffix-search = $(strip $(foreach s, $3, $($(1:%$(strip $2)=%$s))))
|
suffix-search = $(strip $(foreach s, $3, $($(1:%$(strip $2)=%$s))))
|
||||||
# List composite targets that are constructed by combining other targets
|
# 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-y := $(addprefix $(obj)/,$(real-obj-y))
|
||||||
real-obj-m := $(addprefix $(obj)/,$(real-obj-m))
|
real-obj-m := $(addprefix $(obj)/,$(real-obj-m))
|
||||||
multi-obj-m := $(addprefix $(obj)/, $(multi-obj-m))
|
multi-obj-m := $(addprefix $(obj)/, $(multi-obj-m))
|
||||||
|
dtb-y := $(addprefix $(obj)/, $(dtb-y))
|
||||||
multi-dtb-y := $(addprefix $(obj)/, $(multi-dtb-y))
|
multi-dtb-y := $(addprefix $(obj)/, $(multi-dtb-y))
|
||||||
real-dtb-y := $(addprefix $(obj)/, $(real-dtb-y))
|
real-dtb-y := $(addprefix $(obj)/, $(real-dtb-y))
|
||||||
subdir-ym := $(addprefix $(obj)/,$(subdir-ym))
|
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)
|
ifeq ($(CONFIG_GCOV_KERNEL),y)
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_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))
|
$(CFLAGS_GCOV))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -159,32 +165,32 @@ endif
|
|||||||
ifeq ($(CONFIG_KASAN),y)
|
ifeq ($(CONFIG_KASAN),y)
|
||||||
ifneq ($(CONFIG_KASAN_HW_TAGS),y)
|
ifneq ($(CONFIG_KASAN_HW_TAGS),y)
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_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))
|
$(CFLAGS_KASAN), $(CFLAGS_KASAN_NOSANITIZE))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_KMSAN),y)
|
ifeq ($(CONFIG_KMSAN),y)
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_c_flags += $(if $(patsubst n%,, \
|
||||||
$(KMSAN_SANITIZE_$(basetarget).o)$(KMSAN_SANITIZE)y), \
|
$(KMSAN_SANITIZE_$(target-stem).o)$(KMSAN_SANITIZE)y), \
|
||||||
$(CFLAGS_KMSAN))
|
$(CFLAGS_KMSAN))
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_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)
|
, -mllvm -msan-disable-checks=1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_UBSAN),y)
|
ifeq ($(CONFIG_UBSAN),y)
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_c_flags += $(if $(patsubst n%,, \
|
||||||
$(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)y), \
|
$(UBSAN_SANITIZE_$(target-stem).o)$(UBSAN_SANITIZE)y), \
|
||||||
$(CFLAGS_UBSAN))
|
$(CFLAGS_UBSAN))
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_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))
|
$(CFLAGS_UBSAN_SIGNED_WRAP))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_KCOV),y)
|
ifeq ($(CONFIG_KCOV),y)
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_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))
|
$(CFLAGS_KCOV))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -194,12 +200,12 @@ endif
|
|||||||
#
|
#
|
||||||
ifeq ($(CONFIG_KCSAN),y)
|
ifeq ($(CONFIG_KCSAN),y)
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_c_flags += $(if $(patsubst n%,, \
|
||||||
$(KCSAN_SANITIZE_$(basetarget).o)$(KCSAN_SANITIZE)y), \
|
$(KCSAN_SANITIZE_$(target-stem).o)$(KCSAN_SANITIZE)y), \
|
||||||
$(CFLAGS_KCSAN))
|
$(CFLAGS_KCSAN))
|
||||||
# Some uninstrumented files provide implied barriers required to avoid false
|
# Some uninstrumented files provide implied barriers required to avoid false
|
||||||
# positives: set KCSAN_INSTRUMENT_BARRIERS for barrier instrumentation only.
|
# positives: set KCSAN_INSTRUMENT_BARRIERS for barrier instrumentation only.
|
||||||
_c_flags += $(if $(patsubst n%,, \
|
_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__)
|
-D__KCSAN_INSTRUMENT_BARRIERS__)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -364,7 +370,7 @@ DTC_FLAGS += -Wnode_name_chars_strict \
|
|||||||
-Wunique_unit_address
|
-Wunique_unit_address
|
||||||
endif
|
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
|
# Set -@ if the target is a base DTB that overlay is applied onto
|
||||||
DTC_FLAGS += $(if $(filter $(patsubst $(obj)/%,%,$@), $(base-dtb-y)), -@)
|
DTC_FLAGS += $(if $(filter $(patsubst $(obj)/%,%,$@), $(base-dtb-y)), -@)
|
||||||
|
@ -135,7 +135,7 @@ snap-pkg:
|
|||||||
mkdir $(objtree)/snap
|
mkdir $(objtree)/snap
|
||||||
$(MAKE) clean
|
$(MAKE) clean
|
||||||
sed "s@KERNELRELEASE@$(KERNELRELEASE)@; \
|
sed "s@KERNELRELEASE@$(KERNELRELEASE)@; \
|
||||||
s@SRCTREE@$(abs_srctree)@" \
|
s@SRCTREE@$(realpath $(srctree))@" \
|
||||||
$(srctree)/scripts/package/snapcraft.template > \
|
$(srctree)/scripts/package/snapcraft.template > \
|
||||||
$(objtree)/snap/snapcraft.yaml
|
$(objtree)/snap/snapcraft.yaml
|
||||||
cd $(objtree)/snap && \
|
cd $(objtree)/snap && \
|
||||||
|
11
scripts/kconfig/array_size.h
Normal file
11
scripts/kconfig/array_size.h
Normal file
@ -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 */
|
@ -14,6 +14,7 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
|
||||||
static void conf(struct menu *menu);
|
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)
|
static bool conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
{
|
{
|
||||||
struct symbol *sym, *csym;
|
struct symbol *sym, *csym;
|
||||||
int i, cnt;
|
int cnt;
|
||||||
/*
|
/*
|
||||||
* can't go as the default in switch-case below, otherwise gcc whines
|
* can't go as the default in switch-case below, otherwise gcc whines
|
||||||
* about -Wmaybe-uninitialized
|
* 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)
|
if (sym_has_value(sym) || sym->flags & SYMBOL_VALID)
|
||||||
continue;
|
continue;
|
||||||
switch (sym_get_type(sym)) {
|
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.
|
* and the rest to no.
|
||||||
*/
|
*/
|
||||||
if (mode != def_random) {
|
if (mode != def_random) {
|
||||||
for_all_symbols(i, csym) {
|
for_all_symbols(csym) {
|
||||||
if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
|
if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
|
||||||
sym_is_choice_value(csym))
|
sym_is_choice_value(csym))
|
||||||
csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
|
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))
|
if (sym_has_value(csym) || !sym_is_choice(csym))
|
||||||
continue;
|
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)
|
static void conf_rewrite_tristates(tristate old_val, tristate new_val)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
int i;
|
|
||||||
|
|
||||||
for_all_symbols(i, sym) {
|
for_all_symbols(sym) {
|
||||||
if (sym_get_type(sym) == S_TRISTATE &&
|
if (sym_get_type(sym) == S_TRISTATE &&
|
||||||
sym->def[S_DEF_USER].tri == old_val)
|
sym->def[S_DEF_USER].tri == old_val)
|
||||||
sym->def[S_DEF_USER].tri = new_val;
|
sym->def[S_DEF_USER].tri = new_val;
|
||||||
|
@ -18,8 +18,11 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
|
||||||
|
struct gstr autoconf_cmd;
|
||||||
|
|
||||||
/* return true if 'path' exists, false otherwise */
|
/* return true if 'path' exists, false otherwise */
|
||||||
static bool is_present(const char *path)
|
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;
|
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 */
|
/* like getline(), but the newline character is stripped away */
|
||||||
static ssize_t getline_stripped(char **lineptr, size_t *n, FILE *stream)
|
static ssize_t getline_stripped(char **lineptr, size_t *n, FILE *stream)
|
||||||
{
|
{
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
len = compat_getline(lineptr, n, stream);
|
len = getline(lineptr, n, stream);
|
||||||
|
|
||||||
if (len > 0 && (*lineptr)[len - 1] == '\n') {
|
if (len > 0 && (*lineptr)[len - 1] == '\n') {
|
||||||
len--;
|
len--;
|
||||||
@ -371,7 +323,7 @@ int conf_read_simple(const char *name, int def)
|
|||||||
size_t line_asize = 0;
|
size_t line_asize = 0;
|
||||||
char *p, *val;
|
char *p, *val;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
int i, def_flags;
|
int def_flags;
|
||||||
const char *warn_unknown, *sym_name;
|
const char *warn_unknown, *sym_name;
|
||||||
|
|
||||||
warn_unknown = getenv("KCONFIG_WARN_UNKNOWN_SYMBOLS");
|
warn_unknown = getenv("KCONFIG_WARN_UNKNOWN_SYMBOLS");
|
||||||
@ -429,7 +381,7 @@ int conf_read_simple(const char *name, int def)
|
|||||||
conf_warnings = 0;
|
conf_warnings = 0;
|
||||||
|
|
||||||
def_flags = SYMBOL_DEF << def;
|
def_flags = SYMBOL_DEF << def;
|
||||||
for_all_symbols(i, sym) {
|
for_all_symbols(sym) {
|
||||||
sym->flags |= SYMBOL_CHANGED;
|
sym->flags |= SYMBOL_CHANGED;
|
||||||
sym->flags &= ~(def_flags|SYMBOL_VALID);
|
sym->flags &= ~(def_flags|SYMBOL_VALID);
|
||||||
if (sym_is_choice(sym))
|
if (sym_is_choice(sym))
|
||||||
@ -538,7 +490,6 @@ int conf_read(const char *name)
|
|||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
int conf_unsaved = 0;
|
int conf_unsaved = 0;
|
||||||
int i;
|
|
||||||
|
|
||||||
conf_set_changed(false);
|
conf_set_changed(false);
|
||||||
|
|
||||||
@ -549,7 +500,7 @@ int conf_read(const char *name)
|
|||||||
|
|
||||||
sym_calc_value(modules_sym);
|
sym_calc_value(modules_sym);
|
||||||
|
|
||||||
for_all_symbols(i, sym) {
|
for_all_symbols(sym) {
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE))
|
if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE))
|
||||||
continue;
|
continue;
|
||||||
@ -573,7 +524,7 @@ int conf_read(const char *name)
|
|||||||
/* maybe print value in verbose mode... */
|
/* 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)) {
|
if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
|
||||||
/* Reset values of generates values, so they'll appear
|
/* Reset values of generates values, so they'll appear
|
||||||
* as new, if they should become visible, but that
|
* as new, if they should become visible, but that
|
||||||
@ -848,10 +799,7 @@ int conf_write_defconfig(const char *filename)
|
|||||||
while (menu != NULL)
|
while (menu != NULL)
|
||||||
{
|
{
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
if (sym == NULL) {
|
if (sym && !sym_is_choice(sym)) {
|
||||||
if (!menu_is_visible(menu))
|
|
||||||
goto next_menu;
|
|
||||||
} else if (!sym_is_choice(sym)) {
|
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
if (!(sym->flags & SYMBOL_WRITE))
|
if (!(sym->flags & SYMBOL_WRITE))
|
||||||
goto next_menu;
|
goto next_menu;
|
||||||
@ -911,7 +859,6 @@ int conf_write(const char *name)
|
|||||||
const char *str;
|
const char *str;
|
||||||
char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1];
|
char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1];
|
||||||
char *env;
|
char *env;
|
||||||
int i;
|
|
||||||
bool need_newline = false;
|
bool need_newline = false;
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
@ -995,7 +942,7 @@ int conf_write(const char *name)
|
|||||||
}
|
}
|
||||||
fclose(out);
|
fclose(out);
|
||||||
|
|
||||||
for_all_symbols(i, sym)
|
for_all_symbols(sym)
|
||||||
sym->flags &= ~SYMBOL_WRITTEN;
|
sym->flags &= ~SYMBOL_WRITTEN;
|
||||||
|
|
||||||
if (*tmpname) {
|
if (*tmpname) {
|
||||||
@ -1023,7 +970,6 @@ int conf_write(const char *name)
|
|||||||
static int conf_write_autoconf_cmd(const char *autoconf_name)
|
static int conf_write_autoconf_cmd(const char *autoconf_name)
|
||||||
{
|
{
|
||||||
char name[PATH_MAX], tmp[PATH_MAX];
|
char name[PATH_MAX], tmp[PATH_MAX];
|
||||||
struct file *file;
|
|
||||||
FILE *out;
|
FILE *out;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -1044,15 +990,9 @@ static int conf_write_autoconf_cmd(const char *autoconf_name)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(out, "deps_config := \\\n");
|
fprintf(out, "autoconfig := %s\n", autoconf_name);
|
||||||
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);
|
fputs(str_get(&autoconf_cmd), out);
|
||||||
|
|
||||||
env_write_dep(out, autoconf_name);
|
|
||||||
|
|
||||||
fprintf(out, "\n$(deps_config): ;\n");
|
|
||||||
|
|
||||||
fflush(out);
|
fflush(out);
|
||||||
ret = ferror(out); /* error check for all fprintf() calls */
|
ret = ferror(out); /* error check for all fprintf() calls */
|
||||||
@ -1072,7 +1012,7 @@ static int conf_touch_deps(void)
|
|||||||
{
|
{
|
||||||
const char *name, *tmp;
|
const char *name, *tmp;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
int res, i;
|
int res;
|
||||||
|
|
||||||
name = conf_get_autoconfig_name();
|
name = conf_get_autoconfig_name();
|
||||||
tmp = strrchr(name, '/');
|
tmp = strrchr(name, '/');
|
||||||
@ -1086,7 +1026,7 @@ static int conf_touch_deps(void)
|
|||||||
conf_read_simple(name, S_DEF_AUTO);
|
conf_read_simple(name, S_DEF_AUTO);
|
||||||
sym_calc_value(modules_sym);
|
sym_calc_value(modules_sym);
|
||||||
|
|
||||||
for_all_symbols(i, sym) {
|
for_all_symbols(sym) {
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name)
|
if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name)
|
||||||
continue;
|
continue;
|
||||||
@ -1152,7 +1092,7 @@ static int __conf_write_autoconf(const char *filename,
|
|||||||
char tmp[PATH_MAX];
|
char tmp[PATH_MAX];
|
||||||
FILE *file;
|
FILE *file;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
int ret, i;
|
int ret;
|
||||||
|
|
||||||
if (make_parent_dir(filename))
|
if (make_parent_dir(filename))
|
||||||
return -1;
|
return -1;
|
||||||
@ -1169,7 +1109,7 @@ static int __conf_write_autoconf(const char *filename,
|
|||||||
|
|
||||||
conf_write_heading(file, comment_style);
|
conf_write_heading(file, comment_style);
|
||||||
|
|
||||||
for_all_symbols(i, sym)
|
for_all_symbols(sym)
|
||||||
if ((sym->flags & SYMBOL_WRITE) && sym->name)
|
if ((sym->flags & SYMBOL_WRITE) && sym->name)
|
||||||
print_symbol(file, sym);
|
print_symbol(file, sym);
|
||||||
|
|
||||||
@ -1192,7 +1132,7 @@ int conf_write_autoconf(int overwrite)
|
|||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
const char *autoconf_name = conf_get_autoconfig_name();
|
const char *autoconf_name = conf_get_autoconfig_name();
|
||||||
int ret, i;
|
int ret;
|
||||||
|
|
||||||
if (!overwrite && is_present(autoconf_name))
|
if (!overwrite && is_present(autoconf_name))
|
||||||
return 0;
|
return 0;
|
||||||
@ -1204,7 +1144,7 @@ int conf_write_autoconf(int overwrite)
|
|||||||
if (conf_touch_deps())
|
if (conf_touch_deps())
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
for_all_symbols(i, sym)
|
for_all_symbols(sym)
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
|
|
||||||
ret = __conf_write_autoconf(conf_get_autoheader_name(),
|
ret = __conf_write_autoconf(conf_get_autoheader_name(),
|
||||||
|
@ -12,17 +12,12 @@ extern "C" {
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "list.h"
|
#include "list_types.h"
|
||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct file {
|
#include "list_types.h"
|
||||||
struct file *next;
|
|
||||||
struct file *parent;
|
|
||||||
const char *name;
|
|
||||||
int lineno;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef enum tristate {
|
typedef enum tristate {
|
||||||
no, mod, yes
|
no, mod, yes
|
||||||
@ -81,8 +76,8 @@ enum {
|
|||||||
* SYMBOL_CHOICE bit set in 'flags'.
|
* SYMBOL_CHOICE bit set in 'flags'.
|
||||||
*/
|
*/
|
||||||
struct symbol {
|
struct symbol {
|
||||||
/* The next symbol in the same bucket in the symbol hash table */
|
/* link node for the hash table */
|
||||||
struct symbol *next;
|
struct hlist_node node;
|
||||||
|
|
||||||
/* The name of the symbol, e.g. "FOO" for 'config FOO' */
|
/* The name of the symbol, e.g. "FOO" for 'config FOO' */
|
||||||
char *name;
|
char *name;
|
||||||
@ -113,6 +108,9 @@ struct symbol {
|
|||||||
*/
|
*/
|
||||||
tristate visible;
|
tristate visible;
|
||||||
|
|
||||||
|
/* config entries associated with this symbol */
|
||||||
|
struct list_head menus;
|
||||||
|
|
||||||
/* SYMBOL_* flags */
|
/* SYMBOL_* flags */
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
@ -131,8 +129,6 @@ struct symbol {
|
|||||||
struct expr_value implied;
|
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_CONST 0x0001 /* symbol is const */
|
||||||
#define SYMBOL_CHECK 0x0008 /* used during dependency checking */
|
#define SYMBOL_CHECK 0x0008 /* used during dependency checking */
|
||||||
#define SYMBOL_CHOICE 0x0010 /* start of a choice block (null name) */
|
#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_NEED_SET_CHOICE_VALUES 0x100000
|
||||||
|
|
||||||
#define SYMBOL_MAXLENGTH 256
|
#define SYMBOL_MAXLENGTH 256
|
||||||
#define SYMBOL_HASHSIZE 9973
|
|
||||||
|
|
||||||
/* A property represent the config options that can be associated
|
/* A property represent the config options that can be associated
|
||||||
* with a config "symbol".
|
* with a config "symbol".
|
||||||
@ -195,7 +190,7 @@ struct property {
|
|||||||
struct menu *menu; /* the menu the property are associated with
|
struct menu *menu; /* the menu the property are associated with
|
||||||
* valid for: P_SELECT, P_RANGE, P_CHOICE,
|
* valid for: P_SELECT, P_RANGE, P_CHOICE,
|
||||||
* P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */
|
* 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 */
|
int lineno; /* what lineno was this property defined */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -230,6 +225,8 @@ struct menu {
|
|||||||
*/
|
*/
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
|
|
||||||
|
struct list_head link; /* link to symbol::menus */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The prompt associated with the node. This holds the prompt for a
|
* 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
|
* symbol as well as the text for a menu or comment, along with the
|
||||||
@ -256,7 +253,7 @@ struct menu {
|
|||||||
char *help;
|
char *help;
|
||||||
|
|
||||||
/* The location where the menu node appears in the Kconfig files */
|
/* The location where the menu node appears in the Kconfig files */
|
||||||
struct file *file;
|
const char *filename;
|
||||||
int lineno;
|
int lineno;
|
||||||
|
|
||||||
/* For use by front ends that need to store auxiliary data */
|
/* For use by front ends that need to store auxiliary data */
|
||||||
@ -277,10 +274,6 @@ struct jump_key {
|
|||||||
struct menu *target;
|
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 symbol_yes, symbol_no, symbol_mod;
|
||||||
extern struct symbol *modules_sym;
|
extern struct symbol *modules_sym;
|
||||||
extern int cdebug;
|
extern int cdebug;
|
||||||
|
48
scripts/kconfig/hashtable.h
Normal file
48
scripts/kconfig/hashtable.h
Normal file
@ -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 */
|
@ -2,8 +2,20 @@
|
|||||||
#ifndef INTERNAL_H
|
#ifndef INTERNAL_H
|
||||||
#define 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;
|
struct menu;
|
||||||
|
|
||||||
extern struct menu *current_menu, *current_entry;
|
extern struct menu *current_menu, *current_entry;
|
||||||
|
|
||||||
|
extern const char *cur_filename;
|
||||||
|
extern int cur_lineno;
|
||||||
|
|
||||||
#endif /* INTERNAL_H */
|
#endif /* INTERNAL_H */
|
||||||
|
@ -14,16 +14,22 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
#include "preprocess.h"
|
||||||
|
|
||||||
#include "parser.tab.h"
|
#include "parser.tab.h"
|
||||||
|
|
||||||
#define YY_DECL static int yylex1(void)
|
#define YY_DECL static int yylex1(void)
|
||||||
|
|
||||||
#define START_STRSIZE 16
|
#define START_STRSIZE 16
|
||||||
|
|
||||||
static struct {
|
/* The Kconfig file currently being parsed. */
|
||||||
struct file *file;
|
const char *cur_filename;
|
||||||
int lineno;
|
|
||||||
} current_pos;
|
/*
|
||||||
|
* 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_prev_token = T_EOL;
|
||||||
static int prev_token = T_EOL;
|
static int prev_token = T_EOL;
|
||||||
@ -33,6 +39,9 @@ static int text_size, text_asize;
|
|||||||
struct buffer {
|
struct buffer {
|
||||||
struct buffer *parent;
|
struct buffer *parent;
|
||||||
YY_BUFFER_STATE state;
|
YY_BUFFER_STATE state;
|
||||||
|
int yylineno;
|
||||||
|
const char *filename;
|
||||||
|
int source_lineno;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct buffer *current_buf;
|
static struct buffer *current_buf;
|
||||||
@ -77,7 +86,7 @@ static void warn_ignored_character(char chr)
|
|||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s:%d:warning: ignoring unsupported character '%c'\n",
|
"%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 {
|
\n {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s:%d:warning: multi-line strings not supported\n",
|
"%s:%d:warning: multi-line strings not supported\n",
|
||||||
zconf_curname(), zconf_lineno());
|
cur_filename, cur_lineno);
|
||||||
unput('\n');
|
unput('\n');
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
yylval.string = text;
|
yylval.string = text;
|
||||||
@ -246,9 +255,9 @@ n [A-Za-z0-9_-]
|
|||||||
|
|
||||||
if (prev_token != T_EOL && prev_token != T_HELPTEXT)
|
if (prev_token != T_EOL && prev_token != T_HELPTEXT)
|
||||||
fprintf(stderr, "%s:%d:warning: no new line at end of file\n",
|
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();
|
zconf_endfile();
|
||||||
return T_EOL;
|
return T_EOL;
|
||||||
}
|
}
|
||||||
@ -267,19 +276,17 @@ repeat:
|
|||||||
token = yylex1();
|
token = yylex1();
|
||||||
|
|
||||||
if (prev_token == T_EOL || prev_token == T_HELPTEXT) {
|
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. */
|
/* Do not pass unneeded T_EOL to the parser. */
|
||||||
goto repeat;
|
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
|
* of each statement. Generally, \n is a statement
|
||||||
* terminator in Kconfig, but it is not always true
|
* terminator in Kconfig, but it is not always true
|
||||||
* because \n could be escaped by a backslash.
|
* because \n could be escaped by a backslash.
|
||||||
*/
|
*/
|
||||||
current_pos.file = current_file;
|
cur_lineno = yylineno;
|
||||||
current_pos.lineno = yylineno;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prev_prev_token == T_EOL && prev_token == T_WORD &&
|
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();
|
new_string();
|
||||||
append_string(in, n);
|
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') {
|
if (c == '\n') {
|
||||||
unput(c);
|
unput(c);
|
||||||
break;
|
break;
|
||||||
@ -391,78 +401,60 @@ void zconf_initscan(const char *name)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
current_buf = xmalloc(sizeof(*current_buf));
|
cur_filename = file_lookup(name);
|
||||||
memset(current_buf, 0, sizeof(*current_buf));
|
|
||||||
|
|
||||||
current_file = file_lookup(name);
|
|
||||||
yylineno = 1;
|
yylineno = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void zconf_nextfile(const char *name)
|
void zconf_nextfile(const char *name)
|
||||||
{
|
{
|
||||||
struct file *iter;
|
|
||||||
struct file *file = file_lookup(name);
|
|
||||||
struct buffer *buf = xmalloc(sizeof(*buf));
|
struct buffer *buf = xmalloc(sizeof(*buf));
|
||||||
memset(buf, 0, sizeof(*buf));
|
bool recur_include = false;
|
||||||
|
|
||||||
current_buf->state = YY_CURRENT_BUFFER;
|
buf->state = YY_CURRENT_BUFFER;
|
||||||
yyin = zconf_fopen(file->name);
|
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) {
|
if (!yyin) {
|
||||||
fprintf(stderr, "%s:%d: can't open file \"%s\"\n",
|
fprintf(stderr, "%s:%d: can't open file \"%s\"\n",
|
||||||
zconf_curname(), zconf_lineno(), file->name);
|
cur_filename, cur_lineno, name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
|
yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
|
||||||
buf->parent = current_buf;
|
|
||||||
current_buf = buf;
|
|
||||||
|
|
||||||
current_file->lineno = yylineno;
|
for (buf = current_buf; buf; buf = buf->parent) {
|
||||||
file->parent = current_file;
|
if (!strcmp(buf->filename, name))
|
||||||
|
recur_include = true;
|
||||||
|
}
|
||||||
|
|
||||||
for (iter = current_file; iter; iter = iter->parent) {
|
if (recur_include) {
|
||||||
if (!strcmp(iter->name, file->name)) {
|
fprintf(stderr,
|
||||||
fprintf(stderr,
|
"Recursive inclusion detected.\n"
|
||||||
"Recursive inclusion detected.\n"
|
"Inclusion path:\n"
|
||||||
"Inclusion path:\n"
|
" current file : %s\n", name);
|
||||||
" current file : %s\n", file->name);
|
|
||||||
iter = file;
|
for (buf = current_buf; buf; buf = buf->parent)
|
||||||
do {
|
fprintf(stderr, " included from: %s:%d\n",
|
||||||
iter = iter->parent;
|
buf->filename, buf->source_lineno);
|
||||||
fprintf(stderr, " included from: %s:%d\n",
|
exit(1);
|
||||||
iter->name, iter->lineno - 1);
|
|
||||||
} while (strcmp(iter->name, file->name));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
yylineno = 1;
|
yylineno = 1;
|
||||||
current_file = file;
|
cur_filename = file_lookup(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void zconf_endfile(void)
|
static void zconf_endfile(void)
|
||||||
{
|
{
|
||||||
struct buffer *parent;
|
struct buffer *tmp;
|
||||||
|
|
||||||
current_file = current_file->parent;
|
fclose(yyin);
|
||||||
if (current_file)
|
yy_delete_buffer(YY_CURRENT_BUFFER);
|
||||||
yylineno = current_file->lineno;
|
yy_switch_to_buffer(current_buf->state);
|
||||||
|
yylineno = current_buf->yylineno;
|
||||||
parent = current_buf->parent;
|
cur_filename = current_buf->filename;
|
||||||
if (parent) {
|
tmp = current_buf;
|
||||||
fclose(yyin);
|
current_buf = current_buf->parent;
|
||||||
yy_delete_buffer(YY_CURRENT_BUFFER);
|
free(tmp);
|
||||||
yy_switch_to_buffer(parent->state);
|
|
||||||
}
|
|
||||||
free(current_buf);
|
|
||||||
current_buf = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
int zconf_lineno(void)
|
|
||||||
{
|
|
||||||
return current_pos.lineno;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *zconf_curname(void)
|
|
||||||
{
|
|
||||||
return current_pos.file ? current_pos.file->name : "<none>";
|
|
||||||
}
|
}
|
||||||
|
@ -2,29 +2,39 @@
|
|||||||
#ifndef LIST_H
|
#ifndef LIST_H
|
||||||
#define LIST_H
|
#define LIST_H
|
||||||
|
|
||||||
/*
|
#include <stddef.h>
|
||||||
* Copied from include/linux/...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef offsetof
|
#include "list_types.h"
|
||||||
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
|
||||||
|
/* 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
|
* container_of - cast a member of a structure out to the containing structure
|
||||||
* @ptr: the pointer to the member.
|
* @ptr: the pointer to the member.
|
||||||
* @type: the type of the container struct this is embedded in.
|
* @type: the type of the container struct this is embedded in.
|
||||||
* @member: the name of the member within the struct.
|
* @member: the name of the member within the struct.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define container_of(ptr, type, member) ({ \
|
#define container_of(ptr, type, member) ({ \
|
||||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
void *__mptr = (void *)(ptr); \
|
||||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
_Static_assert(__same_type(*(ptr), ((type *)0)->member) || \
|
||||||
|
__same_type(*(ptr), void), \
|
||||||
|
"pointer type mismatch in container_of()"); \
|
||||||
|
((type *)(__mptr - offsetof(type, member))); })
|
||||||
|
|
||||||
|
#define LIST_POISON1 ((void *) 0x100)
|
||||||
|
#define LIST_POISON2 ((void *) 0x122)
|
||||||
|
|
||||||
struct list_head {
|
/*
|
||||||
struct list_head *next, *prev;
|
* 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) }
|
#define LIST_HEAD_INIT(name) { &(name), &(name) }
|
||||||
|
|
||||||
@ -32,45 +42,16 @@ struct list_head {
|
|||||||
struct list_head name = LIST_HEAD_INIT(name)
|
struct list_head name = LIST_HEAD_INIT(name)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* list_entry - get the struct for this entry
|
* INIT_LIST_HEAD - Initialize a list_head structure
|
||||||
* @ptr: the &struct list_head pointer.
|
* @list: list_head structure to be initialized.
|
||||||
* @type: the type of the struct this is embedded in.
|
*
|
||||||
* @member: the name of the list_head within the struct.
|
* Initializes the list_head to point to itself. If it is a list header,
|
||||||
|
* the result is an empty list.
|
||||||
*/
|
*/
|
||||||
#define list_entry(ptr, type, member) \
|
static inline void INIT_LIST_HEAD(struct list_head *list)
|
||||||
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.
|
|
||||||
*/
|
|
||||||
static inline int list_empty(const struct list_head *head)
|
|
||||||
{
|
{
|
||||||
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
|
* This is only for internal list manipulation where we know
|
||||||
* the prev/next entries already!
|
* 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 *prev,
|
||||||
struct list_head *next)
|
struct list_head *next)
|
||||||
{
|
{
|
||||||
next->prev = _new;
|
next->prev = new;
|
||||||
_new->next = next;
|
new->next = next;
|
||||||
_new->prev = prev;
|
new->prev = prev;
|
||||||
prev->next = _new;
|
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.
|
* Insert a new entry before the specified head.
|
||||||
* This is useful for implementing queues.
|
* 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;
|
prev->next = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LIST_POISON1 ((void *) 0x00100100)
|
static inline void __list_del_entry(struct list_head *entry)
|
||||||
#define LIST_POISON2 ((void *) 0x00200200)
|
{
|
||||||
|
__list_del(entry->prev, entry->next);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* list_del - deletes entry from list.
|
* list_del - deletes entry from list.
|
||||||
* @entry: the element to delete from the 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)
|
static inline void list_del(struct list_head *entry)
|
||||||
{
|
{
|
||||||
__list_del(entry->prev, entry->next);
|
__list_del_entry(entry);
|
||||||
entry->next = (struct list_head*)LIST_POISON1;
|
entry->next = LIST_POISON1;
|
||||||
entry->prev = (struct list_head*)LIST_POISON2;
|
entry->prev = LIST_POISON2;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
#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 */
|
||||||
|
17
scripts/kconfig/list_types.h
Normal file
17
scripts/kconfig/list_types.h
Normal file
@ -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 */
|
@ -36,10 +36,9 @@ void zconf_starthelp(void);
|
|||||||
FILE *zconf_fopen(const char *name);
|
FILE *zconf_fopen(const char *name);
|
||||||
void zconf_initscan(const char *name);
|
void zconf_initscan(const char *name);
|
||||||
void zconf_nextfile(const char *name);
|
void zconf_nextfile(const char *name);
|
||||||
int zconf_lineno(void);
|
|
||||||
const char *zconf_curname(void);
|
|
||||||
|
|
||||||
/* confdata.c */
|
/* confdata.c */
|
||||||
|
extern struct gstr autoconf_cmd;
|
||||||
const char *conf_get_configname(void);
|
const char *conf_get_configname(void);
|
||||||
void set_all_choice_values(struct symbol *csym);
|
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 */
|
/* 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 *xmalloc(size_t size);
|
||||||
void *xcalloc(size_t nmemb, size_t size);
|
void *xcalloc(size_t nmemb, size_t size);
|
||||||
void *xrealloc(void *p, size_t size);
|
void *xrealloc(void *p, size_t size);
|
||||||
|
@ -18,8 +18,6 @@ void conf_set_message_callback(void (*fn)(const char *s));
|
|||||||
bool conf_errors(void);
|
bool conf_errors(void);
|
||||||
|
|
||||||
/* symbol.c */
|
/* symbol.c */
|
||||||
extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
|
|
||||||
|
|
||||||
struct symbol * sym_lookup(const char *name, int flags);
|
struct symbol * sym_lookup(const char *name, int flags);
|
||||||
struct symbol * sym_find(const char *name);
|
struct symbol * sym_find(const char *name);
|
||||||
void print_symbol_for_listconfig(struct symbol *sym);
|
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);
|
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 */
|
/* expr.c */
|
||||||
void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken);
|
void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken);
|
||||||
|
|
||||||
|
@ -188,9 +188,8 @@ int dialog_checklist(const char *title, const char *prompt, int height,
|
|||||||
|
|
||||||
print_buttons(dialog, height, width, 0);
|
print_buttons(dialog, height, width, 0);
|
||||||
|
|
||||||
wnoutrefresh(dialog);
|
wmove(list, choice, check_x + 1);
|
||||||
wnoutrefresh(list);
|
wrefresh(list);
|
||||||
doupdate();
|
|
||||||
|
|
||||||
while (key != KEY_ESC) {
|
while (key != KEY_ESC) {
|
||||||
key = wgetch(dialog);
|
key = wgetch(dialog);
|
||||||
|
@ -91,10 +91,6 @@ struct dialog_info {
|
|||||||
struct dialog_color button_label_active;
|
struct dialog_color button_label_active;
|
||||||
struct dialog_color button_label_inactive;
|
struct dialog_color button_label_inactive;
|
||||||
struct dialog_color inputbox;
|
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 position_indicator;
|
||||||
struct dialog_color menubox;
|
struct dialog_color menubox;
|
||||||
struct dialog_color menubox_border;
|
struct dialog_color menubox_border;
|
||||||
|
@ -29,10 +29,6 @@ static void set_mono_theme(void)
|
|||||||
dlg.button_label_active.atr = A_REVERSE;
|
dlg.button_label_active.atr = A_REVERSE;
|
||||||
dlg.button_label_inactive.atr = A_NORMAL;
|
dlg.button_label_inactive.atr = A_NORMAL;
|
||||||
dlg.inputbox.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.position_indicator.atr = A_BOLD;
|
||||||
dlg.menubox.atr = A_NORMAL;
|
dlg.menubox.atr = A_NORMAL;
|
||||||
dlg.menubox_border.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_active, COLOR_YELLOW, COLOR_BLUE, true);
|
||||||
DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true);
|
DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true);
|
||||||
DLG_COLOR(inputbox, COLOR_BLACK, COLOR_WHITE, false);
|
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(position_indicator, COLOR_YELLOW, COLOR_WHITE, true);
|
||||||
DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false);
|
DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false);
|
||||||
DLG_COLOR(menubox_border, COLOR_WHITE, COLOR_WHITE, true);
|
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_active, COLOR_YELLOW, COLOR_RED, true);
|
||||||
DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_BLACK, false);
|
DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_BLACK, false);
|
||||||
DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_RED, 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, 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);
|
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(title, COLOR_BLUE, COLOR_WHITE, true);
|
||||||
DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_BLUE, true);
|
DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_BLUE, true);
|
||||||
DLG_COLOR(button_label_active, COLOR_WHITE, 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(position_indicator, COLOR_BLUE, COLOR_WHITE, true);
|
||||||
DLG_COLOR(tag, COLOR_BLUE, COLOR_WHITE, true);
|
DLG_COLOR(tag, COLOR_BLUE, COLOR_WHITE, true);
|
||||||
DLG_COLOR(tag_key, 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_active);
|
||||||
init_one_color(&dlg.button_label_inactive);
|
init_one_color(&dlg.button_label_inactive);
|
||||||
init_one_color(&dlg.inputbox);
|
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.position_indicator);
|
||||||
init_one_color(&dlg.menubox);
|
init_one_color(&dlg.menubox);
|
||||||
init_one_color(&dlg.menubox_border);
|
init_one_color(&dlg.menubox_border);
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "list.h"
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
#include "lxdialog/dialog.h"
|
#include "lxdialog/dialog.h"
|
||||||
#include "mnconf-common.h"
|
#include "mnconf-common.h"
|
||||||
|
@ -10,20 +10,18 @@
|
|||||||
|
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
#include "list.h"
|
||||||
|
|
||||||
static const char nohelp_text[] = "There is no help available for this option.";
|
static const char nohelp_text[] = "There is no help available for this option.";
|
||||||
|
|
||||||
struct menu rootmenu;
|
struct menu rootmenu;
|
||||||
static struct menu **last_entry_ptr;
|
static struct menu **last_entry_ptr;
|
||||||
|
|
||||||
struct file *file_list;
|
|
||||||
struct file *current_file;
|
|
||||||
|
|
||||||
void menu_warn(struct menu *menu, const char *fmt, ...)
|
void menu_warn(struct menu *menu, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
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);
|
vfprintf(stderr, fmt, ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -33,7 +31,7 @@ static void prop_warn(struct property *prop, const char *fmt, ...)
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
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);
|
vfprintf(stderr, fmt, ap);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -53,14 +51,16 @@ void menu_add_entry(struct symbol *sym)
|
|||||||
memset(menu, 0, sizeof(*menu));
|
memset(menu, 0, sizeof(*menu));
|
||||||
menu->sym = sym;
|
menu->sym = sym;
|
||||||
menu->parent = current_menu;
|
menu->parent = current_menu;
|
||||||
menu->file = current_file;
|
menu->filename = cur_filename;
|
||||||
menu->lineno = zconf_lineno();
|
menu->lineno = cur_lineno;
|
||||||
|
|
||||||
*last_entry_ptr = menu;
|
*last_entry_ptr = menu;
|
||||||
last_entry_ptr = &menu->next;
|
last_entry_ptr = &menu->next;
|
||||||
current_entry = menu;
|
current_entry = menu;
|
||||||
if (sym)
|
if (sym) {
|
||||||
menu_add_symbol(P_SYMBOL, sym, NULL);
|
menu_add_symbol(P_SYMBOL, sym, NULL);
|
||||||
|
list_add_tail(&menu->link, &sym->menus);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct menu *menu_add_menu(void)
|
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));
|
prop = xmalloc(sizeof(*prop));
|
||||||
memset(prop, 0, sizeof(*prop));
|
memset(prop, 0, sizeof(*prop));
|
||||||
prop->type = type;
|
prop->type = type;
|
||||||
prop->file = current_file;
|
prop->filename = cur_filename;
|
||||||
prop->lineno = zconf_lineno();
|
prop->lineno = cur_lineno;
|
||||||
prop->menu = current_entry;
|
prop->menu = current_entry;
|
||||||
prop->expr = expr;
|
prop->expr = expr;
|
||||||
prop->visible.expr = dep;
|
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
|
* Use the choice itself as the parent dependency of
|
||||||
@ -567,9 +561,6 @@ void menu_finalize(struct menu *parent)
|
|||||||
if (sym->type == S_UNKNOWN)
|
if (sym->type == S_UNKNOWN)
|
||||||
menu_warn(parent, "config symbol defined without type");
|
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 */
|
/* Check properties connected to this symbol */
|
||||||
sym_check_prop(sym);
|
sym_check_prop(sym);
|
||||||
sym->flags |= SYMBOL_WARNED;
|
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)
|
static void get_def_str(struct gstr *r, struct menu *menu)
|
||||||
{
|
{
|
||||||
str_printf(r, "Defined at %s:%d\n",
|
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)
|
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 list_head *head)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
struct menu *menu;
|
||||||
|
|
||||||
if (sym && sym->name) {
|
if (sym && sym->name) {
|
||||||
str_printf(r, "Symbol: %s [=%s]\n", 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 */
|
/* Print the definitions with prompts before the ones without */
|
||||||
for_all_properties(sym, prop, P_SYMBOL) {
|
list_for_each_entry(menu, &sym->menus, link) {
|
||||||
if (prop->menu->prompt) {
|
if (menu->prompt) {
|
||||||
get_def_str(r, prop->menu);
|
get_def_str(r, menu);
|
||||||
get_prompt_str(r, prop->menu->prompt, head);
|
get_prompt_str(r, menu->prompt, head);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for_all_properties(sym, prop, P_SYMBOL) {
|
list_for_each_entry(menu, &sym->menus, link) {
|
||||||
if (!prop->menu->prompt) {
|
if (!menu->prompt) {
|
||||||
get_def_str(r, prop->menu);
|
get_def_str(r, menu);
|
||||||
get_dep_str(r, prop->menu->dep, " Depends on: ");
|
get_dep_str(r, menu->dep, " Depends on: ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "list.h"
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
#include "mnconf-common.h"
|
#include "mnconf-common.h"
|
||||||
#include "nconf.h"
|
#include "nconf.h"
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
#include "preprocess.h"
|
||||||
|
|
||||||
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
#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,
|
static bool zconf_endtoken(const char *tokenname,
|
||||||
const char *expected_tokenname);
|
const char *expected_tokenname);
|
||||||
|
|
||||||
struct symbol *symbol_hash[SYMBOL_HASHSIZE];
|
|
||||||
|
|
||||||
struct menu *current_menu, *current_entry;
|
struct menu *current_menu, *current_entry;
|
||||||
|
|
||||||
%}
|
%}
|
||||||
@ -95,12 +94,12 @@ struct menu *current_menu, *current_entry;
|
|||||||
%type <expr> if_expr
|
%type <expr> if_expr
|
||||||
%type <string> end
|
%type <string> end
|
||||||
%type <menu> if_entry menu_entry choice_entry
|
%type <menu> if_entry menu_entry choice_entry
|
||||||
%type <string> word_opt assign_val
|
%type <string> assign_val
|
||||||
%type <flavor> assign_op
|
%type <flavor> assign_op
|
||||||
|
|
||||||
%destructor {
|
%destructor {
|
||||||
fprintf(stderr, "%s:%d: missing end statement for this entry\n",
|
fprintf(stderr, "%s:%d: missing end statement for this entry\n",
|
||||||
$$->file->name, $$->lineno);
|
$$->filename, $$->lineno);
|
||||||
if (current_menu == $$)
|
if (current_menu == $$)
|
||||||
menu_end_menu();
|
menu_end_menu();
|
||||||
} if_entry menu_entry choice_entry
|
} if_entry menu_entry choice_entry
|
||||||
@ -143,19 +142,19 @@ config_entry_start: T_CONFIG nonconst_symbol T_EOL
|
|||||||
{
|
{
|
||||||
$2->flags |= SYMBOL_OPTIONAL;
|
$2->flags |= SYMBOL_OPTIONAL;
|
||||||
menu_add_entry($2);
|
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
|
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
|
menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
|
||||||
{
|
{
|
||||||
$2->flags |= SYMBOL_OPTIONAL;
|
$2->flags |= SYMBOL_OPTIONAL;
|
||||||
menu_add_entry($2);
|
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
|
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;
|
current_entry->prompt->type = P_MENU;
|
||||||
else
|
else
|
||||||
zconfprint("warning: menuconfig statement without prompt");
|
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:
|
config_option_list:
|
||||||
@ -177,15 +176,13 @@ config_option_list:
|
|||||||
config_option: type prompt_stmt_opt T_EOL
|
config_option: type prompt_stmt_opt T_EOL
|
||||||
{
|
{
|
||||||
menu_set_type($1);
|
menu_set_type($1);
|
||||||
printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
|
printd(DEBUG_PARSE, "%s:%d:type(%u)\n", cur_filename, cur_lineno, $1);
|
||||||
zconf_curname(), zconf_lineno(),
|
|
||||||
$1);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
config_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL
|
config_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL
|
||||||
{
|
{
|
||||||
menu_add_prompt(P_PROMPT, $2, $3);
|
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
|
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);
|
menu_add_expr(P_DEFAULT, $2, $3);
|
||||||
if ($1 != S_UNKNOWN)
|
if ($1 != S_UNKNOWN)
|
||||||
menu_set_type($1);
|
menu_set_type($1);
|
||||||
printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
|
printd(DEBUG_PARSE, "%s:%d:default(%u)\n", cur_filename, cur_lineno,
|
||||||
zconf_curname(), zconf_lineno(),
|
|
||||||
$1);
|
$1);
|
||||||
};
|
};
|
||||||
|
|
||||||
config_option: T_SELECT nonconst_symbol if_expr T_EOL
|
config_option: T_SELECT nonconst_symbol if_expr T_EOL
|
||||||
{
|
{
|
||||||
menu_add_symbol(P_SELECT, $2, $3);
|
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
|
config_option: T_IMPLY nonconst_symbol if_expr T_EOL
|
||||||
{
|
{
|
||||||
menu_add_symbol(P_IMPLY, $2, $3);
|
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
|
config_option: T_RANGE symbol symbol if_expr T_EOL
|
||||||
{
|
{
|
||||||
menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
|
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
|
config_option: T_MODULES T_EOL
|
||||||
@ -226,18 +222,23 @@ config_option: T_MODULES T_EOL
|
|||||||
|
|
||||||
/* choice entry */
|
/* 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;
|
sym->flags |= SYMBOL_NO_WRITE;
|
||||||
menu_add_entry(sym);
|
menu_add_entry(sym);
|
||||||
menu_add_expr(P_CHOICE, NULL, NULL);
|
menu_add_expr(P_CHOICE, NULL, NULL);
|
||||||
free($2);
|
printd(DEBUG_PARSE, "%s:%d:choice\n", cur_filename, cur_lineno);
|
||||||
printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
|
|
||||||
};
|
};
|
||||||
|
|
||||||
choice_entry: choice choice_option_list
|
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();
|
$$ = menu_add_menu();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -245,7 +246,7 @@ choice_end: end
|
|||||||
{
|
{
|
||||||
if (zconf_endtoken($1, "choice")) {
|
if (zconf_endtoken($1, "choice")) {
|
||||||
menu_end_menu();
|
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
|
choice_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL
|
||||||
{
|
{
|
||||||
menu_add_prompt(P_PROMPT, $2, $3);
|
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
|
choice_option: logic_type prompt_stmt_opt T_EOL
|
||||||
{
|
{
|
||||||
menu_set_type($1);
|
menu_set_type($1);
|
||||||
printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
|
printd(DEBUG_PARSE, "%s:%d:type(%u)\n", cur_filename, cur_lineno, $1);
|
||||||
zconf_curname(), zconf_lineno(), $1);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
choice_option: T_OPTIONAL T_EOL
|
choice_option: T_OPTIONAL T_EOL
|
||||||
{
|
{
|
||||||
current_entry->sym->flags |= SYMBOL_OPTIONAL;
|
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
|
choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
|
||||||
{
|
{
|
||||||
menu_add_symbol(P_DEFAULT, $2, $3);
|
menu_add_symbol(P_DEFAULT, $2, $3);
|
||||||
printd(DEBUG_PARSE, "%s:%d:default\n",
|
printd(DEBUG_PARSE, "%s:%d:default\n", cur_filename, cur_lineno);
|
||||||
zconf_curname(), zconf_lineno());
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type:
|
type:
|
||||||
@ -304,7 +303,7 @@ default:
|
|||||||
|
|
||||||
if_entry: T_IF expr T_EOL
|
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_entry(NULL);
|
||||||
menu_add_dep($2);
|
menu_add_dep($2);
|
||||||
$$ = menu_add_menu();
|
$$ = menu_add_menu();
|
||||||
@ -314,7 +313,7 @@ if_end: end
|
|||||||
{
|
{
|
||||||
if (zconf_endtoken($1, "if")) {
|
if (zconf_endtoken($1, "if")) {
|
||||||
menu_end_menu();
|
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_entry(NULL);
|
||||||
menu_add_prompt(P_MENU, $2, 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
|
menu_entry: menu menu_option_list
|
||||||
@ -342,7 +341,7 @@ menu_end: end
|
|||||||
{
|
{
|
||||||
if (zconf_endtoken($1, "menu")) {
|
if (zconf_endtoken($1, "menu")) {
|
||||||
menu_end_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
|
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);
|
zconf_nextfile($2);
|
||||||
free($2);
|
free($2);
|
||||||
};
|
};
|
||||||
@ -368,7 +367,7 @@ comment: T_COMMENT T_WORD_QUOTE T_EOL
|
|||||||
{
|
{
|
||||||
menu_add_entry(NULL);
|
menu_add_entry(NULL);
|
||||||
menu_add_prompt(P_COMMENT, $2, 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
|
comment_stmt: comment comment_option_list
|
||||||
@ -383,7 +382,7 @@ comment_option_list:
|
|||||||
|
|
||||||
help_start: T_HELP T_EOL
|
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();
|
zconf_starthelp();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -408,7 +407,7 @@ help: help_start T_HELPTEXT
|
|||||||
depends: T_DEPENDS T_ON expr T_EOL
|
depends: T_DEPENDS T_ON expr T_EOL
|
||||||
{
|
{
|
||||||
menu_add_dep($3);
|
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 */
|
/* visibility option */
|
||||||
@ -455,9 +454,6 @@ symbol: nonconst_symbol
|
|||||||
| T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
|
| T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
word_opt: /* empty */ { $$ = NULL; }
|
|
||||||
| T_WORD
|
|
||||||
|
|
||||||
/* assignment statement */
|
/* assignment statement */
|
||||||
|
|
||||||
assignment_stmt: T_WORD assign_op assign_val T_EOL { variable_add($1, $3, $2); free($1); free($3); }
|
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)
|
void conf_parse(const char *name)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct menu *menu;
|
||||||
int i;
|
|
||||||
|
autoconf_cmd = str_new();
|
||||||
|
|
||||||
|
str_printf(&autoconf_cmd, "\ndeps_config := \\\n");
|
||||||
|
|
||||||
zconf_initscan(name);
|
zconf_initscan(name);
|
||||||
|
|
||||||
@ -488,13 +487,28 @@ void conf_parse(const char *name)
|
|||||||
yydebug = 1;
|
yydebug = 1;
|
||||||
yyparse();
|
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. */
|
/* Variables are expanded in the parse phase. We can free them here. */
|
||||||
variable_all_del();
|
variable_all_del();
|
||||||
|
|
||||||
if (yynerrs)
|
if (yynerrs)
|
||||||
exit(1);
|
exit(1);
|
||||||
if (!modules_sym)
|
if (!modules_sym)
|
||||||
modules_sym = sym_find( "n" );
|
modules_sym = &symbol_no;
|
||||||
|
|
||||||
if (!menu_has_prompt(&rootmenu)) {
|
if (!menu_has_prompt(&rootmenu)) {
|
||||||
current_entry = &rootmenu;
|
current_entry = &rootmenu;
|
||||||
@ -502,10 +516,23 @@ void conf_parse(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu_finalize(&rootmenu);
|
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++;
|
yynerrs++;
|
||||||
|
|
||||||
|
if (menu->list) {
|
||||||
|
menu = menu->list;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!menu->next && menu->parent)
|
||||||
|
menu = menu->parent;
|
||||||
|
|
||||||
|
menu = menu->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (yynerrs)
|
if (yynerrs)
|
||||||
exit(1);
|
exit(1);
|
||||||
conf_set_changed(true);
|
conf_set_changed(true);
|
||||||
@ -520,11 +547,11 @@ static bool zconf_endtoken(const char *tokenname,
|
|||||||
yynerrs++;
|
yynerrs++;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (current_menu->file != current_file) {
|
if (strcmp(current_menu->filename, cur_filename)) {
|
||||||
zconf_error("'%s' in different file than '%s'",
|
zconf_error("'%s' in different file than '%s'",
|
||||||
tokenname, expected_tokenname);
|
tokenname, expected_tokenname);
|
||||||
fprintf(stderr, "%s:%d: location of the '%s'\n",
|
fprintf(stderr, "%s:%d: location of the '%s'\n",
|
||||||
current_menu->file->name, current_menu->lineno,
|
current_menu->filename, current_menu->lineno,
|
||||||
expected_tokenname);
|
expected_tokenname);
|
||||||
yynerrs++;
|
yynerrs++;
|
||||||
return false;
|
return false;
|
||||||
@ -536,7 +563,7 @@ static void zconfprint(const char *err, ...)
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
|
fprintf(stderr, "%s:%d: ", cur_filename, cur_lineno);
|
||||||
va_start(ap, err);
|
va_start(ap, err);
|
||||||
vfprintf(stderr, err, ap);
|
vfprintf(stderr, err, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -548,7 +575,7 @@ static void zconf_error(const char *err, ...)
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
yynerrs++;
|
yynerrs++;
|
||||||
fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
|
fprintf(stderr, "%s:%d: ", cur_filename, cur_lineno);
|
||||||
va_start(ap, err);
|
va_start(ap, err);
|
||||||
vfprintf(stderr, err, ap);
|
vfprintf(stderr, err, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -557,7 +584,7 @@ static void zconf_error(const char *err, ...)
|
|||||||
|
|
||||||
static void yyerror(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)
|
static void print_quoted_string(FILE *out, const char *str)
|
||||||
|
@ -9,10 +9,11 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "array_size.h"
|
||||||
|
#include "internal.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
#include "preprocess.h"
|
||||||
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
|
|
||||||
|
|
||||||
static char *expand_string_with_args(const char *in, int argc, char *argv[]);
|
static char *expand_string_with_args(const char *in, int argc, char *argv[]);
|
||||||
static char *expand_string(const char *in);
|
static char *expand_string(const char *in);
|
||||||
@ -21,7 +22,7 @@ static void __attribute__((noreturn)) pperror(const char *format, ...)
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
fprintf(stderr, "%s:%d: ", current_file->name, yylineno);
|
fprintf(stderr, "%s:%d: ", cur_filename, yylineno);
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vfprintf(stderr, format, ap);
|
vfprintf(stderr, format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -87,14 +88,17 @@ static char *env_expand(const char *name)
|
|||||||
return xstrdup(value);
|
return xstrdup(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void env_write_dep(FILE *f, const char *autoconfig_name)
|
void env_write_dep(struct gstr *s)
|
||||||
{
|
{
|
||||||
struct env *e, *tmp;
|
struct env *e, *tmp;
|
||||||
|
|
||||||
list_for_each_entry_safe(e, tmp, &env_list, node) {
|
list_for_each_entry_safe(e, tmp, &env_list, node) {
|
||||||
fprintf(f, "ifneq \"$(%s)\" \"%s\"\n", e->name, e->value);
|
str_printf(s,
|
||||||
fprintf(f, "%s: FORCE\n", autoconfig_name);
|
"\n"
|
||||||
fprintf(f, "endif\n");
|
"ifneq \"$(%s)\" \"%s\"\n"
|
||||||
|
"$(autoconfig): FORCE\n"
|
||||||
|
"endif\n",
|
||||||
|
e->name, e->value);
|
||||||
env_del(e);
|
env_del(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -119,7 +123,7 @@ static char *do_error_if(int argc, char *argv[])
|
|||||||
|
|
||||||
static char *do_filename(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[])
|
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[])
|
static char *do_warning_if(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
if (!strcmp(argv[0], "y"))
|
if (!strcmp(argv[0], "y"))
|
||||||
fprintf(stderr, "%s:%d: %s\n",
|
fprintf(stderr, "%s:%d: %s\n", cur_filename, yylineno, argv[1]);
|
||||||
current_file->name, yylineno, argv[1]);
|
|
||||||
|
|
||||||
return xstrdup("");
|
return xstrdup("");
|
||||||
}
|
}
|
||||||
|
19
scripts/kconfig/preprocess.h
Normal file
19
scripts/kconfig/preprocess.h
Normal file
@ -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 */
|
@ -1058,7 +1058,7 @@ void ConfigInfoView::menuInfo(void)
|
|||||||
stream << "<br><br>";
|
stream << "<br><br>";
|
||||||
}
|
}
|
||||||
|
|
||||||
stream << "defined at " << _menu->file->name << ":"
|
stream << "defined at " << _menu->filename << ":"
|
||||||
<< _menu->lineno << "<br><br>";
|
<< _menu->lineno << "<br><br>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,23 +9,27 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
|
||||||
struct symbol symbol_yes = {
|
struct symbol symbol_yes = {
|
||||||
.name = "y",
|
.name = "y",
|
||||||
.curr = { "y", yes },
|
.curr = { "y", yes },
|
||||||
|
.menus = LIST_HEAD_INIT(symbol_yes.menus),
|
||||||
.flags = SYMBOL_CONST|SYMBOL_VALID,
|
.flags = SYMBOL_CONST|SYMBOL_VALID,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct symbol symbol_mod = {
|
struct symbol symbol_mod = {
|
||||||
.name = "m",
|
.name = "m",
|
||||||
.curr = { "m", mod },
|
.curr = { "m", mod },
|
||||||
|
.menus = LIST_HEAD_INIT(symbol_mod.menus),
|
||||||
.flags = SYMBOL_CONST|SYMBOL_VALID,
|
.flags = SYMBOL_CONST|SYMBOL_VALID,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct symbol symbol_no = {
|
struct symbol symbol_no = {
|
||||||
.name = "n",
|
.name = "n",
|
||||||
.curr = { "n", no },
|
.curr = { "n", no },
|
||||||
|
.menus = LIST_HEAD_INIT(symbol_no.menus),
|
||||||
.flags = SYMBOL_CONST|SYMBOL_VALID,
|
.flags = SYMBOL_CONST|SYMBOL_VALID,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -160,9 +164,8 @@ static void sym_set_changed(struct symbol *sym)
|
|||||||
static void sym_set_all_changed(void)
|
static void sym_set_all_changed(void)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
int i;
|
|
||||||
|
|
||||||
for_all_symbols(i, sym)
|
for_all_symbols(sym)
|
||||||
sym_set_changed(sym);
|
sym_set_changed(sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,9 +478,8 @@ void sym_calc_value(struct symbol *sym)
|
|||||||
void sym_clear_all_valid(void)
|
void sym_clear_all_valid(void)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
int i;
|
|
||||||
|
|
||||||
for_all_symbols(i, sym)
|
for_all_symbols(sym)
|
||||||
sym->flags &= ~SYMBOL_VALID;
|
sym->flags &= ~SYMBOL_VALID;
|
||||||
conf_set_changed(true);
|
conf_set_changed(true);
|
||||||
sym_calc_value(modules_sym);
|
sym_calc_value(modules_sym);
|
||||||
@ -803,14 +805,7 @@ bool sym_is_changeable(struct symbol *sym)
|
|||||||
return sym->visible > sym->rev_dep.tri;
|
return sym->visible > sym->rev_dep.tri;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned strhash(const char *s)
|
HASHTABLE_DEFINE(sym_hashtable, SYMBOL_HASHSIZE);
|
||||||
{
|
|
||||||
/* fnv32 hash */
|
|
||||||
unsigned hash = 2166136261U;
|
|
||||||
for (; *s; s++)
|
|
||||||
hash = (hash ^ *s) * 0x01000193;
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct symbol *sym_lookup(const char *name, int flags)
|
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;
|
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 &&
|
if (symbol->name &&
|
||||||
!strcmp(symbol->name, name) &&
|
!strcmp(symbol->name, name) &&
|
||||||
(flags ? symbol->flags & flags
|
(flags ? symbol->flags & flags
|
||||||
@ -846,9 +841,9 @@ struct symbol *sym_lookup(const char *name, int flags)
|
|||||||
symbol->name = new_name;
|
symbol->name = new_name;
|
||||||
symbol->type = S_UNKNOWN;
|
symbol->type = S_UNKNOWN;
|
||||||
symbol->flags = flags;
|
symbol->flags = flags;
|
||||||
|
INIT_LIST_HEAD(&symbol->menus);
|
||||||
|
|
||||||
symbol->next = symbol_hash[hash];
|
hash_add(sym_hashtable, &symbol->node, hash);
|
||||||
symbol_hash[hash] = symbol;
|
|
||||||
|
|
||||||
return symbol;
|
return symbol;
|
||||||
}
|
}
|
||||||
@ -868,9 +863,9 @@ struct symbol *sym_find(const char *name)
|
|||||||
case 'n': return &symbol_no;
|
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 &&
|
if (symbol->name &&
|
||||||
!strcmp(symbol->name, name) &&
|
!strcmp(symbol->name, name) &&
|
||||||
!(symbol->flags & SYMBOL_CONST))
|
!(symbol->flags & SYMBOL_CONST))
|
||||||
@ -930,7 +925,7 @@ struct symbol **sym_re_search(const char *pattern)
|
|||||||
if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE))
|
if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for_all_symbols(i, sym) {
|
for_all_symbols(sym) {
|
||||||
if (sym->flags & SYMBOL_CONST || !sym->name)
|
if (sym->flags & SYMBOL_CONST || !sym->name)
|
||||||
continue;
|
continue;
|
||||||
if (regexec(&re, sym->name, 1, match, 0))
|
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)
|
if (stack->sym == last_sym)
|
||||||
fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
|
fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
|
||||||
prop->file->name, prop->lineno);
|
prop->filename, prop->lineno);
|
||||||
|
|
||||||
if (sym_is_choice(sym)) {
|
if (sym_is_choice(sym)) {
|
||||||
fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
|
fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
|
||||||
menu->file->name, menu->lineno,
|
menu->filename, menu->lineno,
|
||||||
sym->name ? sym->name : "<choice>",
|
sym->name ? sym->name : "<choice>",
|
||||||
next_sym->name ? next_sym->name : "<choice>");
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
} else if (sym_is_choice_value(sym)) {
|
} else if (sym_is_choice_value(sym)) {
|
||||||
fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n",
|
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>",
|
sym->name ? sym->name : "<choice>",
|
||||||
next_sym->name ? next_sym->name : "<choice>");
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
} else if (stack->expr == &sym->dir_dep.expr) {
|
} else if (stack->expr == &sym->dir_dep.expr) {
|
||||||
fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n",
|
fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n",
|
||||||
prop->file->name, prop->lineno,
|
prop->filename, prop->lineno,
|
||||||
sym->name ? sym->name : "<choice>",
|
sym->name ? sym->name : "<choice>",
|
||||||
next_sym->name ? next_sym->name : "<choice>");
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
} else if (stack->expr == &sym->rev_dep.expr) {
|
} else if (stack->expr == &sym->rev_dep.expr) {
|
||||||
fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n",
|
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>",
|
sym->name ? sym->name : "<choice>",
|
||||||
next_sym->name ? next_sym->name : "<choice>");
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
} else if (stack->expr == &sym->implied.expr) {
|
} else if (stack->expr == &sym->implied.expr) {
|
||||||
fprintf(stderr, "%s:%d:\tsymbol %s is implied by %s\n",
|
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>",
|
sym->name ? sym->name : "<choice>",
|
||||||
next_sym->name ? next_sym->name : "<choice>");
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
} else if (stack->expr) {
|
} else if (stack->expr) {
|
||||||
fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
|
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>",
|
sym->name ? sym->name : "<choice>",
|
||||||
prop_get_type_name(prop->type),
|
prop_get_type_name(prop->type),
|
||||||
next_sym->name ? next_sym->name : "<choice>");
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "%s:%d:\tsymbol %s %s is visible depending on %s\n",
|
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>",
|
sym->name ? sym->name : "<choice>",
|
||||||
prop_get_type_name(prop->type),
|
prop_get_type_name(prop->type),
|
||||||
next_sym->name ? next_sym->name : "<choice>");
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
22
scripts/kconfig/tests/choice_randomize/Kconfig
Normal file
22
scripts/kconfig/tests/choice_randomize/Kconfig
Normal file
@ -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
|
34
scripts/kconfig/tests/choice_randomize/__init__.py
Normal file
34
scripts/kconfig/tests/choice_randomize/__init__.py
Normal file
@ -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
|
6
scripts/kconfig/tests/choice_randomize/expected_config0
Normal file
6
scripts/kconfig/tests/choice_randomize/expected_config0
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#
|
||||||
|
# Automatically generated file; DO NOT EDIT.
|
||||||
|
# Main menu
|
||||||
|
#
|
||||||
|
CONFIG_A=y
|
||||||
|
# CONFIG_B is not set
|
8
scripts/kconfig/tests/choice_randomize/expected_config1
Normal file
8
scripts/kconfig/tests/choice_randomize/expected_config1
Normal file
@ -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
|
8
scripts/kconfig/tests/choice_randomize/expected_config2
Normal file
8
scripts/kconfig/tests/choice_randomize/expected_config2
Normal file
@ -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
|
32
scripts/kconfig/tests/choice_randomize2/Kconfig
Normal file
32
scripts/kconfig/tests/choice_randomize2/Kconfig
Normal file
@ -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
|
18
scripts/kconfig/tests/choice_randomize2/__init__.py
Normal file
18
scripts/kconfig/tests/choice_randomize2/__init__.py
Normal file
@ -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'))
|
8
scripts/kconfig/tests/choice_randomize2/expected_config0
Normal file
8
scripts/kconfig/tests/choice_randomize2/expected_config0
Normal file
@ -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
|
7
scripts/kconfig/tests/choice_randomize2/expected_config1
Normal file
7
scripts/kconfig/tests/choice_randomize2/expected_config1
Normal file
@ -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
|
6
scripts/kconfig/tests/choice_randomize2/expected_config2
Normal file
6
scripts/kconfig/tests/choice_randomize2/expected_config2
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#
|
||||||
|
# Automatically generated file; DO NOT EDIT.
|
||||||
|
# Main menu
|
||||||
|
#
|
||||||
|
# CONFIG_A is not set
|
||||||
|
CONFIG_B=y
|
@ -154,12 +154,10 @@ class Conf:
|
|||||||
defconfig_path = os.path.join(self._test_dir, defconfig)
|
defconfig_path = os.path.join(self._test_dir, defconfig)
|
||||||
return self._run_conf('--defconfig={}'.format(defconfig_path))
|
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:
|
if all_config:
|
||||||
all_config_path = os.path.join(self._test_dir, all_config)
|
all_config_path = os.path.join(self._test_dir, all_config)
|
||||||
extra_env = {'KCONFIG_ALLCONFIG': all_config_path}
|
extra_env['KCONFIG_ALLCONFIG'] = all_config_path
|
||||||
else:
|
|
||||||
extra_env = {}
|
|
||||||
|
|
||||||
return self._run_conf('--{}config'.format(mode), extra_env=extra_env)
|
return self._run_conf('--{}config'.format(mode), extra_env=extra_env)
|
||||||
|
|
||||||
@ -195,13 +193,19 @@ class Conf:
|
|||||||
"""
|
"""
|
||||||
return self._allconfig('alldef', all_config)
|
return self._allconfig('alldef', all_config)
|
||||||
|
|
||||||
def randconfig(self, all_config=None):
|
def randconfig(self, all_config=None, seed=None):
|
||||||
"""Run randconfig.
|
"""Run randconfig.
|
||||||
|
|
||||||
all_config: fragment config file for KCONFIG_ALLCONFIG (optional)
|
all_config: fragment config file for KCONFIG_ALLCONFIG (optional)
|
||||||
|
seed: the seed for randconfig (optional)
|
||||||
returncode: exit status of the Kconfig executable
|
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):
|
def savedefconfig(self, dot_config):
|
||||||
"""Run savedefconfig.
|
"""Run savedefconfig.
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
Kconfig:11:error: recursive dependency detected!
|
Kconfig:5:error: recursive dependency detected!
|
||||||
Kconfig:11: symbol B is selected by B
|
Kconfig:5: symbol A depends on A
|
||||||
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
||||||
subsection "Kconfig recursive dependency limitations"
|
subsection "Kconfig recursive dependency limitations"
|
||||||
|
|
||||||
Kconfig:5:error: recursive dependency detected!
|
Kconfig:11:error: recursive dependency detected!
|
||||||
Kconfig:5: symbol A depends on A
|
Kconfig:11: symbol B is selected by B
|
||||||
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
||||||
subsection "Kconfig recursive dependency limitations"
|
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
|
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
||||||
subsection "Kconfig recursive dependency limitations"
|
subsection "Kconfig recursive dependency limitations"
|
||||||
|
|
||||||
Kconfig:32:error: recursive dependency detected!
|
Kconfig:27:error: recursive dependency detected!
|
||||||
Kconfig:32: symbol D2 is selected by D1
|
|
||||||
Kconfig:27: symbol D1 depends on D2
|
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
|
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
||||||
subsection "Kconfig recursive dependency limitations"
|
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
|
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
||||||
subsection "Kconfig recursive dependency limitations"
|
subsection "Kconfig recursive dependency limitations"
|
||||||
|
|
||||||
|
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:60:error: recursive dependency detected!
|
Kconfig:60:error: recursive dependency detected!
|
||||||
Kconfig:60: symbol G depends on G
|
Kconfig:60: symbol G depends on G
|
||||||
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
||||||
subsection "Kconfig recursive dependency limitations"
|
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
|
|
||||||
For a resolution refer to Documentation/kbuild/kconfig-language.rst
|
|
||||||
subsection "Kconfig recursive dependency limitations"
|
|
||||||
|
@ -7,25 +7,50 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "hashtable.h"
|
||||||
#include "lkc.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 */
|
/* 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;
|
struct file *file;
|
||||||
|
size_t len;
|
||||||
|
int hash = strhash(name);
|
||||||
|
|
||||||
for (file = file_list; file; file = file->next) {
|
hash_for_each_possible(file_hashtable, file, node, hash)
|
||||||
if (!strcmp(name, file->name)) {
|
if (!strcmp(name, file->name))
|
||||||
return file;
|
return file->name;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
file = xmalloc(sizeof(*file));
|
len = strlen(name);
|
||||||
|
file = xmalloc(sizeof(*file) + len + 1);
|
||||||
memset(file, 0, sizeof(*file));
|
memset(file, 0, sizeof(*file));
|
||||||
file->name = xstrdup(name);
|
memcpy(file->name, name, len);
|
||||||
file->next = file_list;
|
file->name[len] = '\0';
|
||||||
file_list = file;
|
|
||||||
return file;
|
hash_add(file_hashtable, &file->node, hash);
|
||||||
|
|
||||||
|
str_printf(&autoconf_cmd, "\t%s \\\n", name);
|
||||||
|
|
||||||
|
return file->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate initial growable string */
|
/* Allocate initial growable string */
|
||||||
|
@ -1050,7 +1050,9 @@ static void default_mismatch_handler(const char *modname, struct elf_info *elf,
|
|||||||
sec_mismatch_count++;
|
sec_mismatch_count++;
|
||||||
|
|
||||||
warn("%s: section mismatch in reference: %s+0x%x (section: %s) -> %s (section: %s)\n",
|
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 (mismatch->mismatch == EXTABLE_TO_NON_TEXT) {
|
||||||
if (match(tosec, mismatch->bad_tosec))
|
if (match(tosec, mismatch->bad_tosec))
|
||||||
|
@ -24,24 +24,10 @@ if_enabled_echo() {
|
|||||||
fi
|
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 () {
|
install_linux_image () {
|
||||||
pname=$1
|
pname=$1
|
||||||
pdir=debian/$1
|
pdir=debian/$1
|
||||||
|
|
||||||
rm -rf ${pdir}
|
|
||||||
|
|
||||||
# Only some architectures with OF support have this target
|
# Only some architectures with OF support have this target
|
||||||
if is_enabled CONFIG_OF_EARLY_FLATTREE && [ -d "${srctree}/arch/${SRCARCH}/boot/dts" ]; then
|
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
|
${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 () {
|
install_linux_image_dbg () {
|
||||||
pdir=debian/$1
|
pdir=debian/$1
|
||||||
|
|
||||||
rm -rf ${pdir}
|
|
||||||
|
|
||||||
# Parse modules.order directly because 'make modules_install' may sign,
|
# Parse modules.order directly because 'make modules_install' may sign,
|
||||||
# compress modules, and then run unneeded depmod.
|
# compress modules, and then run unneeded depmod.
|
||||||
while read -r mod; do
|
while read -r mod; do
|
||||||
@ -140,8 +124,6 @@ install_kernel_headers () {
|
|||||||
pdir=debian/$1
|
pdir=debian/$1
|
||||||
version=${1#linux-headers-}
|
version=${1#linux-headers-}
|
||||||
|
|
||||||
rm -rf $pdir
|
|
||||||
|
|
||||||
"${srctree}/scripts/package/install-extmod-build" "${pdir}/usr/src/linux-headers-${version}"
|
"${srctree}/scripts/package/install-extmod-build" "${pdir}/usr/src/linux-headers-${version}"
|
||||||
|
|
||||||
mkdir -p $pdir/lib/modules/$version/
|
mkdir -p $pdir/lib/modules/$version/
|
||||||
@ -151,8 +133,6 @@ install_kernel_headers () {
|
|||||||
install_libc_headers () {
|
install_libc_headers () {
|
||||||
pdir=debian/$1
|
pdir=debian/$1
|
||||||
|
|
||||||
rm -rf $pdir
|
|
||||||
|
|
||||||
$MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr
|
$MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH=$pdir/usr
|
||||||
|
|
||||||
# move asm headers to /usr/include/<libc-machine>/asm to match the structure
|
# 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}"
|
mv "$pdir/usr/include/asm" "$pdir/usr/include/${DEB_HOST_MULTIARCH}"
|
||||||
}
|
}
|
||||||
|
|
||||||
rm -f debian/files
|
package=$1
|
||||||
|
|
||||||
packages_enabled=$(dh_listpackages)
|
case "${package}" in
|
||||||
|
*-dbg)
|
||||||
for package in ${packages_enabled}
|
install_linux_image_dbg "${package}";;
|
||||||
do
|
linux-image-*|user-mode-linux-*)
|
||||||
case ${package} in
|
install_linux_image "${package}";;
|
||||||
*-dbg)
|
linux-libc-dev)
|
||||||
install_linux_image_dbg "${package}";;
|
install_libc_headers "${package}";;
|
||||||
linux-image-*|user-mode-linux-*)
|
linux-headers-*)
|
||||||
install_linux_image "${package}";;
|
install_kernel_headers "${package}";;
|
||||||
linux-libc-dev)
|
esac
|
||||||
install_libc_headers "${package}";;
|
|
||||||
linux-headers-*)
|
|
||||||
install_kernel_headers "${package}";;
|
|
||||||
esac
|
|
||||||
create_package "${package}"
|
|
||||||
done
|
|
||||||
|
@ -11,28 +11,73 @@ ifneq (,$(filter-out parallel=1,$(filter parallel=%,$(DEB_BUILD_OPTIONS))))
|
|||||||
MAKEFLAGS += -j$(NUMJOBS)
|
MAKEFLAGS += -j$(NUMJOBS)
|
||||||
endif
|
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)))
|
revision = $(lastword $(subst -, ,$(shell dpkg-parsechangelog -S Version)))
|
||||||
CROSS_COMPILE ?= $(filter-out $(DEB_BUILD_GNU_TYPE)-, $(DEB_HOST_GNU_TYPE)-)
|
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))
|
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
|
.PHONY: binary binary-indep binary-arch
|
||||||
binary: binary-arch binary-indep
|
binary: binary-arch binary-indep
|
||||||
binary-indep: build-indep
|
binary-indep: build-indep
|
||||||
binary-arch: build-arch
|
binary-arch: $(binary-targets)
|
||||||
$(MAKE) $(make-opts) \
|
$(Q)cat $(call mk-files,$^) > debian/files
|
||||||
run-command KBUILD_RUN_COMMAND='+$$(srctree)/scripts/package/builddeb'
|
|
||||||
|
|
||||||
.PHONY: build build-indep build-arch
|
.PHONY: build build-indep build-arch
|
||||||
build: build-arch build-indep
|
build: build-arch build-indep
|
||||||
build-indep:
|
build-indep:
|
||||||
build-arch:
|
build-arch:
|
||||||
$(MAKE) $(make-opts) olddefconfig
|
$(Q)$(MAKE) $(make-opts) olddefconfig
|
||||||
$(MAKE) $(make-opts) $(if $(filter um,$(ARCH)),,headers) all
|
$(Q)$(MAKE) $(make-opts) $(if $(filter um,$(ARCH)),,headers) all
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
rm -rf debian/files debian/linux-* debian/deb-env.vars*
|
$(Q)dh_clean
|
||||||
$(MAKE) ARCH=$(ARCH) 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
|
# If DEB_HOST_ARCH is empty, it is likely that debian/rules was executed
|
||||||
# directly. Run 'dpkg-architecture --print-set --print-format=make' to
|
# directly. Run 'dpkg-architecture --print-set --print-format=make' to
|
||||||
@ -41,6 +86,6 @@ ifndef DEB_HOST_ARCH
|
|||||||
include debian/deb-env.vars
|
include debian/deb-env.vars
|
||||||
|
|
||||||
debian/deb-env.vars:
|
debian/deb-env.vars:
|
||||||
dpkg-architecture -a$$(cat debian/arch) --print-set --print-format=make > $@.tmp
|
$(Q)dpkg-architecture -a$$(cat debian/arch) --print-set --print-format=make > $@.tmp
|
||||||
mv $@.tmp $@
|
$(Q)mv $@.tmp $@
|
||||||
endif
|
endif
|
||||||
|
@ -61,11 +61,37 @@ cp $(%{make} %{makeflags} -s image_name) %{buildroot}/lib/modules/%{KERNELRELEAS
|
|||||||
%{make} %{makeflags} INSTALL_HDR_PATH=%{buildroot}/usr headers_install
|
%{make} %{makeflags} INSTALL_HDR_PATH=%{buildroot}/usr headers_install
|
||||||
cp System.map %{buildroot}/lib/modules/%{KERNELRELEASE}
|
cp System.map %{buildroot}/lib/modules/%{KERNELRELEASE}
|
||||||
cp .config %{buildroot}/lib/modules/%{KERNELRELEASE}/config
|
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
|
ln -fns /usr/src/kernels/%{KERNELRELEASE} %{buildroot}/lib/modules/%{KERNELRELEASE}/build
|
||||||
%if %{with_devel}
|
%if %{with_devel}
|
||||||
%{make} %{makeflags} run-command KBUILD_RUN_COMMAND='${srctree}/scripts/package/install-extmod-build %{buildroot}/usr/src/kernels/%{KERNELRELEASE}'
|
%{make} %{makeflags} run-command KBUILD_RUN_COMMAND='${srctree}/scripts/package/install-extmod-build %{buildroot}/usr/src/kernels/%{KERNELRELEASE}'
|
||||||
%endif
|
%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
|
%clean
|
||||||
rm -rf %{buildroot}
|
rm -rf %{buildroot}
|
||||||
|
|
||||||
@ -78,23 +104,23 @@ for file in vmlinuz System.map config; do
|
|||||||
cp "/lib/modules/%{KERNELRELEASE}/${file}" "/boot/${file}-%{KERNELRELEASE}"
|
cp "/lib/modules/%{KERNELRELEASE}/${file}" "/boot/${file}-%{KERNELRELEASE}"
|
||||||
fi
|
fi
|
||||||
done
|
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
|
%preun
|
||||||
if [ -x /sbin/new-kernel-pkg ]; then
|
if [ -x /usr/bin/kernel-install ]; then
|
||||||
new-kernel-pkg --remove %{KERNELRELEASE} --rminitrd --initrdfile=/boot/initramfs-%{KERNELRELEASE}.img
|
|
||||||
elif [ -x /usr/bin/kernel-install ]; then
|
|
||||||
kernel-install remove %{KERNELRELEASE}
|
kernel-install remove %{KERNELRELEASE}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
%postun
|
%files -f %{buildroot}/kernel.list
|
||||||
if [ -x /sbin/update-bootloader ]; then
|
|
||||||
/sbin/update-bootloader --remove %{KERNELRELEASE}
|
|
||||||
fi
|
|
||||||
|
|
||||||
%files
|
|
||||||
%defattr (-, root, root)
|
%defattr (-, root, root)
|
||||||
/lib/modules/%{KERNELRELEASE}
|
%exclude /kernel.list
|
||||||
%exclude /lib/modules/%{KERNELRELEASE}/build
|
|
||||||
|
|
||||||
%files headers
|
%files headers
|
||||||
%defattr (-, root, root)
|
%defattr (-, root, root)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# Most of this file is copied from tools/lib/traceevent/Makefile
|
# Most of this file is copied from tools/lib/traceevent/Makefile
|
||||||
|
|
||||||
RM ?= rm
|
RM ?= rm
|
||||||
srctree = $(abs_srctree)
|
srctree := $(realpath $(srctree))
|
||||||
|
|
||||||
VERSION_SCRIPT := libbpf.map
|
VERSION_SCRIPT := libbpf.map
|
||||||
LIBBPF_VERSION := $(shell \
|
LIBBPF_VERSION := $(shell \
|
||||||
|
Loading…
Reference in New Issue
Block a user