Module: wine Branch: master Commit: ef8b871e12a5c03fb678d4286a88e708c00326d8 URL: https://source.winehq.org/git/wine.git/?a=commit;h=ef8b871e12a5c03fb678d4286...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Nov 12 15:14:12 2021 +0100
makefiles: Make importlib dependencies point to their respective dll.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
tools/makedep.c | 58 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 17 deletions(-)
diff --git a/tools/makedep.c b/tools/makedep.c index f9fbf7f8d8e..9a9e443456e 100644 --- a/tools/makedep.c +++ b/tools/makedep.c @@ -81,6 +81,7 @@ struct incl_file unsigned int files_size; /* total allocated size */ struct incl_file **files; struct strarray dependencies; /* file dependencies */ + struct strarray importlibdeps; /* importlib dependencies */ };
#define FLAG_GENERATED 0x000001 /* generated file */ @@ -1281,6 +1282,24 @@ static struct file *open_src_file( const struct makefile *make, struct incl_file }
+/******************************************************************* + * find_importlib_module + */ +static struct makefile *find_importlib_module( const char *name ) +{ + unsigned int i, len; + + for (i = 0; i < subdirs.count; i++) + { + if (strncmp( submakes[i]->obj_dir, "dlls/", 5 )) continue; + len = strlen(submakes[i]->obj_dir); + if (strncmp( submakes[i]->obj_dir + 5, name, len - 5 )) continue; + if (!name[len - 5] || !strcmp( name + len - 5, ".dll" )) return submakes[i]; + } + return NULL; +} + + /******************************************************************* * open_include_file */ @@ -1333,6 +1352,14 @@ static struct file *open_include_file( const struct makefile *make, struct incl_ /* now try in source dir */ if ((file = open_local_file( make, pFile->name, &pFile->filename ))) return file;
+ /* check for global importlib (module dependency) */ + + if (pFile->type == INCL_IMPORTLIB && find_importlib_module( pFile->name )) + { + pFile->filename = pFile->name; + return NULL; + } + /* check for corresponding idl file in global includes */
if (strendswith( pFile->name, ".h" ) && @@ -1363,16 +1390,6 @@ static struct file *open_include_file( const struct makefile *make, struct incl_ return file; }
- /* check for corresponding .tlb file in global includes */ - - if (strendswith( pFile->name, ".tlb" ) && - (file = open_global_header( make, replace_extension( pFile->name, ".tlb", ".idl" ), &filename ))) - { - pFile->sourcename = filename; - pFile->filename = strmake( "include/%s", pFile->name ); - return file; - } - /* check in global includes source dir */
if ((file = open_global_header( make, pFile->name, &pFile->filename ))) return file; @@ -1907,11 +1924,14 @@ static void get_dependencies( struct incl_file *file, struct incl_file *source ) if (file != source) { if (file->owner == source) return; /* already processed */ - if (file->type == INCL_IMPORTLIB && - !(source->file->flags & (FLAG_IDL_TYPELIB | FLAG_IDL_REGTYPELIB))) - return; /* library is imported only when building a typelib */ + if (file->type == INCL_IMPORTLIB) + { + if (!(source->file->flags & (FLAG_IDL_TYPELIB | FLAG_IDL_REGTYPELIB))) + return; /* library is imported only when building a typelib */ + strarray_add( &source->importlibdeps, file->filename ); + } + else strarray_add( &source->dependencies, file->filename ); file->owner = source; - strarray_add( &source->dependencies, file->filename );
/* sanity checks */ if (!strcmp( file->filename, "include/config.h" ) && @@ -2776,9 +2796,6 @@ static void output_source_idl( struct makefile *make, struct incl_file *source, if (source->file->flags & FLAG_IDL_HEADER) add_install_rule( make, source->name, strmake( "%s.h", obj ), strmake( "d$(includedir)/wine/%s.h", get_include_install_path( obj ) )); - if (source->file->flags & FLAG_IDL_TYPELIB) - add_install_rule( make, source->name, strmake( "%s.tlb", obj ), - strmake( "d$(includedir)/wine/%s.tlb", get_include_install_path( obj ) )); } if (!targets.count) return;
@@ -2796,6 +2813,13 @@ static void output_source_idl( struct makefile *make, struct incl_file *source, output_filenames_obj_dir( make, targets ); output( ": %s", source->filename ); output_filenames( source->dependencies ); + for (i = 0; i < source->importlibdeps.count; i++) + { + struct makefile *submake = find_importlib_module( source->importlibdeps.str[i] ); + const char *module = submake->module; + if (*dll_ext && !submake->is_cross) module = strmake( "%s.fake", module ); + output_filename( obj_dir_path( submake, module )); + } output( "\n" ); }