Generating Public and Internal headers


This page is severely out of date. Much of the information it contains may be incorrect. Please only remove this warning once the page has been updated.

Other libc implementations make use of preprocessor macro tricks to make header files platform agnostic. When macros aren’t suitable, they rely on build system tricks to pick the right set of files to compile and export. While these approaches have served them well, parts of their systems have become extremely complicated making it hard to modify, extend or maintain. To avoid these problems in llvm-libc, we use a header generation mechanism. The mechanism is driven by a header configuration language.

Header Configuration Language

Header configuration language consists of few special commands. The header generation mechanism takes an input file, which has an extension of .h.def, and produces a header file with .h extension. The header configuration language commands are listed in the input .h.def file. While reading a .h.def file, the header generation tool does two things:

  1. Copy the lines not containing commands as is into the output .h file.

  2. Replace the line on which a command occurs with some other text as directed by the command. The replacement text can span multiple lines.

Command syntax

A command should be listed on a line by itself, and should not span more than one line. The first token to appear on the line is the command name prefixed with %%. For example, a line with the include_file command should start with %%include_file. There can be indentation spaces before the %% prefix.

Most commands typically take arguments. They are listed as a comma separated list of named identifiers within parenthesis, similar to the C function call syntax. Before performing the action corresponding to the command, the header generator replaces the arguments with concrete values.

Argument Syntax

Arguments are named indentifiers but prefixed with $ and enclosed in { and }. For example, ${path_to_constants}.


There can be cases wherein one wants to add comments in the .h.def file but does not want them to be copied into the generated header file. Such comments can be added by beginning the comment lines with the <!> prefix. Currently, comments have to be on lines of their own. That is, they cannot be suffixes like this:

` %%include_file(a/b/c) <!> Path to c in b of a.  !!! WRONG SYNTAX `

Available Commands

Sub-sections below describe the commands currently available. Under each command is the description of the arguments to the command, and the action taken by the header generation tool when processing a command.


This is a replacement command which should be listed in an input .h.def file.


  • path argument - An argument representing a path to a file. The file should have an extension of


This command instructs that the line on which the command appears should be replaced by the contents of the file whose path is passed as argument to the command.


This is not a replacement command. It is an error to list it in the input .h.def file. It is normally listed in the files included by the include_file command (the files). A common use of this command it mark the beginning of what is to be included. This prevents copying items like license headers into the generated header file.




The header generator will only include content starting from the line after the line on which this command is listed.


This is a replacement command which should be listed in an input .h.def file. The header file generator will replace this command with the public API of the target platform. See the build system document for more information on the relevant build rules. Also, see “Mechanics of public_api” to learn the mechanics of how the header generator replaces this command with the public API.




The header generator will replace this command with the public API to be exposed from the generated header file.