# Part of the A-A-P recipe executive: Add default rules and dependencies # Copyright (C) 2002 Stichting NLnet Labs # Permission to copy and use this file is specified in the file COPYING. # If this file is missing you can find it here: http://www.a-a-p.org/COPYING import string import os.path from Dictlist import string2dictlist, var2dictlist, dictlist2str, dictlistattr2str from Rule import Rule, find_rule from RecPos import RecPos from Util import * from Depend import Depend from Dictlist import get_attrdict from Message import * def add_def_rule(work, targetcheck, target, sourcecheck, source, build_attr, commands): if find_rule(work, targetcheck, sourcecheck): return # rule for this target-source already exists # Add a default rule; Expand the source and target into dictlists. rpstack = [RecPos("Default rule")] targetlist = string2dictlist(rpstack, target) buildcheck, i = get_attrdict(rpstack, None, build_attr, 0, 0) sourcelist = string2dictlist(rpstack, source) work.add_rule(Rule(targetlist, buildcheck, sourcelist, rpstack, " " + commands + "\n")) def doadddef(work): """ Add default rules and dependencies, depending on what was defined in the recipe(s) read. """ # # Add rules that are not covered by recipes. # TODO: put this separately somehow # add_def_rule(work, "%.o", "%.o", "%.c", "%.c {check = c_md5}", "{buildcheck = $CC $CFLAGS $CPPFLAGS}", ":sys $CC $CFLAGS $CPPFLAGS -c $source -o $target") add_def_rule(work, "%.obj", "%.obj", "%.c", "%.c {check = c_md5}", "{buildcheck = $CC $CFLAGS $CPPFLAGS}", ":sys $CC $CFLAGS $CPPFLAGS -c $source -o $target") # # If there is no dependency: create one from $SOURCE and $TARGET # Only possible if both are defined. # if not work.dependencies \ and work.globals.has_key("TARGET") and work.globals["TARGET"] \ and work.globals.has_key("SOURCE") and work.globals["SOURCE"]: targets = var2dictlist(work.globals, "TARGET") sources = var2dictlist(work.globals, "SOURCE") targets_len = len(targets) sources_len = len(sources) # # If there is a single target and no default rule or more than one # source, add a dependency with a link command in the form: # $TARGET : {buildcheck = xxx} $BDIR/$SOURCE-OBJ # link-command # if targets_len == 1 and (sources_len > 1 or not find_rule(work, targets[0]["name"], sources[0]["name"])): # Created node for all items in $SOURCE and $TARGET, makes sure # the attributes are carried over. work.add_dictlist_nodes(sources) work.add_dictlist_nodes(targets) # For each source change the extension to $OBJSUF. new_sources = [] i = 0 while i < sources_len: n = os.path.join(get_var_val(0, work.globals, "BDIR"), sources[i]["name"]) di = string.rfind(n, ".") if di > 0: n = n[:di] + get_var_val(0, work.globals, "OBJSUF") # TODO: any attributes we should include here? new_sources.append({"name" : n}) i = i + 1 rpstack = [RecPos("Default target")] cmd = " :sys $CC $CFLAGS $LDFLAGS -o $target $source\n" attr, i = get_attrdict(rpstack, None, "{buildcheck=$CFLAGS $LDFLAGS}", 0, 0) msg_depend(_('Adding dependency from $TARGET and $SOURCE:\n%s : %s %s\n %s') % (dictlist2str(targets), dictlistattr2str(attr), dictlist2str(new_sources), cmd)) work.add_dependency(rpstack, Depend(targets, attr, new_sources, work, rpstack, cmd), 1) # vim: set sw=4 sts=4 tw=79 fo+=l: .