# Copyright 2016 Google Inc. # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. declare_args() { ar = "ar" cc = "cc" cxx = "c++" if (is_android) { ar = "$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin/ar" cc = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang" cxx = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang++" } extra_cflags = "" extra_cflags_c = "" extra_cflags_cc = "" extra_ldflags = "" compiler_prefix = "" } config("no_rtti") { if (sanitize != "ASAN") { # -fsanitize=vptr requires RTTI cflags_cc = [ "-fno-rtti" ] } } config("default") { cflags = [ "-O1", "-fstrict-aliasing", "-fPIC", "-fvisibility=hidden", "-Werror", "-Wall", "-Wextra", "-Winit-self", "-Wpointer-arith", "-Wsign-compare", "-Wvla", "-Wno-deprecated-declarations", "-Wno-unused-parameter", ] cflags_cc = [ "-std=c++11", "-fno-exceptions", "-fno-threadsafe-statics", "-fvisibility-inlines-hidden", "-Wnon-virtual-dtor", ] ldflags = [] # It's annoying to wait for full debug symbols to push over # to Android devices. -gline-tables-only is a lot slimmer. if (is_android) { cflags += [ "-gline-tables-only" ] } else { cflags += [ "-g" ] } if (current_cpu == "arm") { cflags += [ "-march=armv7-a", "-mfpu=neon", "-mthumb", ] } else if (current_cpu == "mipsel") { cflags += [ "-march=mips32r2", "-mdspr2", ] } if (is_android) { asmflags = [ "--target=$ndk_target", "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", ] cflags += [ "--sysroot=$ndk/platforms/$ndk_platform", "--target=$ndk_target", "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", ] cflags_cc += [ "-isystem$ndk/sources/android/support/include", "-isystem$ndk/sources/cxx-stl/llvm-libc++/libcxx/include", ] ldflags += [ "--sysroot=$ndk/platforms/$ndk_platform", "--target=$ndk_target", "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", "-pie", ] lib_dirs = [ "$ndk/sources/cxx-stl/llvm-libc++/libs/$ndk_stdlib", "$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/lib/gcc/$ndk_target/4.9.x", ] libs = [ # Order matters here! Keep these three in exactly this order. "c++_static", "c++abi", "android_support", ] if (target_cpu == "arm") { libs += [ "unwind" ] } } if (is_linux) { libs = [ "pthread" ] } if (sanitize != "") { # You can either pass the sanitizers directly, e.g. "address,undefined", # or pass one of the couple common aliases used by the bots. sanitizers = sanitize if (sanitize == "ASAN") { sanitizers = "address,bool,function,integer-divide-by-zero,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,unreachable,vla-bound,vptr" } else if (sanitize == "TSAN") { sanitizers = "thread" } else if (sanitize == "MSAN") { sanitizers = "memory" } cflags += [ "-fsanitize=$sanitizers", "-fno-sanitize-recover=$sanitizers", "-fsanitize-blacklist=" + rebase_path("../tools/xsan.blacklist"), ] ldflags += [ "-fsanitize=$sanitizers" ] if (sanitizers == "memory") { cflags += [ "-fsanitize-memory-track-origins" ] cflags_cc += [ "-stdlib=libc++" ] ldflags += [ "-stdlib=libc++" ] } } } config("release") { cflags = [ "-O3" ] defines = [ "NDEBUG" ] } config("executable") { if (is_mac) { ldflags = [ "-Wl,-rpath,@loader_path/." ] } else if (is_linux) { ldflags = [ "-Wl,-rpath,\$ORIGIN" ] } } toolchain("gcc_like") { lib_switch = "-l" lib_dir_switch = "-L" tool("cc") { depfile = "{{output}}.d" command = "$compiler_prefix $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} $extra_cflags $extra_cflags_c -c {{source}} -o {{output}}" depsformat = "gcc" outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", ] description = "$compiler_prefix $cc ... $extra_cflags $extra_cflags_c -o {{output}}" } tool("cxx") { depfile = "{{output}}.d" command = "$compiler_prefix $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} $extra_cflags $extra_cflags_cc -c {{source}} -o {{output}}" depsformat = "gcc" outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", ] description = "$compiler_prefix $cxx ... $extra_cflags $extra_cflags_cc -o {{output}}" } tool("asm") { depfile = "{{output}}.d" command = "$compiler_prefix $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" depsformat = "gcc" outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", ] description = "$compiler_prefix $cc ... -o {{output}}" } tool("alink") { command = "rm -f {{output}} && $ar rcs {{output}} {{inputs}}" outputs = [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}", ] default_output_extension = ".a" output_prefix = "lib" description = "$ar {{output}} ..." } tool("solink") { soname = "{{target_output_name}}{{output_extension}}" rpath = "-Wl,-soname,$soname" if (is_mac) { rpath = "-Wl,-install_name,@rpath/$soname" } command = "$compiler_prefix $cxx -shared {{ldflags}} {{inputs}} {{solibs}} {{libs}} $rpath $extra_ldflags -o {{output}}" outputs = [ "{{root_out_dir}}/$soname", ] output_prefix = "lib" default_output_extension = ".so" description = "$compiler_prefix $cxx -shared ... $extra_ldflags -o {{output}}" } tool("link") { command = "$compiler_prefix $cxx {{ldflags}} {{inputs}} {{solibs}} {{libs}} $extra_ldflags -o {{output}}" outputs = [ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}", ] description = "$compiler_prefix $cxx ... $extra_ldflags -o {{output}}" } tool("stamp") { command = "touch {{output}}" } tool("copy") { command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})" } }