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("gcc_toolchain") {
155f9996aaSopenharmony_ci  toolchain(target_name) {
165f9996aaSopenharmony_ci    assert(defined(invoker.ar), "gcc toolchain must specify a \"ar\" value")
175f9996aaSopenharmony_ci    assert(defined(invoker.cc), "gcc toolchain must specify a \"cc\" value")
185f9996aaSopenharmony_ci    assert(defined(invoker.cxx), "gcc toolchain must specify a \"cxx\" value")
195f9996aaSopenharmony_ci    assert(defined(invoker.ld), "gcc 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    if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") {
335f9996aaSopenharmony_ci      extra_ldflags = " " + invoker.extra_ldflags
345f9996aaSopenharmony_ci    } else {
355f9996aaSopenharmony_ci      extra_ldflags = ""
365f9996aaSopenharmony_ci    }
375f9996aaSopenharmony_ci
385f9996aaSopenharmony_ci    tool("cc") {
395f9996aaSopenharmony_ci      command = "$cc {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
405f9996aaSopenharmony_ci      depsformat = "gcc"
415f9996aaSopenharmony_ci      description = "gcc cross compiler {{output}}"
425f9996aaSopenharmony_ci      outputs =
435f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
445f9996aaSopenharmony_ci    }
455f9996aaSopenharmony_ci    tool("cxx") {
465f9996aaSopenharmony_ci      depfile = "{{output}}.d"
475f9996aaSopenharmony_ci      command = "$cxx {{defines}} {{include_dirs}} {{cflags_cc}} -c {{source}} -o {{output}}"
485f9996aaSopenharmony_ci      depsformat = "gcc"
495f9996aaSopenharmony_ci      description = "gcc CXX {{output}}"
505f9996aaSopenharmony_ci      outputs =
515f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
525f9996aaSopenharmony_ci    }
535f9996aaSopenharmony_ci    tool("asm") {
545f9996aaSopenharmony_ci      depfile = "{{output}}.d"
555f9996aaSopenharmony_ci      command = "$cc {{defines}} {{include_dirs}} {{asmflags}} {{source}} -c -o {{output}}"
565f9996aaSopenharmony_ci      depsformat = "gcc"
575f9996aaSopenharmony_ci      description = "gcc cross compiler {{output}}"
585f9996aaSopenharmony_ci      outputs =
595f9996aaSopenharmony_ci          [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
605f9996aaSopenharmony_ci    }
615f9996aaSopenharmony_ci    tool("alink") {
625f9996aaSopenharmony_ci      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
635f9996aaSopenharmony_ci      rspfile = "{{output}}.rsp"
645f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
655f9996aaSopenharmony_ci      command = "$ar cr {{output}} @\"$rspfile\""
665f9996aaSopenharmony_ci
675f9996aaSopenharmony_ci      description = "AR {{output}}"
685f9996aaSopenharmony_ci      outputs = [ outfile ]
695f9996aaSopenharmony_ci
705f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}/libs"
715f9996aaSopenharmony_ci      default_output_extension = ".a"
725f9996aaSopenharmony_ci      output_prefix = "lib"
735f9996aaSopenharmony_ci    }
745f9996aaSopenharmony_ci    tool("solink") {
755f9996aaSopenharmony_ci      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
765f9996aaSopenharmony_ci      unstripped_outfile = outfile
775f9996aaSopenharmony_ci
785f9996aaSopenharmony_ci      rspfile = "$outfile.rsp"
795f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
805f9996aaSopenharmony_ci      command = ""
815f9996aaSopenharmony_ci      if (need_strip) {
825f9996aaSopenharmony_ci        unstripped_outfile = "{{output_dir}}/unstripped/usr/lib/{{target_output_name}}{{output_extension}}"
835f9996aaSopenharmony_ci      }
845f9996aaSopenharmony_ci      command += "$ld -shared {{ldflags}} $extra_ldflags " + "-Wl,--start-group {{inputs}} {{libs}} -Wl,--end-group -o $unstripped_outfile"
855f9996aaSopenharmony_ci      if (need_strip) {
865f9996aaSopenharmony_ci        command += " && $strip \"$unstripped_outfile\" -o \"$outfile\""
875f9996aaSopenharmony_ci      }
885f9996aaSopenharmony_ci      description = "SOLINK $outfile"
895f9996aaSopenharmony_ci      outputs = [ outfile ]
905f9996aaSopenharmony_ci      if (unstripped_outfile != outfile) {
915f9996aaSopenharmony_ci        outputs += [ unstripped_outfile ]
925f9996aaSopenharmony_ci      }
935f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}"
945f9996aaSopenharmony_ci      default_output_extension = ".so"
955f9996aaSopenharmony_ci      output_prefix = "lib"
965f9996aaSopenharmony_ci    }
975f9996aaSopenharmony_ci    tool("link") {
985f9996aaSopenharmony_ci      outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}"
995f9996aaSopenharmony_ci      unstripped_outfile = outfile
1005f9996aaSopenharmony_ci
1015f9996aaSopenharmony_ci      rspfile = "$outfile.rsp"
1025f9996aaSopenharmony_ci      command = ""
1035f9996aaSopenharmony_ci      if (need_strip) {
1045f9996aaSopenharmony_ci        unstripped_outfile = "{{output_dir}}/unstripped/bin/{{target_output_name}}{{output_extension}}"
1055f9996aaSopenharmony_ci      }
1065f9996aaSopenharmony_ci      command += "$ld {{ldflags}} $extra_ldflags " + "-Wl,--start-group {{inputs}} {{libs}} -Wl,--end-group -o $unstripped_outfile "
1075f9996aaSopenharmony_ci      if (need_strip) {
1085f9996aaSopenharmony_ci        command += " && $strip \"$unstripped_outfile\" -o \"$outfile\""
1095f9996aaSopenharmony_ci      }
1105f9996aaSopenharmony_ci
1115f9996aaSopenharmony_ci      description = "LINK $outfile"
1125f9996aaSopenharmony_ci      default_output_dir = "{{root_out_dir}}"
1135f9996aaSopenharmony_ci      rspfile_content = "{{inputs}}"
1145f9996aaSopenharmony_ci      outputs = [ outfile ]
1155f9996aaSopenharmony_ci      if (unstripped_outfile != outfile) {
1165f9996aaSopenharmony_ci        outputs += [ unstripped_outfile ]
1175f9996aaSopenharmony_ci      }
1185f9996aaSopenharmony_ci    }
1195f9996aaSopenharmony_ci    tool("stamp") {
1205f9996aaSopenharmony_ci      if (host_os == "win") {
1215f9996aaSopenharmony_ci        command = "cmd /c type nul > \"{{output}}\""
1225f9996aaSopenharmony_ci      } else {
1235f9996aaSopenharmony_ci        command = "/usr/bin/touch {{output}}"
1245f9996aaSopenharmony_ci      }
1255f9996aaSopenharmony_ci      description = "STAMP {{output}}"
1265f9996aaSopenharmony_ci    }
1275f9996aaSopenharmony_ci    tool("copy") {
1285f9996aaSopenharmony_ci      if (host_os == "win") {
1295f9996aaSopenharmony_ci        command = "python $ohos_root_path/build/lite/copy_files.py --src_type=file --src={{source}} --dest_dir={{output}}"
1305f9996aaSopenharmony_ci      } else if (host_os == "linux") {
1315f9996aaSopenharmony_ci        command = "cp -afd {{source}} {{output}}"
1325f9996aaSopenharmony_ci      }
1335f9996aaSopenharmony_ci      description = "COPY {{source}} {{output}}"
1345f9996aaSopenharmony_ci    }
1355f9996aaSopenharmony_ci  }
1365f9996aaSopenharmony_ci}
137