コード例 #1
0
 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
コード例 #2
0
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 )
コード例 #3
0
 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
コード例 #4
0
 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)
コード例 #5
0
    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
コード例 #6
0
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
コード例 #7
0
 def AddDepend(self, fname, stamp=None, content=None):
     atmake.Assert(fname)
     fsign = FileSign(fname, stamp, content)
     self.depends.append(fsign)