Make use of CMake gccfilter
GCCFilter is a neat perl script that allows you to colorize GCC output and thus makes debugging much more fun and, more importantly, faster.
You can use GCCFilter with CMake generated Makefile by calling
gccfilter -a -c make
However, this approach has some drawbacks: delayed output of CMake status information, lack of color in CMake commands is most obvious.
The question is: is there a way to write some CMake module that looks gccfilter
if the compiler is equal gcc
, checks if it is installed, for example COLOR_CXX
(quite easily) and then tells CMake to replace all calls gcc
with gccfilter -a -c gcc
.
CMake offers a variable CMAKE_CXX_COMPILER
, but changing that setting will prevent CMake from finding the correct include paths, etc. Is there some variable that we can change after the command project()
, which is prefixed before each call gcc
?
source to share
You can use CMake by setting the RULE_LAUNCH_COMPILEgccfilter
property to a shell script that calls with the options you want.gccfilter
Create an executable shell script named gccfilter_wrap
in the furthest CMake project directory with the following content:
#!/bin/sh
exec gccfilter -a -c "$@"
Make sure to set the executable bit of the file. Then in CMakeLists.txt
set the directory property RULE_LAUNCH_COMPILE
before adding targets:
project (HelloWorld)
set_directory_properties(PROPERTIES RULE_LAUNCH_COMPILE
"${PROJECT_SOURCE_DIR}/gccfilter_wrap")
add_executable(HelloWorld HelloWorld.cpp)
The generated makefile rules are then prefixed with each call to the compiler with a gccfilter_wrap
script. Alternatively, the property RULE_LAUNCH_COMPILE
can also be set as a target property or a global property.
This property RULE_LAUNCH_COMPILE
only works for Makefile-based CMake generators.
Edit Thilo
This is how I finally solved the problem - basically a paraphrased version of that solution:
# GCCFilter, if appliciable
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCPP)
option(COLOR_GCC "Use GCCFilter to color compiler output messages" ON)
set(COLOR_GCC_OPTIONS "-c -r -w" CACHE STRING "Arguments that are passed to gccfilter when output coloring is switchend on. Defaults to -c -r -w.")
if(COLOR_GCC)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${PROJECT_SOURCE_DIR}/cmake/gccfilter ${COLOR_GCC_OPTIONS}")
endif()
endif()
source to share