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_ciimport("//build/lite/config/toolchain/config.gni")
155f9996aaSopenharmony_ci
165f9996aaSopenharmony_citemplate("iccarm_toolchain") {
175f9996aaSopenharmony_ci  toolchain(target_name) {
185f9996aaSopenharmony_ci    assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value")
195f9996aaSopenharmony_ci    assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value")
205f9996aaSopenharmony_ci    assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value")
215f9996aaSopenharmony_ci    assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value")
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_ci    cc = invoker.cc
245f9996aaSopenharmony_ci    cxx = invoker.cxx
255f9996aaSopenharmony_ci    as = invoker.as
265f9996aaSopenharmony_ci    ar = invoker.ar
275f9996aaSopenharmony_ci    ld = invoker.ld
285f9996aaSopenharmony_ci
295f9996aaSopenharmony_ci    need_strip = false
305f9996aaSopenharmony_ci    if (defined(invoker.strip)) {
315f9996aaSopenharmony_ci      strip = invoker.strip
325f9996aaSopenharmony_ci      need_strip = true
335f9996aaSopenharmony_ci    }
345f9996aaSopenharmony_ci
355f9996aaSopenharmony_ci    if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") {
365f9996aaSopenharmony_ci      extra_ldflags = " " + invoker.extra_ldflags
375f9996aaSopenharmony_ci    } else {
385f9996aaSopenharmony_ci      extra_ldflags = ""
395f9996aaSopenharmony_ci    }
405f9996aaSopenharmony_ci
415f9996aaSopenharmony_ci    tool("cc") {
425f9996aaSopenharmony_ci      command = "$cc {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
435f9996aaSopenharmony_ci      if (enable_save_temps) {
445f9996aaSopenharmony_ci        preprocess_outfile = "{{output}}.i"
455f9996aaSopenharmony_ci        list_outfile = "{{output}}.lst"
465f9996aaSopenharmony_ci        asm_outfile = "{{output}}.s"
475f9996aaSopenharmony_ci        command += " --preprocess $preprocess_outfile -lCN $list_outfile -lA $asm_outfile"
485f9996aaSopenharmony_ci      }
495f9996aaSopenharmony_ci      description = "iccarm CC {{output}}"
505f9996aaSopenharmony_ci      outputs =
515f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
525f9996aaSopenharmony_ci    }
535f9996aaSopenharmony_ci    tool("cxx") {
545f9996aaSopenharmony_ci      depfile = "{{output}}.d"
555f9996aaSopenharmony_ci      command = "$cxx {{defines}} {{include_dirs}} {{cflags_cc}} -c {{source}} -o {{output}}"
565f9996aaSopenharmony_ci      if (enable_save_temps) {
575f9996aaSopenharmony_ci        preprocess_outfile = "{{output}}.i"
585f9996aaSopenharmony_ci        list_outfile = "{{output}}.lst"
595f9996aaSopenharmony_ci        asm_outfile = "{{output}}.s"
605f9996aaSopenharmony_ci        command += " --preprocess $preprocess_outfile -lCN $list_outfile -lA $asm_outfile"
615f9996aaSopenharmony_ci      }
625f9996aaSopenharmony_ci      description = "iccarm CXX {{output}}"
635f9996aaSopenharmony_ci      outputs =
645f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
655f9996aaSopenharmony_ci    }
665f9996aaSopenharmony_ci    tool("asm") {
675f9996aaSopenharmony_ci      depfile = "{{output}}.d"
685f9996aaSopenharmony_ci      command = "$as {{defines}} {{include_dirs}} {{asmflags}} {{source}} -o {{output}}"
695f9996aaSopenharmony_ci      description = "iccarm ASM {{output}}"
705f9996aaSopenharmony_ci      outputs =
715f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
725f9996aaSopenharmony_ci    }
735f9996aaSopenharmony_ci    tool("alink") {
745f9996aaSopenharmony_ci      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
755f9996aaSopenharmony_ci      rspfile = "{{output}}.rsp"
765f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
775f9996aaSopenharmony_ci      command = "rm -f {{output}} && $ar {{inputs}} -o {{output}}"
785f9996aaSopenharmony_ci
795f9996aaSopenharmony_ci      description = "iccarm AR {{output}}"
805f9996aaSopenharmony_ci      outputs = [ outfile ]
815f9996aaSopenharmony_ci
825f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}/libs"
835f9996aaSopenharmony_ci      default_output_extension = ".a"
845f9996aaSopenharmony_ci      output_prefix = "lib"
855f9996aaSopenharmony_ci    }
865f9996aaSopenharmony_ci    tool("solink") {
875f9996aaSopenharmony_ci      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
885f9996aaSopenharmony_ci      unstripped_outfile = outfile
895f9996aaSopenharmony_ci
905f9996aaSopenharmony_ci      rspfile = "$outfile.rsp"
915f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
925f9996aaSopenharmony_ci      command = ""
935f9996aaSopenharmony_ci      if (need_strip) {
945f9996aaSopenharmony_ci        unstripped_outfile = "{{output_dir}}/unstripped/usr/lib/{{target_output_name}}{{output_extension}}"
955f9996aaSopenharmony_ci      }
965f9996aaSopenharmony_ci      command += "$ld -shared {{ldflags}} $extra_ldflags " + "-Wl, --start-group {{inputs}} {{libs}} -Wl, --end-group -o $unstripped_outfile"
975f9996aaSopenharmony_ci      if (need_strip) {
985f9996aaSopenharmony_ci        command += " && $strip \"$unstripped_outfile\" \"$outfile\""
995f9996aaSopenharmony_ci      }
1005f9996aaSopenharmony_ci      description = "iccarm SOLINK $outfile"
1015f9996aaSopenharmony_ci      outputs = [ outfile ]
1025f9996aaSopenharmony_ci      if (unstripped_outfile != outfile) {
1035f9996aaSopenharmony_ci        outputs += [ unstripped_outfile ]
1045f9996aaSopenharmony_ci      }
1055f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}"
1065f9996aaSopenharmony_ci      default_output_extension = ".so"
1075f9996aaSopenharmony_ci      output_prefix = "lib"
1085f9996aaSopenharmony_ci    }
1095f9996aaSopenharmony_ci    tool("link") {
1105f9996aaSopenharmony_ci      outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}"
1115f9996aaSopenharmony_ci      unstripped_outfile = outfile
1125f9996aaSopenharmony_ci
1135f9996aaSopenharmony_ci      rspfile = "$outfile.rsp"
1145f9996aaSopenharmony_ci      command = ""
1155f9996aaSopenharmony_ci      if (need_strip) {
1165f9996aaSopenharmony_ci        unstripped_outfile = "{{output_dir}}/unstripped/bin/{{target_output_name}}{{output_extension}}"
1175f9996aaSopenharmony_ci      }
1185f9996aaSopenharmony_ci
1195f9996aaSopenharmony_ci      if (enable_iccarm_link_helper) {
1205f9996aaSopenharmony_ci        link_helper =
1215f9996aaSopenharmony_ci            rebase_path("//build/lite/toolchain/iccarm_link_helper.sh")
1225f9996aaSopenharmony_ci        command += "$ld {{ldflags}} $extra_ldflags \$($link_helper {{inputs}} {{libs}}) -o $unstripped_outfile"
1235f9996aaSopenharmony_ci      } else {
1245f9996aaSopenharmony_ci        command += "$ld {{ldflags}} $extra_ldflags " +
1255f9996aaSopenharmony_ci                   "{{inputs}} {{libs}} -o $unstripped_outfile"
1265f9996aaSopenharmony_ci      }
1275f9996aaSopenharmony_ci      if (need_strip) {
1285f9996aaSopenharmony_ci        command += " && $strip \"$unstripped_outfile\" \"$outfile\""
1295f9996aaSopenharmony_ci      }
1305f9996aaSopenharmony_ci
1315f9996aaSopenharmony_ci      description = "iccarm LINK $outfile"
1325f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}"
1335f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
1345f9996aaSopenharmony_ci      outputs = [ outfile ]
1355f9996aaSopenharmony_ci      if (unstripped_outfile != outfile) {
1365f9996aaSopenharmony_ci        outputs += [ unstripped_outfile ]
1375f9996aaSopenharmony_ci      }
1385f9996aaSopenharmony_ci    }
1395f9996aaSopenharmony_ci    tool("stamp") {
1405f9996aaSopenharmony_ci      if (host_os == "win") {
1415f9996aaSopenharmony_ci        command = "cmd /c type nul > \"{{output}}\""
1425f9996aaSopenharmony_ci      } else {
1435f9996aaSopenharmony_ci        command = "/usr/bin/touch {{output}}"
1445f9996aaSopenharmony_ci      }
1455f9996aaSopenharmony_ci      description = "STAMP {{output}}"
1465f9996aaSopenharmony_ci    }
1475f9996aaSopenharmony_ci    tool("copy") {
1485f9996aaSopenharmony_ci      if (host_os == "win") {
1495f9996aaSopenharmony_ci        command = "python $ohos_root_path/build/lite/copy_files.py --src_type=file --src={{source}} --dest_dir={{output}}"
1505f9996aaSopenharmony_ci      } else if (host_os == "linux") {
1515f9996aaSopenharmony_ci        command = "cp -afd {{source}} {{output}}"
1525f9996aaSopenharmony_ci      }
1535f9996aaSopenharmony_ci      description = "COPY {{source}} {{output}}"
1545f9996aaSopenharmony_ci    }
1555f9996aaSopenharmony_ci  }
1565f9996aaSopenharmony_ci}
157