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