Alexandre Julliard : makefiles: Build modules that don' t contain code as PE builtins.

Alexandre Julliard julliard at winehq.org
Mon Apr 22 16:30:38 CDT 2019


Module: wine
Branch: master
Commit: 0189cf21ce4b96372d1f49e5d452ab61a21fbcd4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0189cf21ce4b96372d1f49e5d452ab61a21fbcd4

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr 22 11:51:04 2019 +0200

makefiles: Build modules that don't contain code as PE builtins.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/makedep.c | 104 ++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 74 insertions(+), 30 deletions(-)

diff --git a/tools/makedep.c b/tools/makedep.c
index 227d589..584c5a0 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -2051,6 +2051,37 @@ static const char *get_static_lib( const struct makefile *make, const char *name
 
 
 /*******************************************************************
+ *         get_parent_makefile
+ */
+static struct makefile *get_parent_makefile( struct makefile *make )
+{
+    char *dir, *p;
+    int i;
+
+    if (!make->base_dir) return NULL;
+    dir = xstrdup( make->base_dir );
+    if (!(p = strrchr( dir, '/' ))) return NULL;
+    *p = 0;
+    for (i = 0; i < top_makefile->subdirs.count; i++)
+        if (!strcmp( top_makefile->submakes[i]->base_dir, dir )) return top_makefile->submakes[i];
+    return NULL;
+}
+
+
+/*******************************************************************
+ *         is_cross_compiled
+ */
+static int is_cross_compiled( struct makefile *make )
+{
+    return (crosstarget &&
+            !make->is_win16 &&
+            !strarray_exists( &make->imports, "kernel" ) &&
+            (make->testdll ||
+             !make->object_files.count));
+}
+
+
+/*******************************************************************
  *         add_default_libraries
  */
 static struct strarray add_default_libraries( const struct makefile *make, struct strarray *deps )
@@ -2289,6 +2320,10 @@ static void output_install_commands( struct makefile *make, const struct makefil
         if (submake) file = base_dir_path( submake, file );
         switch (*files.str[i + 1])
         {
+        case 'c':  /* cross-compiled program */
+            output( "\tSTRIPPROG=%s-strip %s -m 644 $(INSTALL_PROGRAM_FLAGS) %s %s\n",
+                    crosstarget, install_sh, obj_dir_path( make, file ), dest );
+            break;
         case 'd':  /* data file */
             output( "\t%s -m 644 $(INSTALL_DATA_FLAGS) %s %s\n",
                     install_sh, obj_dir_path( make, file ), dest );
@@ -3069,47 +3104,61 @@ static void output_module( struct makefile *make )
     char *module_path = obj_dir_path( make, make->module );
     char *spec_file = NULL;
     unsigned int i;
+    int need_cross = is_cross_compiled( make );
 
     if (!make->is_exe) spec_file = src_dir_path( make, replace_extension( make->module, ".dll", ".spec" ));
-    strarray_addall( &all_libs, add_import_libs( make, &dep_libs, make->delayimports, 0 ));
-    strarray_addall( &all_libs, add_import_libs( make, &dep_libs, make->imports, 0 ));
-    add_import_libs( make, &dep_libs, get_default_imports( make ), 0 );  /* dependencies only */
-    strarray_addall( &all_libs, add_default_libraries( make, &dep_libs ));
+    strarray_addall( &all_libs, add_import_libs( make, &dep_libs, make->delayimports, need_cross ));
+    strarray_addall( &all_libs, add_import_libs( make, &dep_libs, make->imports, need_cross ));
+    add_import_libs( make, &dep_libs, get_default_imports( make ), need_cross );  /* dependencies only */
 
-    if (*dll_ext)
+    if (need_cross)
     {
-        for (i = 0; i < make->delayimports.count; i++)
-            strarray_add( &all_libs, strmake( "-Wb,-d%s", make->delayimports.str[i] ));
-        strarray_add( &make->all_targets, strmake( "%s%s", make->module, dll_ext ));
-        strarray_add( &make->all_targets, strmake( "%s.fake", make->module ));
-        add_install_rule( make, make->module, strmake( "%s%s", make->module, dll_ext ),
-                          strmake( "p$(dlldir)/%s%s", make->module, dll_ext ));
-        add_install_rule( make, make->module, strmake( "%s.fake", make->module ),
-                          strmake( "d$(dlldir)/fakedlls/%s", make->module ));
-        output( "%s%s %s.fake:", module_path, dll_ext, module_path );
+        strarray_add( &make->all_targets, strmake( "%s", make->module ));
+        add_install_rule( make, make->module, strmake( "%s", make->module ),
+                          strmake( "c$(dlldir)/%s", make->module ));
+        output( "%s:", module_path );
     }
     else
     {
-        strarray_add( &make->all_targets, make->module );
-        add_install_rule( make, make->module, make->module,
-                          strmake( "p$(%s)/%s", spec_file ? "dlldir" : "bindir", make->module ));
-        output( "%s:", module_path );
+        strarray_addall( &all_libs, add_default_libraries( make, &dep_libs ));
+
+        if (*dll_ext)
+        {
+            for (i = 0; i < make->delayimports.count; i++)
+                strarray_add( &all_libs, strmake( "-Wb,-d%s", make->delayimports.str[i] ));
+            strarray_add( &make->all_targets, strmake( "%s%s", make->module, dll_ext ));
+            strarray_add( &make->all_targets, strmake( "%s.fake", make->module ));
+            add_install_rule( make, make->module, strmake( "%s%s", make->module, dll_ext ),
+                              strmake( "p$(dlldir)/%s%s", make->module, dll_ext ));
+            add_install_rule( make, make->module, strmake( "%s.fake", make->module ),
+                              strmake( "d$(dlldir)/fakedlls/%s", make->module ));
+            output( "%s%s %s.fake:", module_path, dll_ext, module_path );
+        }
+        else
+        {
+            strarray_add( &make->all_targets, make->module );
+            add_install_rule( make, make->module, make->module,
+                              strmake( "p$(%s)/%s", spec_file ? "dlldir" : "bindir", make->module ));
+            output( "%s:", module_path );
+        }
     }
+
     if (spec_file) output_filename( spec_file );
-    output_filenames_obj_dir( make, make->object_files );
+    output_filenames_obj_dir( make, need_cross ? make->crossobj_files : make->object_files );
     output_filenames_obj_dir( make, make->res_files );
     output_filenames( dep_libs );
     output_filename( tools_path( make, "winebuild" ));
     output_filename( tools_path( make, "winegcc" ));
     output( "\n" );
-    output_winegcc_command( make, 0 );
+    output_winegcc_command( make, need_cross );
+    if (need_cross) output_filename( "-Wl,--wine-builtin" );
     if (spec_file)
     {
         output_filename( "-shared" );
         output_filename( spec_file );
     }
     output_filenames( make->extradllflags );
-    output_filenames_obj_dir( make, make->object_files );
+    output_filenames_obj_dir( make, need_cross ? make->crossobj_files : make->object_files );
     output_filenames_obj_dir( make, make->res_files );
     output_filenames( all_libs );
     output_filename( "$(LDFLAGS)" );
@@ -3247,8 +3296,9 @@ static void output_test_module( struct makefile *make )
     char *testres = replace_extension( make->testdll, ".dll", "_test.res" );
     struct strarray dep_libs = empty_strarray;
     struct strarray all_libs = add_import_libs( make, &dep_libs, make->imports, !!crosstarget );
-    int parent_disabled = 0;
+    struct makefile *parent = get_parent_makefile( make );
     const char *ext = crosstarget ? "" : dll_ext;
+    const char *parent_ext = parent && is_cross_compiled( parent ) ? "" : dll_ext;
 
     add_import_libs( make, &dep_libs, get_default_imports( make ), !!crosstarget ); /* dependencies only */
     strarray_addall( &all_libs, libs );
@@ -3287,16 +3337,10 @@ static void output_test_module( struct makefile *make )
     output( "\techo \"%s TESTRES \\\"%s%s\\\"\" | %s -o $@\n",
             testmodule, obj_dir_path( make, stripped ), ext, tools_path( make, "wrc" ));
 
-    if (strendswith( make->base_dir, "/tests" ))
-    {
-        char *dir = xstrdup( make->base_dir );
-        dir[strlen( dir ) - 6] = 0;
-        parent_disabled = strarray_exists( &disabled_dirs, dir );
-    }
     output_filenames_obj_dir( make, make->ok_files );
-    output( ": %s%s ../%s%s\n", testmodule, ext, make->testdll, dll_ext );
+    output( ": %s%s ../%s%s\n", testmodule, ext, make->testdll, parent_ext );
     output( "check test:" );
-    if (!make->disabled && !parent_disabled) output_filenames_obj_dir( make, make->ok_files );
+    if (!make->disabled && parent && !parent->disabled) output_filenames_obj_dir( make, make->ok_files );
     output( "\n" );
     strarray_add( &make->phony_targets, "check" );
     strarray_add( &make->phony_targets, "test" );




More information about the wine-cvs mailing list