aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--makefiles.py169
1 files changed, 148 insertions, 21 deletions
diff --git a/makefiles.py b/makefiles.py
index a754558..43f6de5 100644
--- a/makefiles.py
+++ b/makefiles.py
@@ -4,17 +4,17 @@ from ply import yacc
def scanmakefile(makefile):
tokens = (
- "VARS",
+ "VAR",
"COLON",
"PERCENT",
"TEXT",
"DOLLAR",
"LPAR",
"RPAR",
- "CONTLINE",
"END",
"EQUAL",
- "INCLUDEFLAG"
+ "ENDTAB",
+ "LESS",
)
states = (
@@ -34,11 +34,7 @@ def scanmakefile(makefile):
t.lexer.pop_state()
return t
- def t_INCLUDEFLAG(t):
- r"-I"
- return t
-
- def t_VARS(t):
+ def t_VAR(t):
r"[a-zA-Z_][a-zA-Z0-9_]*[ \t]*="
t.value = t.value.split()[0].rstrip("=") #get the name of the var
return t
@@ -48,6 +44,10 @@ def scanmakefile(makefile):
r"-*\.*[a-zA-Z_][-|a-zA-Z0-9_]*"
return t
+ def t_LESS(t):
+ r"\$<"
+ pass
+
def t_DOLLAR(t):
r"\$"
return t
@@ -72,8 +72,12 @@ def scanmakefile(makefile):
r"\%"
return t
- def t_CONTLINE(t):
- r"\\"
+ def t_contline(t):
+ r"\\\n"
+ pass
+
+ def t_ENDTAB(t):
+ r"\n\t"
return t
def t_END(t):
@@ -85,37 +89,160 @@ def scanmakefile(makefile):
lexer = lex.lex()
- #lexer.input(makefile)
- #for tok in lexer:
- # print(tok)
+ lexer.input(makefile)
+ for tok in lexer:
+ print(tok)
#YACC begins here
#a dict with values of defined variables
variables = {}
+ targets = [] #buildtargets, [[target,deps,options],[target2,....
+
+ def p_target(p):
+ """
+ var : var textlst COLON textlst end
+ | textlst COLON textlst end
+ | var textlst COLON textlst options end
+ | textlst COLON textlst options end
+ """
+ if len(p) == 6:
+ if p[3] == ":":
+ targets.append([p[2][0],p[4],[]])
+ else:
+ targets.append([p[1][0],p[3],p[4]])
+ elif len(p) == 5:
+ targets.append([p[1][0],p[3],[]])
+ else:
+ targets.append([p[2][0],p[4],p[5]])
+
+ def p_lonetarget(p):
+ """
+ var : var textlst COLON options end
+ | textlst COLON options end
+ """
+ if len(p) == 6:
+ targets.append([p[2][0],[],p[4]])
+ else:
+ targets.append([p[1][0],[],p[3]])
- def p_sumfiles(p):
- "files : files sourcefiles"
- p[0] = p[1] + p[2]
+ def p_depconv(p):
+ """
+ var : var command COLON command end
+ | var command COLON command options end
+ """
+ if len(p) == 6:
+ options = []
+ else:
+ options = p[5]
- def p_files(p):
- "files : sourcefiles"
- p[0] = p[1] + p[2]
+ if p[2][0] == p[4][0] == "%":
+ for target in targets:
+ for dep in target[1]:
+ if p[2][1] in dep:
+ targets.append([dep,[(dep.replace(p[2][1],p[4][1]))],options])
+ else:
+ print("Unknown command")
def p_var(p):
- "var : VARS textlst END"
+ """
+ var : VAR textlst end
+ | VAR end
+ | var VAR textlst end
+ | var VAR end
+ """
+ if isinstance(p[2],list):
+ variables[p[1]] = p[2]
+ elif len(p) == 5:
+ variables[p[2]] = p[3]
+ elif len(p) == 3:
+ variables[p[1]] = []
+ else:
+ variables[p[2]] = []
+
+ def p_endtab(p):
+ """
+ options : ENDTAB textlst
+ | options ENDTAB textlst
+ """
+ if len(p) == 3:
+ p[0] = p[2]
+ else:
+ p[0] = p[1] + p[3]
+
+ def p_usecom(p):
+ """
+ textlst : DOLLAR LPAR textlst COLON command RPAR
+ | textlst DOLLAR LPAR textlst COLON command RPAR
+ """
+ if len(p) == 8:
+ o = 1 #offset
+ else:
+ o = 0
+ p[3+o] = variables[p[3+o][0]]
+ p[0] = []
+ if p[5][0] == "replace":
+ for text in p[3+o]:
+ p[0] += [text.replace(p[5+o][1],p[5+o][2])]
+ else:
+ for text in p[3+o]:
+ p[0] += [text + p[5+o][1]]
def p_textlst(p):
"""
textlst : textlst TEXT
| TEXT
+ | DOLLAR LPAR textlst RPAR
+ | textlst DOLLAR LPAR textlst RPAR
"""
if len(p) == 2:
p[0] = [p[1]]
- else:
+ elif len(p) == 3:
p[0] = p[1] + [p[2]]
+ elif len(p) == 5:
+ if p[3][0] in variables:
+ var = variables[p[3][0]]
+ p[0] = var
+ else:
+ p[0] = ["not defined"]
+ else:
+ if p[4][0] in variables:
+ var = variables[p[4][0]]
+ p[0] = p[1] + var
+ else:
+ p[0] = ["not defined"]
+
+ def p_command(p):
+ """
+ command : TEXT EQUAL TEXT
+ | PERCENT EQUAL PERCENT TEXT
+ | PERCENT TEXT
+ """
+ if len(p) == 4:
+ p[0] = ["replace", p[1], p[3]]
+ elif len(p) == 5:
+ p[0] = ["append", p[4]]
+ else:
+ p[0] = [p[1],p[2]]
+
+ def p_end(p):
+ """
+ end : end END
+ | END
+ """
+
+ def p_error(p):
+ print("syntax error at '%s'" % p.type,p.lexpos)
+ pass
+
+ yacc.yacc()
+
+ yacc.parse(makefile)
+ for target in targets:
+ print(target)
+ #print(variables)
file = "/usr/portage/distfiles/svn-src/doneyet-read-only/trunk/Makefile"