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