diff options
-rw-r--r-- | Source/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Source/CPack/cpack.cxx | 33 | ||||
-rw-r--r-- | Source/cmConsoleBuf.cxx | 23 | ||||
-rw-r--r-- | Source/cmConsoleBuf.h | 23 | ||||
-rw-r--r-- | Source/cmakemain.cxx | 23 | ||||
-rw-r--r-- | Source/cmcmd.cxx | 24 | ||||
-rw-r--r-- | Source/cmcmd.h | 6 | ||||
-rw-r--r-- | Source/ctest.cxx | 23 | ||||
-rw-r--r-- | Tests/RunCMake/CommandLine/.gitattributes | 2 | ||||
-rw-r--r-- | Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj | bin | 0 -> 124 bytes | |||
-rw-r--r-- | Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt | bin | 0 -> 248 bytes | |||
-rw-r--r-- | Tests/RunCMake/CommandLine/RunCMakeTest.cmake | 3 | ||||
-rwxr-xr-x | bootstrap | 1 |
13 files changed, 109 insertions, 54 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 1e16e17..1194318 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -197,6 +197,8 @@ set(SRCS cmComputeLinkInformation.h cmComputeTargetDepends.h cmComputeTargetDepends.cxx + cmConsoleBuf.h + cmConsoleBuf.cxx cmCPackPropertiesGenerator.h cmCPackPropertiesGenerator.cxx cmCryptoHash.cxx diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx index 6c80753..85c13ad 100644 --- a/Source/CPack/cpack.cxx +++ b/Source/CPack/cpack.cxx @@ -1,12 +1,22 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ +#include <cstddef> +#include <iostream> +#include <map> +#include <memory> +#include <sstream> +#include <string> +#include <utility> +#include <vector> + #include "cmsys/CommandLineArguments.hxx" #include "cmsys/Encoding.hxx" #include "cmCPackGenerator.h" #include "cmCPackGeneratorFactory.h" #include "cmCPackLog.h" +#include "cmConsoleBuf.h" #include "cmDocumentation.h" #include "cmDocumentationEntry.h" #include "cmDocumentationFormatter.h" @@ -19,19 +29,6 @@ #include "cmSystemTools.h" #include "cmake.h" -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) -# include "cmsys/ConsoleBuf.hxx" -#endif - -#include <cstddef> -#include <iostream> -#include <map> -#include <memory> -#include <sstream> -#include <string> -#include <utility> -#include <vector> - namespace { const char* cmDocumentationName[][2] = { { nullptr, " cpack - Packaging driver provided by CMake." }, @@ -104,13 +101,11 @@ void cpackProgressCallback(const std::string& message, float /*unused*/) int main(int argc, char const* const* argv) { cmSystemTools::EnsureStdPipes(); -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + // Replace streambuf so we can output Unicode to console - cmsys::ConsoleBuf::Manager consoleOut(std::cout); - consoleOut.SetUTF8Pipes(); - cmsys::ConsoleBuf::Manager consoleErr(std::cerr, true); - consoleErr.SetUTF8Pipes(); -#endif + cmConsoleBuf consoleBuf; + consoleBuf.SetUTF8Pipes(); + cmsys::Encoding::CommandLineArguments args = cmsys::Encoding::CommandLineArguments::Main(argc, argv); argc = args.argc(); diff --git a/Source/cmConsoleBuf.cxx b/Source/cmConsoleBuf.cxx new file mode 100644 index 0000000..70be481 --- /dev/null +++ b/Source/cmConsoleBuf.cxx @@ -0,0 +1,23 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#include "cmConsoleBuf.h" + +#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) +cmConsoleBuf::cmConsoleBuf() + : m_ConsoleOut(std::cout) + , m_ConsoleErr(std::cerr, true) +{ +} +#else +cmConsoleBuf::cmConsoleBuf() = default; +#endif + +cmConsoleBuf::~cmConsoleBuf() = default; + +void cmConsoleBuf::SetUTF8Pipes() +{ +#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + m_ConsoleOut.SetUTF8Pipes(); + m_ConsoleErr.SetUTF8Pipes(); +#endif +} diff --git a/Source/cmConsoleBuf.h b/Source/cmConsoleBuf.h new file mode 100644 index 0000000..3564598 --- /dev/null +++ b/Source/cmConsoleBuf.h @@ -0,0 +1,23 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#pragma once + +#include "cmConfigure.h" // IWYU pragma: keep + +#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) +# include "cmsys/ConsoleBuf.hxx" +#endif + +class cmConsoleBuf +{ +#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + cmsys::ConsoleBuf::Manager m_ConsoleOut; + cmsys::ConsoleBuf::Manager m_ConsoleErr; +#endif +public: + cmConsoleBuf(); + ~cmConsoleBuf(); + cmConsoleBuf(cmConsoleBuf const&) = delete; + cmConsoleBuf& operator=(cmConsoleBuf const&) = delete; + void SetUTF8Pipes(); +}; diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx index c769227..f570337 100644 --- a/Source/cmakemain.cxx +++ b/Source/cmakemain.cxx @@ -11,12 +11,15 @@ #include <iostream> #include <sstream> #include <string> +#include <utility> #include <vector> +#include <cm/memory> #include <cmext/algorithm> #include <cm3p/uv.h> +#include "cmConsoleBuf.h" #include "cmDocumentationEntry.h" // IWYU pragma: keep #include "cmGlobalGenerator.h" #include "cmMakefile.h" @@ -34,9 +37,6 @@ #endif #include "cmsys/Encoding.hxx" -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) -# include "cmsys/ConsoleBuf.hxx" -#endif namespace { #ifndef CMAKE_BOOTSTRAP @@ -111,13 +111,14 @@ const char* cmDocumentationOptions[][2] = { #endif -int do_command(int ac, char const* const* av) +int do_command(int ac, char const* const* av, + std::unique_ptr<cmConsoleBuf> consoleBuf) { std::vector<std::string> args; args.reserve(ac - 1); args.emplace_back(av[0]); cm::append(args, av + 2, av + ac); - return cmcmd::ExecuteCMakeCommand(args); + return cmcmd::ExecuteCMakeCommand(args, std::move(consoleBuf)); } cmMakefile* cmakemainGetMakefile(cmake* cm) @@ -830,13 +831,11 @@ int do_open(int ac, char const* const* av) int main(int ac, char const* const* av) { cmSystemTools::EnsureStdPipes(); -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + // Replace streambuf so we can output Unicode to console - cmsys::ConsoleBuf::Manager consoleOut(std::cout); - consoleOut.SetUTF8Pipes(); - cmsys::ConsoleBuf::Manager consoleErr(std::cerr, true); - consoleErr.SetUTF8Pipes(); -#endif + auto consoleBuf = cm::make_unique<cmConsoleBuf>(); + consoleBuf->SetUTF8Pipes(); + cmsys::Encoding::CommandLineArguments args = cmsys::Encoding::CommandLineArguments::Main(ac, av); ac = args.argc(); @@ -855,7 +854,7 @@ int main(int ac, char const* const* av) return do_open(ac, av); } if (strcmp(av[1], "-E") == 0) { - return do_command(ac, av); + return do_command(ac, av, std::move(consoleBuf)); } } int ret = do_cmake(ac, av); diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx index 15d2fd1..e2ff8b7 100644 --- a/Source/cmcmd.cxx +++ b/Source/cmcmd.cxx @@ -7,6 +7,7 @@ #include <cm3p/uv.h> #include <fcntl.h> +#include "cmConsoleBuf.h" #include "cmDuration.h" #include "cmGlobalGenerator.h" #include "cmLocalGenerator.h" @@ -33,10 +34,6 @@ # include "bindexplib.h" #endif -#if !defined(CMAKE_BOOTSTRAP) && defined(_WIN32) -# include "cmsys/ConsoleBuf.hxx" -#endif - #if !defined(CMAKE_BOOTSTRAP) && defined(_WIN32) && !defined(__CYGWIN__) # include "cmVisualStudioWCEPlatformParser.h" #endif @@ -51,6 +48,12 @@ #include <sstream> #include <utility> +#ifdef _WIN32 +# include <fcntl.h> // for _O_BINARY +# include <io.h> // for _setmode +# include <stdio.h> // for std{out,err} and fileno +#endif + #include <cm/string_view> #include "cmsys/Directory.hxx" @@ -182,6 +185,9 @@ static bool cmTarFilesFrom(std::string const& file, static void cmCatFile(const std::string& fileToAppend) { +#ifdef _WIN32 + _setmode(fileno(stdout), _O_BINARY); +#endif cmsys::ifstream source(fileToAppend.c_str(), (std::ios::binary | std::ios::in)); std::cout << source.rdbuf(); @@ -501,7 +507,8 @@ int cmcmd::HandleCoCompileCommands(std::vector<std::string> const& args) return ret; } -int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args) +int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args, + std::unique_ptr<cmConsoleBuf> consoleBuf) { // IF YOU ADD A NEW COMMAND, DOCUMENT IT ABOVE and in cmakemain.cxx if (args.size() > 1) { @@ -951,6 +958,8 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args) cmSystemTools::Error(arg + ": no such file or directory (ignoring)"); return_value = 1; } else { + // Destroy console buffers to drop cout/cerr encoding transform. + consoleBuf.reset(); cmCatFile(arg); } } @@ -1889,14 +1898,11 @@ private: // still works. int cmcmd::VisualStudioLink(std::vector<std::string> const& args, int type) { -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) // Replace streambuf so we output in the system codepage. CMake is set up // to output in Unicode (see SetUTF8Pipes) but the Visual Studio linker // outputs using the system codepage so we need to change behavior when // we run the link command. - cmsys::ConsoleBuf::Manager consoleOut(std::cout); - cmsys::ConsoleBuf::Manager consoleErr(std::cerr, true); -#endif + cmConsoleBuf consoleBuf; if (args.size() < 2) { return -1; diff --git a/Source/cmcmd.h b/Source/cmcmd.h index 605df23..a2e0b1e 100644 --- a/Source/cmcmd.h +++ b/Source/cmcmd.h @@ -4,11 +4,14 @@ #include "cmConfigure.h" // IWYU pragma: keep +#include <memory> #include <string> #include <vector> #include "cmCryptoHash.h" +class cmConsoleBuf; + class cmcmd { public: @@ -16,7 +19,8 @@ public: * Execute commands during the build process. Supports options such * as echo, remove file etc. */ - static int ExecuteCMakeCommand(std::vector<std::string> const&); + static int ExecuteCMakeCommand(std::vector<std::string> const&, + std::unique_ptr<cmConsoleBuf> consoleBuf); protected: static int HandleCoCompileCommands(std::vector<std::string> const& args); diff --git a/Source/ctest.cxx b/Source/ctest.cxx index 3b5bf8c..d0bc061 100644 --- a/Source/ctest.cxx +++ b/Source/ctest.cxx @@ -1,21 +1,20 @@ /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ +#include <cstring> +#include <iostream> +#include <string> +#include <vector> + #include "cmsys/Encoding.hxx" #include "cmCTest.h" +#include "cmConsoleBuf.h" #include "cmDocumentation.h" #include "cmSystemTools.h" #include "CTest/cmCTestLaunch.h" #include "CTest/cmCTestScriptHandler.h" -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) -# include "cmsys/ConsoleBuf.hxx" -#endif -#include <cstring> -#include <iostream> -#include <string> -#include <vector> static const char* cmDocumentationName[][2] = { { nullptr, " ctest - Testing driver provided by CMake." }, @@ -154,13 +153,11 @@ static const char* cmDocumentationOptions[][2] = { int main(int argc, char const* const* argv) { cmSystemTools::EnsureStdPipes(); -#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP) + // Replace streambuf so we can output Unicode to console - cmsys::ConsoleBuf::Manager consoleOut(std::cout); - consoleOut.SetUTF8Pipes(); - cmsys::ConsoleBuf::Manager consoleErr(std::cerr, true); - consoleErr.SetUTF8Pipes(); -#endif + cmConsoleBuf consoleBuf; + consoleBuf.SetUTF8Pipes(); + cmsys::Encoding::CommandLineArguments encoding_args = cmsys::Encoding::CommandLineArguments::Main(argc, argv); argc = encoding_args.argc(); diff --git a/Tests/RunCMake/CommandLine/.gitattributes b/Tests/RunCMake/CommandLine/.gitattributes new file mode 100644 index 0000000..b0b0588 --- /dev/null +++ b/Tests/RunCMake/CommandLine/.gitattributes @@ -0,0 +1,2 @@ +E_cat_binary_files/binary.obj -text +E_cat_good_binary_cat-stdout.txt -text -whitespace diff --git a/Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj b/Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj Binary files differnew file mode 100644 index 0000000..73f1749 --- /dev/null +++ b/Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj diff --git a/Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt b/Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt Binary files differnew file mode 100644 index 0000000..0951d85 --- /dev/null +++ b/Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt diff --git a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake index 2a5d5d3..b23c8c2 100644 --- a/Tests/RunCMake/CommandLine/RunCMakeTest.cmake +++ b/Tests/RunCMake/CommandLine/RunCMakeTest.cmake @@ -563,6 +563,9 @@ run_cmake_command(E_cat_good_cat ${CMAKE_COMMAND} -E cat "${out}/first_file.txt" "${out}/second_file.txt" "${out}/unicode_file.txt") unset(out) +run_cmake_command(E_cat_good_binary_cat + ${CMAKE_COMMAND} -E cat "${RunCMake_SOURCE_DIR}/E_cat_binary_files/binary.obj" "${RunCMake_SOURCE_DIR}/E_cat_binary_files/binary.obj") + run_cmake_command(E_env-no-command0 ${CMAKE_COMMAND} -E env) run_cmake_command(E_env-no-command1 ${CMAKE_COMMAND} -E env TEST_ENV=1) run_cmake_command(E_env-bad-arg1 ${CMAKE_COMMAND} -E env -bad-arg1) @@ -302,6 +302,7 @@ CMAKE_CXX_SOURCES="\ cmComputeLinkDepends \ cmComputeLinkInformation \ cmComputeTargetDepends \ + cmConsoleBuf \ cmConditionEvaluator \ cmConfigureFileCommand \ cmContinueCommand \ |