brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.9 KiB · 00d9df1 Raw
430 lines · plain
1import("//llvm/utils/gn/build/toolchain/compiler.gni")2 3unix_copy_command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"4 5template("unix_toolchain") {6  toolchain(target_name) {7    # https://groups.google.com/a/chromium.org/g/gn-dev/c/F_lv5T-tNDM8    forward_variables_from(invoker.toolchain_args, "*")9    not_needed("*")10 11    forward_variables_from(invoker, "*")12 13    cc = "cc"14    cxx = "c++"15 16    if (clang_base_path != "") {17      cc = rebase_path(clang_base_path, root_build_dir) + "/bin/clang"18      cxx = rebase_path(clang_base_path, root_build_dir) + "/bin/clang++"19    }20 21    ld = cxx  # Don't use compiler wrapper for linking.22    if (compiler_wrapper != "") {23      cc = "$compiler_wrapper $cc"24      cxx = "$compiler_wrapper $cxx"25    }26 27    tool("cc") {28      depfile = "{{output}}.d"29      command = "$cc -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"30      depsformat = "gcc"31      description = "CC {{output}}"32      outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ]33    }34 35    tool("cxx") {36      depfile = "{{output}}.d"37      command = "$cxx -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"38      depsformat = "gcc"39      description = "CXX {{output}}"40      outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ]41    }42 43    tool("objcxx") {44      depfile = "{{output}}.d"45      command = "$cxx -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_objcc}}"46      depsformat = "gcc"47      description = "OBJCXX {{output}}"48      outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ]49    }50 51    tool("asm") {52      depfile = "{{output}}.d"53      command = "$cc -MMD -MF $depfile -o {{output}} -c {{source}} {{defines}} {{include_dirs}} {{asmflags}}"54      depsformat = "gcc"55      description = "ASM {{output}}"56      outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o" ]57    }58 59    tool("alink") {60      if (current_os == "ios" || current_os == "mac") {61        command = "libtool -D -static -no_warning_for_no_symbols {{arflags}} -o {{output}} {{inputs}}"62      } else {63        # Remove the output file first so that ar doesn't try to modify the64        # existing file.65        command =66            "rm -f {{output}} && $ar rcsD {{arflags}} {{output}} {{inputs}}"67      }68      description = "AR {{output}}"69      outputs = [ "{{output_dir}}/{{target_output_name}}.a" ]70      output_prefix = "lib"71      default_output_dir = "{{root_out_dir}}/lib"72    }73 74    # Make these apply to all tools below.75    lib_switch = "-l"76    lib_dir_switch = "-L"77 78    tool("solink") {79      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"80      if (current_os == "ios" || current_os == "mac") {81        command = "$ld -shared {{ldflags}} -o $outfile {{inputs}} {{libs}} {{frameworks}}"82        default_output_extension = ".dylib"83      } else {84        command = "$ld -shared {{ldflags}} -Wl,-soname,{{target_output_name}}{{output_extension}} -o $outfile {{inputs}} {{libs}}"85        default_output_extension = ".so"86      }87      description = "SOLINK $outfile"88      outputs = [ outfile ]89      output_prefix = "lib"90      default_output_dir = "{{root_out_dir}}/lib"91    }92 93    tool("solink_module") {94      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"95      if (current_os == "ios" || current_os == "mac") {96        command = "$ld -shared {{ldflags}} -Wl,-flat_namespace -Wl,-undefined,suppress -o $outfile {{inputs}} {{libs}} {{frameworks}}"97        default_output_extension = ".dylib"98      } else {99        command = "$ld -shared {{ldflags}} -Wl,-soname,{{target_output_name}}{{output_extension}} -o $outfile {{inputs}} {{libs}}"100        default_output_extension = ".so"101      }102      description = "SOLINK $outfile"103      outputs = [ outfile ]104      default_output_dir = "{{root_out_dir}}/lib"105    }106 107    tool("link") {108      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"109      if (current_os == "ios" || current_os == "mac") {110        command =111            "$ld {{ldflags}} -o $outfile {{inputs}} {{libs}} {{frameworks}}"112      } else {113        command = "$ld {{ldflags}} -o $outfile -Wl,--start-group {{inputs}} -Wl,--end-group {{libs}}"114      }115      description = "LINK $outfile"116      outputs = [ outfile ]117 118      # Setting this allows targets to override the default executable output by119      # setting output_dir.120      default_output_dir = "{{root_out_dir}}/bin"121    }122 123    tool("copy") {124      command = unix_copy_command125      description = "COPY {{source}} {{output}}"126    }127 128    if (current_os == "ios" || current_os == "mac") {129      tool("copy_bundle_data") {130        # https://github.com/nico/hack/blob/master/notes/copydir.md131        _copydir = "cd {{source}} && " +132                   "find . | cpio -pdl \"\$OLDPWD\"/{{output}} 2>/dev/null"133        command = "rm -rf {{output}} && if [[ -d {{source}} ]]; then " +134                  _copydir + "; else " + unix_copy_command + "; fi"135        description = "COPY_BUNDLE_DATA {{source}} {{output}}"136      }137      tool("compile_xcassets") {138        command = "false"139        description = "The LLVM build doesn't use any xcasset files"140      }141    }142 143    tool("stamp") {144      command = "touch {{output}}"145      description = "STAMP {{output}}"146    }147  }148}149 150unix_toolchain("unix") {151  if (current_os != "ios" && current_os != "mac") {152    if (clang_base_path != "") {153      ar = rebase_path(clang_base_path, root_build_dir) + "/bin/llvm-ar"154    } else {155      ar = "ar"156    }157  }158 159  toolchain_args = {160    current_os = host_os161    current_cpu = host_cpu162  }163}164 165# This template defines a toolchain that uses just-built clang and lld166# as compiler and linker.167template("stage2_unix_toolchain") {168  unix_toolchain(target_name) {169    toolchain_args = {170      forward_variables_from(invoker.toolchain_args, "*")171 172      clang_base_path = root_build_dir173      llvm_enable_zstd = false174    }175 176    deps = [177      "//:clang($host_toolchain)",178      "//:lld($host_toolchain)",179    ]180    if (toolchain_args.current_os != "ios" &&181        toolchain_args.current_os != "mac") {182      ar = "bin/llvm-ar"183      deps += [ "//:llvm-ar($host_toolchain)" ]184    }185  }186}187 188stage2_unix_toolchain("stage2_unix") {189  toolchain_args = {190    current_os = host_os191    current_cpu = host_cpu192  }193}194 195stage2_unix_toolchain("stage2_unix_x86") {196  toolchain_args = {197    current_os = host_os198    current_cpu = "x86"199  }200}201 202if (android_ndk_path != "") {203  # Android compiler-rt libraries don't really work with per-target runtime204  # directories yet so force it off.205  # https://discourse.llvm.org/t/handling-version-numbers-in-per-target-runtime-directories/62717.206  stage2_unix_toolchain("stage2_android_aarch64") {207    toolchain_args = {208      current_os = "android"209      current_cpu = "arm64"210      clang_enable_per_target_runtime_dir = false211    }212  }213 214  stage2_unix_toolchain("stage2_android_arm") {215    toolchain_args = {216      current_os = "android"217      current_cpu = "arm"218      clang_enable_per_target_runtime_dir = false219    }220  }221 222  stage2_unix_toolchain("stage2_android_x64") {223    toolchain_args = {224      current_os = "android"225      current_cpu = "x64"226      clang_enable_per_target_runtime_dir = false227    }228  }229 230  stage2_unix_toolchain("stage2_android_x86") {231    toolchain_args = {232      current_os = "android"233      current_cpu = "x86"234      clang_enable_per_target_runtime_dir = false235    }236  }237}238 239if (host_os == "mac") {240  stage2_unix_toolchain("stage2_ios_aarch64") {241    toolchain_args = {242      current_os = "ios"243      current_cpu = "arm64"244    }245  }246 247  stage2_unix_toolchain("stage2_iossim_x64") {248    toolchain_args = {249      current_os = "ios"250      current_cpu = "x64"251    }252  }253}254 255stage2_unix_toolchain("stage2_baremetal_aarch64") {256  toolchain_args = {257    current_os = "baremetal"258    current_cpu = "arm64"259 260    # FIXME: These should be set in all toolchains building sanitizers,261    # see discussion at https://reviews.llvm.org/D127906#3587329262    use_asan = false263    use_tsan = false264    use_ubsan = false265  }266}267 268template("win_toolchain") {269  toolchain(target_name) {270    # https://groups.google.com/a/chromium.org/d/msg/gn-dev/F_lv5T-tNDM271    forward_variables_from(invoker.toolchain_args, "*")272    not_needed("*")273 274    forward_variables_from(invoker, "*")275 276    cl = "cl"277    link = "link"278 279    if (clang_base_path != "") {280      cl = rebase_path(clang_base_path, root_build_dir) + "/bin/clang-cl"281      if (use_lld) {282        link = rebase_path(clang_base_path, root_build_dir) + "/bin/lld-link"283      }284    }285 286    if (compiler_wrapper != "") {287      cl = "$compiler_wrapper $cl"288    }289 290    tool("cc") {291      command = "$cl /nologo /showIncludes /Fo{{output}} /c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}"292      depsformat = "msvc"293      description = "CC {{output}}"294      outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj" ]295    }296 297    tool("cxx") {298      command = "$cl /nologo /showIncludes /Fo{{output}} /c {{source}} {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}"299      depsformat = "msvc"300      description = "CXX {{output}}"301      outputs = [ "{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj" ]302    }303 304    tool("alink") {305      command = "$link /lib /nologo {{arflags}} /out:{{output}} {{inputs}}"306      description = "LIB {{output}}"307      outputs = [ "{{output_dir}}/{{target_output_name}}.lib" ]308      default_output_dir = "{{root_out_dir}}/lib"309    }310 311    # Make these apply to all tools below.312    lib_switch = ""313    lib_dir_switch = "/LIBPATH:"314 315    tool("solink") {316      outprefix = "{{output_dir}}/{{target_output_name}}"317      dllfile = "$outprefix{{output_extension}}"318      libfile = "$outprefix.lib"319      pdbfile = "$outprefix.pdb"320      command = "$link /nologo /dll {{ldflags}} /out:$dllfile /implib:$libfile /pdb:$pdbfile {{inputs}} {{libs}} "321      description = "LINK $dllfile"322      link_output = libfile323      depend_output = libfile324      runtime_outputs = [ dllfile ]325      outputs = [326        dllfile,327        libfile,328      ]329      default_output_extension = ".dll"330      restat = true331 332      # Put dlls next to the executables in bin/ on Windows, since Windows333      # doesn't have a configurable rpath. This matches initialization of334      # module_dir to bin/ in AddLLVM.cmake's set_output_directory().335      default_output_dir = "{{root_out_dir}}/bin"336    }337 338    # Plugins for opt and clang and so on don't work in LLVM's Windows build339    # since the code doesn't have export annotations, but there are a few340    # standalone loadable modules used for unit-testing LLVM's dynamic library341    # loading code.342    tool("solink_module") {343      outprefix = "{{output_dir}}/{{target_output_name}}"344      dllfile = "$outprefix{{output_extension}}"345      pdbfile = "$outprefix.pdb"346      command = "$link /nologo /dll {{ldflags}} /out:$dllfile /pdb:$pdbfile {{inputs}} {{libs}} "347      description = "LINK_MODULE $dllfile"348      outputs = [ dllfile ]349      runtime_outputs = outputs350      default_output_extension = ".dll"351 352      # No default_output_dir, all clients set output_dir.353    }354 355    tool("link") {356      outprefix = "{{output_dir}}/{{target_output_name}}"357      outfile = "$outprefix{{output_extension}}"358      pdbfile = "$outprefix.pdb"359      command = "$link /nologo {{ldflags}} /out:$outfile /pdb:$pdbfile {{inputs}} {{libs}}"360      description = "LINK $outfile"361      outputs = [ outfile ]362      default_output_extension = ".exe"363 364      # Setting this allows targets to override the default executable output by365      # setting output_dir.366      default_output_dir = "{{root_out_dir}}/bin"367    }368 369    tool("copy") {370      if (host_os == "win") {371        # GN hands out slash-using paths, but cmd's copy needs backslashes.372        # Use cmd's %foo:a=b% substitution feature to convert.373        command = "cmd /c set source=\"{{source}}\" & set output=\"{{output}}\" & call copy /Y %source:/=\% %output:\=/% > nul"374      } else {375        command = unix_copy_command376      }377 378      description = "COPY {{source}} {{output}}"379    }380 381    tool("stamp") {382      if (host_os == "win") {383        command = "cmd /c type nul > {{output}}"384      } else {385        command = "touch {{output}}"386      }387      description = "STAMP {{output}}"388    }389  }390}391 392win_toolchain("win") {393  toolchain_args = {394    current_os = "win"395    current_cpu = host_cpu396  }397}398 399win_toolchain("stage2_win_x64") {400  toolchain_args = {401    current_os = "win"402    current_cpu = "x64"403 404    if (host_os != "win") {405      sysroot = win_sysroot406    }407    clang_base_path = root_build_dir408  }409  deps = [410    "//:clang($host_toolchain)",411    "//:lld($host_toolchain)",412  ]413}414 415win_toolchain("stage2_win_x86") {416  toolchain_args = {417    current_os = "win"418    current_cpu = "x86"419 420    if (host_os != "win") {421      sysroot = win_sysroot422    }423    clang_base_path = root_build_dir424  }425  deps = [426    "//:clang($host_toolchain)",427    "//:lld($host_toolchain)",428  ]429}430