Home | History | Annotate | Download | only in toolchain
      1 declare_args() {
      2   host_ar = ar
      3   host_cc = cc
      4   host_cxx = cxx
      5 
      6   if (is_android) {
      7     if (host_os == "win") {
      8       target_ar = "$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin/ar.exe"
      9       target_cc = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang.exe"
     10       target_cxx = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang++.exe"
     11     } else {
     12       target_ar = "$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin/ar"
     13       target_cc = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang"
     14       target_cxx = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang++"
     15     }
     16   } else {
     17     target_ar = ar
     18     target_cc = cc
     19     target_cxx = cxx
     20   }
     21 
     22   cc_wrapper = ""
     23 }
     24 
     25 if (host_os == "win") {
     26   python = "python.bat"
     27   stamp = "cmd.exe /c echo >"
     28 } else {
     29   python = "python"
     30   stamp = "touch"
     31 }
     32 
     33 toolchain("msvc") {
     34   lib_dir_switch = "/LIBPATH:"
     35 
     36   if (msvc == 2015) {
     37     bin = "$win_vc/bin/amd64"
     38   } else {
     39     bin = "$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$target_cpu"
     40   }
     41 
     42   env_setup = ""
     43   if (target_cpu == "x86") {
     44     # Toolchain asset includes a script that configures for x86 building.
     45     # We don't support x86 builds with local MSVC installations.
     46     env_setup = "cmd /c $win_sdk/bin/SetEnv.cmd /x86 && "
     47   }
     48 
     49   if (clang_win != "") {
     50     cl = "$clang_win/bin/clang-cl.exe"
     51   } else {
     52     cl = "$bin/cl.exe"
     53   }
     54 
     55   tool("asm") {
     56     _ml = "ml"
     57     if (target_cpu == "x64") {
     58       _ml += "64"
     59     }
     60     command = "$env_setup $bin/$_ml.exe /nologo /c /Fo {{output}} {{source}}"
     61     outputs = [
     62       "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
     63     ]
     64     description = "assemble {{source}}"
     65   }
     66 
     67   tool("cc") {
     68     rspfile = "{{output}}.rsp"
     69     precompiled_header_type = "msvc"
     70     pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
     71 
     72     # Label names may have spaces so pdbname must be quoted.
     73     command = "$env_setup $cc_wrapper \"$cl\" /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
     74     depsformat = "msvc"
     75     outputs = [
     76       "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
     77     ]
     78     rspfile_content = "{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"
     79     description = "compile {{source}}"
     80   }
     81 
     82   tool("cxx") {
     83     rspfile = "{{output}}.rsp"
     84     precompiled_header_type = "msvc"
     85     pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
     86 
     87     # Label names may have spaces so pdbname must be quoted.
     88     command = "$env_setup $cc_wrapper \"$cl\" /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
     89     depsformat = "msvc"
     90     outputs = [
     91       "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
     92     ]
     93     rspfile_content = "{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"
     94     description = "compile {{source}}"
     95   }
     96 
     97   tool("alink") {
     98     rspfile = "{{output}}.rsp"
     99 
    100     command = "$env_setup $bin/lib.exe /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile"
    101     outputs = [
    102       # Ignore {{output_extension}} and always use .lib, there's no reason to
    103       # allow targets to override this extension on Windows.
    104       "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
    105     ]
    106     default_output_extension = ".lib"
    107     default_output_dir = "{{target_out_dir}}"
    108 
    109     # inputs_newline works around a fixed per-line buffer size in the linker.
    110     rspfile_content = "{{inputs_newline}}"
    111     description = "link {{output}}"
    112   }
    113 
    114   tool("solink") {
    115     dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
    116     libname = "${dllname}.lib"
    117     pdbname = "${dllname}.pdb"
    118     rspfile = "${dllname}.rsp"
    119 
    120     command = "$env_setup $bin/link.exe /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile"
    121     outputs = [
    122       dllname,
    123       libname,
    124       pdbname,
    125     ]
    126     default_output_extension = ".dll"
    127     default_output_dir = "{{root_out_dir}}"
    128 
    129     link_output = libname
    130     depend_output = libname
    131     runtime_outputs = [
    132       dllname,
    133       pdbname,
    134     ]
    135 
    136     # I don't quite understand this.  Aping Chrome's toolchain/win/BUILD.gn.
    137     restat = true
    138 
    139     # inputs_newline works around a fixed per-line buffer size in the linker.
    140     rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}"
    141     description = "link {{output}}"
    142   }
    143 
    144   tool("link") {
    145     exename = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
    146     pdbname = "$exename.pdb"
    147     rspfile = "$exename.rsp"
    148 
    149     command =
    150         "$env_setup $bin/link.exe /nologo /OUT:$exename /PDB:$pdbname @$rspfile"
    151 
    152     default_output_extension = ".exe"
    153     default_output_dir = "{{root_out_dir}}"
    154     outputs = [
    155       exename,
    156     ]
    157 
    158     # inputs_newline works around a fixed per-line buffer size in the linker.
    159     rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}"
    160     description = "link {{output}}"
    161   }
    162 
    163   tool("stamp") {
    164     command = "$stamp {{output}}"
    165     description = "stamp {{output}}"
    166   }
    167 
    168   tool("copy") {
    169     cp_py = rebase_path("../cp.py")
    170     command = "$python $cp_py {{source}} {{output}}"
    171     description = "copy {{source}} {{output}}"
    172   }
    173 }
    174 
    175 template("gcc_like_toolchain") {
    176   toolchain(target_name) {
    177     ar = invoker.ar
    178     cc = invoker.cc
    179     cxx = invoker.cxx
    180     lib_switch = "-l"
    181     lib_dir_switch = "-L"
    182 
    183     tool("cc") {
    184       depfile = "{{output}}.d"
    185       command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
    186       depsformat = "gcc"
    187       outputs = [
    188         "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
    189       ]
    190       description = "compile {{source}}"
    191     }
    192 
    193     tool("cxx") {
    194       depfile = "{{output}}.d"
    195       command = "$cc_wrapper $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
    196       depsformat = "gcc"
    197       outputs = [
    198         "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
    199       ]
    200       description = "compile {{source}}"
    201     }
    202 
    203     tool("objc") {
    204       depfile = "{{output}}.d"
    205       command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}"
    206       depsformat = "gcc"
    207       outputs = [
    208         "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
    209       ]
    210       description = "compile {{source}}"
    211     }
    212 
    213     tool("objcxx") {
    214       depfile = "{{output}}.d"
    215       command = "$cc_wrapper $cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} {{cflags_objcc}} -c {{source}} -o {{output}}"
    216       depsformat = "gcc"
    217       outputs = [
    218         "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
    219       ]
    220       description = "compile {{source}}"
    221     }
    222 
    223     tool("asm") {
    224       depfile = "{{output}}.d"
    225       command = "$cc_wrapper $cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
    226       depsformat = "gcc"
    227       outputs = [
    228         "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
    229       ]
    230       description = "assemble {{source}}"
    231     }
    232 
    233     tool("alink") {
    234       rspfile = "{{output}}.rsp"
    235       rspfile_content = "{{inputs}}"
    236       ar_py = rebase_path("../ar.py")
    237       command = "$python $ar_py $ar {{output}} $rspfile"
    238       outputs = [
    239         "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
    240       ]
    241       default_output_extension = ".a"
    242       output_prefix = "lib"
    243       description = "link {{output}}"
    244     }
    245 
    246     tool("solink") {
    247       soname = "{{target_output_name}}{{output_extension}}"
    248 
    249       rpath = "-Wl,-soname,$soname"
    250       if (is_mac) {
    251         rpath = "-Wl,-install_name,@rpath/$soname"
    252       }
    253 
    254       rspfile = "{{output}}.rsp"
    255       rspfile_content = "{{inputs}}"
    256       command = "$cc_wrapper $cxx -shared {{ldflags}} @$rspfile {{solibs}} {{libs}} $rpath -o {{output}}"
    257       outputs = [
    258         "{{root_out_dir}}/$soname",
    259       ]
    260       output_prefix = "lib"
    261       default_output_extension = ".so"
    262       description = "link {{output}}"
    263     }
    264 
    265     tool("link") {
    266       rspfile = "{{output}}.rsp"
    267       rspfile_content = "{{inputs}}"
    268       command = "$cc_wrapper $cxx {{ldflags}} @$rspfile {{solibs}} {{libs}} -o {{output}}"
    269       outputs = [
    270         "{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
    271       ]
    272       description = "link {{output}}"
    273     }
    274 
    275     tool("stamp") {
    276       command = "$stamp {{output}}"
    277       description = "stamp {{output}}"
    278     }
    279 
    280     tool("copy") {
    281       cp_py = rebase_path("../cp.py")
    282       command = "$python $cp_py {{source}} {{output}}"
    283       description = "copy {{source}} {{output}}"
    284     }
    285 
    286     tool("copy_bundle_data") {
    287       cp_py = rebase_path("../cp.py")
    288       command = "$python $cp_py {{source}} {{output}}"
    289       description = "copy_bundle_data {{source}} {{output}}"
    290     }
    291 
    292     # We don't currently have any xcasset files so make this a NOP
    293     tool("compile_xcassets") {
    294       command = "true"
    295       description = "compile_xcassets {{output}}"
    296     }
    297 
    298     toolchain_args = {
    299       current_cpu = invoker.cpu
    300       current_os = invoker.os
    301     }
    302   }
    303 }
    304 
    305 gcc_like_toolchain("gcc_like") {
    306   cpu = current_cpu
    307   os = current_os
    308   ar = target_ar
    309   cc = target_cc
    310   cxx = target_cxx
    311 }
    312 
    313 gcc_like_toolchain("gcc_like_host") {
    314   cpu = host_cpu
    315   os = host_os
    316   ar = host_ar
    317   cc = host_cc
    318   cxx = host_cxx
    319 }
    320