CMake 我可以通过另一个程序过滤编译器输出

spr*_*aff 3 cmake

我可以告诉 CMake 通过外部程序通过管道传输来自编译器和/或链接器的所有 stderr 输出,并在终端上显示其输出吗?

sak*_*kra 5

对于 Makefile 生成器,您可以通过为编译规则设置自定义启动器来将过滤器应用于编译器输出。以下 CMake 列表文件概述了必要的步骤:

cmake_minimum_required(VERSION 2.8)

project (Main)

configure_file(
    "${PROJECT_SOURCE_DIR}/gcc_filter.sh.in"
    "${PROJECT_BINARY_DIR}/gcc_filter.sh"
    @ONLY)

add_executable (Main Main.cpp)

set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${PROJECT_BINARY_DIR}/gcc_filter.sh")
Run Code Online (Sandbox Code Playgroud)

在项目根目录中添加以下shell脚本模板文件gcc_filter.sh.in

#!/bin/sh

# shell script invoked with the following arguments
# $(CXX) $(CXX_DEFINES) $(CXX_FLAGS) -o OBJECT_FILE -c SOURCE_FILE

# invoke compiler
exec "$@" 2>&1 | "@PROJECT_SOURCE_DIR@/myfilter.sh"
Run Code Online (Sandbox Code Playgroud)

自定义启动器规则调用的实际 shell 脚本首先通过configure_fileCMake 列表文件中的调用复制到项目二进制目录。gcc_filter.sh.in必须设置文件的可执行位。shell 脚本将所有参数转发给编译器,然后将编译器输出通过管道传输到myfilter.sh项目根目录中的另一个 shell 脚本:

#!/bin/sh
exec wc
Run Code Online (Sandbox Code Playgroud)

该示例myfilter.sh只是调用wc,但使用上面的方法可以轻松完成更复杂的输出过滤。