[libc] Generate configure.rst from the JSON config information. (#65791)

This commit is contained in:
Siva Chandra 2023-09-08 13:11:09 -07:00 committed by GitHub
parent 37b538819b
commit ca2a4e76ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 114 additions and 1 deletions

View File

@ -143,6 +143,7 @@ foreach(opt IN LISTS global_config)
message(STATUS "${opt_name}: ${opt_value}") message(STATUS "${opt_name}: ${opt_value}")
set(${opt_name} ${opt_value}) set(${opt_name} ${opt_value})
endforeach() endforeach()
generate_config_doc(${main_config_file} ${LIBC_SOURCE_DIR}/docs/configure.rst)
load_libc_config(${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/config.json ${cmd_line_conf}) load_libc_config(${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/config.json ${cmd_line_conf})
load_libc_config(${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_ARCHITECTURE}/config.json ${cmd_line_conf}) load_libc_config(${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_ARCHITECTURE}/config.json ${cmd_line_conf})

View File

@ -47,7 +47,6 @@ function(read_libc_config config_file opt_list)
# to load. If there are no config options, it is better to remove that # to load. If there are no config options, it is better to remove that
# config.json file instead of including an empty file. # config.json file instead of including an empty file.
message(FATAL_ERROR "${config_file}: Does not contain any config option groups") message(FATAL_ERROR "${config_file}: Does not contain any config option groups")
return()
endif() endif()
math(EXPR group_count_1 "${group_count} - 1") math(EXPR group_count_1 "${group_count} - 1")
@ -135,3 +134,84 @@ function(load_libc_config config_file)
set(${opt_name} ${opt_value} PARENT_SCOPE) set(${opt_name} ${opt_value} PARENT_SCOPE)
endforeach() endforeach()
endfunction() endfunction()
function(generate_config_doc config_file doc_file)
if(NOT EXISTS ${config_file})
message(FATAL_ERROR "${config_file} does not exist")
endif()
file(READ ${config_file} json_config)
string(JSON group_count ERROR_VARIABLE json_error LENGTH ${json_config})
if(json_error)
message(FATAL_ERROR "${config_file}: ${json_error}")
endif()
if(${group_count} EQUAL 0)
message(FATAL_ERROR "${config_file}: Does not contain any config option groups")
endif()
math(EXPR group_count_1 "${group_count} - 1")
set(doc_string ".. _configure:\n"
"..\n"
" Do not edit this file directly. CMake will auto generate it.\n"
" If the changes are intended, add this file to your commit.\n"
"\n"
"==========================\n"
"Configure Options\n"
"==========================\n"
"\n"
"Below is the full set of options one can use to configure the libc build.\n"
"An option can be given an explicit value on the CMake command line using\n"
"the following syntax:\n"
"\n"
".. code-block:: sh\n"
"\n"
" $> cmake <other build options> -D<libc config option name>=<option value> <more options>\n"
"\n"
"For example:\n"
"\n"
".. code-block:: sh\n"
"\n"
" $> cmake <other build options> -DLIBC_CONF_PRINTF_DISABLE_FLOAT=ON <more options>\n"
"\n"
"See the main ``config/config.json``, and the platform and architecture specific\n"
"overrides in ``config/<platform>/config.json`` and ``config/<platform>/<arch>/config.json,``\n"
"to learn about the defaults for your platform and target.\n"
"\n")
foreach(group_num RANGE ${group_count_1})
string(JSON group_name ERROR_VARIABLE json_error MEMBER ${json_config} ${group_num})
if(json_error)
message(FATAL_ERROR "${config_file}: ${json_error}")
endif()
string(APPEND doc_string "* **\"${group_name}\" options**\n")
string(JSON option_map ERROR_VARIABLE json_error GET ${json_config} ${group_name})
if(json_error)
message(FATAL_ERROR ${json_error})
endif()
string(JSON option_count ERROR_VARIABLE jsor_error LENGTH ${option_map})
if(json_error)
message(FATAL_ERROR ${json_error})
endif()
if(${option_count} EQUAL 0)
message(FATAL_ERROR "${config_file}: No options listed against the config option group '${group_name}'")
endif()
math(EXPR option_count_1 "${option_count} - 1")
foreach(opt_num RANGE ${option_count_1})
string(JSON option_name ERROR_VARIABLE json_error MEMBER ${option_map} ${opt_num})
if(json_error)
message(FATAL_ERROR ${json_error})
endif()
string(JSON opt_object ERROR_VARIABLE json_error GET ${option_map} ${option_name})
if(json_error)
message(FATAL_ERROR "Error generating ${doc_file}: ${json_error}\n${opt_object}")
endif()
string(JSON opt_doc ERROR_VARIABLE json_error GET ${opt_object} "doc")
if(json_error)
message(FATAL_ERROR "Error generating ${doc_file}: ${json_error}")
endif()
string(APPEND doc_string " - ``${option_name}``: ${opt_doc}\n")
endforeach()
endforeach()
message(STATUS "Writing config doc to ${doc_file}")
file(WRITE ${doc_file} ${doc_string})
endfunction()

31
libc/docs/configure.rst Normal file
View File

@ -0,0 +1,31 @@
.. _configure:
..
Do not edit this file directly. CMake will auto generate it.
If the changes are intended, add this file to your commit.
==========================
Configure Options
==========================
Below is the full set of options one can use to configure the libc build.
An option can be given an explicit value on the CMake command line using
the following syntax:
.. code-block:: sh
$> cmake <other build options> -D<libc config option name>=<option value> <more options>
For example:
.. code-block:: sh
$> cmake <other build options> -DLIBC_CONF_PRINTF_DISABLE_FLOAT=ON <more options>
See the main ``config/config.json``, and the platform and architecture specific
overrides in ``config/<platform>/config.json`` and ``config/<platform>/<arch>/config.json,``
to learn about the defaults for your platform and target.
* **"printf" options**
- ``LIBC_CONF_PRINTF_DISABLE_FLOAT``: Disable printing floating point values in printf and friends.
- ``LIBC_CONF_PRINTF_DISABLE_INDEX_MODE``: Disable index mode in the printf format string.
- ``LIBC_CONF_PRINTF_DISABLE_WRITE_INT``: Disable handling of %n in printf format string.

View File

@ -52,6 +52,7 @@ stages there is no ABI stability in any form.
usage_modes usage_modes
overlay_mode overlay_mode
fullbuild_mode fullbuild_mode
configure
gpu/index.rst gpu/index.rst
.. toctree:: .. toctree::