17db96d56Sopenharmony_ci# Check for a module in a set of extension directories. 27db96d56Sopenharmony_ci# An extension directory should contain a Setup file 37db96d56Sopenharmony_ci# and one or more .o files or a lib.a file. 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ciimport os 67db96d56Sopenharmony_ciimport parsesetup 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_cidef checkextensions(unknown, extensions): 97db96d56Sopenharmony_ci files = [] 107db96d56Sopenharmony_ci modules = [] 117db96d56Sopenharmony_ci edict = {} 127db96d56Sopenharmony_ci for e in extensions: 137db96d56Sopenharmony_ci setup = os.path.join(e, 'Setup') 147db96d56Sopenharmony_ci liba = os.path.join(e, 'lib.a') 157db96d56Sopenharmony_ci if not os.path.isfile(liba): 167db96d56Sopenharmony_ci liba = None 177db96d56Sopenharmony_ci edict[e] = parsesetup.getsetupinfo(setup), liba 187db96d56Sopenharmony_ci for mod in unknown: 197db96d56Sopenharmony_ci for e in extensions: 207db96d56Sopenharmony_ci (mods, vars), liba = edict[e] 217db96d56Sopenharmony_ci if mod not in mods: 227db96d56Sopenharmony_ci continue 237db96d56Sopenharmony_ci modules.append(mod) 247db96d56Sopenharmony_ci if liba: 257db96d56Sopenharmony_ci # If we find a lib.a, use it, ignore the 267db96d56Sopenharmony_ci # .o files, and use *all* libraries for 277db96d56Sopenharmony_ci # *all* modules in the Setup file 287db96d56Sopenharmony_ci if liba in files: 297db96d56Sopenharmony_ci break 307db96d56Sopenharmony_ci files.append(liba) 317db96d56Sopenharmony_ci for m in list(mods.keys()): 327db96d56Sopenharmony_ci files = files + select(e, mods, vars, 337db96d56Sopenharmony_ci m, 1) 347db96d56Sopenharmony_ci break 357db96d56Sopenharmony_ci files = files + select(e, mods, vars, mod, 0) 367db96d56Sopenharmony_ci break 377db96d56Sopenharmony_ci return files, modules 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_cidef select(e, mods, vars, mod, skipofiles): 407db96d56Sopenharmony_ci files = [] 417db96d56Sopenharmony_ci for w in mods[mod]: 427db96d56Sopenharmony_ci w = treatword(w) 437db96d56Sopenharmony_ci if not w: 447db96d56Sopenharmony_ci continue 457db96d56Sopenharmony_ci w = expandvars(w, vars) 467db96d56Sopenharmony_ci for w in w.split(): 477db96d56Sopenharmony_ci if skipofiles and w[-2:] == '.o': 487db96d56Sopenharmony_ci continue 497db96d56Sopenharmony_ci # Assume $var expands to absolute pathname 507db96d56Sopenharmony_ci if w[0] not in ('-', '$') and w[-2:] in ('.o', '.a'): 517db96d56Sopenharmony_ci w = os.path.join(e, w) 527db96d56Sopenharmony_ci if w[:2] in ('-L', '-R') and w[2:3] != '$': 537db96d56Sopenharmony_ci w = w[:2] + os.path.join(e, w[2:]) 547db96d56Sopenharmony_ci files.append(w) 557db96d56Sopenharmony_ci return files 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_cicc_flags = ['-I', '-D', '-U'] 587db96d56Sopenharmony_cicc_exts = ['.c', '.C', '.cc', '.c++'] 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_cidef treatword(w): 617db96d56Sopenharmony_ci if w[:2] in cc_flags: 627db96d56Sopenharmony_ci return None 637db96d56Sopenharmony_ci if w[:1] == '-': 647db96d56Sopenharmony_ci return w # Assume loader flag 657db96d56Sopenharmony_ci head, tail = os.path.split(w) 667db96d56Sopenharmony_ci base, ext = os.path.splitext(tail) 677db96d56Sopenharmony_ci if ext in cc_exts: 687db96d56Sopenharmony_ci tail = base + '.o' 697db96d56Sopenharmony_ci w = os.path.join(head, tail) 707db96d56Sopenharmony_ci return w 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_cidef expandvars(str, vars): 737db96d56Sopenharmony_ci i = 0 747db96d56Sopenharmony_ci while i < len(str): 757db96d56Sopenharmony_ci i = k = str.find('$', i) 767db96d56Sopenharmony_ci if i < 0: 777db96d56Sopenharmony_ci break 787db96d56Sopenharmony_ci i = i+1 797db96d56Sopenharmony_ci var = str[i:i+1] 807db96d56Sopenharmony_ci i = i+1 817db96d56Sopenharmony_ci if var == '(': 827db96d56Sopenharmony_ci j = str.find(')', i) 837db96d56Sopenharmony_ci if j < 0: 847db96d56Sopenharmony_ci break 857db96d56Sopenharmony_ci var = str[i:j] 867db96d56Sopenharmony_ci i = j+1 877db96d56Sopenharmony_ci if var in vars: 887db96d56Sopenharmony_ci str = str[:k] + vars[var] + str[i:] 897db96d56Sopenharmony_ci i = k 907db96d56Sopenharmony_ci return str 91