You've already forked linux-packaging-mono
acceptance-tests
data
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
bdwgc
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
helix-binaries
ikdasm
ikvm
illinker-test-assets
linker
llvm-project
clang
clang-tools-extra
compiler-rt
eng
libcxx
benchmarks
cmake
docs
DesignDocs
ABIVersioning.rst
AvailabilityMarkup.rst
CapturingConfigInfo.rst
DebugMode.rst
ThreadingSupportAPI.rst
VisibilityMacros.rst
BuildingLibcxx.rst
CMakeLists.txt
Makefile.sphinx
README.txt
TestingLibcxx.rst
UsingLibcxx.rst
conf.py
index.rst
fuzzing
include
lib
src
utils
www
.arcconfig
.clang-format
.gitignore
CMakeLists.txt
CREDITS.TXT
LICENSE.TXT
NOTES.TXT
TODO.TXT
appveyor-reqs-install.cmd
appveyor.yml
libcxxabi
libunwind
lld
lldb
llvm
nuget
openmp
polly
Directory.Build.props
Directory.Build.targets
NuGet.config
azure-pipelines.yml
build.cmd
build.sh
dir.common.props
global.json
llvm.proj
mxe-Win64.cmake.in
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
how-to-bump-roslyn-binaries.md
ikvm-native
llvm
m4
man
mcs
mono
msvc
netcore
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
89 lines
3.2 KiB
ReStructuredText
89 lines
3.2 KiB
ReStructuredText
![]() |
=======================================================
|
||
|
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
|