简体   繁体   中英

Treat warnings as errors but ignore warnings in googletest

I have a C++ project where I want to use the -Wsign-conversion compile option. As build tool Bazel 0.28.1 is used. My self-written code does not generate warning of that type. The project uses Googletest. Unfortunately, Googletest generates this kind of warning, which breaks my build. Here are my files:

.bazelrc

build --cxxopt=-Werror           # Every warning is treated as an error.
build --cxxopt=-std=c++14
build --cxxopt=-Wsign-conversion # Warn for implicit conversions that may change the sign of an integer value

gtest.BUILD

cc_library(
    name = "main",
    srcs = glob(
        ["src/*.cc"],
        exclude = ["src/gtest-all.cc"]
    ),
    hdrs = glob([
        "include/**/*.h",
        "src/*.h"
    ]),
    copts = ["-Iexternal/gtest/include"],
    linkopts = ["-pthread"],
    visibility = ["//visibility:public"],
)

WORKSPACE

workspace(name = "GTestDemo")

load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

git_repository(
    name = "googletest",
    remote = "https://github.com/google/googletest",
    #tag = "release-1.8.1",
    commit = "2fe3bd994b3189899d93f1d5a881e725e046fdc2", 
    shallow_since = "1535728917 -0400",
)

BUILD

cc_test(
    name = "tests",
    srcs = ["test.cpp"],
    copts = ["-Iexternal/gtest/include"],
    deps = [
            "@googletest//:gtest_main",
        ],
)

test.cpp

#include <iostream>

#include "gtest/gtest.h"

TEST(sample_test_case, sample_test)
{
    EXPECT_EQ(1, 1);
}

When I try to build the code the following error is shown:

Starting local Bazel server and connecting to it...
INFO: Analyzed target //:tests (21 packages loaded, 540 targets configured).
INFO: Found 1 target...
INFO: Deleting stale sandbox base /mnt/ramdisk/bazel-sandbox.be60b2910864108c1e29c6fce8ad6ea4
ERROR: /home/admin/.cache/bazel/_bazel_admin/cc9b56275ffa85d1a0fca263d1d708e4/external/googletest/BUILD.bazel:55:1: C++ compilation of rule '@googletest//:gtest' failed (Exit 1) gcc failed: error executing command /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer '-std=c++0x' -MD -MF ... (remaining 36 argument(s) skipped)

Use --sandbox_debug to see verbose messages from the sandbox
external/googletest/googletest/src/gtest-filepath.cc: In member function 'testing::internal::FilePath testing::internal::FilePath::RemoveFileName() const':
external/googletest/googletest/src/gtest-filepath.cc:168:45: error: conversion to 'std::__cxx11::basic_string<char>::size_type {aka long unsigned int}' from 'long int' may change the sign of the result [-Werror=sign-conversion]
     dir = std::string(c_str(), last_sep + 1 - c_str());
                                ~~~~~~~~~~~~~^~~~~~~~~
cc1plus: all warnings being treated as errors
Target //:tests failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 7.225s, Critical Path: 0.66s
INFO: 0 processes.
FAILED: Build did NOT complete successfully

Is there a possibility in Bazel to ignore warnings in 3rd-party-library such as googletest?

This is more of a GCC question.

"System headers" are immune from this kind of thing :

-Wsystem-headers : Print warning messages for constructs found in system header files. Warnings from system headers are normally suppressed , on the assumption that they usually do not indicate real problems and would only make the compiler output harder to read.

So, you can just pretend that the 3rd-party lib is a system header, using GCC's -isystem flag (instead of -I ):

copts = ["-isystem external/gtest/include"],

Bazel's --per_file_copt allows setting flags for all files except ones matching some regular expression. Something more like this in your .bazelrc should do what you're looking for:

# Warn for implicit conversions that may change the sign of an integer value,
# for C++ files not in googletest
build --per_file_copt=.*\.(cc|cpp),-googletest/.*@-Wsign-conversion

You'll need to update that to match any extensions you use for C++ files other than .cc and .cpp. The documentation for cc_library.srcs lists all the extensions Bazel uses, for reference.

I couldn't figure out how to match @googletest// in the flag, because I don't see a way to escape an @ there... However, I'm pretty sure it's matching against @googletest and not external/googletest or something, because /googletest doesn't match anything. Probably won't matter, but it is something to keep in mind if you have any other filenames with googletest in them.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM