wrappers: For UWP, pass the default -lwindowsapp after user specified options

This matches how the compiler driver normally includes default
linked libraries; the user provided -l flags are passed first,
followed by the compiler's default ones. That allows a user
specified library to override the default ones.

This makes sure that if a user provides -lwindowsappcompat, it
gets linked before -lwindowsapp, which makes a difference for
symbols that are provided in both (such as e.g. LoadLibraryW).
This commit is contained in:
Martin Storsjö committed 2022-10-01 13:28:02 +03:00
1 parent e76e935c7d
commit 56fec2622f
2 files changed
+25 -9

No files matched your search

+14 -6
View File
@@ -50,7 +50,7 @@ int _tmain(int argc, TCHAR* argv[]) {
} }
} }
int max_arg = argc + 20; int max_arg = argc + 22;
const TCHAR **exec_argv = malloc((max_arg + 1) * sizeof(*exec_argv)); const TCHAR **exec_argv = malloc((max_arg + 1) * sizeof(*exec_argv));
int arg = 0; int arg = 0;
if (getenv("CCACHE")) if (getenv("CCACHE"))
@@ -84,11 +84,6 @@ int _tmain(int argc, TCHAR* argv[]) {
exec_argv[arg++] = _T("-DWINAPI_FAMILY=WINAPI_FAMILY_APP"); exec_argv[arg++] = _T("-DWINAPI_FAMILY=WINAPI_FAMILY_APP");
// the Windows Store API only supports Windows Unicode (some rare ANSI ones are available) // the Windows Store API only supports Windows Unicode (some rare ANSI ones are available)
exec_argv[arg++] = _T("-DUNICODE"); exec_argv[arg++] = _T("-DUNICODE");
// add the minimum runtime to use for UWP targets
exec_argv[arg++] = _T("-Wl,-lwindowsapp");
// This still requires that the toolchain (in particular, libc++.a) has
// been built targeting UCRT originally.
exec_argv[arg++] = _T("-Wl,-lucrtapp");
// force the user of Universal C Runtime // force the user of Universal C Runtime
exec_argv[arg++] = _T("-D_UCRT"); exec_argv[arg++] = _T("-D_UCRT");
} }
@@ -104,6 +99,19 @@ int _tmain(int argc, TCHAR* argv[]) {
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++)
exec_argv[arg++] = argv[i]; exec_argv[arg++] = argv[i];
if (target_os && !_tcscmp(target_os, _T("mingw32uwp"))) {
// Default linker flags; passed after any user specified -l options,
// to let the user specified libraries take precedence over these.
exec_argv[arg++] = _T("--start-no-unused-arguments");
// add the minimum runtime to use for UWP targets
exec_argv[arg++] = _T("-Wl,-lwindowsapp");
// This still requires that the toolchain (in particular, libc++.a) has
// been built targeting UCRT originally.
exec_argv[arg++] = _T("-Wl,-lucrtapp");
exec_argv[arg++] = _T("--end-no-unused-arguments");
}
exec_argv[arg] = NULL; exec_argv[arg] = NULL;
if (arg >= max_arg) { if (arg >= max_arg) {
fprintf(stderr, "Too many options added\n"); fprintf(stderr, "Too many options added\n");
+11 -3
View File
@@ -71,6 +71,7 @@ aarch64)
# SEH is the default for aarch64. # SEH is the default for aarch64.
;; ;;
esac esac
LINKER_FLAGS=""
case $TARGET_OS in case $TARGET_OS in
mingw32uwp) mingw32uwp)
# the UWP target is for Windows 10 # the UWP target is for Windows 10
@@ -79,11 +80,18 @@ mingw32uwp)
FLAGS="$FLAGS -DWINAPI_FAMILY=WINAPI_FAMILY_APP" FLAGS="$FLAGS -DWINAPI_FAMILY=WINAPI_FAMILY_APP"
# the Windows Store API only supports Windows Unicode (some rare ANSI ones are available) # the Windows Store API only supports Windows Unicode (some rare ANSI ones are available)
FLAGS="$FLAGS -DUNICODE" FLAGS="$FLAGS -DUNICODE"
# Default linker flags; passed after any user specified -l options,
# to let the user specified libraries take precedence over these.
# add the minimum runtime to use for UWP targets # add the minimum runtime to use for UWP targets
FLAGS="$FLAGS -Wl,-lwindowsapp" LINKER_FLAGS="$LINKER_FLAGS --start-no-unused-arguments"
LINKER_FLAGS="$LINKER_FLAGS -Wl,-lwindowsapp"
# This still requires that the toolchain (in particular, libc++.a) has # This still requires that the toolchain (in particular, libc++.a) has
# been built targeting UCRT originally. # been built targeting UCRT originally.
FLAGS="$FLAGS -Wl,-lucrtapp" LINKER_FLAGS="$LINKER_FLAGS -Wl,-lucrtapp"
LINKER_FLAGS="$LINKER_FLAGS --end-no-unused-arguments"
# Force the Universal C Runtime # Force the Universal C Runtime
FLAGS="$FLAGS -D_UCRT" FLAGS="$FLAGS -D_UCRT"
;; ;;
@@ -96,4 +104,4 @@ FLAGS="$FLAGS -stdlib=libc++"
FLAGS="$FLAGS -fuse-ld=lld" FLAGS="$FLAGS -fuse-ld=lld"
FLAGS="$FLAGS --end-no-unused-arguments" FLAGS="$FLAGS --end-no-unused-arguments"
$CCACHE "$CLANG" $FLAGS "$@" $CCACHE "$CLANG" $FLAGS "$@" $LINKER_FLAGS