Рассматривайте предупреждения как ошибки, но игнорируйте предупреждения в googletest - PullRequest
2 голосов
/ 03 июня 2019

У меня есть проект C ++, в котором я хочу использовать опцию компиляции -Wsign-conversion. В качестве инструмента сборки используется Bazel 0.26.0. Мой самостоятельно написанный код не генерирует предупреждение такого типа. В проекте используется Googletest. К сожалению, Googletest выдает такое предупреждение, которое нарушает мою сборку. Вот мои файлы:

.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);
}

Когда я пытаюсь построить код, появляется следующая ошибка:

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

Есть ли в Bazel возможность игнорировать предупреждения в сторонней библиотеке, такой как googletest?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Это больше вопрос GCC.

«Системные заголовки» неуязвимы для такого рода вещей :

-Wsystem-headers: выводить предупреждающие сообщения для конструкций, найденных в системных заголовочных файлах. Предупреждения из системных заголовков обычно подавляются , при условии, что они обычно не указывают на реальные проблемы и только затруднят чтение выходных данных компилятора.

Итак, вы можете простопритвориться, что сторонняя библиотека является системным заголовком, используя GCC's -isystem flag (вместо -I):

copts = ["-isystem external/gtest/include"],
1 голос
/ 12 июня 2019

Bazel's - per_file_copt позволяет установить флаги для всех файлов , за исключением , соответствующих некоторому регулярному выражению.Нечто подобное в вашем .bazelrc должно делать то, что вы ищете:

# 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

Вам нужно будет обновить его, чтобы оно соответствовало любым расширениям, которые вы используете для файлов C ++, кроме .cc и .cpp.Документация для cc_library.srcs перечисляет все расширения, которые использует Базель, для справки.

Я не мог понять, как сопоставить @googletest// во флаге, потому что я не вижуспособ избежать @ там ... Тем не менее, я почти уверен, что он соответствует @googletest, а не external/googletest или чему-то еще, потому что /googletest ничего не соответствует.Вероятно, это не имеет значения, но об этом следует помнить, если у вас есть какие-либо другие имена файлов с googletest в них.

...