annotate libcxx/docs/BuildingLibcxx.rst @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 0572611fdcc8
children 5f17cb93ff66
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 .. _BuildingLibcxx:
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 ===============
anatofuz
parents:
diff changeset
4 Building libc++
anatofuz
parents:
diff changeset
5 ===============
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7 .. contents::
anatofuz
parents:
diff changeset
8 :local:
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 .. _build instructions:
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 Getting Started
anatofuz
parents:
diff changeset
13 ===============
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 On Mac OS 10.7 (Lion) and later, the easiest way to get this library is to install
anatofuz
parents:
diff changeset
16 Xcode 4.2 or later. However if you want to install tip-of-trunk from here
anatofuz
parents:
diff changeset
17 (getting the bleeding edge), read on.
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 The following instructions describe how to checkout, build, test and
anatofuz
parents:
diff changeset
20 (optionally) install libc++ and libc++abi.
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 If your system already provides a libc++ installation it is important to be
anatofuz
parents:
diff changeset
23 careful not to replace it. Remember Use the CMake option
anatofuz
parents:
diff changeset
24 ``CMAKE_INSTALL_PREFIX`` to select a safe place to install libc++.
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 .. warning::
anatofuz
parents:
diff changeset
27 * Replacing your systems libc++ installation could render the system non-functional.
anatofuz
parents:
diff changeset
28 * macOS will not boot without a valid copy of ``libc++.1.dylib`` in ``/usr/lib``.
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 .. code-block:: bash
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 $ git clone https://github.com/llvm/llvm-project.git
anatofuz
parents:
diff changeset
33 $ cd llvm-project
anatofuz
parents:
diff changeset
34 $ mkdir build && cd build
anatofuz
parents:
diff changeset
35 $ cmake -DCMAKE_C_COMPILER=clang \
anatofuz
parents:
diff changeset
36 -DCMAKE_CXX_COMPILER=clang++ \
anatofuz
parents:
diff changeset
37 -DLLVM_ENABLE_PROJECTS="libcxx;libcxxabi" \
anatofuz
parents:
diff changeset
38 ../llvm
anatofuz
parents:
diff changeset
39 $ make # Build
anatofuz
parents:
diff changeset
40 $ make check-cxx # Test
anatofuz
parents:
diff changeset
41 $ make install-cxx install-cxxabi # Install
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 For more information about configuring libc++ see :ref:`CMake Options`. You may
anatofuz
parents:
diff changeset
44 also want to read the `LLVM getting started
anatofuz
parents:
diff changeset
45 <https://llvm.org/docs/GettingStarted.html>`_ documentation.
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 Shared libraries for libc++ and libc++ abi should now be present in
anatofuz
parents:
diff changeset
48 ``build/lib``. See :ref:`using an alternate libc++ installation <alternate
anatofuz
parents:
diff changeset
49 libcxx>` for information on how to use this libc++.
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 The instructions are for building libc++ on
anatofuz
parents:
diff changeset
52 FreeBSD, Linux, or Mac using `libc++abi`_ as the C++ ABI library.
anatofuz
parents:
diff changeset
53 On Linux, it is also possible to use :ref:`libsupc++ <libsupcxx>` or libcxxrt.
anatofuz
parents:
diff changeset
54
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
55 It is possible to build libc++ standalone (i.e. without building other LLVM
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
56 projects). A standalone build would look like this:
150
anatofuz
parents:
diff changeset
57
anatofuz
parents:
diff changeset
58 .. code-block:: bash
anatofuz
parents:
diff changeset
59
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
60 $ git clone https://github.com/llvm/llvm-project.git llvm-project
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
61 $ cd llvm-project
150
anatofuz
parents:
diff changeset
62 $ mkdir build && cd build
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
63 $ cmake -DCMAKE_C_COMPILER=clang \
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
64 -DCMAKE_CXX_COMPILER=clang++ \
150
anatofuz
parents:
diff changeset
65 -DLIBCXX_CXX_ABI=libcxxabi \
anatofuz
parents:
diff changeset
66 -DLIBCXX_CXX_ABI_INCLUDE_PATHS=path/to/separate/libcxxabi/include \
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
67 ../libcxx
150
anatofuz
parents:
diff changeset
68 $ make
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
69 $ make check-cxx # optional
150
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
72 Support for Windows
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
73 -------------------
150
anatofuz
parents:
diff changeset
74
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
75 libcxx supports being built with clang-cl, but not with MSVC's cl.exe, as
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
76 cl doesn't support the ``#include_next`` extension. Furthermore, VS 2017 or
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
77 newer (19.14) is required.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
79 libcxx also supports being built with clang targeting MinGW environments.
150
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 CMake + Visual Studio
anatofuz
parents:
diff changeset
82 ~~~~~~~~~~~~~~~~~~~~~
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 Building with Visual Studio currently does not permit running tests. However,
anatofuz
parents:
diff changeset
85 it is the simplest way to build.
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 .. code-block:: batch
anatofuz
parents:
diff changeset
88
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
89 > cmake -G "Visual Studio 16 2019" ^
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
90 -T "ClangCL" ^
150
anatofuz
parents:
diff changeset
91 -DLIBCXX_ENABLE_SHARED=YES ^
anatofuz
parents:
diff changeset
92 -DLIBCXX_ENABLE_STATIC=NO ^
anatofuz
parents:
diff changeset
93 -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=NO ^
anatofuz
parents:
diff changeset
94 \path\to\libcxx
anatofuz
parents:
diff changeset
95 > cmake --build .
anatofuz
parents:
diff changeset
96
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
97 CMake + ninja (MSVC)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
98 ~~~~~~~~~~~~~~~~~~~~
150
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 Building with ninja is required for development to enable tests.
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
101 A couple of tests require Bash to be available, and a couple dozens
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
102 of tests require other posix tools (cp, grep and similar - LLVM's tests
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
103 require the same). Without those tools the vast majority of tests
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
104 can still be ran successfully.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
105
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
106 If Git for Windows is available, that can be used to provide the bash
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
107 shell by adding the right bin directory to the path, e.g.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
108 ``set PATH=%PATH%;C:\Program Files\Git\usr\bin``.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
109
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
110 Alternatively, one can also choose to run the whole build in a MSYS2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
111 shell. That can be set up e.g. by starting a Visual Studio Tools Command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
112 Prompt (for getting the environment variables pointing to the headers and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
113 import libraries), and making sure that clang-cl is available in the
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
114 path. From there, launch an MSYS2 shell via e.g.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
115 ``C:\msys64\msys2_shell.cmd -full-path -mingw64`` (preserving the earlier
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
116 environment, allowing the MSVC headers/libraries and clang-cl to be found).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
117
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
118 In either case, then run:
150
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 .. code-block:: batch
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 > cmake -G Ninja ^
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
123 -DCMAKE_BUILD_TYPE=Release ^
150
anatofuz
parents:
diff changeset
124 -DCMAKE_C_COMPILER=clang-cl ^
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
125 -DCMAKE_CXX_COMPILER=clang-cl ^
150
anatofuz
parents:
diff changeset
126 -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=NO ^
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
127 path/to/libcxx
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
128 > ninja cxx
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
129 > ninja check-cxx
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
130
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
131 If you are running in an MSYS2 shell and you have installed the
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
132 MSYS2-provided clang package (which defaults to a non-MSVC target), you
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
133 should add e.g. ``-DLIBCXX_TARGET_TRIPLE=x86_64-windows-msvc`` (replacing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
134 ``x86_64`` with the architecture you're targeting) to the ``cmake`` command
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
135 line above. This will instruct ``check-cxx`` to use the right target triple
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
136 when invoking ``clang++``.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
137
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
138 Also note that if not building in Release mode, a failed assert in the tests
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
139 pops up a blocking dialog box, making it hard to run a larger number of tests.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
140
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
141 CMake + ninja (MinGW)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
142 ~~~~~~~~~~~~~~~~~~~~~
150
anatofuz
parents:
diff changeset
143
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
144 libcxx can also be built in MinGW environments, e.g. with the MinGW
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
145 compilers in MSYS2. This requires clang to be available (installed with
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
146 e.g. the ``mingw-w64-x86_64-clang`` package), together with CMake and ninja.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
147
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
148 .. code-block:: bash
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
149
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
150 > cmake -G Ninja \
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
151 -DCMAKE_C_COMPILER=clang \
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
152 -DCMAKE_CXX_COMPILER=clang++ \
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
153 -DLIBCXX_HAS_WIN32_THREAD_API=ON \
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
154 -DLIBCXX_CXX_ABI=libstdc++ \
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
155 -DLIBCXX_TARGET_INFO="libcxx.test.target_info.MingwLocalTI" \
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
156 path/to/libcxx
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
157 > ninja cxx
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
158 > cp /mingw64/bin/{libstdc++-6,libgcc_s_seh-1,libwinpthread-1}.dll lib
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
159 > ninja check-cxx
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
160
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
161 As this build configuration ends up depending on a couple other DLLs that
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
162 aren't available in path while running tests, copy them into the same
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
163 directory as the tested libc++ DLL.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
164
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
165 (Building a libc++ that depends on libstdc++ isn't necessarily a config one
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
166 would want to deploy, but it simplifies the config for testing purposes.)
150
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 .. _`libc++abi`: http://libcxxabi.llvm.org/
anatofuz
parents:
diff changeset
169
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 .. _CMake Options:
anatofuz
parents:
diff changeset
172
anatofuz
parents:
diff changeset
173 CMake Options
anatofuz
parents:
diff changeset
174 =============
anatofuz
parents:
diff changeset
175
anatofuz
parents:
diff changeset
176 Here are some of the CMake variables that are used often, along with a
anatofuz
parents:
diff changeset
177 brief explanation and LLVM-specific notes. For full documentation, check the
anatofuz
parents:
diff changeset
178 CMake docs or execute ``cmake --help-variable VARIABLE_NAME``.
anatofuz
parents:
diff changeset
179
anatofuz
parents:
diff changeset
180 **CMAKE_BUILD_TYPE**:STRING
anatofuz
parents:
diff changeset
181 Sets the build type for ``make`` based generators. Possible values are
anatofuz
parents:
diff changeset
182 Release, Debug, RelWithDebInfo and MinSizeRel. On systems like Visual Studio
anatofuz
parents:
diff changeset
183 the user sets the build type with the IDE settings.
anatofuz
parents:
diff changeset
184
anatofuz
parents:
diff changeset
185 **CMAKE_INSTALL_PREFIX**:PATH
anatofuz
parents:
diff changeset
186 Path where LLVM will be installed if "make install" is invoked or the
anatofuz
parents:
diff changeset
187 "INSTALL" target is built.
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 **CMAKE_CXX_COMPILER**:STRING
anatofuz
parents:
diff changeset
190 The C++ compiler to use when building and testing libc++.
anatofuz
parents:
diff changeset
191
anatofuz
parents:
diff changeset
192
anatofuz
parents:
diff changeset
193 .. _libcxx-specific options:
anatofuz
parents:
diff changeset
194
anatofuz
parents:
diff changeset
195 libc++ specific options
anatofuz
parents:
diff changeset
196 -----------------------
anatofuz
parents:
diff changeset
197
anatofuz
parents:
diff changeset
198 .. option:: LIBCXX_INSTALL_LIBRARY:BOOL
anatofuz
parents:
diff changeset
199
anatofuz
parents:
diff changeset
200 **Default**: ``ON``
anatofuz
parents:
diff changeset
201
anatofuz
parents:
diff changeset
202 Toggle the installation of the library portion of libc++.
anatofuz
parents:
diff changeset
203
anatofuz
parents:
diff changeset
204 .. option:: LIBCXX_INSTALL_HEADERS:BOOL
anatofuz
parents:
diff changeset
205
anatofuz
parents:
diff changeset
206 **Default**: ``ON``
anatofuz
parents:
diff changeset
207
anatofuz
parents:
diff changeset
208 Toggle the installation of the libc++ headers.
anatofuz
parents:
diff changeset
209
anatofuz
parents:
diff changeset
210 .. option:: LIBCXX_ENABLE_ASSERTIONS:BOOL
anatofuz
parents:
diff changeset
211
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
212 **Default**: ``OFF``
150
anatofuz
parents:
diff changeset
213
anatofuz
parents:
diff changeset
214 Build libc++ with assertions enabled.
anatofuz
parents:
diff changeset
215
anatofuz
parents:
diff changeset
216 .. option:: LIBCXX_BUILD_32_BITS:BOOL
anatofuz
parents:
diff changeset
217
anatofuz
parents:
diff changeset
218 **Default**: ``OFF``
anatofuz
parents:
diff changeset
219
anatofuz
parents:
diff changeset
220 Build libc++ as a 32 bit library. Also see `LLVM_BUILD_32_BITS`.
anatofuz
parents:
diff changeset
221
anatofuz
parents:
diff changeset
222 .. option:: LIBCXX_ENABLE_SHARED:BOOL
anatofuz
parents:
diff changeset
223
anatofuz
parents:
diff changeset
224 **Default**: ``ON``
anatofuz
parents:
diff changeset
225
anatofuz
parents:
diff changeset
226 Build libc++ as a shared library. Either `LIBCXX_ENABLE_SHARED` or
anatofuz
parents:
diff changeset
227 `LIBCXX_ENABLE_STATIC` has to be enabled.
anatofuz
parents:
diff changeset
228
anatofuz
parents:
diff changeset
229 .. option:: LIBCXX_ENABLE_STATIC:BOOL
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 **Default**: ``ON``
anatofuz
parents:
diff changeset
232
anatofuz
parents:
diff changeset
233 Build libc++ as a static library. Either `LIBCXX_ENABLE_SHARED` or
anatofuz
parents:
diff changeset
234 `LIBCXX_ENABLE_STATIC` has to be enabled.
anatofuz
parents:
diff changeset
235
anatofuz
parents:
diff changeset
236 .. option:: LIBCXX_LIBDIR_SUFFIX:STRING
anatofuz
parents:
diff changeset
237
anatofuz
parents:
diff changeset
238 Extra suffix to append to the directory where libraries are to be installed.
anatofuz
parents:
diff changeset
239 This option overrides `LLVM_LIBDIR_SUFFIX`.
anatofuz
parents:
diff changeset
240
anatofuz
parents:
diff changeset
241 .. option:: LIBCXX_HERMETIC_STATIC_LIBRARY:BOOL
anatofuz
parents:
diff changeset
242
anatofuz
parents:
diff changeset
243 **Default**: ``OFF``
anatofuz
parents:
diff changeset
244
anatofuz
parents:
diff changeset
245 Do not export any symbols from the static libc++ library.
anatofuz
parents:
diff changeset
246 This is useful when the static libc++ library is being linked into shared
anatofuz
parents:
diff changeset
247 libraries that may be used in with other shared libraries that use different
anatofuz
parents:
diff changeset
248 C++ library. We want to avoid exporting any libc++ symbols in that case.
anatofuz
parents:
diff changeset
249
anatofuz
parents:
diff changeset
250 .. option:: LIBCXX_ENABLE_FILESYSTEM:BOOL
anatofuz
parents:
diff changeset
251
anatofuz
parents:
diff changeset
252 **Default**: ``ON`` except on Windows.
anatofuz
parents:
diff changeset
253
anatofuz
parents:
diff changeset
254 This option can be used to enable or disable the filesystem components on
anatofuz
parents:
diff changeset
255 platforms that may not support them. For example on Windows.
anatofuz
parents:
diff changeset
256
anatofuz
parents:
diff changeset
257 .. _libc++experimental options:
anatofuz
parents:
diff changeset
258
anatofuz
parents:
diff changeset
259 libc++experimental Specific Options
anatofuz
parents:
diff changeset
260 ------------------------------------
anatofuz
parents:
diff changeset
261
anatofuz
parents:
diff changeset
262 .. option:: LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY:BOOL
anatofuz
parents:
diff changeset
263
anatofuz
parents:
diff changeset
264 **Default**: ``ON``
anatofuz
parents:
diff changeset
265
anatofuz
parents:
diff changeset
266 Build and test libc++experimental.a.
anatofuz
parents:
diff changeset
267
anatofuz
parents:
diff changeset
268 .. option:: LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY:BOOL
anatofuz
parents:
diff changeset
269
anatofuz
parents:
diff changeset
270 **Default**: ``LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY AND LIBCXX_INSTALL_LIBRARY``
anatofuz
parents:
diff changeset
271
anatofuz
parents:
diff changeset
272 Install libc++experimental.a alongside libc++.
anatofuz
parents:
diff changeset
273
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275 .. _ABI Library Specific Options:
anatofuz
parents:
diff changeset
276
anatofuz
parents:
diff changeset
277 ABI Library Specific Options
anatofuz
parents:
diff changeset
278 ----------------------------
anatofuz
parents:
diff changeset
279
anatofuz
parents:
diff changeset
280 .. option:: LIBCXX_CXX_ABI:STRING
anatofuz
parents:
diff changeset
281
anatofuz
parents:
diff changeset
282 **Values**: ``none``, ``libcxxabi``, ``libcxxrt``, ``libstdc++``, ``libsupc++``.
anatofuz
parents:
diff changeset
283
anatofuz
parents:
diff changeset
284 Select the ABI library to build libc++ against.
anatofuz
parents:
diff changeset
285
anatofuz
parents:
diff changeset
286 .. option:: LIBCXX_CXX_ABI_INCLUDE_PATHS:PATHS
anatofuz
parents:
diff changeset
287
anatofuz
parents:
diff changeset
288 Provide additional search paths for the ABI library headers.
anatofuz
parents:
diff changeset
289
anatofuz
parents:
diff changeset
290 .. option:: LIBCXX_CXX_ABI_LIBRARY_PATH:PATH
anatofuz
parents:
diff changeset
291
anatofuz
parents:
diff changeset
292 Provide the path to the ABI library that libc++ should link against.
anatofuz
parents:
diff changeset
293
anatofuz
parents:
diff changeset
294 .. option:: LIBCXX_ENABLE_STATIC_ABI_LIBRARY:BOOL
anatofuz
parents:
diff changeset
295
anatofuz
parents:
diff changeset
296 **Default**: ``OFF``
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 If this option is enabled, libc++ will try and link the selected ABI library
anatofuz
parents:
diff changeset
299 statically.
anatofuz
parents:
diff changeset
300
anatofuz
parents:
diff changeset
301 .. option:: LIBCXX_ENABLE_ABI_LINKER_SCRIPT:BOOL
anatofuz
parents:
diff changeset
302
anatofuz
parents:
diff changeset
303 **Default**: ``ON`` by default on UNIX platforms other than Apple unless
anatofuz
parents:
diff changeset
304 'LIBCXX_ENABLE_STATIC_ABI_LIBRARY' is ON. Otherwise the default value is ``OFF``.
anatofuz
parents:
diff changeset
305
anatofuz
parents:
diff changeset
306 This option generate and installs a linker script as ``libc++.so`` which
anatofuz
parents:
diff changeset
307 links the correct ABI library.
anatofuz
parents:
diff changeset
308
anatofuz
parents:
diff changeset
309 .. option:: LIBCXXABI_USE_LLVM_UNWINDER:BOOL
anatofuz
parents:
diff changeset
310
anatofuz
parents:
diff changeset
311 **Default**: ``OFF``
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 Build and use the LLVM unwinder. Note: This option can only be used when
anatofuz
parents:
diff changeset
314 libc++abi is the C++ ABI library used.
anatofuz
parents:
diff changeset
315
anatofuz
parents:
diff changeset
316
anatofuz
parents:
diff changeset
317 libc++ Feature Options
anatofuz
parents:
diff changeset
318 ----------------------
anatofuz
parents:
diff changeset
319
anatofuz
parents:
diff changeset
320 .. option:: LIBCXX_ENABLE_EXCEPTIONS:BOOL
anatofuz
parents:
diff changeset
321
anatofuz
parents:
diff changeset
322 **Default**: ``ON``
anatofuz
parents:
diff changeset
323
anatofuz
parents:
diff changeset
324 Build libc++ with exception support.
anatofuz
parents:
diff changeset
325
anatofuz
parents:
diff changeset
326 .. option:: LIBCXX_ENABLE_RTTI:BOOL
anatofuz
parents:
diff changeset
327
anatofuz
parents:
diff changeset
328 **Default**: ``ON``
anatofuz
parents:
diff changeset
329
anatofuz
parents:
diff changeset
330 Build libc++ with run time type information.
anatofuz
parents:
diff changeset
331
anatofuz
parents:
diff changeset
332 .. option:: LIBCXX_INCLUDE_TESTS:BOOL
anatofuz
parents:
diff changeset
333
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
334 **Default**: ``ON`` (or value of ``LLVM_INCLUDE_TESTS``)
150
anatofuz
parents:
diff changeset
335
anatofuz
parents:
diff changeset
336 Build the libc++ tests.
anatofuz
parents:
diff changeset
337
anatofuz
parents:
diff changeset
338 .. option:: LIBCXX_INCLUDE_BENCHMARKS:BOOL
anatofuz
parents:
diff changeset
339
anatofuz
parents:
diff changeset
340 **Default**: ``ON``
anatofuz
parents:
diff changeset
341
anatofuz
parents:
diff changeset
342 Build the libc++ benchmark tests and the Google Benchmark library needed
anatofuz
parents:
diff changeset
343 to support them.
anatofuz
parents:
diff changeset
344
anatofuz
parents:
diff changeset
345 .. option:: LIBCXX_BENCHMARK_TEST_ARGS:STRING
anatofuz
parents:
diff changeset
346
anatofuz
parents:
diff changeset
347 **Default**: ``--benchmark_min_time=0.01``
anatofuz
parents:
diff changeset
348
anatofuz
parents:
diff changeset
349 A semicolon list of arguments to pass when running the libc++ benchmarks using the
anatofuz
parents:
diff changeset
350 ``check-cxx-benchmarks`` rule. By default we run the benchmarks for a very short amount of time,
anatofuz
parents:
diff changeset
351 since the primary use of ``check-cxx-benchmarks`` is to get test and sanitizer coverage, not to
anatofuz
parents:
diff changeset
352 get accurate measurements.
anatofuz
parents:
diff changeset
353
anatofuz
parents:
diff changeset
354 .. option:: LIBCXX_BENCHMARK_NATIVE_STDLIB:STRING
anatofuz
parents:
diff changeset
355
anatofuz
parents:
diff changeset
356 **Default**:: ``""``
anatofuz
parents:
diff changeset
357
anatofuz
parents:
diff changeset
358 **Values**:: ``libc++``, ``libstdc++``
anatofuz
parents:
diff changeset
359
anatofuz
parents:
diff changeset
360 Build the libc++ benchmark tests and Google Benchmark library against the
anatofuz
parents:
diff changeset
361 specified standard library on the platform. On Linux this can be used to
anatofuz
parents:
diff changeset
362 compare libc++ to libstdc++ by building the benchmark tests against both
anatofuz
parents:
diff changeset
363 standard libraries.
anatofuz
parents:
diff changeset
364
anatofuz
parents:
diff changeset
365 .. option:: LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN:STRING
anatofuz
parents:
diff changeset
366
anatofuz
parents:
diff changeset
367 Use the specified GCC toolchain and standard library when building the native
anatofuz
parents:
diff changeset
368 stdlib benchmark tests.
anatofuz
parents:
diff changeset
369
anatofuz
parents:
diff changeset
370 .. option:: LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT:BOOL
anatofuz
parents:
diff changeset
371
anatofuz
parents:
diff changeset
372 **Default**: ``OFF``
anatofuz
parents:
diff changeset
373
anatofuz
parents:
diff changeset
374 Pick the default for whether to constrain ABI-unstable symbols to
anatofuz
parents:
diff changeset
375 each individual translation unit. This setting controls whether
anatofuz
parents:
diff changeset
376 `_LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT` is defined by default --
anatofuz
parents:
diff changeset
377 see the documentation of that macro for details.
anatofuz
parents:
diff changeset
378
anatofuz
parents:
diff changeset
379
anatofuz
parents:
diff changeset
380 libc++ ABI Feature Options
anatofuz
parents:
diff changeset
381 --------------------------
anatofuz
parents:
diff changeset
382
anatofuz
parents:
diff changeset
383 The following options allow building libc++ for a different ABI version.
anatofuz
parents:
diff changeset
384
anatofuz
parents:
diff changeset
385 .. option:: LIBCXX_ABI_VERSION:STRING
anatofuz
parents:
diff changeset
386
anatofuz
parents:
diff changeset
387 **Default**: ``1``
anatofuz
parents:
diff changeset
388
anatofuz
parents:
diff changeset
389 Defines the target ABI version of libc++.
anatofuz
parents:
diff changeset
390
anatofuz
parents:
diff changeset
391 .. option:: LIBCXX_ABI_UNSTABLE:BOOL
anatofuz
parents:
diff changeset
392
anatofuz
parents:
diff changeset
393 **Default**: ``OFF``
anatofuz
parents:
diff changeset
394
anatofuz
parents:
diff changeset
395 Build the "unstable" ABI version of libc++. Includes all ABI changing features
anatofuz
parents:
diff changeset
396 on top of the current stable version.
anatofuz
parents:
diff changeset
397
anatofuz
parents:
diff changeset
398 .. option:: LIBCXX_ABI_NAMESPACE:STRING
anatofuz
parents:
diff changeset
399
anatofuz
parents:
diff changeset
400 **Default**: ``__n`` where ``n`` is the current ABI version.
anatofuz
parents:
diff changeset
401
anatofuz
parents:
diff changeset
402 This option defines the name of the inline ABI versioning namespace. It can be used for building
anatofuz
parents:
diff changeset
403 custom versions of libc++ with unique symbol names in order to prevent conflicts or ODR issues
anatofuz
parents:
diff changeset
404 with other libc++ versions.
anatofuz
parents:
diff changeset
405
anatofuz
parents:
diff changeset
406 .. warning::
anatofuz
parents:
diff changeset
407 When providing a custom namespace, it's the users responsibility to ensure the name won't cause
anatofuz
parents:
diff changeset
408 conflicts with other names defined by libc++, both now and in the future. In particular, inline
anatofuz
parents:
diff changeset
409 namespaces of the form ``__[0-9]+`` are strictly reserved by libc++ and may not be used by users.
anatofuz
parents:
diff changeset
410 Doing otherwise could cause conflicts and hinder libc++ ABI evolution.
anatofuz
parents:
diff changeset
411
anatofuz
parents:
diff changeset
412 .. option:: LIBCXX_ABI_DEFINES:STRING
anatofuz
parents:
diff changeset
413
anatofuz
parents:
diff changeset
414 **Default**: ``""``
anatofuz
parents:
diff changeset
415
anatofuz
parents:
diff changeset
416 A semicolon-separated list of ABI macros to persist in the site config header.
anatofuz
parents:
diff changeset
417 See ``include/__config`` for the list of ABI macros.
anatofuz
parents:
diff changeset
418
anatofuz
parents:
diff changeset
419
anatofuz
parents:
diff changeset
420 .. _LLVM-specific variables:
anatofuz
parents:
diff changeset
421
anatofuz
parents:
diff changeset
422 LLVM-specific options
anatofuz
parents:
diff changeset
423 ---------------------
anatofuz
parents:
diff changeset
424
anatofuz
parents:
diff changeset
425 .. option:: LLVM_LIBDIR_SUFFIX:STRING
anatofuz
parents:
diff changeset
426
anatofuz
parents:
diff changeset
427 Extra suffix to append to the directory where libraries are to be
anatofuz
parents:
diff changeset
428 installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64``
anatofuz
parents:
diff changeset
429 to install libraries to ``/usr/lib64``.
anatofuz
parents:
diff changeset
430
anatofuz
parents:
diff changeset
431 .. option:: LLVM_BUILD_32_BITS:BOOL
anatofuz
parents:
diff changeset
432
anatofuz
parents:
diff changeset
433 Build 32-bits executables and libraries on 64-bits systems. This option is
anatofuz
parents:
diff changeset
434 available only on some 64-bits Unix systems. Defaults to OFF.
anatofuz
parents:
diff changeset
435
anatofuz
parents:
diff changeset
436 .. option:: LLVM_LIT_ARGS:STRING
anatofuz
parents:
diff changeset
437
anatofuz
parents:
diff changeset
438 Arguments given to lit. ``make check`` and ``make clang-test`` are affected.
anatofuz
parents:
diff changeset
439 By default, ``'-sv --no-progress-bar'`` on Visual C++ and Xcode, ``'-sv'`` on
anatofuz
parents:
diff changeset
440 others.
anatofuz
parents:
diff changeset
441
anatofuz
parents:
diff changeset
442
anatofuz
parents:
diff changeset
443 Using Alternate ABI libraries
anatofuz
parents:
diff changeset
444 =============================
anatofuz
parents:
diff changeset
445
anatofuz
parents:
diff changeset
446
anatofuz
parents:
diff changeset
447 .. _libsupcxx:
anatofuz
parents:
diff changeset
448
anatofuz
parents:
diff changeset
449 Using libsupc++ on Linux
anatofuz
parents:
diff changeset
450 ------------------------
anatofuz
parents:
diff changeset
451
anatofuz
parents:
diff changeset
452 You will need libstdc++ in order to provide libsupc++.
anatofuz
parents:
diff changeset
453
anatofuz
parents:
diff changeset
454 Figure out where the libsupc++ headers are on your system. On Ubuntu this
anatofuz
parents:
diff changeset
455 is ``/usr/include/c++/<version>`` and ``/usr/include/c++/<version>/<target-triple>``
anatofuz
parents:
diff changeset
456
anatofuz
parents:
diff changeset
457 You can also figure this out by running
anatofuz
parents:
diff changeset
458
anatofuz
parents:
diff changeset
459 .. code-block:: bash
anatofuz
parents:
diff changeset
460
anatofuz
parents:
diff changeset
461 $ echo | g++ -Wp,-v -x c++ - -fsyntax-only
anatofuz
parents:
diff changeset
462 ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
anatofuz
parents:
diff changeset
463 ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
anatofuz
parents:
diff changeset
464 #include "..." search starts here:
anatofuz
parents:
diff changeset
465 #include &lt;...&gt; search starts here:
anatofuz
parents:
diff changeset
466 /usr/include/c++/4.7
anatofuz
parents:
diff changeset
467 /usr/include/c++/4.7/x86_64-linux-gnu
anatofuz
parents:
diff changeset
468 /usr/include/c++/4.7/backward
anatofuz
parents:
diff changeset
469 /usr/lib/gcc/x86_64-linux-gnu/4.7/include
anatofuz
parents:
diff changeset
470 /usr/local/include
anatofuz
parents:
diff changeset
471 /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
anatofuz
parents:
diff changeset
472 /usr/include/x86_64-linux-gnu
anatofuz
parents:
diff changeset
473 /usr/include
anatofuz
parents:
diff changeset
474 End of search list.
anatofuz
parents:
diff changeset
475
anatofuz
parents:
diff changeset
476 Note that the first two entries happen to be what we are looking for. This
anatofuz
parents:
diff changeset
477 may not be correct on other platforms.
anatofuz
parents:
diff changeset
478
anatofuz
parents:
diff changeset
479 We can now run CMake:
anatofuz
parents:
diff changeset
480
anatofuz
parents:
diff changeset
481 .. code-block:: bash
anatofuz
parents:
diff changeset
482
anatofuz
parents:
diff changeset
483 $ CC=clang CXX=clang++ cmake -G "Unix Makefiles" \
anatofuz
parents:
diff changeset
484 -DLIBCXX_CXX_ABI=libstdc++ \
anatofuz
parents:
diff changeset
485 -DLIBCXX_CXX_ABI_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/" \
anatofuz
parents:
diff changeset
486 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
anatofuz
parents:
diff changeset
487 <libc++-source-dir>
anatofuz
parents:
diff changeset
488
anatofuz
parents:
diff changeset
489
anatofuz
parents:
diff changeset
490 You can also substitute ``-DLIBCXX_CXX_ABI=libsupc++``
anatofuz
parents:
diff changeset
491 above, which will cause the library to be linked to libsupc++ instead
anatofuz
parents:
diff changeset
492 of libstdc++, but this is only recommended if you know that you will
anatofuz
parents:
diff changeset
493 never need to link against libstdc++ in the same executable as libc++.
anatofuz
parents:
diff changeset
494 GCC ships libsupc++ separately but only as a static library. If a
anatofuz
parents:
diff changeset
495 program also needs to link against libstdc++, it will provide its
anatofuz
parents:
diff changeset
496 own copy of libsupc++ and this can lead to subtle problems.
anatofuz
parents:
diff changeset
497
anatofuz
parents:
diff changeset
498 .. code-block:: bash
anatofuz
parents:
diff changeset
499
anatofuz
parents:
diff changeset
500 $ make cxx
anatofuz
parents:
diff changeset
501 $ make install
anatofuz
parents:
diff changeset
502
anatofuz
parents:
diff changeset
503 You can now run clang with -stdlib=libc++.
anatofuz
parents:
diff changeset
504
anatofuz
parents:
diff changeset
505
anatofuz
parents:
diff changeset
506 .. _libcxxrt_ref:
anatofuz
parents:
diff changeset
507
anatofuz
parents:
diff changeset
508 Using libcxxrt on Linux
anatofuz
parents:
diff changeset
509 ------------------------
anatofuz
parents:
diff changeset
510
anatofuz
parents:
diff changeset
511 You will need to keep the source tree of `libcxxrt`_ available
anatofuz
parents:
diff changeset
512 on your build machine and your copy of the libcxxrt shared library must
anatofuz
parents:
diff changeset
513 be placed where your linker will find it.
anatofuz
parents:
diff changeset
514
anatofuz
parents:
diff changeset
515 We can now run CMake like:
anatofuz
parents:
diff changeset
516
anatofuz
parents:
diff changeset
517 .. code-block:: bash
anatofuz
parents:
diff changeset
518
anatofuz
parents:
diff changeset
519 $ CC=clang CXX=clang++ cmake -G "Unix Makefiles" \
anatofuz
parents:
diff changeset
520 -DLIBCXX_CXX_ABI=libcxxrt \
anatofuz
parents:
diff changeset
521 -DLIBCXX_CXX_ABI_INCLUDE_PATHS=path/to/libcxxrt-sources/src \
anatofuz
parents:
diff changeset
522 -DCMAKE_BUILD_TYPE=Release \
anatofuz
parents:
diff changeset
523 -DCMAKE_INSTALL_PREFIX=/usr \
anatofuz
parents:
diff changeset
524 <libc++-source-directory>
anatofuz
parents:
diff changeset
525 $ make cxx
anatofuz
parents:
diff changeset
526 $ make install
anatofuz
parents:
diff changeset
527
anatofuz
parents:
diff changeset
528 Unfortunately you can't simply run clang with "-stdlib=libc++" at this point, as
anatofuz
parents:
diff changeset
529 clang is set up to link for libc++ linked to libsupc++. To get around this
anatofuz
parents:
diff changeset
530 you'll have to set up your linker yourself (or patch clang). For example,
anatofuz
parents:
diff changeset
531
anatofuz
parents:
diff changeset
532 .. code-block:: bash
anatofuz
parents:
diff changeset
533
anatofuz
parents:
diff changeset
534 $ clang++ -stdlib=libc++ helloworld.cpp \
anatofuz
parents:
diff changeset
535 -nodefaultlibs -lc++ -lcxxrt -lm -lc -lgcc_s -lgcc
anatofuz
parents:
diff changeset
536
anatofuz
parents:
diff changeset
537 Alternately, you could just add libcxxrt to your libraries list, which in most
anatofuz
parents:
diff changeset
538 situations will give the same result:
anatofuz
parents:
diff changeset
539
anatofuz
parents:
diff changeset
540 .. code-block:: bash
anatofuz
parents:
diff changeset
541
anatofuz
parents:
diff changeset
542 $ clang++ -stdlib=libc++ helloworld.cpp -lcxxrt
anatofuz
parents:
diff changeset
543
anatofuz
parents:
diff changeset
544 .. _`libcxxrt`: https://github.com/pathscale/libcxxrt/
anatofuz
parents:
diff changeset
545
anatofuz
parents:
diff changeset
546
anatofuz
parents:
diff changeset
547 Using a local ABI library installation
anatofuz
parents:
diff changeset
548 ---------------------------------------
anatofuz
parents:
diff changeset
549
anatofuz
parents:
diff changeset
550 .. warning::
anatofuz
parents:
diff changeset
551 This is not recommended in almost all cases.
anatofuz
parents:
diff changeset
552
anatofuz
parents:
diff changeset
553 These instructions should only be used when you can't install your ABI library.
anatofuz
parents:
diff changeset
554
anatofuz
parents:
diff changeset
555 Normally you must link libc++ against a ABI shared library that the
anatofuz
parents:
diff changeset
556 linker can find. If you want to build and test libc++ against an ABI
anatofuz
parents:
diff changeset
557 library not in the linker's path you need to set
anatofuz
parents:
diff changeset
558 ``-DLIBCXX_CXX_ABI_LIBRARY_PATH=/path/to/abi/lib`` when configuring CMake.
anatofuz
parents:
diff changeset
559
anatofuz
parents:
diff changeset
560 An example build using libc++abi would look like:
anatofuz
parents:
diff changeset
561
anatofuz
parents:
diff changeset
562 .. code-block:: bash
anatofuz
parents:
diff changeset
563
anatofuz
parents:
diff changeset
564 $ CC=clang CXX=clang++ cmake \
anatofuz
parents:
diff changeset
565 -DLIBCXX_CXX_ABI=libc++abi \
anatofuz
parents:
diff changeset
566 -DLIBCXX_CXX_ABI_INCLUDE_PATHS="/path/to/libcxxabi/include" \
anatofuz
parents:
diff changeset
567 -DLIBCXX_CXX_ABI_LIBRARY_PATH="/path/to/libcxxabi-build/lib" \
anatofuz
parents:
diff changeset
568 path/to/libcxx
anatofuz
parents:
diff changeset
569 $ make
anatofuz
parents:
diff changeset
570
anatofuz
parents:
diff changeset
571 When testing libc++ LIT will automatically link against the proper ABI
anatofuz
parents:
diff changeset
572 library.