From 8195aa30269773732902029741fb8adfe13aa83d Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 8 Jun 2023 00:02:13 -0400 Subject: Makefiles: quote `$(COLOR)` expansions This handles the case where `COLOR` is set to some ANSI-like color sequence in the ambient environment. These sequences tend to include `;` which terminates the command and tries to use the next component (typically an integer, possibly with a trailing `m`) with errors like: /bin/sh: line 1: 2: command not found /bin/sh: line 1: 255: command not found /bin/sh: line 1: 221: command not found /bin/sh: line 1: 255m: command not found Also add a test that sets `COLOR` in the environment which affects the generated Makefiles behavior. See: https://discourse.cmake.org/t/cmake-failing-gcc-compiler-checks/8277 --- Source/cmLocalUnixMakefileGenerator3.cxx | 2 +- Source/cmMakefileTargetGenerator.cxx | 2 +- Tests/RunCMake/Color/DiagColorInEnv.cmake | 9 +++++++++ Tests/RunCMake/Color/RunCMakeTest.cmake | 6 ++++++ 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 Tests/RunCMake/Color/DiagColorInEnv.cmake diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index 43711b3..3c6b303 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -1222,7 +1222,7 @@ void cmLocalUnixMakefileGenerator3::AppendEcho( } else { // Use cmake to echo the text in color. cmd = cmStrCat( - "@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) ", + "@$(CMAKE_COMMAND) -E cmake_echo_color \"--switch=$(COLOR)\" ", color_name); if (progress) { cmd += "--progress-dir="; diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index 8099d44..5f27856 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -1525,7 +1525,7 @@ void cmMakefileTargetGenerator::WriteTargetDependRules() cmSystemTools::CollapseFullPath(this->InfoFileNameFull), cmOutputConverter::SHELL); if (this->LocalGenerator->GetColorMakefile()) { - depCmd << " --color=$(COLOR)"; + depCmd << " \"--color=$(COLOR)\""; } commands.push_back(depCmd.str()); diff --git a/Tests/RunCMake/Color/DiagColorInEnv.cmake b/Tests/RunCMake/Color/DiagColorInEnv.cmake new file mode 100644 index 0000000..83c45e5 --- /dev/null +++ b/Tests/RunCMake/Color/DiagColorInEnv.cmake @@ -0,0 +1,9 @@ +if (CMAKE_GENERATOR MATCHES "Makefiles") + set(CMAKE_COLOR_DIAGNOSTICS 1) + set(EXPECT_COLOR 1) +endif () +include(DiagCommon.cmake) + +if(CMAKE_GENERATOR MATCHES "Makefiles" AND NOT DEFINED CMAKE_COLOR_MAKEFILE) + message(FATAL_ERROR "CMAKE_COLOR_MAKEFILE incorrectly undefined.") +endif() diff --git a/Tests/RunCMake/Color/RunCMakeTest.cmake b/Tests/RunCMake/Color/RunCMakeTest.cmake index bb62d4c..d2bc45a 100644 --- a/Tests/RunCMake/Color/RunCMakeTest.cmake +++ b/Tests/RunCMake/Color/RunCMakeTest.cmake @@ -12,3 +12,9 @@ endfunction() run_Diag(On -DCMAKE_COLOR_DIAGNOSTICS=ON) run_Diag(Off -DCMAKE_COLOR_DIAGNOSTICS=OFF) run_Diag(Default) + +# Test with `COLOR` in the ambient environment set to an ANSI-like color +# sequence. `$(COLOR)` is used in the Makefiles generator to control whether or +# not to do such color sequences itself. +set(ENV{COLOR} "[38;2;255;221;255m") +run_Diag(ColorInEnv) -- cgit v0.12