xref: /build/lite/toolchain/clang.gni (revision 5f9996aa)
15f9996aaSopenharmony_ci# Copyright (c) 2020 Huawei Device Co., Ltd.
25f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
35f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
45f9996aaSopenharmony_ci# You may obtain a copy of the License at
55f9996aaSopenharmony_ci#
65f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
75f9996aaSopenharmony_ci#
85f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
95f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
105f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
125f9996aaSopenharmony_ci# limitations under the License.
135f9996aaSopenharmony_ci
145f9996aaSopenharmony_citemplate("clang_toolchain") {
155f9996aaSopenharmony_ci  toolchain(target_name) {
165f9996aaSopenharmony_ci    assert(defined(invoker.cc), "clang toolchain must specify a \"cc\" value")
175f9996aaSopenharmony_ci    assert(defined(invoker.cxx), "clang toolchain must specify a \"cxx\" value")
185f9996aaSopenharmony_ci    assert(defined(invoker.ar), "clang toolchain must specify a \"ar\" value")
195f9996aaSopenharmony_ci    assert(defined(invoker.ld), "clang toolchain must specify a \"ld\" value")
205f9996aaSopenharmony_ci
215f9996aaSopenharmony_ci    cc = invoker.cc
225f9996aaSopenharmony_ci    cxx = invoker.cxx
235f9996aaSopenharmony_ci    ar = invoker.ar
245f9996aaSopenharmony_ci    ld = invoker.ld
255f9996aaSopenharmony_ci
265f9996aaSopenharmony_ci    need_strip = false
275f9996aaSopenharmony_ci    if (defined(invoker.strip)) {
285f9996aaSopenharmony_ci      strip = invoker.strip
295f9996aaSopenharmony_ci      need_strip = true
305f9996aaSopenharmony_ci    }
315f9996aaSopenharmony_ci
325f9996aaSopenharmony_ci    tool("cc") {
335f9996aaSopenharmony_ci      command = "$cc {{defines}} {{cflags}} {{cflags_c}} {{include_dirs}} -c {{source}} -o {{output}}"
345f9996aaSopenharmony_ci      description = "clang {{output}}"
355f9996aaSopenharmony_ci      outputs =
365f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
375f9996aaSopenharmony_ci    }
385f9996aaSopenharmony_ci    tool("cxx") {
395f9996aaSopenharmony_ci      depfile = "{{output}}.d"
405f9996aaSopenharmony_ci      command = "$cxx {{defines}} {{cflags_cc}} {{include_dirs}} -c {{source}} -o {{output}}"
415f9996aaSopenharmony_ci      description = "clang++ {{output}}"
425f9996aaSopenharmony_ci      outputs =
435f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
445f9996aaSopenharmony_ci    }
455f9996aaSopenharmony_ci    tool("asm") {
465f9996aaSopenharmony_ci      depfile = "{{output}}.d"
475f9996aaSopenharmony_ci      command = "$cc {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
485f9996aaSopenharmony_ci      description = "ASM {{output}}"
495f9996aaSopenharmony_ci      outputs =
505f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
515f9996aaSopenharmony_ci    }
525f9996aaSopenharmony_ci    tool("alink") {
535f9996aaSopenharmony_ci      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
545f9996aaSopenharmony_ci      rspfile = "{{output}}.rsp"
555f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
565f9996aaSopenharmony_ci      command = "$ar -cr {{output}} @\"$rspfile\""
575f9996aaSopenharmony_ci      description = "AR {{output}}"
585f9996aaSopenharmony_ci      outputs = [ outfile ]
595f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}/libs"
605f9996aaSopenharmony_ci      default_output_extension = ".a"
615f9996aaSopenharmony_ci      output_prefix = "lib"
625f9996aaSopenharmony_ci    }
635f9996aaSopenharmony_ci    tool("solink") {
645f9996aaSopenharmony_ci      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
655f9996aaSopenharmony_ci      unstripped_outfile = outfile
665f9996aaSopenharmony_ci
675f9996aaSopenharmony_ci      rspfile = "$outfile.rsp"
685f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
695f9996aaSopenharmony_ci      command = ""
705f9996aaSopenharmony_ci      if (need_strip) {
715f9996aaSopenharmony_ci        unstripped_outfile = "{{output_dir}}/unstripped/usr/lib/{{target_output_name}}{{output_extension}}"
725f9996aaSopenharmony_ci      }
735f9996aaSopenharmony_ci
745f9996aaSopenharmony_ci      command +=
755f9996aaSopenharmony_ci          "$ld -shared {{ldflags}} {{inputs}} {{libs}} -o $unstripped_outfile"
765f9996aaSopenharmony_ci      if (need_strip) {
775f9996aaSopenharmony_ci        command += " && $strip \"$unstripped_outfile\" -o \"$outfile\""
785f9996aaSopenharmony_ci      }
795f9996aaSopenharmony_ci
805f9996aaSopenharmony_ci      default_output_extension = ".so"
815f9996aaSopenharmony_ci      description = "SOLINK $outfile"
825f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}"
835f9996aaSopenharmony_ci      output_prefix = "lib"
845f9996aaSopenharmony_ci      outputs = [ outfile ]
855f9996aaSopenharmony_ci      if (unstripped_outfile != outfile) {
865f9996aaSopenharmony_ci        outputs += [ unstripped_outfile ]
875f9996aaSopenharmony_ci      }
885f9996aaSopenharmony_ci    }
895f9996aaSopenharmony_ci    tool("link") {
905f9996aaSopenharmony_ci      outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}"
915f9996aaSopenharmony_ci      unstripped_outfile = outfile
925f9996aaSopenharmony_ci
935f9996aaSopenharmony_ci      rspfile = "$outfile.rsp"
945f9996aaSopenharmony_ci      custom_ld_flags = " "
955f9996aaSopenharmony_ci      command = ""
965f9996aaSopenharmony_ci      if (need_strip) {
975f9996aaSopenharmony_ci        unstripped_outfile = "{{output_dir}}/unstripped/bin/{{target_output_name}}{{output_extension}}"
985f9996aaSopenharmony_ci      }
995f9996aaSopenharmony_ci      command += "$ld {{ldflags}} {{inputs}} {{libs}} $custom_ld_flags -o $unstripped_outfile"
1005f9996aaSopenharmony_ci      if (need_strip) {
1015f9996aaSopenharmony_ci        command += " && $strip \"$unstripped_outfile\" -o \"$outfile\""
1025f9996aaSopenharmony_ci      }
1035f9996aaSopenharmony_ci
1045f9996aaSopenharmony_ci      description = "LLVM LINK $outfile"
1055f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}"
1065f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
1075f9996aaSopenharmony_ci      outputs = [ outfile ]
1085f9996aaSopenharmony_ci      if (unstripped_outfile != outfile) {
1095f9996aaSopenharmony_ci        outputs += [ unstripped_outfile ]
1105f9996aaSopenharmony_ci      }
1115f9996aaSopenharmony_ci    }
1125f9996aaSopenharmony_ci    tool("stamp") {
1135f9996aaSopenharmony_ci      if (host_os == "win") {
1145f9996aaSopenharmony_ci        command = "cmd /c type nul > \"{{output}}\""
1155f9996aaSopenharmony_ci      } else {
1165f9996aaSopenharmony_ci        command = "/usr/bin/touch {{output}}"
1175f9996aaSopenharmony_ci      }
1185f9996aaSopenharmony_ci      description = "STAMP {{output}}"
1195f9996aaSopenharmony_ci    }
1205f9996aaSopenharmony_ci
1215f9996aaSopenharmony_ci    tool("copy") {
1225f9996aaSopenharmony_ci      command = "cp -afd {{source}} {{output}}"
1235f9996aaSopenharmony_ci      description = "COPY {{source}} {{output}}"
1245f9996aaSopenharmony_ci    }
1255f9996aaSopenharmony_ci  }
1265f9996aaSopenharmony_ci}
127