1import("//clang/runtimes.gni") 2import("//libcxx/config.gni") 3import("//llvm/utils/gn/build/symlink_or_copy.gni") 4 5declare_args() { 6 # Build libc++ with definitions for operator new/delete. 7 libcxx_enable_new_delete_definitions = true 8 9 # Build libc++ as a shared library. 10 libcxx_enable_shared = true 11 12 # Build libc++ as a static library. 13 libcxx_enable_static = true 14 15 # Build filesystem as part of libc++. 16 libcxx_enable_filesystem = target_os != "win" 17 18 # Build libc++experimental.a. 19 libcxx_enable_experimental = true 20 21 # Use compiler-rt builtins. 22 libcxx_use_compiler_rt = true 23 24 # Use exceptions. 25 libcxx_enable_exceptions = true 26 27 # Use run time type information. 28 libcxx_enable_rtti = true 29 30 # Do not export any symbols from the static library. 31 libcxx_hermetic_static_library = true 32 33 # Use and install a linker script for the given ABI library. 34 libcxx_enable_abi_linker_script = true 35} 36 37config("cxx_config") { 38 include_dirs = [ "//libcxxabi/include" ] 39 cflags = [ 40 "-Wall", 41 "-Wextra", 42 "-W", 43 "-Wwrite-strings", 44 "-Wno-unused-parameter", 45 "-Wno-long-long", 46 "-Werror=return-type", 47 "-Wextra-semi", 48 "-Wno-user-defined-literals", 49 "-Wno-covered-switch-default", 50 ] 51 cflags_cc = [ 52 "-std=c++23", 53 "-nostdinc++", 54 ] 55 defines = [ 56 "_LIBCPP_BUILDING_LIBRARY", 57 "_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER", 58 ] 59 if (current_os != "win") { 60 defines += [ "LIBCXX_BUILDING_LIBCXXABI" ] 61 } 62 if (target_os == "win") { 63 cflags += [ "/Zl" ] 64 defines += [ 65 # Ignore the -MSC_VER mismatch, as we may build 66 # with a different compatibility version. 67 "_ALLOW_MSC_VER_MISMATCH", 68 69 # Don't check the msvcprt iterator debug levels 70 # as we will define the iterator types; libc++ 71 # uses a different macro to identify the debug 72 # level. 73 "_ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH", 74 75 # We are building the c++ runtime, don't pull in 76 # msvcprt. 77 "_CRTBLD", 78 79 # Don't warn on the use of "deprecated" 80 # "insecure" functions which are standards 81 # specified. 82 "_CRT_SECURE_NO_WARNINGS", 83 84 # Use the ISO conforming behaviour for conversion 85 # in printf, scanf. 86 "_CRT_STDIO_ISO_WIDE_SPECIFIERS", 87 ] 88 } 89 if (!libcxx_enable_new_delete_definitions) { 90 defines += [ "_LIBCPP_DISABLE_NEW_DELETE_DEFINITIONS" ] 91 } 92 if (libcxx_enable_exceptions) { 93 if (current_os == "win") { 94 cflags_cc += [ "/EHsc" ] 95 } 96 } else { 97 if (current_os == "win") { 98 cflags_cc += [ 99 "/EHs-", 100 "/EHa-", 101 ] 102 } else { 103 cflags_cc += [ "-fno-exceptions" ] 104 } 105 } 106 if (!libcxx_enable_rtti) { 107 if (current_os == "win") { 108 cflags_cc += [ "/GR-" ] 109 } else { 110 cflags_cc += [ "-fno-rtti" ] 111 } 112 } 113} 114 115cxx_sources = [ 116 "algorithm.cpp", 117 "any.cpp", 118 "atomic.cpp", 119 "barrier.cpp", 120 "bind.cpp", 121 "call_once.cpp", 122 "charconv.cpp", 123 "chrono.cpp", 124 "condition_variable.cpp", 125 "condition_variable_destructor.cpp", 126 "error_category.cpp", 127 "exception.cpp", 128 "expected.cpp", 129 "fstream.cpp", 130 "functional.cpp", 131 "future.cpp", 132 "hash.cpp", 133 "include/apple_availability.h", 134 "include/atomic_support.h", 135 "include/config_elast.h", 136 "include/from_chars_floating_point.h", 137 "include/refstring.h", 138 "include/ryu/common.h", 139 "include/ryu/d2fixed.h", 140 "include/ryu/d2fixed_full_table.h", 141 "include/ryu/d2s.h", 142 "include/ryu/d2s_full_table.h", 143 "include/ryu/d2s_intrinsics.h", 144 "include/ryu/digit_table.h", 145 "include/ryu/f2s.h", 146 "include/ryu/ryu.h", 147 "include/sso_allocator.h", 148 "include/to_chars_floating_point.h", 149 "ios.cpp", 150 "ios.instantiations.cpp", 151 "iostream.cpp", 152 "locale.cpp", 153 "memory.cpp", 154 "memory_resource.cpp", 155 "mutex.cpp", 156 "mutex_destructor.cpp", 157 "new.cpp", 158 "new_handler.cpp", 159 "new_helpers.cpp", 160 "optional.cpp", 161 "ostream.cpp", 162 "print.cpp", 163 "random.cpp", 164 "random_shuffle.cpp", 165 "regex.cpp", 166 "ryu/d2fixed.cpp", 167 "ryu/d2s.cpp", 168 "ryu/f2s.cpp", 169 "shared_mutex.cpp", 170 "stdexcept.cpp", 171 "string.cpp", 172 "strstream.cpp", 173 "support/runtime/exception_fallback.ipp", 174 "support/runtime/exception_glibcxx.ipp", 175 "support/runtime/exception_libcxxabi.ipp", 176 "support/runtime/exception_libcxxrt.ipp", 177 "support/runtime/exception_msvc.ipp", 178 "support/runtime/exception_pointer_cxxabi.ipp", 179 "support/runtime/exception_pointer_glibcxx.ipp", 180 "support/runtime/exception_pointer_msvc.ipp", 181 "support/runtime/exception_pointer_unimplemented.ipp", 182 "support/runtime/new_handler_fallback.ipp", 183 "support/runtime/stdexcept_default.ipp", 184 "support/runtime/stdexcept_vcruntime.ipp", 185 "system_error.cpp", 186 "thread.cpp", 187 "typeinfo.cpp", 188 "valarray.cpp", 189 "variant.cpp", 190 "vector.cpp", 191 "verbose_abort.cpp", 192] 193if (target_os == "win") { 194 cxx_sources += [ 195 "support/win32/compiler_rt_shims.cpp", 196 "support/win32/locale_win32.cpp", 197 "support/win32/support.cpp", 198 "support/win32/thread_win32.cpp", 199 ] 200} 201if (target_os == "zos") { 202 cxx_sources += [ 203 "support/ibm/mbsnrtowcs.cpp", 204 "support/ibm/wcsnrtombs.cpp", 205 "support/ibm/xlocale_zos.cpp", 206 ] 207} 208if (libcxx_enable_filesystem) { 209 cxx_sources += [ 210 "filesystem/directory_entry.cpp", 211 "filesystem/directory_iterator.cpp", 212 "filesystem/file_descriptor.h", 213 "filesystem/filesystem_clock.cpp", 214 "filesystem/filesystem_error.cpp", 215 "filesystem/operations.cpp", 216 "filesystem/path.cpp", 217 "filesystem/path_parser.h", 218 "filesystem/posix_compat.h", 219 "filesystem/time_utils.h", 220 ] 221 if (libcxx_use_compiler_rt) { 222 cxx_sources += [ "filesystem/int128_builtins.cpp" ] 223 } 224} 225 226# FIXME: Put this behind an arg, or enable it by default on macOS. 227if (false) { 228 cxx_sources += [ "pstl/libdispatch.cpp" ] 229} 230 231if (libcxx_enable_shared) { 232 shared_library("cxx_shared") { 233 output_dir = runtimes_dir 234 output_name = "c++" 235 if (libcxx_enable_abi_linker_script) { 236 output_extension = "so.0" 237 } 238 if (target_os == "linux" || target_os == "mac") { 239 cflags = [ "-fPIC" ] 240 ldflags = [ "-nostdlib++" ] 241 libs = [ 242 "dl", 243 "pthread", 244 ] 245 } 246 sources = cxx_sources 247 include_dirs = [ "." ] 248 deps = [ 249 "//compiler-rt/lib/builtins", 250 "//libcxx/include", 251 "//libcxxabi/src:cxxabi_shared", 252 "//libunwind/src:unwind_shared", 253 ] 254 configs += [ ":cxx_config" ] 255 configs -= [ 256 "//llvm/utils/gn/build:no_exceptions", 257 "//llvm/utils/gn/build:no_rtti", 258 ] 259 } 260 261 symlink_or_copy("cxx_symlink") { 262 deps = [ ":cxx_shared" ] 263 source = "libc++.so.0" 264 output = "$runtimes_dir/libc++.so" 265 } 266 267 if (libcxx_enable_abi_linker_script) { 268 action("cxx_linker_script") { 269 script = "//llvm/utils/gn/secondary/libcxx/utils/gen_link_script.py" 270 outputs = [ "$runtimes_dir/libc++.so" ] 271 args = [ 272 "--input", 273 rebase_path("$runtimes_dir/libc++.so.0", root_build_dir), 274 "--output", 275 rebase_path("$runtimes_dir/libc++.so", root_build_dir), 276 "c++abi", 277 "unwind", 278 ] 279 deps = [ ":cxx_symlink" ] 280 } 281 } 282} 283 284if (libcxx_enable_static) { 285 static_library("cxx_static") { 286 output_dir = runtimes_dir 287 output_name = "c++" 288 complete_static_lib = true 289 configs -= [ "//llvm/utils/gn/build:thin_archive" ] 290 sources = cxx_sources 291 include_dirs = [ "." ] 292 if (libcxx_hermetic_static_library) { 293 cflags = [ "-fvisibility=hidden" ] 294 if (libcxx_enable_new_delete_definitions) { 295 cflags_cc = [ "-fvisibility-global-new-delete=force-hidden" ] 296 } 297 defines = [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ] 298 } 299 deps = [ 300 "//compiler-rt/lib/builtins", 301 "//libcxx/include", 302 "//libcxxabi/src:cxxabi_static", 303 "//libunwind/src:unwind_static", 304 ] 305 configs += [ ":cxx_config" ] 306 configs -= [ 307 "//llvm/utils/gn/build:no_exceptions", 308 "//llvm/utils/gn/build:no_rtti", 309 ] 310 } 311} 312 313if (libcxx_enable_experimental) { 314 static_library("cxx_experimental") { 315 output_dir = runtimes_dir 316 output_name = "c++experimental" 317 sources = [ "experimental/keep.cpp" ] 318 if (libcxx_enable_filesystem && libcxx_enable_time_zone_database) { 319 sources += [ 320 # TODO TZDB The exception could be moved in chrono once the TZDB library 321 # is no longer experimental. 322 "experimental/chrono_exception.cpp", 323 "experimental/include/tzdb/time_zone_private.h", 324 "experimental/include/tzdb/types_private.h", 325 "experimental/include/tzdb/tzdb_list_private.h", 326 "experimental/include/tzdb/tzdb_private.h", 327 "experimental/time_zone.cpp", 328 "experimental/tzdb.cpp", 329 "experimental/tzdb_list.cpp", 330 ] 331 } 332 deps = [ "//libcxx/include" ] 333 configs += [ ":cxx_config" ] 334 configs -= [ 335 "//llvm/utils/gn/build:no_exceptions", 336 "//llvm/utils/gn/build:no_rtti", 337 ] 338 } 339} 340 341group("src") { 342 deps = [] 343 if (libcxx_enable_shared) { 344 if (libcxx_enable_abi_linker_script) { 345 deps += [ ":cxx_linker_script" ] 346 } else { 347 deps += [ ":cxx_shared" ] 348 } 349 } 350 if (libcxx_enable_static) { 351 deps += [ ":cxx_static" ] 352 } 353 if (libcxx_enable_experimental) { 354 deps += [ ":cxx_experimental" ] 355 } 356} 357