From 871adefce97246ec42a157f62e39855b434c523d Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 13 Jun 2017 16:08:12 -0400 Subject: cmake: Fix default file translate mode when using libuv On Windows, libuv's one-time initialization changes the C runtime library's `_fmode` setting to `_O_BINARY`, thus causing files to open as binary after that instead of the default `_O_TEXT` mode. See upstream libuv issue 840. Work around the problem by performing libuv initialization early and then restoring `_fmode`. In particular, this currently affects server mode. Without this fix, the `_fmode` setting changes when the server mode initializes libuv. Fixes: #16962 --- Source/cmakemain.cxx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx index 6e65955..c5a6836 100644 --- a/Source/cmakemain.cxx +++ b/Source/cmakemain.cxx @@ -27,6 +27,10 @@ #include #ifdef CMAKE_USE_LIBUV +#ifdef _WIN32 +#include /* _O_TEXT */ +#include /* _set_fmode, _fmode */ +#endif #include "cm_uv.h" #endif @@ -168,6 +172,18 @@ int main(int ac, char const* const* av) ac = args.argc(); av = args.argv(); +#if defined(CMAKE_USE_LIBUV) && defined(_WIN32) + // Perform libuv one-time initialization now, and then un-do its + // global _fmode setting so that using libuv does not change the + // default file text/binary mode. See libuv issue 840. + uv_loop_close(uv_default_loop()); +#ifdef _MSC_VER + _set_fmode(_O_TEXT); +#else + _fmode = _O_TEXT; +#endif +#endif + cmSystemTools::EnableMSVCDebugHook(); cmSystemTools::FindCMakeResources(av[0]); if (ac > 1) { -- cgit v0.12