|  | # Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | # Define the sysroot directory. | 
|  | sysroot = "$root_out_dir/sysroot" | 
|  | sysroot_lib_dir = "${sysroot}/usr/lib" | 
|  | sysroot_include_dir = "${sysroot}/usr/include" | 
|  | sysroot_include_bits_dir = "${sysroot}/usr/include/bits" | 
|  |  | 
|  | config("fusl_config") { | 
|  | cflags = [ | 
|  | # Flags from musl | 
|  | "-std=c99", | 
|  | "-ffreestanding", | 
|  | "-nostdinc", | 
|  |  | 
|  | "-D_XOPEN_SOURCE=700", | 
|  |  | 
|  | "-Wa,--noexecstack", | 
|  |  | 
|  | "-fomit-frame-pointer", | 
|  | "-fno-unwind-tables", | 
|  | "-fno-asynchronous-unwind-tables", | 
|  | "-ffunction-sections", | 
|  | "-fdata-sections", | 
|  | "-Werror=implicit-function-declaration", | 
|  | "-Werror=implicit-int", | 
|  | "-Werror=pointer-sign", | 
|  | "-Werror=pointer-arith", | 
|  | ] | 
|  |  | 
|  | include_dirs = [] | 
|  |  | 
|  | # Arch specific includes, these need to come before the general includes. | 
|  | if (current_cpu == "x64") { | 
|  | include_dirs += [ "arch/x86_64" ] | 
|  | } | 
|  |  | 
|  | # General includes, these need to come after the arch specific includes. | 
|  | # src/internal must come before include. | 
|  | include_dirs += [ | 
|  | "arch/generic", | 
|  | "src/internal", | 
|  | "include", | 
|  | ] | 
|  | } | 
|  |  | 
|  | config("fusl_no_stack_protector_config") { | 
|  | cflags = [ "-fno-stack-protector" ] | 
|  | } | 
|  |  | 
|  | static_library("libc") { | 
|  | configs = [] | 
|  | configs += [ ":fusl_config" ] | 
|  |  | 
|  | complete_static_lib = true | 
|  |  | 
|  | deps = [ | 
|  | "ldso", | 
|  | "src/aio", | 
|  | "src/complex", | 
|  | "src/conf", | 
|  | "src/crypt", | 
|  | "src/ctype", | 
|  | "src/dirent", | 
|  | "src/env", | 
|  | "src/errno", | 
|  | "src/exit", | 
|  | "src/fcntl", | 
|  | "src/fenv", | 
|  | "src/internal", | 
|  | "src/ipc", | 
|  | "src/ldso", | 
|  | "src/legacy", | 
|  | "src/linux", | 
|  | "src/locale", | 
|  | "src/malloc", | 
|  | "src/math", | 
|  | "src/misc", | 
|  | "src/mman", | 
|  | "src/mq", | 
|  | "src/multibyte", | 
|  | "src/network", | 
|  | "src/passwd", | 
|  | "src/prng", | 
|  | "src/process", | 
|  | "src/regex", | 
|  | "src/sched", | 
|  | "src/search", | 
|  | "src/select", | 
|  | "src/setjmp", | 
|  | "src/signal", | 
|  | "src/stat", | 
|  | "src/stdio", | 
|  | "src/stdlib", | 
|  | "src/string", | 
|  | "src/temp", | 
|  | "src/termios", | 
|  | "src/thread", | 
|  | "src/time", | 
|  | "src/unistd", | 
|  | ] | 
|  | } | 
|  |  | 
|  | # For simplicity, musl places all its symbols in libc. To support | 
|  | # linking against e.g. libm, either implicitly or with an explicit -lm | 
|  | # flag, we build empty libraries. | 
|  | static_library("libm") { | 
|  | complete_static_lib = true | 
|  | } | 
|  |  | 
|  | copy("copy_include") { | 
|  | sources = [ | 
|  | "include", | 
|  | ] | 
|  | outputs = [ | 
|  | "${sysroot_include_dir}", | 
|  | ] | 
|  | } | 
|  |  | 
|  | copy("copy_arch_include_bits") { | 
|  | deps = [ | 
|  | ":copy_include", | 
|  | ] | 
|  | if (current_cpu == "x64") { | 
|  | sources = [ | 
|  | "arch/generic/bits/errno.h", | 
|  | "arch/generic/bits/poll.h", | 
|  | "arch/generic/bits/resource.h", | 
|  | "arch/generic/bits/sem.h", | 
|  | "arch/generic/bits/statfs.h", | 
|  | "arch/generic/bits/stdarg.h", | 
|  | "arch/generic/bits/termios.h", | 
|  | "arch/x86_64/bits/alltypes.h", | 
|  | "arch/x86_64/bits/endian.h", | 
|  | "arch/x86_64/bits/fcntl.h", | 
|  | "arch/x86_64/bits/fenv.h", | 
|  | "arch/x86_64/bits/float.h", | 
|  | "arch/x86_64/bits/io.h", | 
|  | "arch/x86_64/bits/ioctl.h", | 
|  | "arch/x86_64/bits/ipc.h", | 
|  | "arch/x86_64/bits/limits.h", | 
|  | "arch/x86_64/bits/mman.h", | 
|  | "arch/x86_64/bits/msg.h", | 
|  | "arch/x86_64/bits/posix.h", | 
|  | "arch/x86_64/bits/reg.h", | 
|  | "arch/x86_64/bits/setjmp.h", | 
|  | "arch/x86_64/bits/shm.h", | 
|  | "arch/x86_64/bits/signal.h", | 
|  | "arch/x86_64/bits/socket.h", | 
|  | "arch/x86_64/bits/stat.h", | 
|  | "arch/x86_64/bits/stdint.h", | 
|  | "arch/x86_64/bits/syscall.h", | 
|  | "arch/x86_64/bits/user.h", | 
|  | ] | 
|  | } | 
|  | outputs = [ | 
|  | "${sysroot_include_bits_dir}/{{source_name_part}}.h", | 
|  | ] | 
|  | } | 
|  |  | 
|  | copy("copy_libs") { | 
|  | deps = [ | 
|  | ":libc", | 
|  | ":libm", | 
|  | ] | 
|  | sources = [ | 
|  | "${target_out_dir}/libc.a", | 
|  | "${target_out_dir}/libm.a", | 
|  | ] | 
|  | outputs = [ | 
|  | "${sysroot_lib_dir}/{{source_name_part}}.a", | 
|  | ] | 
|  | } | 
|  |  | 
|  | group("copy_sysroot") { | 
|  | deps = [ | 
|  | ":copy_arch_include_bits", | 
|  | ":copy_include", | 
|  | ":copy_libs", | 
|  | "crt:copy_crt_objects", | 
|  | ] | 
|  | } | 
|  |  | 
|  | copy("copy_libcxx") { | 
|  | sources = [ | 
|  | "${target_out_dir}/../third_party/libcxx/libcxx.a", | 
|  | ] | 
|  | outputs = [ | 
|  | "${sysroot_lib_dir}/libc++.a", | 
|  | ] | 
|  | deps = [ | 
|  | "//third_party/libcxx:libcxx", | 
|  | ] | 
|  | } | 
|  |  | 
|  | action("copy_libcxx_headers") { | 
|  | script = "tools/copy_libcxx_headers.py" | 
|  |  | 
|  | deps = [ | 
|  | ":copy_sysroot", | 
|  | ] | 
|  |  | 
|  | source_dir = "//third_party/libcxx/libcxx/include" | 
|  |  | 
|  | # Annoyingly, this has to be ".../c++/v1" for clang to automatically | 
|  | # add it to the includes. | 
|  | target_dir = "${sysroot_include_dir}/c++/v1" | 
|  |  | 
|  | args = [ | 
|  | rebase_path(source_dir), | 
|  | rebase_path(target_dir), | 
|  | ] | 
|  |  | 
|  | outputs = [ | 
|  | "${target_dir}/__bit_reference", | 
|  | "${target_dir}/__config", | 
|  | "${target_dir}/__config_site.in", | 
|  | "${target_dir}/__debug", | 
|  | "${target_dir}/__functional_03", | 
|  | "${target_dir}/__functional_base", | 
|  | "${target_dir}/__functional_base_03", | 
|  | "${target_dir}/__hash_table", | 
|  | "${target_dir}/__locale", | 
|  | "${target_dir}/__mutex_base", | 
|  | "${target_dir}/__nullptr", | 
|  | "${target_dir}/__refstring", | 
|  | "${target_dir}/__split_buffer", | 
|  | "${target_dir}/__sso_allocator", | 
|  | "${target_dir}/__std_stream", | 
|  | "${target_dir}/__tree", | 
|  | "${target_dir}/__tuple", | 
|  | "${target_dir}/__undef___deallocate", | 
|  | "${target_dir}/__undef_min_max", | 
|  | "${target_dir}/algorithm", | 
|  | "${target_dir}/array", | 
|  | "${target_dir}/atomic", | 
|  | "${target_dir}/bitset", | 
|  | "${target_dir}/cassert", | 
|  | "${target_dir}/ccomplex", | 
|  | "${target_dir}/cctype", | 
|  | "${target_dir}/cerrno", | 
|  | "${target_dir}/cfenv", | 
|  | "${target_dir}/cfloat", | 
|  | "${target_dir}/chrono", | 
|  | "${target_dir}/cinttypes", | 
|  | "${target_dir}/ciso646", | 
|  | "${target_dir}/climits", | 
|  | "${target_dir}/clocale", | 
|  | "${target_dir}/cmath", | 
|  | "${target_dir}/codecvt", | 
|  | "${target_dir}/complex", | 
|  | "${target_dir}/complex.h", | 
|  | "${target_dir}/condition_variable", | 
|  | "${target_dir}/csetjmp", | 
|  | "${target_dir}/csignal", | 
|  | "${target_dir}/cstdarg", | 
|  | "${target_dir}/cstdbool", | 
|  | "${target_dir}/cstddef", | 
|  | "${target_dir}/cstdint", | 
|  | "${target_dir}/cstdio", | 
|  | "${target_dir}/cstdlib", | 
|  | "${target_dir}/cstring", | 
|  | "${target_dir}/ctgmath", | 
|  | "${target_dir}/ctime", | 
|  | "${target_dir}/ctype.h", | 
|  | "${target_dir}/cwchar", | 
|  | "${target_dir}/cwctype", | 
|  | "${target_dir}/deque", | 
|  | "${target_dir}/errno.h", | 
|  | "${target_dir}/exception", | 
|  | "${target_dir}/experimental/__config", | 
|  | "${target_dir}/experimental/algorithm", | 
|  | "${target_dir}/experimental/any", | 
|  | "${target_dir}/experimental/chrono", | 
|  | "${target_dir}/experimental/dynarray", | 
|  | "${target_dir}/experimental/functional", | 
|  | "${target_dir}/experimental/optional", | 
|  | "${target_dir}/experimental/ratio", | 
|  | "${target_dir}/experimental/string_view", | 
|  | "${target_dir}/experimental/system_error", | 
|  | "${target_dir}/experimental/tuple", | 
|  | "${target_dir}/experimental/type_traits", | 
|  | "${target_dir}/experimental/utility", | 
|  | "${target_dir}/ext/__hash", | 
|  | "${target_dir}/ext/hash_map", | 
|  | "${target_dir}/ext/hash_set", | 
|  | "${target_dir}/float.h", | 
|  | "${target_dir}/forward_list", | 
|  | "${target_dir}/fstream", | 
|  | "${target_dir}/functional", | 
|  | "${target_dir}/future", | 
|  | "${target_dir}/initializer_list", | 
|  | "${target_dir}/inttypes.h", | 
|  | "${target_dir}/iomanip", | 
|  | "${target_dir}/ios", | 
|  | "${target_dir}/iosfwd", | 
|  | "${target_dir}/iostream", | 
|  | "${target_dir}/istream", | 
|  | "${target_dir}/iterator", | 
|  | "${target_dir}/limits", | 
|  | "${target_dir}/list", | 
|  | "${target_dir}/locale", | 
|  | "${target_dir}/map", | 
|  | "${target_dir}/math.h", | 
|  | "${target_dir}/memory", | 
|  | "${target_dir}/module.modulemap", | 
|  | "${target_dir}/mutex", | 
|  | "${target_dir}/new", | 
|  | "${target_dir}/numeric", | 
|  | "${target_dir}/ostream", | 
|  | "${target_dir}/queue", | 
|  | "${target_dir}/random", | 
|  | "${target_dir}/ratio", | 
|  | "${target_dir}/regex", | 
|  | "${target_dir}/scoped_allocator", | 
|  | "${target_dir}/set", | 
|  | "${target_dir}/setjmp.h", | 
|  | "${target_dir}/shared_mutex", | 
|  | "${target_dir}/sstream", | 
|  | "${target_dir}/stack", | 
|  | "${target_dir}/stddef.h", | 
|  | "${target_dir}/stdexcept", | 
|  | "${target_dir}/stdio.h", | 
|  | "${target_dir}/stdlib.h", | 
|  | "${target_dir}/streambuf", | 
|  | "${target_dir}/string", | 
|  | "${target_dir}/strstream", | 
|  | "${target_dir}/support/android/locale_bionic.h", | 
|  | "${target_dir}/support/ibm/limits.h", | 
|  | "${target_dir}/support/ibm/support.h", | 
|  | "${target_dir}/support/ibm/xlocale.h", | 
|  | "${target_dir}/support/musl/xlocale.h", | 
|  | "${target_dir}/support/newlib/xlocale.h", | 
|  | "${target_dir}/support/solaris/floatingpoint.h", | 
|  | "${target_dir}/support/solaris/wchar.h", | 
|  | "${target_dir}/support/solaris/xlocale.h", | 
|  | "${target_dir}/support/win32/limits_win32.h", | 
|  | "${target_dir}/support/win32/locale_win32.h", | 
|  | "${target_dir}/support/win32/math_win32.h", | 
|  | "${target_dir}/support/win32/support.h", | 
|  | "${target_dir}/support/xlocale/xlocale.h", | 
|  | "${target_dir}/system_error", | 
|  | "${target_dir}/tgmath.h", | 
|  | "${target_dir}/thread", | 
|  | "${target_dir}/tuple", | 
|  | "${target_dir}/type_traits", | 
|  | "${target_dir}/typeindex", | 
|  | "${target_dir}/typeinfo", | 
|  | "${target_dir}/unordered_map", | 
|  | "${target_dir}/unordered_set", | 
|  | "${target_dir}/utility", | 
|  | "${target_dir}/valarray", | 
|  | "${target_dir}/vector", | 
|  | "${target_dir}/wchar.h", | 
|  | "${target_dir}/wctype.h", | 
|  | ] | 
|  | } | 
|  |  | 
|  | config("fusl_sysroot_config") { | 
|  | rebased_sysroot = rebase_path(sysroot) | 
|  |  | 
|  | cflags = [ | 
|  | "--sysroot=$rebased_sysroot", | 
|  | "-fPIC", | 
|  | "-static", | 
|  | ] | 
|  |  | 
|  | cflags_c = [ "-std=c11" ] | 
|  |  | 
|  | cflags_cc = [ | 
|  | "-std=c++11", | 
|  |  | 
|  | # Make everyone using our libc++ headers use musl paths rather | 
|  | # than glibc ones. | 
|  | "-D_LIBCPP_HAS_MUSL_LIBC", | 
|  |  | 
|  | # This is necessary for clang to get the header search paths right. | 
|  | "-stdlib=libc++", | 
|  | ] | 
|  |  | 
|  | ldflags = [ | 
|  | "--sysroot=$rebased_sysroot", | 
|  | "-static", | 
|  | "-stdlib=libc++", | 
|  | ] | 
|  | } | 
|  |  | 
|  | config("fusl_sysroot_config_c") { | 
|  | ldflags = [ | 
|  | # Using clang++ as the linker driver is necessary for libc++ | 
|  | # resolution to work. | 
|  | "-nodefaultlibs", | 
|  | "-lc", | 
|  | ] | 
|  | } | 
|  |  | 
|  | executable("empty_main") { | 
|  | configs = [] | 
|  | configs += [ | 
|  | ":fusl_sysroot_config", | 
|  | ":fusl_sysroot_config_c", | 
|  | ] | 
|  |  | 
|  | sources = [ | 
|  | "test/empty_main.c", | 
|  | ] | 
|  |  | 
|  | deps = [ | 
|  | ":copy_sysroot", | 
|  | ] | 
|  | } | 
|  |  | 
|  | executable("vector") { | 
|  | configs = [] | 
|  | configs += [ ":fusl_sysroot_config" ] | 
|  |  | 
|  | sources = [ | 
|  | "test/vector.cc", | 
|  | ] | 
|  |  | 
|  | deps = [ | 
|  | ":copy_libcxx", | 
|  | ":copy_libcxx_headers", | 
|  | ] | 
|  | } | 
|  |  | 
|  | group("fusl_pre_toolchain") { | 
|  | deps = [ | 
|  | ":copy_sysroot", | 
|  | ":empty_main", | 
|  | ":libc", | 
|  | ":vector", | 
|  | "crt", | 
|  | "//third_party/libcxx:libcxx", | 
|  | ] | 
|  | } | 
|  |  | 
|  | group("fusl") { | 
|  | deps = [ | 
|  | ":fusl_pre_toolchain(//build/toolchain/fusl:fusl_$current_cpu)", | 
|  | ] | 
|  | } |