From: Eric Pouech eric.pouech@gmail.com
Signed-off-by: Eric Pouech eric.pouech@gmail.com --- programs/winetest/main.c | 46 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/programs/winetest/main.c b/programs/winetest/main.c index 711f38d06e6..1611333bf9f 100644 --- a/programs/winetest/main.c +++ b/programs/winetest/main.c @@ -74,6 +74,17 @@ static char build_id[64]; static BOOL is_wow64; static int failures; static int quiet_mode; +static int multi_arch; +static const char * const arch_dirs[2] = +#if defined(__i386__) || defined(__x86_64__) +{"\i386-windows", "\x86_64-windows"} +#elif defined(__arm__) || defined(__aarch64__) +{"\arm-windows", "\aarch64-windows"} +#else +#error define support for your CPU +#endif + ; +static const char *current_arch_dir = arch_dirs[sizeof(void*)==8];
/* filters for running only specific tests */ static char **filters; @@ -1098,9 +1109,36 @@ extract_test_proc (HMODULE hModule, LPCSTR lpszType, LPSTR lpszName, LONG_PTR lP return TRUE; }
+static void create_multiarch_directories(const char* target_dir) +{ + char tmp[MAX_PATH + 4]; + + if (!multi_arch) return; + + strcpy(tmp, target_dir); + strcat(tmp, arch_dirs[0]); + if (!CreateDirectoryA( tmp, NULL )) + report (R_FATAL, "Could not create directory %s (%d)", tmp, GetLastError()); + strcpy(tmp, target_dir); + strcat(tmp, arch_dirs[1]); + if (!CreateDirectoryA( tmp, NULL )) + report (R_FATAL, "Could not create directory %s (%d)", tmp, GetLastError()); +} + static BOOL init_image(struct winetest_image *image, const char *target_dir) { - image->target_dir = target_dir; + char* new; + + if (multi_arch) + { + new = malloc(strlen(target_dir) + strlen(current_arch_dir) + 1); + strcpy(new, target_dir); + strcat(new, current_arch_dir); + } + else + new = strdup(target_dir); + + image->target_dir = new; image->module = NULL; image->nr_of_files = image->nr_of_tests = image->nr_of_skips = 0; report (R_STATUS, "Counting tests"); @@ -1125,6 +1163,7 @@ static BOOL load_image(struct winetest_image *image, const char *tempdir)
static void dispose_image(struct winetest_image *image) { + free((void*)image->target_dir); free(image->wine_tests); FreeLibrary(image->module); memset(image, 0, sizeof(*image)); @@ -1189,6 +1228,7 @@ run_tests (char *logname, char *outdir, int *nr_of_skips) if (!newdir && (!outdir || GetLastError() != ERROR_ALREADY_EXISTS)) report (R_FATAL, "Could not create directory %s (%d)", tempdir, GetLastError());
+ create_multiarch_directories(tempdir); report (R_DIR, tempdir);
xprintf ("Version 4\n"); @@ -1313,6 +1353,7 @@ static void extract_only (const char *target_dir) res = CreateDirectoryA( target_dir, NULL ); if (!res && GetLastError() != ERROR_ALREADY_EXISTS) report (R_FATAL, "Could not create directory: %s (%d)", target_dir, GetLastError ()); + create_multiarch_directories( target_dir );
if (!init_image(&image, target_dir)) return;
@@ -1474,6 +1515,9 @@ int __cdecl main( int argc, char *argv[] ) case 'd': outdir = argv[++i]; break; + case 'w': + multi_arch = 1; + break; default: report (R_ERROR, "invalid option: -%c", argv[i][1]); usage ();