make: Support for combined targets

This commit is contained in:
Colomban Wendling 2015-04-02 17:19:43 +02:00
parent 5bed3b58f3
commit 2d31d8f836
5 changed files with 70 additions and 82 deletions

View File

@ -105,42 +105,19 @@ static void newMacro (vString *const name)
makeSimpleTag (name, MakeKinds, K_MACRO);
}
static void newMacroFromDefine (vString *const name)
{
/* name is something like "define JAVAHPP_RULE", find the space and jump to the next char */
char *name_val = strchr (vStringValue (name), ' ');
if (name_val != NULL) {
vStringCopyS (name, name_val + 1);
makeSimpleTag (name, MakeKinds, K_MACRO);
}
}
static void readIdentifier (const int first, vString *const id)
{
int depth = 0;
int c = first;
int c_prev = first;
int c_next = first;
vStringClear (id);
while (isIdentifier (c) || c == ' ' || (depth > 0 && c != EOF && c != '\n'))
while (isIdentifier (c) || (depth > 0 && c != EOF && c != '\n'))
{
c_next = nextChar ();
if (c == '(' || c == '}')
depth++;
else if (depth > 0 && (c == ')' || c == '}'))
depth--;
if (depth < 1 && c == ' ') {
/* add the space character only if the previous and
* next character are valid identifiers */
if (isIdentifier (c_prev) && isIdentifier (c_next))
vStringPut (id, c);
}
else {
vStringPut (id, c);
}
c_prev = c;
c = c_next;
c = nextChar ();
}
fileUngetc (c);
vStringTerminate (id);
@ -148,7 +125,7 @@ static void readIdentifier (const int first, vString *const id)
static void findMakeTags (void)
{
vString *name = vStringNew ();
stringList *identifiers = stringListNew ();
boolean newline = TRUE;
boolean in_define = FALSE;
boolean in_rule = FALSE;
@ -169,6 +146,7 @@ static void findMakeTags (void)
else
in_rule = FALSE;
}
stringListClear (identifiers);
variable_possible = (boolean)(!in_rule);
newline = FALSE;
}
@ -178,74 +156,70 @@ static void findMakeTags (void)
continue;
else if (c == '#')
skipLine ();
else if (c == ':')
else if (variable_possible && c == '?')
{
variable_possible = TRUE;
c = nextChar ();
fileUngetc (c);
variable_possible = (c == '=');
}
else if (variable_possible && c == ':' &&
stringListCount (identifiers) > 0)
{
c = nextChar ();
fileUngetc (c);
if (c != '=')
{
unsigned int i;
for (i = 0; i < stringListCount (identifiers); i++)
newTarget (stringListItem (identifiers, i));
stringListClear (identifiers);
in_rule = TRUE;
}
}
else if (variable_possible && c == '=' &&
stringListCount (identifiers) == 1)
{
newMacro (stringListItem (identifiers, 0));
skipLine ();
in_rule = FALSE;
}
else if (variable_possible && isIdentifier (c))
{
vString *name = vStringNew ();
readIdentifier (c, name);
if (strncmp (vStringValue (name), "endef", 5) == 0)
stringListAdd (identifiers, name);
if (stringListCount (identifiers) == 1)
{
if (in_define && ! strcmp (vStringValue (name), "endef"))
in_define = FALSE;
else if (in_define)
skipLine ();
else if (strncmp (vStringValue (name), "define", 6) == 0 &&
isIdentifier (c))
else if (! strcmp (vStringValue (name), "define"))
{
in_define = TRUE;
c = skipToNonWhite ();
newMacroFromDefine (name);
skipLine ();
}
else {
c = skipToNonWhite ();
if (strchr (":?+", c) != NULL)
vStringClear (name);
/* all remaining characters on the line are the name -- even spaces */
while (c != EOF && c != '\n')
{
boolean append = (boolean)(c == '+');
boolean was_colon = (c == ':');
vStringPut (name, c);
c = nextChar ();
if (was_colon)
{
if (c == '=')
{
}
if (c == '\n')
fileUngetc (c);
vStringTerminate (name);
vStringStripTrailing (name);
newMacro (name);
in_rule = FALSE;
skipLine ();
}
else
{
fileUngetc (c);
in_rule = TRUE;
newTarget (name);
}
}
else if (append)
{
skipLine ();
continue;
}
else
{
fileUngetc (c);
}
}
else if (c == '=')
{
newMacro (name);
in_rule = FALSE;
skipLine ();
}
else
{
fileUngetc (c);
}
else if (! strcmp (vStringValue (name), "export"))
stringListClear (identifiers);
}
}
else
variable_possible = FALSE;
}
vStringDelete (name);
stringListDelete (identifiers);
}
extern parserDefinition* MakefileParser (void)

View File

@ -200,6 +200,7 @@ test_sources = \
line_directives.c \
local.c \
macros.c \
make-multi-target.mak \
make-target-with-parentheses.mak \
make-variable-on-cmdline.mak \
masm.asm \

View File

@ -0,0 +1,8 @@
all: foo bar
foo bar: baz
echo $@
baz:
echo $@

View File

@ -0,0 +1,5 @@
# format=tagmanager
allÌ16Ö0
barÌ16Ö0
bazÌ16Ö0
fooÌ16Ö0

View File

@ -8,7 +8,7 @@ E
FÌ65536Ö0
GÌ65536Ö0
HÌ65536Ö0
I<EFBFBD>65536<EFBFBD>0
a.oÌ16Ö0
b.oÌ16Ö0
defaultÌ16Ö0
export Iフ65536ヨ0