## -*- mode: perl; -*- # Windows HybridCRT targets. # # https://github.com/microsoft/WindowsAppSDK/blob/77761e244289fda6b3d5f14c7bded189fed4fb89/docs/Coding-Guidelines/HybridCRT.md # Link statically against the runtime and STL, but link dynamically against the CRT by ignoring the static CRT # lib and instead linking against the Universal CRT DLL import library. This "Hybrid" linking mechanism is # supported according to the CRT maintainer. Dynamic linking against the CRT makes the binaries a bit smaller # than they would otherwise be if the CRT, runtime, and STL were all statically linked in. sub remove_from_flags { my ($toRemove, $flags) = @_; return $flags =~ s/$toRemove//r; } my %targets = ( "VC-WIN32-HYBRIDCRT" => { inherit_from => [ "VC-WIN32" ], cflags => sub { remove_from_flags(qr/\/MDd?\s/, add(picker(debug => "/MTd", release => "/MT"))->(@_)) }, lflags => add(picker(debug => "/NODEFAULTLIB:libucrtd.lib /DEFAULTLIB:ucrtd.lib", release => "/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib")), }, "VC-WIN64A-HYBRIDCRT" => { inherit_from => [ "VC-WIN64A" ], cflags => sub { remove_from_flags(qr/\/MDd?\s/, add(picker(debug => "/MTd", release => "/MT"))->(@_)) }, lflags => add(picker(debug => "/NODEFAULTLIB:libucrtd.lib /DEFAULTLIB:ucrtd.lib", release => "/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib")), }, );