make: Support for combined targets
This commit is contained in:
parent
5bed3b58f3
commit
2d31d8f836
@ -105,42 +105,19 @@ static void newMacro (vString *const name)
|
|||||||
makeSimpleTag (name, MakeKinds, K_MACRO);
|
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)
|
static void readIdentifier (const int first, vString *const id)
|
||||||
{
|
{
|
||||||
int depth = 0;
|
int depth = 0;
|
||||||
int c = first;
|
int c = first;
|
||||||
int c_prev = first;
|
|
||||||
int c_next = first;
|
|
||||||
vStringClear (id);
|
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 == '}')
|
if (c == '(' || c == '}')
|
||||||
depth++;
|
depth++;
|
||||||
else if (depth > 0 && (c == ')' || c == '}'))
|
else if (depth > 0 && (c == ')' || c == '}'))
|
||||||
depth--;
|
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);
|
vStringPut (id, c);
|
||||||
}
|
c = nextChar ();
|
||||||
else {
|
|
||||||
vStringPut (id, c);
|
|
||||||
}
|
|
||||||
c_prev = c;
|
|
||||||
c = c_next;
|
|
||||||
}
|
}
|
||||||
fileUngetc (c);
|
fileUngetc (c);
|
||||||
vStringTerminate (id);
|
vStringTerminate (id);
|
||||||
@ -148,7 +125,7 @@ static void readIdentifier (const int first, vString *const id)
|
|||||||
|
|
||||||
static void findMakeTags (void)
|
static void findMakeTags (void)
|
||||||
{
|
{
|
||||||
vString *name = vStringNew ();
|
stringList *identifiers = stringListNew ();
|
||||||
boolean newline = TRUE;
|
boolean newline = TRUE;
|
||||||
boolean in_define = FALSE;
|
boolean in_define = FALSE;
|
||||||
boolean in_rule = FALSE;
|
boolean in_rule = FALSE;
|
||||||
@ -169,6 +146,7 @@ static void findMakeTags (void)
|
|||||||
else
|
else
|
||||||
in_rule = FALSE;
|
in_rule = FALSE;
|
||||||
}
|
}
|
||||||
|
stringListClear (identifiers);
|
||||||
variable_possible = (boolean)(!in_rule);
|
variable_possible = (boolean)(!in_rule);
|
||||||
newline = FALSE;
|
newline = FALSE;
|
||||||
}
|
}
|
||||||
@ -178,74 +156,70 @@ static void findMakeTags (void)
|
|||||||
continue;
|
continue;
|
||||||
else if (c == '#')
|
else if (c == '#')
|
||||||
skipLine ();
|
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;
|
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))
|
else if (variable_possible && isIdentifier (c))
|
||||||
{
|
{
|
||||||
|
vString *name = vStringNew ();
|
||||||
readIdentifier (c, name);
|
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;
|
in_define = FALSE;
|
||||||
else if (in_define)
|
else if (in_define)
|
||||||
skipLine ();
|
skipLine ();
|
||||||
else if (strncmp (vStringValue (name), "define", 6) == 0 &&
|
else if (! strcmp (vStringValue (name), "define"))
|
||||||
isIdentifier (c))
|
|
||||||
{
|
{
|
||||||
in_define = TRUE;
|
in_define = TRUE;
|
||||||
c = skipToNonWhite ();
|
c = skipToNonWhite ();
|
||||||
newMacroFromDefine (name);
|
vStringClear (name);
|
||||||
skipLine ();
|
/* all remaining characters on the line are the name -- even spaces */
|
||||||
}
|
while (c != EOF && c != '\n')
|
||||||
else {
|
|
||||||
c = skipToNonWhite ();
|
|
||||||
if (strchr (":?+", c) != NULL)
|
|
||||||
{
|
{
|
||||||
boolean append = (boolean)(c == '+');
|
vStringPut (name, c);
|
||||||
boolean was_colon = (c == ':');
|
|
||||||
c = nextChar ();
|
c = nextChar ();
|
||||||
if (was_colon)
|
}
|
||||||
{
|
if (c == '\n')
|
||||||
if (c == '=')
|
fileUngetc (c);
|
||||||
{
|
vStringTerminate (name);
|
||||||
|
vStringStripTrailing (name);
|
||||||
newMacro (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
|
else
|
||||||
variable_possible = FALSE;
|
variable_possible = FALSE;
|
||||||
}
|
}
|
||||||
vStringDelete (name);
|
stringListDelete (identifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern parserDefinition* MakefileParser (void)
|
extern parserDefinition* MakefileParser (void)
|
||||||
|
@ -200,6 +200,7 @@ test_sources = \
|
|||||||
line_directives.c \
|
line_directives.c \
|
||||||
local.c \
|
local.c \
|
||||||
macros.c \
|
macros.c \
|
||||||
|
make-multi-target.mak \
|
||||||
make-target-with-parentheses.mak \
|
make-target-with-parentheses.mak \
|
||||||
make-variable-on-cmdline.mak \
|
make-variable-on-cmdline.mak \
|
||||||
masm.asm \
|
masm.asm \
|
||||||
|
8
tests/ctags/make-multi-target.mak
Normal file
8
tests/ctags/make-multi-target.mak
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
all: foo bar
|
||||||
|
|
||||||
|
foo bar: baz
|
||||||
|
echo $@
|
||||||
|
|
||||||
|
baz:
|
||||||
|
echo $@
|
5
tests/ctags/make-multi-target.mak.tags
Normal file
5
tests/ctags/make-multi-target.mak.tags
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# format=tagmanager
|
||||||
|
allÌ16Ö0
|
||||||
|
barÌ16Ö0
|
||||||
|
bazÌ16Ö0
|
||||||
|
fooÌ16Ö0
|
@ -8,7 +8,7 @@ E
|
|||||||
FÌ65536Ö0
|
FÌ65536Ö0
|
||||||
GÌ65536Ö0
|
GÌ65536Ö0
|
||||||
HÌ65536Ö0
|
HÌ65536Ö0
|
||||||
|
I<EFBFBD>65536<EFBFBD>0
|
||||||
a.oÌ16Ö0
|
a.oÌ16Ö0
|
||||||
b.oÌ16Ö0
|
b.oÌ16Ö0
|
||||||
defaultÌ16Ö0
|
defaultÌ16Ö0
|
||||||
export Iフ65536ヨ0
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user