doc: restructure build/config system section

Restructure Build/Config section to allow for addition of new content
(DTS).

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
diff --git a/doc/build/build-build-phase-1.svg b/doc/build/cmake/build-build-phase-1.svg
similarity index 100%
rename from doc/build/build-build-phase-1.svg
rename to doc/build/cmake/build-build-phase-1.svg
diff --git a/doc/build/build-build-phase-2.svg b/doc/build/cmake/build-build-phase-2.svg
similarity index 100%
rename from doc/build/build-build-phase-2.svg
rename to doc/build/cmake/build-build-phase-2.svg
diff --git a/doc/build/build-build-phase-3.svg b/doc/build/cmake/build-build-phase-3.svg
similarity index 100%
rename from doc/build/build-build-phase-3.svg
rename to doc/build/cmake/build-build-phase-3.svg
diff --git a/doc/build/build-build-phase-4.svg b/doc/build/cmake/build-build-phase-4.svg
similarity index 100%
rename from doc/build/build-build-phase-4.svg
rename to doc/build/cmake/build-build-phase-4.svg
diff --git a/doc/build/build-build-phase-5.svg b/doc/build/cmake/build-build-phase-5.svg
similarity index 100%
rename from doc/build/build-build-phase-5.svg
rename to doc/build/cmake/build-build-phase-5.svg
diff --git a/doc/build/build-build-phase-6.svg b/doc/build/cmake/build-build-phase-6.svg
similarity index 100%
rename from doc/build/build-build-phase-6.svg
rename to doc/build/cmake/build-build-phase-6.svg
diff --git a/doc/build/build-config-phase.svg b/doc/build/cmake/build-config-phase.svg
similarity index 100%
rename from doc/build/build-config-phase.svg
rename to doc/build/cmake/build-config-phase.svg
diff --git a/doc/build/build-postprocess-1.svg b/doc/build/cmake/build-postprocess-1.svg
similarity index 100%
rename from doc/build/build-postprocess-1.svg
rename to doc/build/cmake/build-postprocess-1.svg
diff --git a/doc/build/build-postprocess-2.svg b/doc/build/cmake/build-postprocess-2.svg
similarity index 100%
rename from doc/build/build-postprocess-2.svg
rename to doc/build/cmake/build-postprocess-2.svg
diff --git a/doc/build/build-postprocess-3.svg b/doc/build/cmake/build-postprocess-3.svg
similarity index 100%
rename from doc/build/build-postprocess-3.svg
rename to doc/build/cmake/build-postprocess-3.svg
diff --git a/doc/build/build-postprocess-4.svg b/doc/build/cmake/build-postprocess-4.svg
similarity index 100%
rename from doc/build/build-postprocess-4.svg
rename to doc/build/cmake/build-postprocess-4.svg
diff --git a/doc/build/cmake/index.rst b/doc/build/cmake/index.rst
new file mode 100644
index 0000000..7287ca6
--- /dev/null
+++ b/doc/build/cmake/index.rst
@@ -0,0 +1,417 @@
+.. _cmake-details:
+
+Build System (CMake)
+********************
+
+
+CMake is used to build your application together with the Zephyr kernel. A
+CMake build is done in two stages. The first stage is called
+**configuration**. During configuration, the CMakeLists.txt build scripts are
+executed. After configuration is finished, CMake has an internal model of the
+Zephyr build, and can generate build scripts that are native to the host
+platform.
+
+CMake supports generating scripts for several build systems, but only Ninja and
+Make are tested and supported by Zephyr. After configuration, you begin the
+**build** stage by executing the generated build scripts. These build scripts
+can recompile the application without involving CMake following
+most code changes. However, after certain changes, the configuration step must
+be executed again before building. The build scripts can detect some of these
+situations and reconfigure automatically, but there are cases when this must be
+done manually.
+
+Zephyr uses CMake's concept of a 'target' to organize the build. A
+target can be an executable, a library, or a generated file. For
+application developers, the library target is the most important to
+understand. All source code that goes into a Zephyr build does so by
+being included in a library target, even application code.
+
+Library targets have source code, that is added through CMakeLists.txt
+build scripts like this:
+
+.. code-block:: cmake
+
+   target_sources(app PRIVATE src/main.c)
+
+In the above :file:`CMakeLists.txt`, an existing library target named ``app``
+is configured to include the source file :file:`src/main.c`. The ``PRIVATE``
+keyword indicates that we are modifying the internals of how the library is
+being built. Using the keyword ``PUBLIC`` would modify how other
+libraries that link with app are built. In this case, using ``PUBLIC``
+would cause libraries that link with ``app`` to also include the
+source file :file:`src/main.c`, behavior that we surely do not want. The
+``PUBLIC`` keyword could however be useful when modifying the include
+paths of a target library.
+
+
+Build and Configuration Phases
+==============================
+
+The Zephyr build process can be divided into two main phases: a configuration
+phase (driven by CMake) and a build phase (driven by Make or Ninja).
+
+.. _build_configuration_phase:
+
+Configuration Phase
+-------------------
+
+The configuration phase begins when the user invokes *CMake* to generate a
+build system, specifying a source application directory and a board target.
+
+.. figure:: build-config-phase.svg
+    :align: center
+    :alt: Zephyr's build configuration phase
+    :figclass: align-center
+    :width: 80%
+
+CMake begins by processing the :file:`CMakeLists.txt` file in the application
+directory, which refers to the :file:`CMakeLists.txt` file in the Zephyr
+top-level directory, which in turn refers to :file:`CMakeLists.txt` files
+throughout the build tree (directly and indirectly). Its primary output is a
+set of Makefiles or Ninja files to drive the build process, but the CMake
+scripts also do some processing of their own, which is explained here.
+
+Note that paths beginning with :file:`build/` below refer to the build
+directory you create when running CMake.
+
+Devicetree
+   :file:`*.dts` (*devicetree source*) and :file:`*.dtsi` (*devicetree source
+   include*) files are collected from the target's architecture, SoC, board,
+   and application directories.
+
+   :file:`*.dtsi` files are included by :file:`*.dts` files via the C
+   preprocessor (often abbreviated *cpp*, which should not be confused with
+   C++). The C preprocessor is also used to merge in any devicetree
+   :file:`*.overlay` files, and to expand macros in :file:`*.dts`,
+   :file:`*.dtsi`, and :file:`*.overlay` files. The preprocessor output is
+   placed in :file:`build/zephyr/zephyr.dts.pre`.
+
+   The preprocessed devicetree sources are parsed by
+   :zephyr_file:`gen_defines.py <scripts/dts/gen_defines.py>` to generate a
+   :file:`build/zephyr/include/generated/devicetree_unfixed.h` header with
+   preprocessor macros.
+
+   Source code should access preprocessor macros generated from devicetree by
+   including the :zephyr_file:`devicetree.h <include/devicetree.h>` header,
+   which includes :file:`devicetree_unfixed.h`.
+
+   :file:`gen_defines.py` also writes the final devicetree to
+   :file:`build/zephyr/zephyr.dts` in the build directory. This file's contents
+   may be useful for debugging.
+
+   If the devicetree compiler ``dtc`` is installed, it is run on
+   :file:`build/zephyr/zephyr.dts` to catch any extra warnings and errors
+   generated by this tool. The output from ``dtc`` is unused otherwise, and
+   this step is skipped if ``dtc`` is not installed.
+
+   The above is just a brief overview. For more information on devicetree, see
+   :ref:`dt-guide`.
+
+Devicetree fixups
+   Files named :file:`dts_fixup.h` from the target’s architecture, SoC, board,
+   and application directories are concatenated into a single
+   :file:`devicetree_fixups.h` file. :file:`dts_fixup.h` files are a legacy
+   feature which should not be used in new code.
+
+Kconfig
+   :file:`Kconfig` files define available configuration options for for the
+   target architecture, SoC, board, and application, as well as dependencies
+   between options.
+
+   Kconfig configurations are stored in *configuration files*. The initial
+   configuration is generated by merging configuration fragments from the board
+   and application (e.g. :file:`prj.conf`).
+
+   The output from Kconfig is an :file:`autoconf.h` header with preprocessor
+   assignments, and a :file:`.config` file that acts both as a saved
+   configuration and as configuration output (used by CMake). The definitions in
+   :file:`autoconf.h` are automatically exposed at compile time, so there is no
+   need to include this header.
+
+   Information from devicetree is available to Kconfig, through the functions
+   defined in :zephyr_file:`kconfigfunctions.py
+   <scripts/kconfig/kconfigfunctions.py>`.
+
+   See :ref:`the Kconfig section of the manual <kconfig>` for more information.
+
+Build Phase
+-----------
+
+The build phase begins when the user invokes ``make`` or ``ninja``. Its
+ultimate output is a complete Zephyr application in a format suitable for
+loading/flashing on the desired target board (:file:`zephyr.elf`,
+:file:`zephyr.hex`, etc.) The build phase can be broken down, conceptually,
+into four stages: the pre-build, first-pass binary, final binary, and
+post-processing.
+
+Pre-build
++++++++++
+
+Pre-build occurs before any source files are compiled, because during
+this phase header files used by the source files are generated.
+
+Offset generation
+   Access to high-level data structures and members is sometimes
+   required when the definitions of those structures is not
+   immediately accessible (e.g., assembly language). The generation of
+   *offsets.h* (by *gen_offset_header.py*) facilitates this.
+
+System call boilerplate
+   The *gen_syscall.py* and *parse_syscalls.py*  scripts work
+   together to bind potential system call functions with their
+   implementations.
+
+.. figure:: build-build-phase-1.svg
+    :align: center
+    :alt: Zephyr's build stage I
+    :figclass: align-center
+    :width: 80%
+
+Intermediate binaries
++++++++++++++++++++++
+
+Compilation proper begins with the first intermediate binary. Source files (C
+and assembly) are collected from various subsystems (which ones is
+decided during the configuration phase), and compiled into archives
+(with reference to header files in the tree, as well as those
+generated during the configuration phase and the pre-build stage(s)).
+
+.. figure:: build-build-phase-2.svg
+    :align: center
+    :alt: Zephyr's build stage II
+    :figclass: align-center
+    :width: 80%
+
+The exact number of intermediate binaries is decided during the configuration
+phase.
+
+If memory protection is enabled, then:
+
+Partition grouping
+   The *gen_app_partitions.py* script scans all the
+   generated archives and outputs linker scripts to ensure that
+   application partitions are properly grouped and aligned for the
+   target’s memory protection hardware.
+
+Then *cpp* is used to combine linker script fragments from the target’s
+architecture/SoC, the kernel tree, optionally the partition output if
+memory protection is enabled, and any other fragments selected during
+the configuration process, into a *linker.cmd* file. The compiled
+archives are then linked with *ld* as specified in the
+*linker.cmd*.
+
+Unfixed size binary
+   The unfixed size intermediate binary is produced when :ref:`usermode_api`
+   is enabled or :ref:`devicetree` is in use.
+   It produces a binary where sizes are not fixed and thus it may be used
+   by post-process steps that will impact the size of the final binary.
+
+.. figure:: build-build-phase-3.svg
+    :align: center
+    :alt: Zephyr's build stage III
+    :figclass: align-center
+    :width: 80%
+
+Fixed size binary
+   The fixed size intermediate binary is produced when :ref:`usermode_api`
+   is enabled or when generated IRQ tables are used,
+   :kconfig:option:`CONFIG_GEN_ISR_TABLES`
+   It produces a binary where sizes are fixed and thus the size must not change
+   between the intermediate binary and the final binary.
+
+.. figure:: build-build-phase-4.svg
+    :align: center
+    :alt: Zephyr's build stage IV
+    :figclass: align-center
+    :width: 80%
+
+Intermediate binaries post-processing
++++++++++++++++++++++++++++++++++++++
+
+The binaries from the previous stage are incomplete, with empty and/or
+placeholder sections that must be filled in by, essentially, reflection.
+
+To complete the build procedure the following scripts are executed on the
+intermediate binaries to produce the missing pieces needed for the final
+binary.
+
+When :ref:`usermode_api` is enabled:
+
+Partition alignment
+   The *gen_app_partitions.py* script scans the unfixed size binary and
+   generates an app shared memory aligned linker script snippet where the
+   partitions are sorted in descending order.
+
+.. figure:: build-postprocess-1.svg
+    :align: center
+    :alt: Zephyr's intermediate binary post-process I
+    :figclass: align-center
+    :width: 80%
+
+When :ref:`devicetree` is used:
+
+Device dependencies
+   The *gen_handles.py* script scans the unfixed size binary to determine
+   relationships between devices that were recorded from devicetree data,
+   and replaces the encoded relationships with values that are optimized to
+   locate the devices actually present in the application.
+
+.. figure:: build-postprocess-2.svg
+    :align: center
+    :alt: Zephyr's intermediate binary post-process II
+    :figclass: align-center
+    :width: 80%
+
+When :kconfig:option:`CONFIG_GEN_ISR_TABLES` is enabled:
+   The *gen_isr_tables.py* script scant the fixed size binary and creates
+   an isr_tables.c source file with a hardware vector table and/or software
+   IRQ table.
+
+.. figure:: build-postprocess-3.svg
+    :align: center
+    :alt: Zephyr's intermediate binary post-process III
+    :figclass: align-center
+    :width: 80%
+
+When :ref:`usermode_api` is enabled:
+
+Kernel object hashing
+   The *gen_kobject_list.py* scans the *ELF DWARF*
+   debug data to find the address of the all kernel objects. This
+   list is passed to *gperf*, which generates a perfect hash function and
+   table of those addresses, then that output is optimized by
+   *process_gperf.py*, using known properties of our special case.
+
+.. figure:: build-postprocess-4.svg
+    :align: center
+    :alt: Zephyr's intermediate binary post-process IV
+    :figclass: align-center
+    :width: 80%
+
+When no intermediate binary post-processing is required then the first
+intermediate binary will be directly used as the final binary.
+
+Final binary
+++++++++++++
+
+The binary from the previous stage is incomplete, with empty and/or
+placeholder sections that must be filled in by, essentially, reflection.
+
+The link from the previous stage is repeated, this time with the missing
+pieces populated.
+
+.. figure:: build-build-phase-5.svg
+    :align: center
+    :alt: Zephyr's build final stage
+    :figclass: align-center
+    :width: 80%
+
+Post processing
++++++++++++++++
+
+Finally, if necessary, the completed kernel is converted from *ELF* to
+the format expected by the loader and/or flash tool required by the
+target. This is accomplished in a straightforward manner with *objdump*.
+
+.. figure:: build-build-phase-6.svg
+    :align: center
+    :alt: Zephyr's build final stage post-process
+    :figclass: align-center
+    :width: 80%
+
+
+.. _build_system_scripts:
+
+Supporting Scripts and Tools
+============================
+
+The following is a detailed description of the scripts used during the build process.
+
+.. _gen_syscalls.py:
+
+:zephyr_file:`scripts/gen_syscalls.py`
+--------------------------------------
+
+.. include:: ../../../scripts/gen_syscalls.py
+   :start-after: """
+   :end-before: """
+
+.. _gen_handles.py:
+
+:zephyr_file:`scripts/gen_handles.py`
+--------------------------------------
+
+.. include:: ../../../scripts/gen_handles.py
+   :start-after: """
+   :end-before: """
+
+.. _gen_kobject_list.py:
+
+:zephyr_file:`scripts/gen_kobject_list.py`
+------------------------------------------
+
+.. include:: ../../../scripts/gen_kobject_list.py
+   :start-after: """
+   :end-before: """
+
+.. _gen_offset_header.py:
+
+:zephyr_file:`scripts/gen_offset_header.py`
+-------------------------------------------
+
+.. include:: ../../../scripts/gen_offset_header.py
+   :start-after: """
+   :end-before: """
+
+.. _parse_syscalls.py:
+
+:zephyr_file:`scripts/parse_syscalls.py`
+----------------------------------------
+
+
+.. include:: ../../../scripts/parse_syscalls.py
+   :start-after: """
+   :end-before: """
+
+.. _gen_idt.py:
+
+:zephyr_file:`arch/x86/gen_idt.py`
+----------------------------------
+
+.. include:: ../../../arch/x86/gen_idt.py
+   :start-after: """
+   :end-before: """
+
+.. _gen_gdt.py:
+
+:zephyr_file:`arch/x86/gen_gdt.py`
+----------------------------------
+
+.. include:: ../../../arch/x86/gen_gdt.py
+   :start-after: """
+   :end-before: """
+
+.. _gen_relocate_app.py:
+
+:zephyr_file:`scripts/gen_relocate_app.py`
+-------------------------------------------
+
+.. include:: ../../../scripts/gen_relocate_app.py
+   :start-after: """
+   :end-before: """
+
+.. _process_gperf.py:
+
+:zephyr_file:`scripts/process_gperf.py`
+---------------------------------------
+
+.. include:: ../../../scripts/process_gperf.py
+   :start-after: """
+   :end-before: """
+
+:zephyr_file:`scripts/gen_app_partitions.py`
+--------------------------------------------
+
+.. include:: ../../../scripts/gen_app_partitions.py
+   :start-after: """
+   :end-before: """
diff --git a/doc/build/index.rst b/doc/build/index.rst
index 4bc2c63..5e3ba91 100644
--- a/doc/build/index.rst
+++ b/doc/build/index.rst
@@ -4,455 +4,9 @@
 ###############################
 
 
