重复构建项目时,如果翻译单元中有警告但没有错误,则通常不会重新编译主源文件。
这可能会导致难以处理错误和警告,以尝试在没有警告的情况下构建项目。通常,必须保持迭代构建,直到所有错误都得到处理,然后进行全面清理并构建以确保没有警告(以及确保以前完成的构建不会因为剩余的构建工件而导致“侥幸”。
有没有办法用CMake(或其他一些实用程序,如Bash脚本)来解析警告的构建输出,将它们保存在某个文本文件中,然后在后续构建中重新显示它们?
对于奖励积分,由于我为编译器输出着色,是否可以使用颜色控制字符保存警告并使用相同的颜色重新显示?
(如果重要的是,目前我只编译C ++,我通常使用GCC这样做。我选择的构建生成器是Ninja,我有一些Bash脚本我&#39写完了我把所有电话都包裹在CMake和Ninja中。)
答案 0 :(得分:5)
我不是bash
专家 - 因此以下代码肯定可以改进 - 但这是一个有CMake
/ bash
/ gcc
/ {的工作示例{1}}应该给出我的基本想法:
ninja
stderr
<强>的CMakeLists.txt 强>
<object file name>.warnings
<强> capture_warnings.sh.in 强>
cmake_minimum_required(VERSION 2.8)
project(CaptureWarnings CXX)
add_compile_options(-fdiagnostics-color=always -Wconversion)
configure_file(capture_warnings.sh.in ${CMAKE_BINARY_DIR}/capture_warnings.sh @ONLY)
file(WRITE foo.cc "int main() {\nreturn 0.5;\n}")
file(WRITE bar.cc "")
set_directory_properties(PROPERTIES
RULE_LAUNCH_COMPILE "bash ${CMAKE_BINARY_DIR}/capture_warnings.sh")
add_executable(MyExe foo.cc bar.cc)
<强> build.sh 强>
#!/bin/bash
# shell script invoked with the following arguments
# $(CXX) $(CXX_DEFINES) $(CXX_FLAGS) -MMD -MT OBJ_FILE -MF DEP_FILE -o OBJ_FILE -c SRC_FILE
# extract parameters
OBJECT_FILE="${@: -3:1}"
# invoke compiler
set -o pipefail
$@ 2> ${OBJECT_FILE}.warnings
ERROR=${PIPESTATUS}
OUT=$(<${OBJECT_FILE}.warnings)
if ! [[ -z "$OUT" ]]; then
# reprint the warning/error
>&2 echo "${OUT}"
echo "rm -f ${PWD}/${OBJECT_FILE}" >> @CMAKE_BINARY_DIR@/remove_obj_with_warnings.sh
else
rm -f ${OBJECT_FILE}.warnings
fi
exit ${ERROR}
我认为在#!/bin/bash
if ! [ -d build ]; then
mkdir build
cmake -H. -Bbuild -G "Ninja"
fi
if [ -f build/remove_obj_with_warnings.sh ]; then
sh ./build/remove_obj_with_warnings.sh
rm build/remove_obj_with_warnings.sh
fi
cmake --build build
中收集要删除的文件比在remove_obj_with_warnings.sh
文件中收集要快。缺点是它可能包含已被删除或尚未存在的文件(由给予.warnings
覆盖)。
如果您将rm -f
调用设为可选项,则尤其如此。
使用的参考文献: