Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions libc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ foreach(opt IN LISTS global_config)
message(STATUS "${opt_name}: ${opt_value}")
set(${opt_name} ${opt_value})
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}/${LIBC_TARGET_ARCHITECTURE}/config.json ${cmd_line_conf})

Expand Down
82 changes: 81 additions & 1 deletion libc/cmake/modules/LibcConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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
# config.json file instead of including an empty file.
message(FATAL_ERROR "${config_file}: Does not contain any config option groups")
return()
endif()
math(EXPR group_count_1 "${group_count} - 1")

Expand Down Expand Up @@ -135,3 +134,84 @@ function(load_libc_config config_file)
set(${opt_name} ${opt_value} PARENT_SCOPE)
endforeach()
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 changes: 31 additions & 0 deletions libc/docs/configure.rst
Original file line number Diff line number Diff line change
@@ -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.
1 change: 1 addition & 0 deletions libc/docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ stages there is no ABI stability in any form.
usage_modes
overlay_mode
fullbuild_mode
configure
gpu/index.rst

.. toctree::
Expand Down