33"""
44from __future__ import absolute_import
55# import compatibility functions and utilities
6- from ._utils import ConfigParser , StringIO
6+ from ._utils import ConfigParser , StringIO , shlex
77import io
88import re
99from subprocess import check_call
10- import shlex
11-
1210
1311__author__ = {"github.com/" : ["casperdcl" , "lrq3000" ]}
1412__all__ = ['PymakeTypeError' , 'PymakeKeyError' ,
1513 'parse_makefile_aliases' , 'execute_makefile_commands' ]
1614
1715
18- RE_MAKE_CMD = re .compile ('^\t (@\+?)(make)?' , flags = re . M )
19- RE_MACRO_DEF = re .compile (r"^(\S+)\s*\:?\=\s*(.*?)$" , flags = re . M )
20- RE_MACRO = re .compile (r"\$\(\s*\S+\s*\)" , flags = re . M )
16+ RE_MAKE_CMD = re .compile ('^\t (@\+?)(make)?' )
17+ RE_MACRO_DEF = re .compile (r"^(\S+)\s*\:?\=\s*(.*?)$" )
18+ RE_MACRO = re .compile (r"\$\(\s*\S+\s*\)" )
2119
2220
2321class PymakeTypeError (TypeError ):
@@ -42,19 +40,22 @@ def parse_makefile_aliases(filepath):
4240
4341 # -- Parsing the Makefile using ConfigParser
4442 # Adding a fake section to make the Makefile a valid Ini file
45- ini_str = '[root]\n '
43+ ini_lines = [ '[root]' ]
4644 with io .open (filepath , mode = 'r' ) as fd :
47- ini_str = ini_str + RE_MAKE_CMD .sub ('\t ' , fd .read ())
45+ ini_lines . extend ( RE_MAKE_CMD .sub ('\t ' , i ) for i in fd .readlines ())
4846
4947 # Substitute macros
50- macros = dict (RE_MACRO_DEF .findall (ini_str ))
48+ macros = dict (found for l in ini_lines
49+ for found in RE_MACRO_DEF .findall (l ) if found )
50+ ini_str = '\n ' .join (ini_lines )
5151 # allow finite amount of nesting
5252 for _ in range (99 ):
5353 for (m , expr ) in getattr (macros , 'iteritems' , macros .items )():
54- ini_str = re .sub (r"\$\(" + m + "\)" , expr , ini_str , flags = re . M )
55- if not RE_MACRO .match (ini_str ):
54+ ini_str = re .sub (r"\$\(" + m + "\)" , expr , ini_str )
55+ if not RE_MACRO .search (ini_str ):
5656 # Strip macro definitions for rest of parsing
57- ini_str = RE_MACRO_DEF .sub ("" , ini_str )
57+ ini_str = '\n ' .join (l for l in ini_str .splitlines ()
58+ if not RE_MACRO_DEF .search (l ))
5859 break
5960 else :
6061 raise PymakeKeyError ("No substitution for macros: " +
0 commit comments