blob: 35ffac92b7759676780fcf2a10cf20ad99ba47bd [file] [log] [blame]
# 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)",
]
}