1fb726d48Sopenharmony_ci# Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
2fb726d48Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
3fb726d48Sopenharmony_ci# you may not use this file except in compliance with the License.
4fb726d48Sopenharmony_ci# You may obtain a copy of the License at
5fb726d48Sopenharmony_ci#
6fb726d48Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
7fb726d48Sopenharmony_ci#
8fb726d48Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
9fb726d48Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
10fb726d48Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11fb726d48Sopenharmony_ci# See the License for the specific language governing permissions and
12fb726d48Sopenharmony_ci# limitations under the License.
13fb726d48Sopenharmony_ci
14fb726d48Sopenharmony_ciimport("//gn/wasm.gni")
15fb726d48Sopenharmony_cideclare_args() {
16fb726d48Sopenharmony_ci  if (target_os == "linux" || target_os == "macx") {
17fb726d48Sopenharmony_ci    cc = "clang"
18fb726d48Sopenharmony_ci    cxx = "clang++"
19fb726d48Sopenharmony_ci    pic = "-fPIC"
20fb726d48Sopenharmony_ci    rebuild_string = ""
21fb726d48Sopenharmony_ci    extra_asmflags = ""
22fb726d48Sopenharmony_ci    asm = "clang"
23fb726d48Sopenharmony_ci  } else if (target_os == "windows") {
24fb726d48Sopenharmony_ci    cc = "gcc.exe"
25fb726d48Sopenharmony_ci    cxx = "g++.exe"
26fb726d48Sopenharmony_ci    rebuild_string = ""
27fb726d48Sopenharmony_ci    extra_asmflags = ""
28fb726d48Sopenharmony_ci    asm = "gcc.exe"
29fb726d48Sopenharmony_ci    pic = ""
30fb726d48Sopenharmony_ci  }
31fb726d48Sopenharmony_ci  if (use_wasm == true) {
32fb726d48Sopenharmony_ci    print("make_wasm")
33fb726d48Sopenharmony_ci  } else if (use_wasm == false) {
34fb726d48Sopenharmony_ci    print("no make_wasm")
35fb726d48Sopenharmony_ci  }
36fb726d48Sopenharmony_ci  cc_wrapper = ""
37fb726d48Sopenharmony_ci}
38fb726d48Sopenharmony_citoolchain("wasm") {
39fb726d48Sopenharmony_ci  # emsdk_dir and em_config are defined in wasm.gni.
40fb726d48Sopenharmony_ci  print("use gcc_like_chain wasm")
41fb726d48Sopenharmony_ci  if (!is_mac) {
42fb726d48Sopenharmony_ci    ar = "emar"
43fb726d48Sopenharmony_ci  }
44fb726d48Sopenharmony_ci  cc = "emcc"
45fb726d48Sopenharmony_ci  cxx = "em++"
46fb726d48Sopenharmony_ci  if (!use_local_emsdk) {
47fb726d48Sopenharmony_ci    if (!is_mac) {
48fb726d48Sopenharmony_ci      ar = "$emsdk_dir/emscripten/emar --em-config $em_config"
49fb726d48Sopenharmony_ci    }
50fb726d48Sopenharmony_ci    cc = "$emsdk_dir/emscripten/emcc --em-config $em_config"
51fb726d48Sopenharmony_ci    cxx = "$emsdk_dir/emscripten/em++ --em-config $em_config"
52fb726d48Sopenharmony_ci  }
53fb726d48Sopenharmony_ci  lib_switch = "-l"
54fb726d48Sopenharmony_ci  ld_arg = ""
55fb726d48Sopenharmony_ci  lib_dir_switch = "-L"
56fb726d48Sopenharmony_ci  external_cxxflags = ""
57fb726d48Sopenharmony_ci  external_cflags = ""
58fb726d48Sopenharmony_ci  external_ldflags = ""
59fb726d48Sopenharmony_ci  if (defined(linker) && linker != "") {
60fb726d48Sopenharmony_ci    ld_arg = "-fuse-ld=$_invoker_linker"
61fb726d48Sopenharmony_ci    _invoker_linker = linker
62fb726d48Sopenharmony_ci  }
63fb726d48Sopenharmony_ci  if (defined(sysroot) && sysroot != "") {
64fb726d48Sopenharmony_ci    _invoker_sysroot = sysroot
65fb726d48Sopenharmony_ci    cxx = "$cxx --sysroot=$_invoker_sysroot"
66fb726d48Sopenharmony_ci    cc = "$cc --sysroot=$_invoker_sysroot"
67fb726d48Sopenharmony_ci  }
68fb726d48Sopenharmony_ci  if (defined(gcc_toolchain) && gcc_toolchain != "") {
69fb726d48Sopenharmony_ci    ld_arg = "$ld_arg --gcc-toolchain=$gcc_toolchain"
70fb726d48Sopenharmony_ci  }
71fb726d48Sopenharmony_ci  if (defined(external_cxxflags)) {
72fb726d48Sopenharmony_ci    print("defined external_cxxflags")
73fb726d48Sopenharmony_ci    external_cxxflags = external_cxxflags
74fb726d48Sopenharmony_ci  }
75fb726d48Sopenharmony_ci  if (defined(external_cflags)) {
76fb726d48Sopenharmony_ci    external_cflags = external_cflags
77fb726d48Sopenharmony_ci  }
78fb726d48Sopenharmony_ci
79fb726d48Sopenharmony_ci  tool("cc") {
80fb726d48Sopenharmony_ci    depfiles = "{{output}}.d"
81fb726d48Sopenharmony_ci    command = "$cc_wrapper $cc -MMD -MF $depfiles {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} ${external_cflags} -c {{source}} -o {{output}}"
82fb726d48Sopenharmony_ci    outputfiles =
83fb726d48Sopenharmony_ci        "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o"
84fb726d48Sopenharmony_ci    outputs = [ outputfiles ]
85fb726d48Sopenharmony_ci    description = "step: compile {{source}}"
86fb726d48Sopenharmony_ci  }
87fb726d48Sopenharmony_ci
88fb726d48Sopenharmony_ci  tool("cxx") {
89fb726d48Sopenharmony_ci    depfiles = "{{output}}.d"  # must be defined
90fb726d48Sopenharmony_ci    command = "$cc_wrapper $cxx -MMD -MF $depfiles {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}  ${external_cflags} ${external_cxxflags} -c {{source}} -o {{output}}"
91fb726d48Sopenharmony_ci
92fb726d48Sopenharmony_ci    outputfiles =
93fb726d48Sopenharmony_ci        "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o"
94fb726d48Sopenharmony_ci    outputs = [ outputfiles ]
95fb726d48Sopenharmony_ci    description = "step: compile {{source}}"
96fb726d48Sopenharmony_ci  }
97fb726d48Sopenharmony_ci  tool("alink") {
98fb726d48Sopenharmony_ci    rspfile = "{{output}}.rsp"  # must be defined
99fb726d48Sopenharmony_ci    rspfile_content = "{{inputs}}"
100fb726d48Sopenharmony_ci    if (is_mac) {
101fb726d48Sopenharmony_ci      command = "rm -f {{output}} && libtool -static {{arflags}} -o {{output}} -filelist $rspfile"
102fb726d48Sopenharmony_ci    } else {
103fb726d48Sopenharmony_ci      command = "rm -rf {{output}} && $ar rcsD {{output}} @$rspfile"
104fb726d48Sopenharmony_ci    }
105fb726d48Sopenharmony_ci    outputfiles = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
106fb726d48Sopenharmony_ci    outputs = [ outputfiles ]
107fb726d48Sopenharmony_ci    output_prefix = "lib"
108fb726d48Sopenharmony_ci    default_output_extension = ".a"
109fb726d48Sopenharmony_ci    description = "step: link {{output}}"
110fb726d48Sopenharmony_ci  }
111fb726d48Sopenharmony_ci  tool("solink") {
112fb726d48Sopenharmony_ci    sonames = "{{target_output_name}}{{output_extension}}"
113fb726d48Sopenharmony_ci    outputfiles = "{{root_out_dir}}/$sonames"
114fb726d48Sopenharmony_ci    unstripped_so = outputfiles
115fb726d48Sopenharmony_ci    rpath = ""
116fb726d48Sopenharmony_ci    outputs = [ outputfiles ]
117fb726d48Sopenharmony_ci    command = "$cc_wrapper $cxx $ld_arg -shared {{ldflags}} ${external_ldflags} {{inputs}} {{solibs}} {{libs}} $rpath -o {{output}}"
118fb726d48Sopenharmony_ci    output_prefix = "lib"
119fb726d48Sopenharmony_ci    description = "step: link $unstripped_so"
120fb726d48Sopenharmony_ci    default_output_extension = ".so"
121fb726d48Sopenharmony_ci  }
122fb726d48Sopenharmony_ci
123fb726d48Sopenharmony_ci  tool("link") {
124fb726d48Sopenharmony_ci    outputfiles = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
125fb726d48Sopenharmony_ci    outputs = [ outputfiles ]
126fb726d48Sopenharmony_ci    command = "$cc_wrapper $cxx $ld_arg {{ldflags}} ${external_ldflags} {{inputs}} {{solibs}} {{libs}} -o {{output}}"
127fb726d48Sopenharmony_ci    description = "step:link {{output}}"
128fb726d48Sopenharmony_ci  }
129fb726d48Sopenharmony_ci
130fb726d48Sopenharmony_ci  tool("stamp") {
131fb726d48Sopenharmony_ci    description = "step: stamp {{output}}"
132fb726d48Sopenharmony_ci    command = "touch {{output}}"
133fb726d48Sopenharmony_ci  }
134fb726d48Sopenharmony_ci
135fb726d48Sopenharmony_ci  tool("copy") {
136fb726d48Sopenharmony_ci    description = "step: COPY files from {{source}} to {{output}}"
137fb726d48Sopenharmony_ci    command = "cp -arf {{source}} {{output}}"
138fb726d48Sopenharmony_ci  }
139fb726d48Sopenharmony_ci}
140fb726d48Sopenharmony_citoolchain("gcc_like") {
141fb726d48Sopenharmony_ci  lib_switch = "-l"
142fb726d48Sopenharmony_ci  lib_dir_switch = "-L"
143fb726d48Sopenharmony_ci
144fb726d48Sopenharmony_ci  tool("cxx") {
145fb726d48Sopenharmony_ci    depfile = "{{output}}.d"  # must be defined
146fb726d48Sopenharmony_ci    command = "$cxx -o {{output}} -MMD -MF $depfile {{defines}} $pic {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}}"
147fb726d48Sopenharmony_ci    outputfiles =
148fb726d48Sopenharmony_ci        "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o"
149fb726d48Sopenharmony_ci    outputs = [ outputfiles ]
150fb726d48Sopenharmony_ci    description = "step: compile {{source}}"
151fb726d48Sopenharmony_ci  }
152fb726d48Sopenharmony_ci
153fb726d48Sopenharmony_ci  tool("cc") {
154fb726d48Sopenharmony_ci    depfile = "{{output}}.d"
155fb726d48Sopenharmony_ci    command = "$cc -o {{output}} -MMD -MF $depfile {{defines}} $pic {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}}"
156fb726d48Sopenharmony_ci    outputfiles =
157fb726d48Sopenharmony_ci        "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o"
158fb726d48Sopenharmony_ci    outputs = [ outputfiles ]
159fb726d48Sopenharmony_ci    description = "step: compile {{source}}"
160fb726d48Sopenharmony_ci  }
161fb726d48Sopenharmony_ci  tool("asm") {
162fb726d48Sopenharmony_ci    depfile = "{{output}}.d"
163fb726d48Sopenharmony_ci    command = "$asm -o {{output}} -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}}${extra_asmflags} -c {{source}}"
164fb726d48Sopenharmony_ci    depsformat = "gcc"
165fb726d48Sopenharmony_ci    outputfiles =
166fb726d48Sopenharmony_ci        "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o"
167fb726d48Sopenharmony_ci    outputs = [ outputfiles ]
168fb726d48Sopenharmony_ci  }
169fb726d48Sopenharmony_ci  tool("alink") {
170fb726d48Sopenharmony_ci    rspfile = "{{output}}.rsp"  # this must be defined
171fb726d48Sopenharmony_ci    if (is_mac) {
172fb726d48Sopenharmony_ci      rspfile_content = "{{inputs_newline}}"
173fb726d48Sopenharmony_ci      command = "rm -f {{output}} && libtool -static {{arflags}} -filelist $rspfile -o {{output}}"
174fb726d48Sopenharmony_ci    } else {
175fb726d48Sopenharmony_ci      rspfile_content = "{{inputs}}"  # this must be defined
176fb726d48Sopenharmony_ci      command = "rm -f {{output}} && $ar rcsD {{output}} @$rspfile"
177fb726d48Sopenharmony_ci      if (is_mingw) {
178fb726d48Sopenharmony_ci        command = "$ar rcsD {{output}} @$rspfile"
179fb726d48Sopenharmony_ci      }
180fb726d48Sopenharmony_ci    }
181fb726d48Sopenharmony_ci    outputsfiles = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
182fb726d48Sopenharmony_ci    outputs = [ outputsfiles ]
183fb726d48Sopenharmony_ci    default_output_extension = ".a"
184fb726d48Sopenharmony_ci    output_prefix = "lib"
185fb726d48Sopenharmony_ci    description = "step: link {{output}}"
186fb726d48Sopenharmony_ci  }
187fb726d48Sopenharmony_ci
188fb726d48Sopenharmony_ci  tool("link") {
189fb726d48Sopenharmony_ci    command = "$cxx -o {{output}} {{ldflags}} {{inputs}} {{solibs}} {{libs}}"
190fb726d48Sopenharmony_ci    outputsfiles = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
191fb726d48Sopenharmony_ci    outputs = [ outputsfiles ]
192fb726d48Sopenharmony_ci    description = "step: link {{output}}"
193fb726d48Sopenharmony_ci  }
194fb726d48Sopenharmony_ci  tool("solink") {
195fb726d48Sopenharmony_ci    default_output_extension = ".so"
196fb726d48Sopenharmony_ci    command =
197fb726d48Sopenharmony_ci        "$cxx -o {{output}} {{ldflags}} {{inputs}}  {{solibs}} {{libs}} -shared"
198fb726d48Sopenharmony_ci    outputsfiles = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
199fb726d48Sopenharmony_ci    outputs = [ outputsfiles ]
200fb726d48Sopenharmony_ci    description = "step: solink {{output}}"
201fb726d48Sopenharmony_ci  }
202fb726d48Sopenharmony_ci
203fb726d48Sopenharmony_ci  tool("stamp") {
204fb726d48Sopenharmony_ci    print("need do nothing")
205fb726d48Sopenharmony_ci    description = "step: touch {{output}}"
206fb726d48Sopenharmony_ci    command = "touch {{output}}"
207fb726d48Sopenharmony_ci  }
208fb726d48Sopenharmony_ci
209fb726d48Sopenharmony_ci  tool("copy") {
210fb726d48Sopenharmony_ci    description = "COPY files from  {{source}} to {{output}}"
211fb726d48Sopenharmony_ci    command = "cp -arf {{source}} {{output}}"
212fb726d48Sopenharmony_ci  }
213fb726d48Sopenharmony_ci}
214