This would hopefully fix some comctl32 test failures which started happening after I changed my nightly winetest runs to build Wine with Clang.
-- v2: winegcc: Force default subsystem version to MSVC modern values. user32/tests: Force console subsystem version 5.2. quartz/tests: Force console subsystem version 5.2. dxgi/tests: Force console subsystem version 5.2. comctl32/tests: Force console subsystem version 5.2. winegcc: Support subsystem version number in link.exe-style cmdline. winegcc: Consistently use the subsystem option with Clang and MinGW.
From: Rémi Bernon rbernon@codeweavers.com
Instead of the -mwindows / -mconsole flags with MinGW. --- tools/winegcc/winegcc.c | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 7322feaaf80..46a63453985 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -170,7 +170,6 @@ enum file_type { file_na, file_other, file_obj, file_res, file_rc, file_arh, fil static bool is_pe; static bool is_static; static bool is_shared; -static bool is_gui_app; static bool is_unicode_app; static bool is_win16_app; static bool is_arm64x; @@ -541,10 +540,9 @@ static struct strarray get_link_args( const char *output_name ) strarray_add( &flags, "-shared" ); strarray_add( &flags, "-Wl,--kill-at" ); } - else strarray_add( &flags, is_gui_app ? "-mwindows" : "-mconsole" );
if (is_unicode_app) strarray_add( &flags, "-municode" ); - if (subsystem) strarray_add( &flags, strmake("-Wl,--subsystem,%s", subsystem )); + if (subsystem) strarray_add( &flags, strmake( "-Wl,--subsystem,%s", subsystem ) );
strarray_add( &flags, "-Wl,--exclude-all-symbols" ); strarray_add( &flags, "-Wl,--nxcompat" ); @@ -600,10 +598,7 @@ static struct strarray get_link_args( const char *output_name )
if (entry_point) strarray_add( &flags, strmake( "-Wl,-entry:%s", entry_point ));
- if (subsystem) - strarray_add( &flags, strmake("-Wl,-subsystem:%s", subsystem )); - else - strarray_add( &flags, strmake("-Wl,-subsystem:%s", is_gui_app ? "windows" : "console" )); + if (subsystem) strarray_add( &flags, strmake( "-Wl,--subsystem:%s", subsystem ) );
STRARRAY_FOR_EACH( file, &output_debug_files ) { @@ -1137,13 +1132,14 @@ static void build_spec_obj( const char *spec_file, const char *output_file, strarray_add(&spec_args, output_name); }
- if (!is_shared) + if (subsystem) { - strarray_add(&spec_args, "--subsystem"); - strarray_add(&spec_args, is_gui_app ? "windows" : "console"); - if (large_address_aware) strarray_add( &spec_args, "--large-address-aware" ); + strarray_add( &spec_args, "--subsystem" ); + strarray_add( &spec_args, subsystem ); }
+ if (!is_shared && large_address_aware) strarray_add( &spec_args, "--large-address-aware" ); + if (target.platform == PLATFORM_WINDOWS && target.cpu == CPU_i386) strarray_add(&spec_args, "--safeseh");
@@ -1153,12 +1149,6 @@ static void build_spec_obj( const char *spec_file, const char *output_file, strarray_add(&spec_args, entry_point); }
- if (subsystem) - { - strarray_add(&spec_args, "--subsystem"); - strarray_add(&spec_args, subsystem); - } - if (!is_pe) STRARRAY_FOR_EACH( imp, &delayimports ) strarray_add(&spec_args, strmake("-d%s", imp));
strarray_addall( &spec_args, resources ); @@ -1318,7 +1308,7 @@ static void build(struct strarray input_files, const char *output)
if (!wine_objdir && !nodefaultlibs) { - if (is_gui_app) + if (subsystem && !strncmp( subsystem, "windows", 7 )) { add_library(lib_dirs, &files, "shell32"); add_library(lib_dirs, &files, "comdlg32"); @@ -1776,12 +1766,12 @@ int main(int argc, char **argv) } else if (strcmp("-mwindows", args.str[i]) == 0) { - is_gui_app = true; + subsystem = "windows"; raw_compiler_arg = 0; } else if (strcmp("-mconsole", args.str[i]) == 0) { - is_gui_app = false; + subsystem = "console"; raw_compiler_arg = 0; } else if (strcmp("-municode", args.str[i]) == 0) @@ -1856,6 +1846,7 @@ int main(int argc, char **argv) { is_shared = true; raw_compiler_arg = raw_linker_arg = 0; + if (!subsystem) subsystem = "console"; } else if (strcmp("-s", args.str[i]) == 0) {
From: Rémi Bernon rbernon@codeweavers.com
--- tools/winegcc/winegcc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 46a63453985..a42cfd7a617 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -598,7 +598,14 @@ static struct strarray get_link_args( const char *output_name )
if (entry_point) strarray_add( &flags, strmake( "-Wl,-entry:%s", entry_point ));
- if (subsystem) strarray_add( &flags, strmake( "-Wl,--subsystem:%s", subsystem ) ); + if (subsystem) + { + char *version = strchr( subsystem, ':' ); + if (version) subsystem = strmake( "%.*s,%s", (int)(version - subsystem), subsystem, version + 1 ); + + strarray_add( &flags, "-Xlinker" ); + strarray_add( &flags, strmake( "-subsystem:%s", subsystem ) ); + }
STRARRAY_FOR_EACH( file, &output_debug_files ) {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/comctl32/tests/Makefile.in | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/comctl32/tests/Makefile.in b/dlls/comctl32/tests/Makefile.in index ee7fe6527fe..9c17acd77d7 100644 --- a/dlls/comctl32/tests/Makefile.in +++ b/dlls/comctl32/tests/Makefile.in @@ -1,5 +1,6 @@ TESTDLL = comctl32.dll IMPORTS = ole32 user32 gdi32 advapi32 imm32 uxtheme oleacc oleaut32 +EXTRADLLFLAGS = -Wl,--subsystem,console:5.2
SOURCES = \ animate.c \
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dxgi/tests/Makefile.in | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/dxgi/tests/Makefile.in b/dlls/dxgi/tests/Makefile.in index 43c7a55a88c..add3803ca40 100644 --- a/dlls/dxgi/tests/Makefile.in +++ b/dlls/dxgi/tests/Makefile.in @@ -1,5 +1,6 @@ TESTDLL = dxgi.dll IMPORTS = d3d10_1 dxgi user32 +EXTRADLLFLAGS = -Wl,--subsystem,console:5.2
SOURCES = \ dxgi.c
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/quartz/tests/Makefile.in | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in index c3b96272fbf..1dd25efd19f 100644 --- a/dlls/quartz/tests/Makefile.in +++ b/dlls/quartz/tests/Makefile.in @@ -1,5 +1,6 @@ TESTDLL = quartz.dll IMPORTS = strmbase advapi32 d3d9 ddraw dsound msdmo msvfw32 ole32 oleaut32 user32 uuid winmm +EXTRADLLFLAGS = -Wl,--subsystem,console:5.2
SOURCES = \ acmwrapper.c \
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/user32/tests/Makefile.in | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/user32/tests/Makefile.in b/dlls/user32/tests/Makefile.in index bff53de7713..4bc7172bdb9 100644 --- a/dlls/user32/tests/Makefile.in +++ b/dlls/user32/tests/Makefile.in @@ -1,5 +1,6 @@ TESTDLL = user32.dll IMPORTS = user32 gdi32 advapi32 hid imm32 setupapi +EXTRADLLFLAGS = -Wl,--subsystem,console:5.2
testdll_IMPORTS = user32
From: Rémi Bernon rbernon@codeweavers.com
--- tools/winegcc/winegcc.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index a42cfd7a617..f473ec41f36 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -542,7 +542,14 @@ static struct strarray get_link_args( const char *output_name ) }
if (is_unicode_app) strarray_add( &flags, "-municode" ); - if (subsystem) strarray_add( &flags, strmake( "-Wl,--subsystem,%s", subsystem ) ); + + if (subsystem) + { + unsigned int default_minor = target.cpu == CPU_i386 || target.cpu == CPU_x86_64 ? 0 : 2; + if (!strchr( subsystem, ':' )) subsystem = strmake( "%s:6.%d", subsystem, default_minor ); + + strarray_add( &flags, strmake( "-Wl,--subsystem,%s", subsystem ) ); + }
strarray_add( &flags, "-Wl,--exclude-all-symbols" ); strarray_add( &flags, "-Wl,--nxcompat" ); @@ -600,8 +607,11 @@ static struct strarray get_link_args( const char *output_name )
if (subsystem) { - char *version = strchr( subsystem, ':' ); - if (version) subsystem = strmake( "%.*s,%s", (int)(version - subsystem), subsystem, version + 1 ); + unsigned int default_minor = target.cpu == CPU_i386 || target.cpu == CPU_x86_64 ? 0 : 2; + char *version; + + if (!(version = strchr( subsystem, ':' ))) subsystem = strmake( "%s,6.%d", subsystem, default_minor ); + else subsystem = strmake( "%.*s,%s", (int)(version - subsystem), subsystem, version + 1 );
strarray_add( &flags, "-Xlinker" ); strarray_add( &flags, strmake( "-subsystem:%s", subsystem ) ); @@ -1141,6 +1151,9 @@ static void build_spec_obj( const char *spec_file, const char *output_file,
if (subsystem) { + unsigned int default_minor = target.cpu == CPU_i386 || target.cpu == CPU_x86_64 ? 0 : 2; + if (!strchr( subsystem, ':' )) subsystem = strmake( "%s:6.%d", subsystem, default_minor ); + strarray_add( &spec_args, "--subsystem" ); strarray_add( &spec_args, subsystem ); }