1# Copyright (c) 2023 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14import("$build_root/third_party_gn/musl/musl_template.gni")
15
16musl_libs("soft_libs") {
17}
18
19group("musl_headers") {
20  deps = [
21    ":FreeBSD_copy",
22    ":copy_uapi_file",
23    ":create_alltypes_h_file",
24    ":create_syscall_h_file",
25    ":create_version_h_file",
26    ":musl_copy_inc_arpa_file",
27    ":musl_copy_inc_hook_file",
28    ":musl_copy_inc_net_file",
29    ":musl_copy_inc_netinet_file",
30    ":musl_copy_inc_netpacket_file",
31  ]
32}
33
34action("create_porting_src") {
35  script = "//third_party/musl/scripts/porting.sh"
36
37  sources_dir = [ "//third_party/musl" ]
38
39  outdir = [ "${target_out_dir}/${musl_ported_dir}" ]
40
41  src_files = musl_src_arch_file
42  src_files += musl_src_file
43  src_files += musl_src_ldso
44  src_files += musl_inc_bits_files
45  src_files += musl_inc_arpa_files
46  src_files += musl_inc_net_files
47  src_files += musl_inc_netinet_files
48  src_files += musl_inc_netpacket_files
49  src_files += musl_inc_scsi_files
50  src_files += musl_inc_sys_files
51  src_files += musl_inc_fortify_files
52  src_files += musl_inc_root_files
53  src_files += musl_inc_info_files
54  src_files += musl_inc_trace_files
55
56  src_files += [
57    "crt/Scrt1.c",
58    "crt/crt1.c",
59    "crt/rcrt1.c",
60    "tools/mkalltypes.sed",
61    "arch/${musl_arch}/bits/alltypes.h.in",
62    "arch/${musl_arch}/bits/syscall.h.in",
63    "include/alltypes.h.in",
64    "VERSION",
65    "tools/version.sh",
66    "tools/install.sh",
67    "scripts/install.py",
68    "scripts/create_alltypes.sh",
69    "scripts/create_vesion.sh",
70    "scripts/create_syscall.sh",
71  ]
72  src_files += [
73    "crt/${musl_arch}/crti.s",
74    "crt/${musl_arch}/crtn.s",
75  ]
76
77  args = [ "-i" ] + rebase_path(sources_dir)
78  args += [ "-o" ] + rebase_path(outdir)
79  args += [ "-p" ] + [ "${musl_target_os}" ]
80  foreach(i, src_files) {
81    foreach(s, musl_src_files_ext) {
82      if (i == s) {
83        src_files -= [ "${s}" ]
84      }
85    }
86  }
87
88  outputs = []
89  foreach(s, src_files) {
90    outputs += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
91  }
92
93  foreach(s, musl_src_files_ext) {
94    outputs += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
95  }
96
97  inputs = []
98  foreach(i, src_files) {
99    foreach(s, musl_src_linux_files) {
100      if (i == s) {
101        src_files -= [ "${s}" ]
102      }
103    }
104  }
105  foreach(s, src_files) {
106    inputs += [ "${musl_dir}/${s}" ]
107  }
108
109  foreach(s, musl_src_files_ext) {
110    inputs += [ "${musl_dir}/${s}" ]
111  }
112}
113
114action("create_alltypes_h_file") {
115  script = "${target_out_dir}/${musl_ported_dir}/scripts/create_alltypes.sh"
116
117  sources = [ "${target_out_dir}/${musl_ported_dir}/tools/mkalltypes.sed" ]
118
119  sources += [
120    "${target_out_dir}/${musl_ported_dir}/arch/${musl_arch}/bits/alltypes.h.in",
121    "${target_out_dir}/${musl_ported_dir}/include/alltypes.h.in",
122  ]
123
124  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/bits/alltypes.h" ]
125
126  args = [ "-o" ] + rebase_path(outputs, root_build_dir) +
127         rebase_path(sources, root_build_dir)
128
129  deps = [ ":create_porting_src" ]
130}
131
132action("create_version_h_file") {
133  script = "${target_out_dir}/${musl_ported_dir}/scripts/create_vesion.sh"
134
135  sources = [
136    "${target_out_dir}/${musl_ported_dir}/VERSION",
137    "${target_out_dir}/${musl_ported_dir}/tools/version.sh",
138  ]
139
140  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/version.h" ]
141
142  args =
143      rebase_path(sources, root_build_dir) +
144      [ rebase_path("${target_out_dir}/${musl_inc_out_dir}", root_build_dir) ]
145
146  deps = [ ":create_porting_src" ]
147}
148
149action("create_syscall_h_file") {
150  script = "${target_out_dir}/${musl_ported_dir}/scripts/create_syscall.sh"
151
152  sources = [
153    "${target_out_dir}/${musl_ported_dir}/arch/${musl_arch}/bits/syscall.h.in",
154  ]
155
156  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/bits/syscall.h" ]
157
158  args = rebase_path(sources, root_build_dir) +
159         rebase_path(outputs, root_build_dir)
160
161  deps = [ ":create_porting_src" ]
162}
163
164uapi_from = "local"
165uapi_full_path = rebase_path(musl_uapi_dir)
166arguments_uapi = [ "-c" ]
167
168# exclude these files because they need special treatment
169if (uapi_from == "make") {
170  exclude_files = "^asm\$|^scsi\$"
171} else {
172  exclude_files = "^asm-arm\$|^asm-arm64\$|^scsi\$"
173}
174
175arguments_uapi +=
176    [ "ls ${uapi_full_path} | grep -Ev " + "\"" + "${exclude_files}" + "\"" ]
177uspi_files = exec_script("/bin/sh", arguments_uapi, "list lines")
178
179# Generate a copy target for each file
180foreach(file, uspi_files) {
181  copy("copy_uapi_${file}") {
182    sources = [ "${musl_uapi_dir}/${file}" ]
183    outputs = [ "${target_out_dir}/${musl_inc_out_dir}/${file}" ]
184  }
185}
186
187group("copy_uapi_scsi") {
188  deps = []
189  sources = []
190  outputs = []
191  uapi_scsi_dir = rebase_path("${musl_uapi_dir}/scsi")
192  arguments_scsi = [ "-c" ]
193  arguments_scsi += [ "ls ${uapi_scsi_dir}" ]
194  uapi_scsi_files = exec_script("/bin/sh", arguments_scsi, "list lines")
195
196  # Generate a copy target for each file in scsi dir to avoid being influenced by musl_copy_inc_scsi output
197  foreach(file, uapi_scsi_files) {
198    copy("copy_uapi_scsi_${file}") {
199      sources += [ "${musl_uapi_dir}/scsi/${file}" ]
200      outputs += [ "${target_out_dir}/${musl_inc_out_dir}/scsi/${file}" ]
201    }
202    deps += [ ":copy_uapi_scsi_${file}" ]
203  }
204}
205
206copy("copy_uapi_asm") {
207  if (uapi_from == "local") {
208    if ("${musl_arch}" == "arm") {
209      file_name = "asm-arm"
210    } else {  # aarch64 and x86_64 use same file
211      file_name = "asm-arm64"
212    }
213    sources = [ "${musl_uapi_dir}/${file_name}/asm" ]
214  } else {
215    sources = [ "${musl_uapi_dir}/asm" ]
216  }
217  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/asm" ]
218}
219
220group("copy_uapi_file") {
221  deps = [ ":copy_uapi_scsi" ]
222
223  # We need do different processing for asm according to the source of uapi
224  deps += [ ":copy_uapi_asm" ]
225  foreach(file, uspi_files) {
226    deps += [ ":copy_uapi_${file}" ]
227  }
228}
229
230copy("musl_copy_inc_hook_file") {
231  sources = musl_inc_hook_files
232  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/{{source_file_part}}" ]
233}
234
235copy("musl_copy_inc_bits") {
236  sources = []
237  sources_bits = musl_inc_bits_files
238  foreach(s, sources_bits) {
239    sources += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
240  }
241  outputs =
242      [ "${target_out_dir}/${musl_inc_out_dir}/bits/{{source_file_part}}" ]
243  deps = [ ":create_porting_src" ]
244}
245
246copy("musl_copy_inc_fortify") {
247  sources = []
248  sources_fortify = musl_inc_fortify_files
249  foreach(s, sources_fortify) {
250    sources += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
251  }
252  outputs =
253      [ "${target_out_dir}/${musl_inc_out_dir}/fortify/{{source_file_part}}" ]
254  deps = [ ":create_porting_src" ]
255}
256
257copy("musl_copy_inc_root") {
258  sources = []
259  sources_inc_root = musl_inc_root_files
260  foreach(s, sources_inc_root) {
261    sources += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
262  }
263  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/{{source_file_part}}" ]
264  deps = [ ":create_porting_src" ]
265}
266
267copy("musl_copy_inc_sys") {
268  sources = []
269  sources_inc_sys = musl_inc_sys_files
270  foreach(s, sources_inc_sys) {
271    sources += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
272  }
273  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/sys/{{source_file_part}}" ]
274  deps = [ ":create_porting_src" ]
275}
276
277copy("musl_copy_inc_netinet_file") {
278  sources = []
279  sources_netinet_file = musl_inc_netinet_files
280  foreach(s, sources_netinet_file) {
281    sources += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
282  }
283  outputs =
284      [ "${target_out_dir}/${musl_inc_out_dir}/netinet/{{source_file_part}}" ]
285  deps = [ ":create_porting_src" ]
286}
287
288copy("musl_copy_inc_arpa_file") {
289  sources = []
290  sources_arpa_file = musl_inc_arpa_files
291  foreach(s, sources_arpa_file) {
292    sources += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
293  }
294  outputs =
295      [ "${target_out_dir}/${musl_inc_out_dir}/arpa/{{source_file_part}}" ]
296  deps = [ ":create_porting_src" ]
297}
298
299copy("musl_copy_inc_net_file") {
300  sources = []
301  sources_net_file = musl_inc_net_files
302  foreach(s, sources_net_file) {
303    sources += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
304  }
305  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/net/{{source_file_part}}" ]
306  deps = [ ":create_porting_src" ]
307}
308
309copy("musl_copy_inc_netpacket_file") {
310  sources = []
311  sources_netpacket_file = musl_inc_netpacket_files
312  foreach(s, sources_netpacket_file) {
313    sources += [ "${target_out_dir}/${musl_ported_dir}/${s}" ]
314  }
315  outputs =
316      [ "${target_out_dir}/${musl_inc_out_dir}/netpacket/{{source_file_part}}" ]
317  deps = [ ":create_porting_src" ]
318}
319
320group("FreeBSD_copy") {
321  deps = [ ":FreeBSD_sys_headers" ]
322}
323
324copy("FreeBSD_sys_headers") {
325  sources = freebsd_sys_headers
326  outputs = [ "${target_out_dir}/${musl_inc_out_dir}/sys/{{source_file_part}}" ]
327  deps = [ ":create_porting_src" ]
328}
329