def AddTarget(self, target): if not target: return None ti = self.FindTarget(target) if ti is None: self.files.append(BuildFiles(target)) ti = len(self.files) - 1 atmake.Assert((ti == 0) or self.builder.IsOne2One(), 'Invalid state !') return ti
def CFileScanner ( outScan, fw, fname ) : srcfile = fw.ToAbsFile( fname ) incdirs = [] includes = fw.env['INCLUDE'] atmake.Assert( atmake.IsString(includes) ) for d in includes.split( os.pathsep ) : if atmake.IsString(d) : incdirs.append( fw.ToAbsFile(d) ) deps = CFileDepends ( srcfile, incdirs=incdirs, recurse=False ) for dep in atmake.ToList(deps) : outScan.AddDepend( dep )
def __rcmp(r, r0, r1): if len(r0) == 0 and len(r1) == 0: return 0 if r0[0] == r1[0]: return __rcmp(r, r0[1:], r1[1:]) c = 0 for i0 in r0: for i1 in r1: if i1 in r[i0]: _c = -1 # i0 before i1 elif i0 in r[i1]: _c = +1 # i0 after i1 else: _c = 0 if _c != 0: atmake.Assert(c == 0 or (_c == c), 'Circular rules found !') c = _c return c
def AddSource(self, target, source): atmake.Assert(target, 'Invalid target (src=%s) !' % source) if target and source: ti = self.AddTarget(target) self.files[ti].AddSource(source)
def Process(ctxt, builder, actions, exec_actions=True): opt_silent_mode = ctxt['env']['OPT_SILENT_MODE'] opt_show_depends = ctxt['env']['OPT_SHOW_DEPENDS'] opt_show_tree = ctxt['env']['OPT_SHOW_TREE'] opt_show_actions = ctxt['env']['OPT_SHOW_ACTIONS'] opt_exec_actions = ctxt['env']['OPT_EXEC_ACTIONS'] and exec_actions opt_show_outputs = ctxt['env']['OPT_SHOW_OUTPUTS'] opt_en_act_cache = ctxt['env']['OPT_EN_ACTION_CACHE'] opt_show_act_cache = ctxt['env']['OPT_SHOW_ACTION_CACHE'] msg_stdout = ctxt['env']['BUILD_STDOUT'] msg_stderr = ctxt['env']['BUILD_STDERR'] atmake.Assert(atmake.IsCallable(msg_stdout)) atmake.Assert(atmake.IsCallable(msg_stderr)) # display action tree ? if opt_show_tree or opt_show_depends: for b in ctxt['builders']: print(b.name) action_cpt = 0 # load cache signs = sign.BuildSignCache(ctxt) assert (signs) # check depends depends = [] target = ctxt['TARGET'] + '.' + builder.GetTargetExt() if signs and opt_en_act_cache: # depends = ctxt.CollectDepends( bf.sources ) # get build state bstt = signs.IsUptodate(target, None, actions) if opt_show_act_cache: print('Action cache for target <%s>' % target) if bstt == sign.BuildState.UP_TO_DATE: print(' => up to date.') elif bstt == sign.BuildState.NO_CACHE_ENTRY: print(' => Not in cache !') elif bstt == sign.BuildState.ACTIONS_CHANGED: print(' => Actions have changed !') elif bstt == sign.BuildState.TARGET_FILE_CHANGED: print(' => The target file has changed !') elif bstt == sign.BuildState.TARGET_FILE_DELETED: print(' => The target file is not found !') elif bstt == sign.BuildState.DEPENDS_CHANGED: print(' => Depends have changed !') elif bstt == sign.BuildState.DEPEND_FILE_CHANGED: print(' => A depend file has changed !') elif bstt == sign.BuildState.DEPEND_FILE_DELETED: print(' => A depend file is not found !') if bstt != sign.BuildState.UP_TO_DATE: # exec actions for a in actions: action_cpt += 1 if opt_show_actions and (not opt_silent_mode): print('>>>> %s' % str(a)) if opt_exec_actions: res = Exec(action=a, env=ctxt['env']) if res: rcode, xcode, oo, ee = res if not rcode: atmake.Abort('Command not found [%s] !' % a, 1) if opt_show_outputs and ((xcode != 0) or (ee) or (not opt_silent_mode)): msg_stdout(lines=oo, ctxt=ctxt) msg_stderr(lines=ee, ctxt=ctxt) if xcode != 0: atmake.Abort( 'Command exit code: %s !' % str(xcode), xcode) # update the signatures build cache if signs and opt_en_act_cache: signs.SetUptodate(ctxt['TARGET'], None, actions) return action_cpt
def sort_by_rules(in_list, in_rules): # sort strings according to a list of rules # rule is a string 'pattern0 < pattern1' such as strings matching pattern0 # always occur in list before strings matching pattern1 def __id(li, it): if it in li: return li.index(it) else: li.append(it) return len(li) - 1 def __add(d, lid, rid): if lid in d: d[lid].append(rid) else: d[lid] = [rid] if rid not in d: d[rid] = [] def __extdict(d, r, k): for i in d[k]: r[i] = True __extdict(d, r, i) def __extlist(d, k): r = {} __extdict(d, r, k) return r.keys() def __fnmatch(li, path): d = {} for i in range(len(li)): pi = li[i] if fnmatch.fnmatch(path, pi): d[pi] = i return [d[k] for k in sorted(d.keys())] def __rcmp(r, r0, r1): if len(r0) == 0 and len(r1) == 0: return 0 if r0[0] == r1[0]: return __rcmp(r, r0[1:], r1[1:]) c = 0 for i0 in r0: for i1 in r1: if i1 in r[i0]: _c = -1 # i0 before i1 elif i0 in r[i1]: _c = +1 # i0 after i1 else: _c = 0 if _c != 0: atmake.Assert(c == 0 or (_c == c), 'Circular rules found !') c = _c return c show_dbg = False patterns = [] rules = {} for r in in_rules: if r.find('<') > 0: left, sep, right = r.partition('<') elif r.find('>') > 0: right, sep, left = r.partition('>') else: atmake.Error('Invalid rule "%s" !' % r) left, right = left.strip().lower(), right.strip().lower() atmake.Assert(left, 'Invalid rule "%s" !' % r) atmake.Assert(right, 'Invalid rule "%s" !' % r) lid = __id(patterns, left) rid = __id(patterns, right) __add(rules, lid, rid) if show_dbg: print(r, lid, rid, patterns, rules) def __cmp(s0, s1): c = __rcmp(rules, s0[1], s1[1]) if show_dbg: if c < 0: print('(%s) < (%s)' % (s0[0], s1[0])) elif c > 0: print('(%s) > (%s)' % (s0[0], s1[0])) else: print('(%s) = (%s)' % (s0[0], s1[0])) return c # items is list of preprocessed ( path, path-pattern-ids ) items = [(i, __fnmatch(patterns, i.lower())) for i in in_list] sitems = sorted(items, cmp=__cmp) out_list = [i[0] for i in sitems] if show_dbg: print("Before ....") for s in in_list: print(s) print("After ...") for s in out_list: print(s) return out_list
def AddDepend(self, fname, stamp=None, content=None): atmake.Assert(fname) fsign = FileSign(fname, stamp, content) self.depends.append(fsign)