-.. _cmake-details:
-
-Build System (CMake)
-********************
-
-
-CMake is used to build your application together with the Zephyr kernel. A
-CMake build is done in two stages. The first stage is called
-**configuration**. During configuration, the CMakeLists.txt build scripts are
-executed. After configuration is finished, CMake has an internal model of the
-Zephyr build, and can generate build scripts that are native to the host
-platform.
-
-CMake supports generating scripts for several build systems, but only Ninja and
-Make are tested and supported by Zephyr. After configuration, you begin the
-**build** stage by executing the generated build scripts. These build scripts
-can recompile the application without involving CMake following
-most code changes. However, after certain changes, the configuration step must
-be executed again before building. The build scripts can detect some of these
-situations and reconfigure automatically, but there are cases when this must be
-done manually.
-
-Zephyr uses CMake's concept of a 'target' to organize the build. A
-target can be an executable, a library, or a generated file. For
-application developers, the library target is the most important to
-understand. All source code that goes into a Zephyr build does so by
-being included in a library target, even application code.
-
-Library targets have source code, that is added through CMakeLists.txt
-build scripts like this:
-
-.. code-block:: cmake
-
-   target_sources(app PRIVATE src/main.c)
-
-In the above :file:`CMakeLists.txt`, an existing library target named ``app``
-is configured to include the source file :file:`src/main.c`. The ``PRIVATE``
-keyword indicates that we are modifying the internals of how the library is
-being built. Using the keyword ``PUBLIC`` would modify how other
-libraries that link with app are built. In this case, using ``PUBLIC``
-would cause libraries that link with ``app`` to also include the
-source file :file:`src/main.c`, behavior that we surely do not want. The
-``PUBLIC`` keyword could however be useful when modifying the include
-paths of a target library.
-
-
-Build and Configuration Phases
-==============================
-
-The Zephyr build process can be divided into two main phases: a configuration
-phase (driven by CMake) and a build phase (driven by Make or Ninja).
-
-.. _build_configuration_phase:
-
-Configuration Phase
--------------------
-
-The configuration phase begins when the user invokes *CMake* to generate a
-build system, specifying a source application directory and a board target.
-
-.. figure:: build-config-phase.svg
-    :align: center
-    :alt: Zephyr's build configuration phase
-    :figclass: align-center
-    :width: 80%
-
-CMake begins by processing the :file:`CMakeLists.txt` file in the application
-directory, which refers to the :file:`CMakeLists.txt` file in the Zephyr
-top-level directory, which in turn refers to :file:`CMakeLists.txt` files
-throughout the build tree (directly and indirectly). Its primary output is a
-set of Makefiles or Ninja files to drive the build process, but the CMake
-scripts also do some processing of their own, which is explained here.
-
-Note that paths beginning with :file:`build/` below refer to the build
-directory you create when running CMake.
-
-Devicetree
-   :file:`*.dts` (*devicetree source*) and :file:`*.dtsi` (*devicetree source
-   include*) files are collected from the target's architecture, SoC, board,
-   and application directories.
-
-   :file:`*.dtsi` files are included by :file:`*.dts` files via the C
-   preprocessor (often abbreviated *cpp*, which should not be confused with
-   C++). The C preprocessor is also used to merge in any devicetree
-   :file:`*.overlay` files, and to expand macros in :file:`*.dts`,
-   :file:`*.dtsi`, and :file:`*.overlay` files. The preprocessor output is
-   placed in :file:`build/zephyr/zephyr.dts.pre`.
-
-   The preprocessed devicetree sources are parsed by
-   :zephyr_file:`gen_defines.py <scripts/dts/gen_defines.py>` to generate a
-   :file:`build/zephyr/include/generated/devicetree_unfixed.h` header with
-   preprocessor macros.
-
-   Source code should access preprocessor macros generated from devicetree by
-   including the :zephyr_file:`devicetree.h <include/devicetree.h>` header,
-   which includes :file:`devicetree_unfixed.h`.
-
-   :file:`gen_defines.py` also writes the final devicetree to
-   :file:`build/zephyr/zephyr.dts` in the build directory. This file's contents
-   may be useful for debugging.
-
-   If the devicetree compiler ``dtc`` is installed, it is run on
-   :file:`build/zephyr/zephyr.dts` to catch any extra warnings and errors
-   generated by this tool. The output from ``dtc`` is unused otherwise, and
-   this step is skipped if ``dtc`` is not installed.
-
-   The above is just a brief overview. For more information on devicetree, see
-   :ref:`dt-guide`.
-
-Devicetree fixups
-   Files named :file:`dts_fixup.h` from the target’s architecture, SoC, board,
-   and application directories are concatenated into a single
-   :file:`devicetree_fixups.h` file. :file:`dts_fixup.h` files are a legacy
-   feature which should not be used in new code.
-
-Kconfig
-   :file:`Kconfig` files define available configuration options for for the
-   target architecture, SoC, board, and application, as well as dependencies
-   between options.
-
-   Kconfig configurations are stored in *configuration files*. The initial
-   configuration is generated by merging configuration fragments from the board
-   and application (e.g. :file:`prj.conf`).
-
-   The output from Kconfig is an :file:`autoconf.h` header with preprocessor
-   assignments, and a :file:`.config` file that acts both as a saved
-   configuration and as configuration output (used by CMake). The definitions in
-   :file:`autoconf.h` are automatically exposed at compile time, so there is no
-   need to include this header.
-
-   Information from devicetree is available to Kconfig, through the functions
-   defined in :zephyr_file:`kconfigfunctions.py
-   <scripts/kconfig/kconfigfunctions.py>`.
-
-   See :ref:`the Kconfig section of the manual <kconfig>` for more information.
-
-Build Phase
------------
-
-The build phase begins when the user invokes ``make`` or ``ninja``. Its
-ultimate output is a complete Zephyr application in a format suitable for
-loading/flashing on the desired target board (:file:`zephyr.elf`,
-:file:`zephyr.hex`, etc.) The build phase can be broken down, conceptually,
-into four stages: the pre-build, first-pass binary, final binary, and
-post-processing.
-
-Pre-build
-+++++++++
-
-Pre-build occurs before any source files are compiled, because during
-this phase header files used by the source files are generated.
-
-Offset generation
-   Access to high-level data structures and members is sometimes
-   required when the definitions of those structures is not
-   immediately accessible (e.g., assembly language). The generation of
-   *offsets.h* (by *gen_offset_header.py*) facilitates this.
-
-System call boilerplate
-   The *gen_syscall.py* and *parse_syscalls.py*  scripts work
-   together to bind potential system call functions with their
-   implementations.
-
-.. figure:: build-build-phase-1.svg
-    :align: center
-    :alt: Zephyr's build stage I
-    :figclass: align-center
-    :width: 80%
-
-Intermediate binaries
-+++++++++++++++++++++
-
-Compilation proper begins with the first intermediate binary. Source files (C
-and assembly) are collected from various subsystems (which ones is
-decided during the configuration phase), and compiled into archives
-(with reference to header files in the tree, as well as those
-generated during the configuration phase and the pre-build stage(s)).
-
-.. figure:: build-build-phase-2.svg
-    :align: center
-    :alt: Zephyr's build stage II
-    :figclass: align-center
-    :width: 80%
-
-The exact number of intermediate binaries is decided during the configuration
-phase.
-
-If memory protection is enabled, then:
-
-Partition grouping
-   The *gen_app_partitions.py* script scans all the
-   generated archives and outputs linker scripts to ensure that
-   application partitions are properly grouped and aligned for the
-   target’s memory protection hardware.
-
-Then *cpp* is used to combine linker script fragments from the target’s
-architecture/SoC, the kernel tree, optionally the partition output if
-memory protection is enabled, and any other fragments selected during
-the configuration process, into a *linker.cmd* file. The compiled
-archives are then linked with *ld* as specified in the
-*linker.cmd*.
-
-Unfixed size binary
-   The unfixed size intermediate binary is produced when :ref:`usermode_api`
-   is enabled or :ref:`devicetree` is in use.
-   It produces a binary where sizes are not fixed and thus it may be used
-   by post-process steps that will impact the size of the final binary.
-
-.. figure:: build-build-phase-3.svg
-    :align: center
-    :alt: Zephyr's build stage III
-    :figclass: align-center
-    :width: 80%
-
-Fixed size binary
-   The fixed size intermediate binary is produced when :ref:`usermode_api`
-   is enabled or when generated IRQ tables are used,
-   :kconfig:option:`CONFIG_GEN_ISR_TABLES`
-   It produces a binary where sizes are fixed and thus the size must not change
-   between the intermediate binary and the final binary.
-
-.. figure:: build-build-phase-4.svg
-    :align: center
-    :alt: Zephyr's build stage IV
-    :figclass: align-center
-    :width: 80%
-
-Intermediate binaries post-processing
-+++++++++++++++++++++++++++++++++++++
-
-The binaries from the previous stage are incomplete, with empty and/or
-placeholder sections that must be filled in by, essentially, reflection.
-
-To complete the build procedure the following scripts are executed on the
-intermediate binaries to produce the missing pieces needed for the final
-binary.
-
-When :ref:`usermode_api` is enabled:
-
-Partition alignment
-   The *gen_app_partitions.py* script scans the unfixed size binary and
-   generates an app shared memory aligned linker script snippet where the
-   partitions are sorted in descending order.
-
-.. figure:: build-postprocess-1.svg
-    :align: center
-    :alt: Zephyr's intermediate binary post-process I
-    :figclass: align-center
-    :width: 80%
-
-When :ref:`devicetree` is used:
-
-Device dependencies
-   The *gen_handles.py* script scans the unfixed size binary to determine
-   relationships between devices that were recorded from devicetree data,
-   and replaces the encoded relationships with values that are optimized to
-   locate the devices actually present in the application.
-
-.. figure:: build-postprocess-2.svg
-    :align: center
-    :alt: Zephyr's intermediate binary post-process II
-    :figclass: align-center
-    :width: 80%
-
-When :kconfig:option:`CONFIG_GEN_ISR_TABLES` is enabled:
-   The *gen_isr_tables.py* script scant the fixed size binary and creates
-   an isr_tables.c source file with a hardware vector table and/or software
-   IRQ table.
-
-.. figure:: build-postprocess-3.svg
-    :align: center
-    :alt: Zephyr's intermediate binary post-process III
-    :figclass: align-center
-    :width: 80%
-
-When :ref:`usermode_api` is enabled:
-
-Kernel object hashing
-   The *gen_kobject_list.py* scans the *ELF DWARF*
-   debug data to find the address of the all kernel objects. This
-   list is passed to *gperf*, which generates a perfect hash function and
-   table of those addresses, then that output is optimized by
-   *process_gperf.py*, using known properties of our special case.
-
-.. figure:: build-postprocess-4.svg
-    :align: center
-    :alt: Zephyr's intermediate binary post-process IV
-    :figclass: align-center
-    :width: 80%
-
-When no intermediate binary post-processing is required then the first
-intermediate binary will be directly used as the final binary.
-
-Final binary
-++++++++++++
-
-The binary from the previous stage is incomplete, with empty and/or
-placeholder sections that must be filled in by, essentially, reflection.
-
-The link from the previous stage is repeated, this time with the missing
-pieces populated.
-
-.. figure:: build-build-phase-5.svg
-    :align: center
-    :alt: Zephyr's build final stage
-    :figclass: align-center
-    :width: 80%
-
-Post processing
-+++++++++++++++
-
-Finally, if necessary, the completed kernel is converted from *ELF* to
-the format expected by the loader and/or flash tool required by the
-target. This is accomplished in a straightforward manner with *objdump*.
-
-.. figure:: build-build-phase-6.svg
-    :align: center
-    :alt: Zephyr's build final stage post-process
-    :figclass: align-center
-    :width: 80%
-
-
-.. _build_system_scripts:
-
-Supporting Scripts and Tools
-============================
-
-The following is a detailed description of the scripts used during the build process.
-
-.. _gen_syscalls.py:
-
-:zephyr_file:`scripts/gen_syscalls.py`
---------------------------------------
-
-.. include:: ../../scripts/gen_syscalls.py
-   :start-after: """
-   :end-before: """
-
-.. _gen_handles.py:
-
-:zephyr_file:`scripts/gen_handles.py`
---------------------------------------
-
-.. include:: ../../scripts/gen_handles.py
-   :start-after: """
-   :end-before: """
-
-.. _gen_kobject_list.py:
-
-:zephyr_file:`scripts/gen_kobject_list.py`
-------------------------------------------
-
-.. include:: ../../scripts/gen_kobject_list.py
-   :start-after: """
-   :end-before: """
-
-.. _gen_offset_header.py:
-
-:zephyr_file:`scripts/gen_offset_header.py`
--------------------------------------------
-
-.. include:: ../../scripts/gen_offset_header.py
-   :start-after: """
-   :end-before: """
-
-.. _parse_syscalls.py:
-
-:zephyr_file:`scripts/parse_syscalls.py`
-----------------------------------------
-
-
-.. include:: ../../scripts/parse_syscalls.py
-   :start-after: """
-   :end-before: """
-
-.. _gen_idt.py:
-
-:zephyr_file:`arch/x86/gen_idt.py`
-----------------------------------
-
-.. include:: ../../arch/x86/gen_idt.py
-   :start-after: """
-   :end-before: """
-
-.. _gen_gdt.py:
-
-:zephyr_file:`arch/x86/gen_gdt.py`
-----------------------------------
-
-.. include:: ../../arch/x86/gen_gdt.py
-   :start-after: """
-   :end-before: """
-
-.. _gen_relocate_app.py:
-
-:zephyr_file:`scripts/gen_relocate_app.py`
--------------------------------------------
-
-.. include:: ../../scripts/gen_relocate_app.py
-   :start-after: """
-   :end-before: """
-
-.. _process_gperf.py:
-
-:zephyr_file:`scripts/process_gperf.py`
----------------------------------------
-
-.. include:: ../../scripts/process_gperf.py
-   :start-after: """
-   :end-before: """
-
-:zephyr_file:`scripts/gen_app_partitions.py`
---------------------------------------------
-
-.. include:: ../../scripts/gen_app_partitions.py
-   :start-after: """
-   :end-before: """
-
-.. _kconfig:
-
-Configuration System (Kconfig)
-*******************************
-
-The Zephyr kernel and subsystems can be configured at build time to adapt them
-for specific application and platform needs. Configuration is handled through
-Kconfig, which is the same configuration system used by the Linux kernel. The
-goal is to support configuration without having to change any source code.
-
-Configuration options (often called *symbols*) are defined in :file:`Kconfig`
-files, which also specify dependencies between symbols that determine what
-configurations are valid. Symbols can be grouped into menus and sub-menus to
-keep the interactive configuration interfaces organized.
-
-The output from Kconfig is a header file :file:`autoconf.h` with macros that
-can be tested at build time. Code for unused features can be compiled out to
-save space.
-
-The following sections explain how to set Kconfig configuration options, go
-into detail on how Kconfig is used within the Zephyr project, and have some
-tips and best practices for writing :file:`Kconfig` files.
-
 .. toctree::
    :maxdepth: 1
 
