[libc-commits] [libc] [libc] Generate configure.rst from the JSON config information. (PR #65791)
Siva Chandra via libc-commits
libc-commits at lists.llvm.org
Fri Sep 8 13:05:28 PDT 2023
https://github.com/sivachandra updated https://github.com/llvm/llvm-project/pull/65791:
>From b90fced3e1fa2a5850c991a14126875f29440434 Mon Sep 17 00:00:00 2001
From: Siva Chandra Reddy <sivachandra at google.com>
Date: Fri, 8 Sep 2023 11:19:01 -0700
Subject: [PATCH 1/2] [libc] Generate configure.rst from the JSON config
information.
---
libc/CMakeLists.txt | 1 +
libc/cmake/modules/LibcConfig.cmake | 82 +++++++++++++++++++++++++++++
libc/docs/configure.rst | 31 +++++++++++
libc/docs/index.rst | 1 +
4 files changed, 115 insertions(+)
create mode 100644 libc/docs/configure.rst
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index 0665cf0f7a1d900..12fff25c197e2d9 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -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})
diff --git a/libc/cmake/modules/LibcConfig.cmake b/libc/cmake/modules/LibcConfig.cmake
index a9c69de8a310a9b..000e471704bf7b7 100644
--- a/libc/cmake/modules/LibcConfig.cmake
+++ b/libc/cmake/modules/LibcConfig.cmake
@@ -135,3 +135,85 @@ 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")
+ return()
+ 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()
diff --git a/libc/docs/configure.rst b/libc/docs/configure.rst
new file mode 100644
index 000000000000000..9b4d6034129351d
--- /dev/null
+++ b/libc/docs/configure.rst
@@ -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.
diff --git a/libc/docs/index.rst b/libc/docs/index.rst
index 5e9a602b5a96af4..6d36351b7ce1fc4 100644
--- a/libc/docs/index.rst
+++ b/libc/docs/index.rst
@@ -52,6 +52,7 @@ stages there is no ABI stability in any form.
usage_modes
overlay_mode
fullbuild_mode
+ configure
gpu/index.rst
.. toctree::
>From 093bfefef0ee7cb417268ea084301acdb8a5c67f Mon Sep 17 00:00:00 2001
From: Siva Chandra Reddy <sivachandra at google.com>
Date: Fri, 8 Sep 2023 11:19:01 -0700
Subject: [PATCH 2/2] [libc] Generate configure.rst from the JSON config
information.
---
libc/cmake/modules/LibcConfig.cmake | 2 --
1 file changed, 2 deletions(-)
diff --git a/libc/cmake/modules/LibcConfig.cmake b/libc/cmake/modules/LibcConfig.cmake
index 000e471704bf7b7..7a3e6066b3cc06e 100644
--- a/libc/cmake/modules/LibcConfig.cmake
+++ b/libc/cmake/modules/LibcConfig.cmake
@@ -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")
@@ -147,7 +146,6 @@ function(generate_config_doc config_file doc_file)
endif()
if(${group_count} EQUAL 0)
message(FATAL_ERROR "${config_file}: Does not contain any config option groups")
- return()
endif()
math(EXPR group_count_1 "${group_count} - 1")
More information about the libc-commits
mailing list