xref: /aosp_15_r20/external/musl/android/generate_bp.py (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*c9945492SAndroid Build Coastguard Worker
3*c9945492SAndroid Build Coastguard Worker# This replicates the logic in Makefile to produce lists of generic
4*c9945492SAndroid Build Coastguard Worker# and architecture specific sources, then writes them into sources.bp
5*c9945492SAndroid Build Coastguard Worker# as cc_defaults modules for use by the Android.bp file.
6*c9945492SAndroid Build Coastguard Worker
7*c9945492SAndroid Build Coastguard Workerimport copy
8*c9945492SAndroid Build Coastguard Workerimport glob
9*c9945492SAndroid Build Coastguard Workerimport os.path
10*c9945492SAndroid Build Coastguard Worker
11*c9945492SAndroid Build Coastguard WorkerBP_TO_MUSL_ARCHES = {
12*c9945492SAndroid Build Coastguard Worker  'arm': 'arm',
13*c9945492SAndroid Build Coastguard Worker  'arm64': 'aarch64',
14*c9945492SAndroid Build Coastguard Worker  'x86': 'i386',
15*c9945492SAndroid Build Coastguard Worker  'x86_64': 'x86_64',
16*c9945492SAndroid Build Coastguard Worker}
17*c9945492SAndroid Build Coastguard Worker
18*c9945492SAndroid Build Coastguard WorkerSRC_DIRS = (
19*c9945492SAndroid Build Coastguard Worker  'src/*',
20*c9945492SAndroid Build Coastguard Worker  'src/malloc/mallocng',
21*c9945492SAndroid Build Coastguard Worker)
22*c9945492SAndroid Build Coastguard WorkerCOMPAT32_SRC_DIRS = (
23*c9945492SAndroid Build Coastguard Worker  'compat/time32',
24*c9945492SAndroid Build Coastguard Worker)
25*c9945492SAndroid Build Coastguard WorkerOPT_DIRS = (
26*c9945492SAndroid Build Coastguard Worker  'src/internal',
27*c9945492SAndroid Build Coastguard Worker  'src/malloc',
28*c9945492SAndroid Build Coastguard Worker  'src/string',
29*c9945492SAndroid Build Coastguard Worker)
30*c9945492SAndroid Build Coastguard WorkerNOSSP_SRCS = (
31*c9945492SAndroid Build Coastguard Worker  'src/env/__libc_start_main.c',
32*c9945492SAndroid Build Coastguard Worker  'src/env/__init_tls.c',
33*c9945492SAndroid Build Coastguard Worker  'src/env/__stack_chk_fail.c',
34*c9945492SAndroid Build Coastguard Worker  'src/thread/__set_thread_area.c',
35*c9945492SAndroid Build Coastguard Worker  'src/string/memset.c',
36*c9945492SAndroid Build Coastguard Worker  'src/string/memcpy.c',
37*c9945492SAndroid Build Coastguard Worker)
38*c9945492SAndroid Build Coastguard WorkerLDSO_SRC_DIRS = (
39*c9945492SAndroid Build Coastguard Worker  'ldso',
40*c9945492SAndroid Build Coastguard Worker)
41*c9945492SAndroid Build Coastguard WorkerCRT_SRCS = (
42*c9945492SAndroid Build Coastguard Worker  'crt/crt1.c',
43*c9945492SAndroid Build Coastguard Worker  'crt/crti.c',
44*c9945492SAndroid Build Coastguard Worker  'crt/crtn.c',
45*c9945492SAndroid Build Coastguard Worker  'crt/rcrt1.c',
46*c9945492SAndroid Build Coastguard Worker  'crt/Scrt1.c',
47*c9945492SAndroid Build Coastguard Worker)
48*c9945492SAndroid Build Coastguard Worker
49*c9945492SAndroid Build Coastguard Workerdef overridden_base_src(arch, src):
50*c9945492SAndroid Build Coastguard Worker  src = src.replace('/'+arch+'/','/')
51*c9945492SAndroid Build Coastguard Worker  if src.endswith('.s') or src.endswith('.S'):
52*c9945492SAndroid Build Coastguard Worker    src = src[:-2]+'.c'
53*c9945492SAndroid Build Coastguard Worker  return src
54*c9945492SAndroid Build Coastguard Worker
55*c9945492SAndroid Build Coastguard Workerdef overridden_base_srcs(arch, srcs):
56*c9945492SAndroid Build Coastguard Worker  return [overridden_base_src(arch, src) for src in srcs]
57*c9945492SAndroid Build Coastguard Worker
58*c9945492SAndroid Build Coastguard Workerdef glob_dirs(*args):
59*c9945492SAndroid Build Coastguard Worker  """glob_dirs takes a list of parts of glob patterns, some of which may be
60*c9945492SAndroid Build Coastguard Worker  lists or tuples, expands the lists and tuples into every combination
61*c9945492SAndroid Build Coastguard Worker  of patterns, and returns the glob expansion of the patterns."""
62*c9945492SAndroid Build Coastguard Worker  ret = []
63*c9945492SAndroid Build Coastguard Worker  for i, arg in enumerate(args):
64*c9945492SAndroid Build Coastguard Worker    if type(arg) is list or type(arg) is tuple:
65*c9945492SAndroid Build Coastguard Worker      for entry in arg:
66*c9945492SAndroid Build Coastguard Worker        new_args = list(args)
67*c9945492SAndroid Build Coastguard Worker        new_args[i] = entry
68*c9945492SAndroid Build Coastguard Worker        ret += glob_dirs(*new_args)
69*c9945492SAndroid Build Coastguard Worker      return ret
70*c9945492SAndroid Build Coastguard Worker  return sorted(glob.glob('/'.join(args)))
71*c9945492SAndroid Build Coastguard Worker
72*c9945492SAndroid Build Coastguard Workerdef force_exists(files):
73*c9945492SAndroid Build Coastguard Worker  """force_exists raises an exception if any of the input files are missing
74*c9945492SAndroid Build Coastguard Worker  and returns the sorted list of inputs files"""
75*c9945492SAndroid Build Coastguard Worker  files = sorted(files)
76*c9945492SAndroid Build Coastguard Worker  glob_files = glob_dirs(files)
77*c9945492SAndroid Build Coastguard Worker  if glob_files != files:
78*c9945492SAndroid Build Coastguard Worker    raise(Exception('failed to find sources: %s' % ', '.join(['"'+x+'"' for x in list(set(files) - set(glob_files))])))
79*c9945492SAndroid Build Coastguard Worker  return files
80*c9945492SAndroid Build Coastguard Worker
81*c9945492SAndroid Build Coastguard Workerdef files_to_arch_files(base_files, arch):
82*c9945492SAndroid Build Coastguard Worker  files=[]
83*c9945492SAndroid Build Coastguard Worker  for f in base_files:
84*c9945492SAndroid Build Coastguard Worker    base, ext = os.path.splitext(os.path.basename(f))
85*c9945492SAndroid Build Coastguard Worker    pattern = os.path.join(os.path.dirname(f), arch, base+'.[csS]')
86*c9945492SAndroid Build Coastguard Worker    glob_files = glob.glob(pattern)
87*c9945492SAndroid Build Coastguard Worker    if len(glob_files) > 1:
88*c9945492SAndroid Build Coastguard Worker      raise(Exception('expected at most one file for %s, found %s' % (pattern, glob_files)))
89*c9945492SAndroid Build Coastguard Worker    elif glob_files:
90*c9945492SAndroid Build Coastguard Worker      files.append(glob_files[0])
91*c9945492SAndroid Build Coastguard Worker
92*c9945492SAndroid Build Coastguard Worker  return files
93*c9945492SAndroid Build Coastguard Worker
94*c9945492SAndroid Build Coastguard Workerclass SourceSet(object):
95*c9945492SAndroid Build Coastguard Worker  def __init__(self, *, dirs=[], files=[]):
96*c9945492SAndroid Build Coastguard Worker    self.srcs = self._srcs(dirs, files)
97*c9945492SAndroid Build Coastguard Worker    self.arch_srcs, self.arch_exclude_srcs = self._arch_srcs(dirs, files)
98*c9945492SAndroid Build Coastguard Worker
99*c9945492SAndroid Build Coastguard Worker  def _srcs(self, dirs, files):
100*c9945492SAndroid Build Coastguard Worker    return glob_dirs(dirs, '*.c') + force_exists(files)
101*c9945492SAndroid Build Coastguard Worker
102*c9945492SAndroid Build Coastguard Worker  def _arch_srcs(self, dirs, files):
103*c9945492SAndroid Build Coastguard Worker    srcs = {}
104*c9945492SAndroid Build Coastguard Worker    exclude_srcs = {}
105*c9945492SAndroid Build Coastguard Worker    for bp_arch, musl_arch in BP_TO_MUSL_ARCHES.items():
106*c9945492SAndroid Build Coastguard Worker      arch_srcs = glob_dirs(dirs, musl_arch, '*.[csS]')
107*c9945492SAndroid Build Coastguard Worker      arch_srcs += files_to_arch_files(files, musl_arch)
108*c9945492SAndroid Build Coastguard Worker      arch_exclude_srcs = overridden_base_srcs(musl_arch, arch_srcs)
109*c9945492SAndroid Build Coastguard Worker      if arch_srcs:
110*c9945492SAndroid Build Coastguard Worker        srcs[bp_arch] = arch_srcs
111*c9945492SAndroid Build Coastguard Worker      if arch_exclude_srcs:
112*c9945492SAndroid Build Coastguard Worker        exclude_srcs[bp_arch] = arch_exclude_srcs
113*c9945492SAndroid Build Coastguard Worker    return srcs, exclude_srcs
114*c9945492SAndroid Build Coastguard Worker
115*c9945492SAndroid Build Coastguard Worker  def intersect(self, other):
116*c9945492SAndroid Build Coastguard Worker    diff = self.subtract(other)
117*c9945492SAndroid Build Coastguard Worker    return self.subtract(diff)
118*c9945492SAndroid Build Coastguard Worker
119*c9945492SAndroid Build Coastguard Worker  def subtract(self, other):
120*c9945492SAndroid Build Coastguard Worker    ret = copy.deepcopy(self)
121*c9945492SAndroid Build Coastguard Worker    ret.srcs = sorted(list(set(ret.srcs) - set(other.srcs)))
122*c9945492SAndroid Build Coastguard Worker    for bp_arch in BP_TO_MUSL_ARCHES:
123*c9945492SAndroid Build Coastguard Worker      ret.arch_srcs[bp_arch] = sorted(list(set(ret.arch_srcs[bp_arch]) - set(other.arch_srcs[bp_arch])))
124*c9945492SAndroid Build Coastguard Worker      ret.arch_exclude_srcs[bp_arch] = sorted(list(set(ret.arch_exclude_srcs[bp_arch]) - set(other.arch_exclude_srcs[bp_arch])))
125*c9945492SAndroid Build Coastguard Worker    return ret
126*c9945492SAndroid Build Coastguard Worker
127*c9945492SAndroid Build Coastguard Worker  def union(self, other):
128*c9945492SAndroid Build Coastguard Worker    ret = copy.deepcopy(self)
129*c9945492SAndroid Build Coastguard Worker    ret.srcs = sorted(ret.srcs + other.srcs)
130*c9945492SAndroid Build Coastguard Worker    for bp_arch in BP_TO_MUSL_ARCHES:
131*c9945492SAndroid Build Coastguard Worker      ret.arch_srcs[bp_arch] = sorted(ret.arch_srcs[bp_arch] + other.arch_srcs[bp_arch])
132*c9945492SAndroid Build Coastguard Worker      ret.arch_exclude_srcs[bp_arch] = sorted(ret.arch_exclude_srcs[bp_arch] + other.arch_exclude_srcs[bp_arch])
133*c9945492SAndroid Build Coastguard Worker    return self
134*c9945492SAndroid Build Coastguard Worker
135*c9945492SAndroid Build Coastguard Workerclass Blueprint(object):
136*c9945492SAndroid Build Coastguard Worker  def __init__(self, out):
137*c9945492SAndroid Build Coastguard Worker    self.out = out
138*c9945492SAndroid Build Coastguard Worker
139*c9945492SAndroid Build Coastguard Worker  def PrintHeader(self):
140*c9945492SAndroid Build Coastguard Worker    self.out.write(
141*c9945492SAndroid Build Coastguard Worker"""// Copyright (C) 2021 The Android Open Source Project
142*c9945492SAndroid Build Coastguard Worker//
143*c9945492SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
144*c9945492SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
145*c9945492SAndroid Build Coastguard Worker// You may obtain a copy of the License at
146*c9945492SAndroid Build Coastguard Worker//
147*c9945492SAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
148*c9945492SAndroid Build Coastguard Worker//
149*c9945492SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
150*c9945492SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
151*c9945492SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152*c9945492SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
153*c9945492SAndroid Build Coastguard Worker// limitations under the License.
154*c9945492SAndroid Build Coastguard Worker
155*c9945492SAndroid Build Coastguard Worker// This file is created by generate_bp.py. Do not edit manually.
156*c9945492SAndroid Build Coastguard Worker""")
157*c9945492SAndroid Build Coastguard Worker
158*c9945492SAndroid Build Coastguard Worker  def PrintDefaults(self, name, srcs):
159*c9945492SAndroid Build Coastguard Worker    """Print a cc_defaults section from a list of source files, architecture
160*c9945492SAndroid Build Coastguard Worker    specific source files, and source files replaced by architecture specific
161*c9945492SAndroid Build Coastguard Worker    source files"""
162*c9945492SAndroid Build Coastguard Worker    self.out.write('\n')
163*c9945492SAndroid Build Coastguard Worker    self.out.write('cc_defaults {\n')
164*c9945492SAndroid Build Coastguard Worker    self.out.write('    name: "%s",\n' % name)
165*c9945492SAndroid Build Coastguard Worker    self.out.write('    srcs: [\n')
166*c9945492SAndroid Build Coastguard Worker    for f in srcs.srcs:
167*c9945492SAndroid Build Coastguard Worker      self.out.write('        "%s",\n' % f)
168*c9945492SAndroid Build Coastguard Worker    self.out.write('    ],\n')
169*c9945492SAndroid Build Coastguard Worker
170*c9945492SAndroid Build Coastguard Worker    if srcs.arch_srcs or srcs.arch_exclude_srcs:
171*c9945492SAndroid Build Coastguard Worker      self.out.write('    arch: {\n')
172*c9945492SAndroid Build Coastguard Worker      for arch in BP_TO_MUSL_ARCHES.keys():
173*c9945492SAndroid Build Coastguard Worker        if srcs.arch_srcs[arch] or srcs.arch_exclude_srcs[arch]:
174*c9945492SAndroid Build Coastguard Worker          self.out.write('        %s: {\n' % arch)
175*c9945492SAndroid Build Coastguard Worker          if srcs.arch_srcs[arch]:
176*c9945492SAndroid Build Coastguard Worker            self.out.write('            srcs: [\n')
177*c9945492SAndroid Build Coastguard Worker            for f in srcs.arch_srcs[arch]:
178*c9945492SAndroid Build Coastguard Worker              self.out.write('                "%s",\n' % f)
179*c9945492SAndroid Build Coastguard Worker            self.out.write('            ],\n')
180*c9945492SAndroid Build Coastguard Worker          if srcs.arch_exclude_srcs[arch]:
181*c9945492SAndroid Build Coastguard Worker            self.out.write('            exclude_srcs: [\n')
182*c9945492SAndroid Build Coastguard Worker            for f in srcs.arch_exclude_srcs[arch]:
183*c9945492SAndroid Build Coastguard Worker              self.out.write('                "%s",\n' % f)
184*c9945492SAndroid Build Coastguard Worker            self.out.write('            ],\n')
185*c9945492SAndroid Build Coastguard Worker          self.out.write('        },\n')
186*c9945492SAndroid Build Coastguard Worker      self.out.write('    },\n')
187*c9945492SAndroid Build Coastguard Worker
188*c9945492SAndroid Build Coastguard Worker    self.out.write('}\n')
189*c9945492SAndroid Build Coastguard Worker
190*c9945492SAndroid Build Coastguard Worker
191*c9945492SAndroid Build Coastguard Workerlibc = SourceSet(dirs=SRC_DIRS)
192*c9945492SAndroid Build Coastguard Workercompat32 = SourceSet(dirs=COMPAT32_SRC_DIRS)
193*c9945492SAndroid Build Coastguard Workeropt = SourceSet(dirs=OPT_DIRS)
194*c9945492SAndroid Build Coastguard Workernossp = SourceSet(files=NOSSP_SRCS)
195*c9945492SAndroid Build Coastguard Workerldso = SourceSet(dirs=LDSO_SRC_DIRS)
196*c9945492SAndroid Build Coastguard Worker
197*c9945492SAndroid Build Coastguard Workercrts = {}
198*c9945492SAndroid Build Coastguard Workerfor crt in CRT_SRCS:
199*c9945492SAndroid Build Coastguard Worker  srcs = SourceSet(files=[crt])
200*c9945492SAndroid Build Coastguard Worker  name = os.path.splitext(os.path.basename(crt))[0]
201*c9945492SAndroid Build Coastguard Worker  crts[name] = srcs
202*c9945492SAndroid Build Coastguard Worker
203*c9945492SAndroid Build Coastguard Workerlibc = libc.subtract(opt).subtract(nossp)
204*c9945492SAndroid Build Coastguard Workeropt_nossp = opt.intersect(nossp)
205*c9945492SAndroid Build Coastguard Workeropt = opt.subtract(opt_nossp)
206*c9945492SAndroid Build Coastguard Workernossp = nossp.subtract(opt_nossp)
207*c9945492SAndroid Build Coastguard Worker
208*c9945492SAndroid Build Coastguard Workerdir_name = os.path.dirname(os.path.realpath(__file__))
209*c9945492SAndroid Build Coastguard Worker
210*c9945492SAndroid Build Coastguard Workerwith open(os.path.join(dir_name, '..', 'sources.bp'), 'w+') as out:
211*c9945492SAndroid Build Coastguard Worker  bp = Blueprint(out)
212*c9945492SAndroid Build Coastguard Worker  bp.PrintHeader()
213*c9945492SAndroid Build Coastguard Worker  bp.PrintDefaults('libc_musl_sources', libc)
214*c9945492SAndroid Build Coastguard Worker  bp.PrintDefaults('libc_musl_compat32_sources', compat32)
215*c9945492SAndroid Build Coastguard Worker  bp.PrintDefaults('libc_musl_opt_sources', opt)
216*c9945492SAndroid Build Coastguard Worker  bp.PrintDefaults('libc_musl_opt_nossp_sources', opt_nossp)
217*c9945492SAndroid Build Coastguard Worker  bp.PrintDefaults('libc_musl_nossp_sources', nossp)
218*c9945492SAndroid Build Coastguard Worker  bp.PrintDefaults('libc_musl_ldso_sources', ldso)
219*c9945492SAndroid Build Coastguard Worker  for crt in sorted(crts.keys()):
220*c9945492SAndroid Build Coastguard Worker    bp.PrintDefaults('libc_musl_%s_sources' % crt, crts[crt])
221