Home | History | Annotate | Download | only in toolchain
      1 # Copyright (C) 2017 The Android Open Source Project
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
      4 # you may not use this file except in compliance with the License.
      5 # You may obtain a copy of the License at
      6 #
      7 #      http://www.apache.org/licenses/LICENSE-2.0
      8 #
      9 # Unless required by applicable law or agreed to in writing, software
     10 # distributed under the License is distributed on an "AS IS" BASIS,
     11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
     14 
     15 import("//gn/standalone/android.gni")
     16 import("llvm.gni")
     17 
     18 declare_args() {
     19   if (is_clang) {
     20     if (is_linux) {
     21       cc = linux_clang_bin
     22       cxx = linux_clangxx_bin
     23     } else {
     24       cc = "clang"
     25       cxx = "clang++"
     26     }
     27   } else {
     28     cc = "gcc"
     29     cxx = "g++"
     30   }
     31 }
     32 
     33 declare_args() {
     34   host_ar = ar
     35   if (is_linux_host && is_clang) {
     36     host_cc = linux_clang_bin
     37     host_cxx = linux_clangxx_bin
     38   } else {
     39     host_cc = cc
     40     host_cxx = cxx
     41   }
     42 
     43   if (is_android) {
     44     target_ar = "$android_toolchain_root/bin/$android_abi_target-ar"
     45     target_cc = "$android_llvm_dir/bin/clang"
     46     target_cxx = "$android_llvm_dir/bin/clang++"
     47   } else {
     48     target_ar = ar
     49     target_cc = cc
     50     target_cxx = cxx
     51   }
     52   cc_wrapper = ""
     53 }
     54 
     55 python = "python"
     56 stamp = "touch"
     57 
     58 template("gcc_like_toolchain") {
     59   toolchain(target_name) {
     60     ar = invoker.ar
     61     cc = invoker.cc
     62     cxx = invoker.cxx
     63     lib_switch = "-l"
     64     lib_dir_switch = "-L"
     65 
     66     tool("cc") {
     67       depfile = "{{output}}.d"
     68       command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
     69       depsformat = "gcc"
     70       outputs = [
     71         "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
     72       ]
     73       description = "compile {{source}}"
     74     }
     75 
     76     tool("cxx") {
     77       depfile = "{{output}}.d"
     78       command = "$cc_wrapper $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
     79       depsformat = "gcc"
     80       outputs = [
     81         "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
     82       ]
     83       description = "compile {{source}}"
     84     }
     85 
     86     tool("asm") {
     87       depfile = "{{output}}.d"
     88       command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
     89       depsformat = "gcc"
     90       outputs = [
     91         "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
     92       ]
     93       description = "assemble {{source}}"
     94     }
     95 
     96     tool("alink") {
     97       if (is_mac && ar != "suppress_unused_ar_variable_warning") {
     98         command = "rm -f {{output}} && libtool -static {{arflags}} -o {{output}} {{inputs}}"
     99       } else {
    100         rspfile = "{{output}}.rsp"
    101         rspfile_content = "{{inputs}}"
    102         command = "$ar rcsD {{output}} @$rspfile"
    103       }
    104       outputs = [
    105         "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
    106       ]
    107       default_output_extension = ".a"
    108       output_prefix = "lib"
    109       description = "link {{output}}"
    110     }
    111 
    112     tool("solink") {
    113       soname = "{{target_output_name}}{{output_extension}}"
    114 
    115       rpath = "-Wl,-soname,$soname"
    116       if (is_mac) {
    117         rpath = "-Wl,-install_name,@rpath/$soname"
    118       }
    119 
    120       command = "$cc_wrapper $cxx -shared {{ldflags}} {{inputs}} {{solibs}} {{libs}} $rpath -o {{output}}"
    121       outputs = [
    122         "{{root_out_dir}}/$soname",
    123       ]
    124       output_prefix = "lib"
    125       default_output_extension = ".so"
    126       description = "link {{output}}"
    127     }
    128 
    129     tool("link") {
    130       command = "$cc_wrapper $cxx {{ldflags}} {{inputs}} {{solibs}} {{libs}} -o {{output}}"
    131       outputs = [
    132         "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
    133       ]
    134       description = "link {{output}}"
    135     }
    136 
    137     tool("stamp") {
    138       command = "touch {{output}}"
    139       description = "stamp {{output}}"
    140     }
    141 
    142     tool("copy") {
    143       command = "cp -af {{source}} {{output}}"
    144       description = "COPY {{source}} {{output}}"
    145     }
    146 
    147     toolchain_args = {
    148       current_cpu = invoker.cpu
    149       current_os = invoker.os
    150     }
    151   }
    152 }
    153 
    154 gcc_like_toolchain("gcc_like") {
    155   cpu = current_cpu
    156   os = current_os
    157   ar = target_ar
    158   cc = target_cc
    159   cxx = target_cxx
    160 }
    161 
    162 gcc_like_toolchain("gcc_like_host") {
    163   cpu = host_cpu
    164   os = host_os
    165   ar = host_ar
    166   cc = host_cc
    167   cxx = host_cxx
    168 }
    169