|
@@ -0,0 +1,88 @@
|
|
|
+=======================================================
|
|
|
+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
|