Index: meson/part/extra_targets/doxygen.cfg.diff
===================================================================
--- meson/part/extra_targets/doxygen.cfg.diff	(revision eb9c5989b91ec23120260f0a438a7608a6989fa1)
+++ meson/part/extra_targets/doxygen.cfg.diff	(revision eb9c5989b91ec23120260f0a438a7608a6989fa1)
@@ -0,0 +1,56 @@
+--- doxygen.cfg.gen	2018-08-29 17:07:57.439518972 +0200
++++ doxygen.cfg	2018-08-30 00:03:23.790524052 +0200
+@@ -32,7 +32,7 @@
+ # title of most generated pages and in a few other places.
+ # The default value is: My Project.
+ 
+-PROJECT_NAME           = "My Project"
++PROJECT_NAME           = "HelenOS"
+ 
+ # The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+ # could be handy for archiving the generated documentation or if some version
+@@ -44,7 +44,7 @@
+ # for a project that appears at the top of each page and should give viewer a
+ # quick idea about the purpose of the project. Keep the description short.
+ 
+-PROJECT_BRIEF          =
++PROJECT_BRIEF          = " HelenOS is a portable microkernel-based multiserver operating system designed and implemented from scratch."
+ 
+ # With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+ # in the documentation. The maximum height of the logo should not exceed 55
+@@ -649,7 +649,7 @@
+ # sections, marked by \if <section_label> ... \endif and \cond <section_label>
+ # ... \endcond blocks.
+ 
+-ENABLED_SECTIONS       =
++ENABLED_SECTIONS       = abs32le amd64 arm32 arm64 ia32 ia64 mips32 ppc32 riscv64 sparc64
+ 
+ # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+ # initial value of a variable or macro / define can have for it to appear in the
+@@ -791,7 +791,7 @@
+ # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+ # Note: If this tag is empty the current directory is searched.
+ 
+-INPUT                  =
++INPUT                  = ../README.md ../abi ../boot ../kernel ../uspace
+ 
+ # This tag can be used to specify the character encoding of the source files
+ # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+@@ -865,7 +865,7 @@
+ # be searched for input files as well.
+ # The default value is: NO.
+ 
+-RECURSIVE              = NO
++RECURSIVE              = YES
+ 
+ # The EXCLUDE tag can be used to specify files and/or directories that should be
+ # excluded from the INPUT source files. This way you can easily exclude a
+@@ -1468,7 +1468,7 @@
+ # The default value is: NO.
+ # This tag requires that the tag GENERATE_HTML is set to YES.
+ 
+-GENERATE_TREEVIEW      = NO
++GENERATE_TREEVIEW      = YES
+ 
+ # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+ # doxygen will group on one line in the generated HTML documentation.
Index: meson/part/extra_targets/meson.build
===================================================================
--- meson/part/extra_targets/meson.build	(revision 200b2113fc4b438d75d53ae122f1828de1728eb8)
+++ meson/part/extra_targets/meson.build	(revision eb9c5989b91ec23120260f0a438a7608a6989fa1)
@@ -1,2 +1,31 @@
+#
+# Copyright (c) 2017 Jiri Svoboda
+# Copyright (c) 2019 Jiří Zárevúcky
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# - The name of the author may not be used to endorse or promote products
+#   derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
 run_target('config',
 	command: [
@@ -28,4 +57,18 @@
 endif
 
+_patch_file = files('doxygen.cfg.diff')
+
+_gen_cfg = custom_target('doxygen.cfg.gen',
+	output: 'doxygen.cfg.gen',
+	command: [ doxygen, '-g', '@OUTPUT@' ],
+)
+
+_dox_cfg = custom_target('doxygen.cfg',
+	output: 'doxygen.cfg',
+	input: [ _gen_cfg, _patch_file ],
+	command: [ patch, '-o', '@OUTPUT@', '@INPUT@' ],
+)
+
+run_target('doxygen', command: [ doxygen, _dox_cfg ])
 
 # TODO text-xcw
Index: meson/part/tools/meson.build
===================================================================
--- meson/part/tools/meson.build	(revision 200b2113fc4b438d75d53ae122f1828de1728eb8)
+++ meson/part/tools/meson.build	(revision eb9c5989b91ec23120260f0a438a7608a6989fa1)
@@ -7,8 +7,10 @@
 _tools_dir = meson.source_root() / 'tools'
 
+basename = find_program('basename')
 cc = meson.get_compiler('c')
-basename = find_program('basename')
+config_py = find_program(_tools_dir / 'config.py')
 cp = find_program('cp')
 dirname = find_program('dirname')
+doxygen = find_program('doxygen')
 find = find_program('find')
 grep = find_program('grep')
@@ -17,7 +19,7 @@
 mkfat = find_program(_tools_dir / 'mkfat.py')
 mkuimage = find_program(_tools_dir / 'mkuimage.py')
-config_py = find_program(_tools_dir / 'config.py')
 objcopy = find_program('objcopy')
 objdump = find_program('objdump')
+patch = find_program('patch')
 sed = find_program('sed')
 unzip = find_program('unzip')