-   kconfig/menuconfig.rst
-   kconfig/setting.rst
-   kconfig/tips.rst
-   kconfig/preprocessor-functions.rst
-   kconfig/extensions.rst
 
-Users interested in optimizing their configuration for security should refer
-to the Zephyr Security Guide's section on the :ref:`hardening`.
+   cmake/index.rst
+   kconfig/index.rst
diff --git a/doc/build/kconfig/index.rst b/doc/build/kconfig/index.rst
new file mode 100644
index 0000000..b59213d
--- /dev/null
+++ b/doc/build/kconfig/index.rst
@@ -0,0 +1,34 @@
+.. _kconfig:
+
+Configuration System (Kconfig)
+*******************************
+
+The Zephyr kernel and subsystems can be configured at build time to adapt them
+for specific application and platform needs. Configuration is handled through
+Kconfig, which is the same configuration system used by the Linux kernel. The
+goal is to support configuration without having to change any source code.
+
+Configuration options (often called *symbols*) are defined in :file:`Kconfig`
+files, which also specify dependencies between symbols that determine what
+configurations are valid. Symbols can be grouped into menus and sub-menus to
+keep the interactive configuration interfaces organized.
+
+The output from Kconfig is a header file :file:`autoconf.h` with macros that
+can be tested at build time. Code for unused features can be compiled out to
+save space.
+
+The following sections explain how to set Kconfig configuration options, go
+into detail on how Kconfig is used within the Zephyr project, and have some
+tips and best practices for writing :file:`Kconfig` files.
+
+.. toctree::
+   :maxdepth: 1
+
+   menuconfig.rst
+   setting.rst
+   tips.rst
+   preprocessor-functions.rst
+   extensions.rst
+
+Users interested in optimizing their configuration for security should refer
+to the Zephyr Security Guide's section on the :ref:`hardening`.