|  | ======================================================= | 
|  | Capturing configuration information during installation | 
|  | ======================================================= | 
|  |  | 
|  | .. contents:: | 
|  | :local: | 
|  |  | 
|  | The Problem | 
|  | =========== | 
|  |  | 
|  | Currently the libc++ supports building the library with a number of different | 
|  | configuration options.  Unfortunately all of that configuration information is | 
|  | lost when libc++ is installed. In order to support "persistent" | 
|  | configurations libc++ needs a mechanism to capture the configuration options | 
|  | in the INSTALLED headers. | 
|  |  | 
|  |  | 
|  | Design Goals | 
|  | ============ | 
|  |  | 
|  | * The solution should not INSTALL any additional headers. We don't want an extra | 
|  | #include slowing everybody down. | 
|  |  | 
|  | * The solution should not unduly affect libc++ developers. The problem is limited | 
|  | to installed versions of libc++ and the solution should be as well. | 
|  |  | 
|  | * The solution should not modify any existing headers EXCEPT during installation. | 
|  | It makes developers lives harder if they have to regenerate the libc++ headers | 
|  | every time they are modified. | 
|  |  | 
|  | * The solution should not make any of the libc++ headers dependant on | 
|  | files generated by the build system. The headers should be able to compile | 
|  | out of the box without any modification. | 
|  |  | 
|  | * The solution should not have ANY effect on users who don't need special | 
|  | configuration options. The vast majority of users will never need this so it | 
|  | shouldn't cost them. | 
|  |  | 
|  |  | 
|  | The Solution | 
|  | ============ | 
|  |  | 
|  | When you first configure libc++ using CMake we check to see if we need to | 
|  | capture any options. If we haven't been given any "persistent" options then | 
|  | we do NOTHING. | 
|  |  | 
|  | Otherwise we create a custom installation rule that modifies the installed __config | 
|  | header. The rule first generates a dummy "__config_site" header containing the required | 
|  | #defines. The contents of the dummy header are then prependend to the installed | 
|  | __config header. By manually prepending the files we avoid the cost of an | 
|  | extra #include and we allow the __config header to be ignorant of the extra | 
|  | configuration all together. An example "__config" header generated when | 
|  | -DLIBCXX_ENABLE_THREADS=OFF is given to CMake would look something like: | 
|  |  | 
|  | .. code-block:: cpp | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is dual licensed under the MIT and the University of Illinois Open | 
|  | // Source Licenses. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef _LIBCPP_CONFIG_SITE | 
|  | #define _LIBCPP_CONFIG_SITE | 
|  |  | 
|  | /* #undef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE */ | 
|  | /* #undef _LIBCPP_HAS_NO_STDIN */ | 
|  | /* #undef _LIBCPP_HAS_NO_STDOUT */ | 
|  | #define _LIBCPP_HAS_NO_THREADS | 
|  | /* #undef _LIBCPP_HAS_NO_MONOTONIC_CLOCK */ | 
|  | /* #undef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS */ | 
|  |  | 
|  | #endif | 
|  | // -*- C++ -*- | 
|  | //===--------------------------- __config ---------------------------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is dual licensed under the MIT and the University of Illinois Open | 
|  | // Source Licenses. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef _LIBCPP_CONFIG | 
|  | #define _LIBCPP_CONFIG |