Alexandre Julliard : makedep: Add support for #pragma directives in the source to set the flags for generated files .
Alexandre Julliard
julliard at winehq.org
Tue Nov 5 15:02:29 CST 2013
Module: wine
Branch: master
Commit: ae9f33e17b428d2b554236d093a96c90a24fa112
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae9f33e17b428d2b554236d093a96c90a24fa112
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Nov 5 12:48:16 2013 +0100
makedep: Add support for #pragma directives in the source to set the flags for generated files.
---
tools/makedep.c | 151 ++++++++++++++++++++++++++++++++++--------------------
1 files changed, 95 insertions(+), 56 deletions(-)
diff --git a/tools/makedep.c b/tools/makedep.c
index 561cf0b..4c54c90 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -615,6 +615,80 @@ found:
/*******************************************************************
+ * parse_include_directive
+ */
+static void parse_include_directive( struct incl_file *source, char *str )
+{
+ char quote, *include, *p = str;
+
+ while (*p && isspace(*p)) p++;
+ if (*p != '\"' && *p != '<' ) return;
+ quote = *p++;
+ if (quote == '<') quote = '>';
+ include = p;
+ while (*p && (*p != quote)) p++;
+ if (!*p) fatal_error( "malformed include directive '%s'\n", str );
+ *p = 0;
+ add_include( source, include, (quote == '>') );
+}
+
+
+/*******************************************************************
+ * parse_pragma_directive
+ */
+static void parse_pragma_directive( struct incl_file *source, char *str )
+{
+ char *flag, *p = str;
+
+ if (!isspace( *p )) return;
+ while (*p && isspace(*p)) p++;
+ p = strtok( p, " \t" );
+ if (strcmp( p, "makedep" )) return;
+
+ while ((flag = strtok( NULL, " \t" )))
+ {
+ if (!strcmp( flag, "depend" ))
+ {
+ while ((p = strtok( NULL, " \t" ))) add_include( source, p, 0 );
+ return;
+ }
+ if (strendswith( source->name, ".idl" ))
+ {
+ if (!strcmp( flag, "header" )) source->flags |= FLAG_IDL_HEADER;
+ else if (!strcmp( flag, "proxy" )) source->flags |= FLAG_IDL_PROXY;
+ else if (!strcmp( flag, "client" )) source->flags |= FLAG_IDL_CLIENT;
+ else if (!strcmp( flag, "server" )) source->flags |= FLAG_IDL_SERVER;
+ else if (!strcmp( flag, "ident" )) source->flags |= FLAG_IDL_IDENT;
+ else if (!strcmp( flag, "typelib" )) source->flags |= FLAG_IDL_TYPELIB;
+ else if (!strcmp( flag, "register" )) source->flags |= FLAG_IDL_REGISTER;
+ }
+ else if (strendswith( source->name, ".rc" ))
+ {
+ if (!strcmp( flag, "po" )) source->flags |= FLAG_RC_PO;
+ }
+ }
+}
+
+
+/*******************************************************************
+ * parse_cpp_directive
+ */
+static void parse_cpp_directive( struct incl_file *source, char *str )
+{
+ while (*str && isspace(*str)) str++;
+ if (*str++ != '#') return;
+ while (*str && isspace(*str)) str++;
+
+ if (!strncmp( str, "include", 7 ))
+ parse_include_directive( source, str + 7 );
+ else if (!strncmp( str, "import", 6 ) && strendswith( source->name, ".m" ))
+ parse_include_directive( source, str + 6 );
+ else if (!strncmp( str, "pragma", 6 ))
+ parse_pragma_directive( source, str + 6 );
+}
+
+
+/*******************************************************************
* parse_idl_file
*
* If for_h_file is non-zero, it means we are not interested in the idl file
@@ -685,20 +759,7 @@ static void parse_idl_file( struct incl_file *pFile, FILE *file, int for_h_file
continue;
}
- /* check for normal #include */
- if (*p++ != '#') continue;
- while (*p && isspace(*p)) p++;
- if (strncmp( p, "include", 7 )) continue;
- p += 7;
- while (*p && isspace(*p)) p++;
- if (*p != '\"' && *p != '<' ) continue;
- quote = *p++;
- if (quote == '<') quote = '>';
- include = p;
- while (*p && (*p != quote)) p++;
- if (!*p) fatal_error( "malformed #include directive\n" );
- *p = 0;
- add_include( pFile, include, (quote == '>') );
+ parse_cpp_directive( pFile, p );
}
}
@@ -707,28 +768,12 @@ static void parse_idl_file( struct incl_file *pFile, FILE *file, int for_h_file
*/
static void parse_c_file( struct incl_file *pFile, FILE *file )
{
- char *buffer, *include;
+ char *buffer;
input_line = 0;
while ((buffer = get_line( file )))
{
- char quote;
- char *p = buffer;
- while (*p && isspace(*p)) p++;
- if (*p++ != '#') continue;
- while (*p && isspace(*p)) p++;
- if (!strncmp( p, "include", 7 )) p += 7;
- else if (!strncmp( p, "import", 6 )) p += 6;
- else continue;
- while (*p && isspace(*p)) p++;
- if (*p != '\"' && *p != '<' ) continue;
- quote = *p++;
- if (quote == '<') quote = '>';
- include = p;
- while (*p && (*p != quote)) p++;
- if (!*p) fatal_error( "malformed #include directive\n" );
- *p = 0;
- add_include( pFile, include, (quote == '>') );
+ parse_cpp_directive( pFile, buffer );
}
}
@@ -768,23 +813,11 @@ static void parse_rc_file( struct incl_file *pFile, FILE *file )
if (!*p)
fatal_error( "malformed makedep comment\n" );
*p = 0;
+ add_include( pFile, include, (quote == '>') );
+ continue;
}
- else /* check for #include */
- {
- if (*p++ != '#') continue;
- while (*p && isspace(*p)) p++;
- if (strncmp( p, "include", 7 )) continue;
- p += 7;
- while (*p && isspace(*p)) p++;
- if (*p != '\"' && *p != '<' ) continue;
- quote = *p++;
- if (quote == '<') quote = '>';
- include = p;
- while (*p && (*p != quote)) p++;
- if (!*p) fatal_error( "malformed #include directive\n" );
- *p = 0;
- }
- add_include( pFile, include, (quote == '>') );
+
+ parse_cpp_directive( pFile, buffer );
}
}
@@ -917,14 +950,7 @@ static struct incl_file *add_src_file( const char *name )
}
if (strendswith( file->name, ".tlb" ) ||
- strendswith( file->name, "_r.res" ) ||
- strendswith( file->name, "_t.res" ))
- {
- file->filename = xstrdup( file->name );
- return file;
- }
-
- if (strendswith( file->name, ".res" ) ||
+ strendswith( file->name, ".res" ) ||
strendswith( file->name, ".pot" ) ||
strendswith( file->name, ".x" ))
{
@@ -942,10 +968,23 @@ static struct incl_file *add_src_file( const char *name )
*/
static void add_generated_sources(void)
{
+ unsigned int i;
struct incl_file *source, *next;
LIST_FOR_EACH_ENTRY_SAFE( source, next, &sources, struct incl_file, entry )
{
+ if (!source->flags) continue;
+ for (i = 0; i < sizeof(idl_outputs) / sizeof(idl_outputs[0]); i++)
+ {
+ if (!(source->flags & idl_outputs[i].flag)) continue;
+ if (!strendswith( idl_outputs[i].ext, ".c" )) continue;
+ add_src_file( replace_extension( source->name, 4, idl_outputs[i].ext ));
+ }
+ if (source->flags & FLAG_IDL_PROXY) add_src_file( "dlldata.o" );
+ }
+
+ LIST_FOR_EACH_ENTRY_SAFE( source, next, &sources, struct incl_file, entry )
+ {
if (strendswith( source->name, "_c.c" ) ||
strendswith( source->name, "_i.c" ) ||
strendswith( source->name, "_p.c" ) ||
More information about the wine-cvs
mailing list