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.