1 1.1 joerg =================== 2 1.1 joerg Feature Test Macros 3 1.1 joerg =================== 4 1.1 joerg 5 1.1 joerg .. contents:: 6 1.1 joerg :local: 7 1.1 joerg 8 1.1 joerg Overview 9 1.1 joerg ======== 10 1.1 joerg 11 1.1 joerg Libc++ implements the C++ feature test macros as specified in the C++20 standard, 12 1.1 joerg and before that in non-normative guiding documents 13 1.1 joerg (`See cppreference <https://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros>`_) 14 1.1 joerg 15 1.1 joerg 16 1.1 joerg Design 17 1.1 joerg ====== 18 1.1 joerg 19 1.1 joerg Feature test macros are tricky to track, implement, test, and document correctly. 20 1.1 joerg They must be available from a list of headers, they may have different values in 21 1.1 joerg different dialects, and they may or may not be implemented by libc++. In order to 22 1.1 joerg track all of these conditions correctly and easily, we want a Single Source of 23 1.1 joerg Truth (SSoT) that defines each feature test macro, its values, the headers it 24 1.1 joerg lives in, and whether or not is is implemented by libc++. From this SSoA we 25 1.1 joerg have enough information to automatically generate the `<version>` header, 26 1.1 joerg the tests, and the documentation. 27 1.1 joerg 28 1.1 joerg Therefore we maintain a SSoA in `libcxx/utils/generate_feature_test_macro_components.py` 29 1.1 joerg which doubles as a script to generate the following components: 30 1.1 joerg 31 1.1 joerg * The `<version>` header. 32 1.1 joerg * The version tests under `support.limits.general`. 33 1.1 joerg * Documentation of libc++'s implementation of each macro. 34 1.1 joerg 35 1.1 joerg Usage 36 1.1 joerg ===== 37 1.1 joerg 38 1.1 joerg The `generate_feature_test_macro_components.py` script is used to track and 39 1.1 joerg update feature test macros in libc++. 40 1.1 joerg 41 1.1 joerg Whenever a feature test macro is added or changed, the table should be updated 42 1.1 joerg and the script should be re-ran. The script will clobber the existing test files, 43 1.1 joerg the documentation and the `<version>` header. 44