mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-08 14:50:10 -06:00
Merge branch 'cmake-E-cat-binary' into release-3.18
Merge-request: !5364
This commit is contained in:
@@ -193,6 +193,8 @@ set(SRCS
|
||||
cmComputeLinkInformation.h
|
||||
cmComputeTargetDepends.h
|
||||
cmComputeTargetDepends.cxx
|
||||
cmConsoleBuf.h
|
||||
cmConsoleBuf.cxx
|
||||
cmCPackPropertiesGenerator.h
|
||||
cmCPackPropertiesGenerator.cxx
|
||||
cmCryptoHash.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"
|
||||
@@ -18,19 +28,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." },
|
||||
@@ -103,13 +100,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();
|
||||
|
||||
23
Source/cmConsoleBuf.cxx
Normal file
23
Source/cmConsoleBuf.cxx
Normal file
@@ -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
|
||||
}
|
||||
23
Source/cmConsoleBuf.h
Normal file
23
Source/cmConsoleBuf.h
Normal file
@@ -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();
|
||||
};
|
||||
@@ -9,12 +9,15 @@
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#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"
|
||||
@@ -32,9 +35,6 @@
|
||||
#endif
|
||||
|
||||
#include "cmsys/Encoding.hxx"
|
||||
#if defined(_WIN32) && !defined(CMAKE_BOOTSTRAP)
|
||||
# include "cmsys/ConsoleBuf.hxx"
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
#ifndef CMAKE_BOOTSTRAP
|
||||
@@ -109,13 +109,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)
|
||||
@@ -687,13 +688,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();
|
||||
@@ -712,7 +711,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);
|
||||
|
||||
@@ -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"
|
||||
@@ -181,6 +184,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();
|
||||
@@ -500,7 +506,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) {
|
||||
@@ -954,6 +961,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);
|
||||
}
|
||||
}
|
||||
@@ -1863,14 +1872,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;
|
||||
|
||||
@@ -5,11 +5,14 @@
|
||||
|
||||
#include "cmConfigure.h" // IWYU pragma: keep
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "cmCryptoHash.h"
|
||||
|
||||
class cmConsoleBuf;
|
||||
|
||||
class cmcmd
|
||||
{
|
||||
public:
|
||||
@@ -17,7 +20,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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
2
Tests/RunCMake/CommandLine/.gitattributes
vendored
Normal file
2
Tests/RunCMake/CommandLine/.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
E_cat_binary_files/binary.obj -text
|
||||
E_cat_good_binary_cat-stdout.txt -text -whitespace
|
||||
BIN
Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj
Normal file
BIN
Tests/RunCMake/CommandLine/E_cat_binary_files/binary.obj
Normal file
Binary file not shown.
BIN
Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt
Normal file
BIN
Tests/RunCMake/CommandLine/E_cat_good_binary_cat-stdout.txt
Normal file
Binary file not shown.
@@ -498,6 +498,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)
|
||||
|
||||
Reference in New Issue
Block a user