Alexandre Julliard : makefiles: Install Unix binaries into an architecture-specific directory.
Alexandre Julliard
julliard at winehq.org
Wed Apr 28 16:18:47 CDT 2021
Module: wine
Branch: master
Commit: 2801d6341cda4f52fcc362da4629c576b859fbb7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2801d6341cda4f52fcc362da4629c576b859fbb7
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Apr 28 11:40:39 2021 +0200
makefiles: Install Unix binaries into an architecture-specific directory.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/loader.c | 33 ++++++++++++++++++++++++++++-----
loader/main.c | 18 +++++++++++++++---
tools/makedep.c | 19 +++++++++++--------
3 files changed, 54 insertions(+), 16 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 154ab9a5234..a575fb21b76 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -91,6 +91,18 @@
WINE_DEFAULT_DEBUG_CHANNEL(module);
+#ifdef __i386__
+static const char so_dir[] = "/i386-unix";
+#elif defined(__x86_64__)
+static const char so_dir[] = "/x86_64-unix";
+#elif defined(__arm__)
+static const char so_dir[] = "/arm-unix";
+#elif defined(__aarch64__)
+static const char so_dir[] = "/aarch64-unix";
+#else
+static const char so_dir[] = "";
+#endif
+
void (WINAPI *pDbgUiRemoteBreakin)( void *arg ) = NULL;
NTSTATUS (WINAPI *pKiRaiseUserExceptionDispatcher)(void) = NULL;
void (WINAPI *pKiUserApcDispatcher)(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC) = NULL;
@@ -114,6 +126,7 @@ static const BOOL use_preloader = FALSE;
static char *argv0;
static const char *bin_dir;
static const char *dll_dir;
+static const char *ntdll_dir;
static SIZE_T dll_path_maxlen;
static int *p___wine_main_argc;
static char ***p___wine_main_argv;
@@ -331,11 +344,12 @@ static void init_paths( char *argv[] )
argv0 = strdup( argv[0] );
- if (!dladdr( init_paths, &info ) || !(dll_dir = realpath_dirname( info.dli_fname )))
+ if (!dladdr( init_paths, &info ) || !(ntdll_dir = realpath_dirname( info.dli_fname )))
fatal_error( "cannot get path to ntdll.so\n" );
- if (!(build_dir = remove_tail( dll_dir, "/dlls/ntdll" )))
+ if (!(build_dir = remove_tail( ntdll_dir, "/dlls/ntdll" )))
{
+ if (!(dll_dir = remove_tail( ntdll_dir, so_dir ))) dll_dir = ntdll_dir;
#if (defined(__linux__) && !defined(__ANDROID__)) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
bin_dir = realpath_dirname( "/proc/self/exe" );
#elif defined (__FreeBSD__) || defined(__DragonFly__)
@@ -1349,6 +1363,14 @@ static NTSTATUS find_builtin_dll( UNICODE_STRING *nt_name, void **module, SIZE_T
ptr = prepend( ptr, dll_paths[i], strlen(dll_paths[i]) );
status = open_builtin_pe_file( ptr, &attr, module, size_ptr, image_info, machine, prefer_native );
/* use so dir for unix lib */
+ ptr = file + pos;
+ ptr = prepend( ptr, so_dir, strlen(so_dir) );
+ ptr = prepend( ptr, dll_paths[i], strlen(dll_paths[i]) );
+ if (status != STATUS_DLL_NOT_FOUND) goto done;
+ strcpy( file + pos + len + 1, ".so" );
+ status = open_builtin_so_file( ptr, &attr, module, image_info, prefer_native );
+ if (status != STATUS_DLL_NOT_FOUND) goto done;
+ file[pos + len + 1] = 0;
ptr = prepend( file + pos, dll_paths[i], strlen(dll_paths[i]) );
if (status != STATUS_DLL_NOT_FOUND) goto done;
status = open_builtin_pe_file( ptr, &attr, module, size_ptr, image_info, machine, prefer_native );
@@ -1725,12 +1747,13 @@ static void load_ntdll(void)
init_unicode_string( &str, path );
InitializeObjectAttributes( &attr, &str, 0, 0, NULL );
- name = malloc( strlen( dll_dir ) + strlen( pe_dir ) + sizeof("/ntdll.dll.so") );
- sprintf( name, "%s%s/ntdll.dll", dll_dir, build_dir ? "" : pe_dir );
+ name = malloc( strlen( ntdll_dir ) + strlen( pe_dir ) + sizeof("/ntdll.dll.so") );
+ if (build_dir) sprintf( name, "%s/ntdll.dll", ntdll_dir );
+ else sprintf( name, "%s%s/ntdll.dll", dll_dir, pe_dir );
status = open_builtin_pe_file( name, &attr, &module, &size, &info, current_machine, FALSE );
if (status == STATUS_DLL_NOT_FOUND)
{
- sprintf( name, "%s/ntdll.dll.so", dll_dir );
+ sprintf( name, "%s/ntdll.dll.so", ntdll_dir );
status = open_builtin_so_file( name, &attr, &module, &info, FALSE );
}
if (status == STATUS_IMAGE_NOT_AT_BASE) relocate_ntdll( module );
diff --git a/loader/main.c b/loader/main.c
index fb40e90f977..86c2b28263e 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -112,6 +112,17 @@ static void *try_dlopen( const char *dir, const char *name )
static void *load_ntdll( char *argv0 )
{
+#ifdef __i386__
+#define SO_DIR "i386-unix/"
+#elif defined(__x86_64__)
+#define SO_DIR "x86_64-unix/"
+#elif defined(__arm__)
+#define SO_DIR "arm-unix/"
+#elif defined(__aarch64__)
+#define SO_DIR "aarch64-unix/"
+#else
+#define SO_DIR ""
+#endif
const char *self = get_self_exe( argv0 );
char *path, *p;
void *handle = NULL;
@@ -123,7 +134,7 @@ static void *load_ntdll( char *argv0 )
handle = try_dlopen( p, "dlls/ntdll/ntdll.so" );
free( p );
}
- else handle = try_dlopen( path, BIN_TO_DLLDIR "/ntdll.so" );
+ else handle = try_dlopen( path, BIN_TO_DLLDIR "/" SO_DIR "ntdll.so" );
free( path );
}
@@ -132,13 +143,14 @@ static void *load_ntdll( char *argv0 )
path = strdup( path );
for (p = strtok( path, ":" ); p; p = strtok( NULL, ":" ))
{
- handle = try_dlopen( p, "ntdll.so" );
+ handle = try_dlopen( p, SO_DIR "ntdll.so" );
+ if (!handle) handle = try_dlopen( p, "ntdll.so" );
if (handle) break;
}
free( path );
}
- if (!handle && !self) handle = try_dlopen( DLLDIR, "ntdll.so" );
+ if (!handle && !self) handle = try_dlopen( DLLDIR, SO_DIR "ntdll.so" );
return handle;
}
diff --git a/tools/makedep.c b/tools/makedep.c
index 0092f22b3b0..638af2b6a44 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -159,6 +159,7 @@ static const char *dll_ext;
static const char *man_ext;
static const char *arch;
static const char *pe_dir;
+static const char *so_dir;
static const char *crosstarget;
static const char *crossdebug;
static const char *fontforge;
@@ -2613,7 +2614,7 @@ static int cmp_string_length( const char **a, const char **b )
static void output_uninstall_rules( struct makefile *make )
{
static const char *dirs_order[] =
- { "$(includedir)", "$(mandir)", "$(fontdir)", "$(datadir)", "$(dlldir)" };
+ { "$(includedir)", "$(mandir)", "$(fontdir)", "$(nlsdir)", "$(datadir)", "$(dlldir)" };
struct strarray uninstall_dirs = empty_strarray;
unsigned int i, j;
@@ -3313,7 +3314,7 @@ static void output_module( struct makefile *make )
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 ));
+ strmake( "p%s/%s%s", so_dir, make->module, dll_ext ));
add_install_rule( make, make->module, strmake( "%s.fake", make->module ),
strmake( "d%s/%s", pe_dir, make->module ));
output( "%s%s %s.fake:", module_path, dll_ext, module_path );
@@ -3368,7 +3369,7 @@ static void output_module( struct makefile *make )
strarray_addall( &unix_libs, add_unix_libraries( make, &unix_deps ));
strarray_add( &make->all_targets, unix_lib );
- add_install_rule( make, make->module, unix_lib, strmake( "p$(dlldir)/%s", unix_lib ));
+ add_install_rule( make, make->module, unix_lib, strmake( "p%s/%s", so_dir, unix_lib ));
output( "%s:", obj_dir_path( make, unix_lib ));
if (spec_file) output_filename( spec_file );
output_filenames_obj_dir( make, make->unixobj_files );
@@ -3402,7 +3403,7 @@ static void output_module( struct makefile *make )
output( "\n" );
add_install_rule( make, make->importlib,
strmake( "lib%s.def", make->importlib ),
- strmake( "d$(dlldir)/lib%s.def", make->importlib ));
+ strmake( "d%s/lib%s.def", so_dir, make->importlib ));
}
else
{
@@ -3424,7 +3425,7 @@ static void output_module( struct makefile *make )
output( "\n" );
add_install_rule( make, make->importlib,
strmake( "lib%s.a", make->importlib ),
- strmake( "d$(dlldir)/lib%s.a", make->importlib ));
+ strmake( "d%s/lib%s.a", so_dir, make->importlib ));
}
if (crosstarget)
{
@@ -3478,8 +3479,7 @@ static void output_static_lib( struct makefile *make )
output_filenames_obj_dir( make, make->object_files );
output_filenames_obj_dir( make, make->unixobj_files );
output( " && %s $@\n", ranlib );
- add_install_rule( make, make->staticlib, make->staticlib,
- strmake( "d$(dlldir)/%s", make->staticlib ));
+ add_install_rule( make, make->staticlib, make->staticlib, strmake( "d%s/%s", so_dir, make->staticlib ));
if (crosstarget && make->module)
{
char *name = replace_extension( make->staticlib, ".a", ".cross.a" );
@@ -4428,9 +4428,12 @@ int main( int argc, char *argv[] )
if (!tools_ext) tools_ext = "";
if (!man_ext) man_ext = "3w";
if (arch)
+ {
+ so_dir = strmake( "$(dlldir)/%s-unix", arch );
pe_dir = strmake( "$(dlldir)/%s-windows", arch );
+ }
else
- pe_dir = "$(dlldir)";
+ so_dir = pe_dir = "$(dlldir)";
top_makefile->src_dir = root_src_dir;
subdirs = get_expanded_make_var_array( top_makefile, "SUBDIRS" );
More information about the wine-cvs
mailing list