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