2017-05-11 3 views
2

Ich bin neu in Bazel, und ich bin ein Versager immer meine C++ Paket mitWie bazel "undeclared inclusion (s)" Fehler beheben?

ERROR: /path/to/package/BUILD:linenumber:1 undeclared inclusion(s) in rule '//path/to/package:name': this rule is missing dependency declarations for the following files included by 'path/to/package/source_file.cpp'

... durch eine Liste von Header-Dateien in einem anderen Verzeichnis gefolgt zu bauen. Diese Dateien sind nicht Teil des Pakets, das erstellt wird, aber von woanders her eingezogen werden.

Meine Frage ist, wie Sie die Deklaration ordnungsgemäß zur BUILD-Datei hinzufügen, um den Fehler zu beheben?

Laut der Online-Bazel Doku here sollte ich jeden Header an den SRCs Liste hinzufügen. (Um es klar, sind diese Header, die intern von der Bibliothek verwendet werden, ich baue und nicht Teil der öffentlichen Schnittstelle, so dass sie gehören nicht in hdrs.) Aber wenn ich versuche, dass

srcs = [ ..., "path/to/dependent/headers/header.h",] 

ich erhalte eine Fehlermeldung

ERROR: ... crosses boundary of subpackage ... (perhaps you meant to put the colon here: ...?)

, weil das Verzeichnis mit den Header kein Paket Bazel ist.

Wenn ich versuche, die endgültige/zu einem Doppelpunkt zu ändern, wie die Fehlermeldung,

srcs = [ ..., "path/to/dependent/headers:header.h",] 

schlägt dann

ERROR: ... target names may not contain ':'.

Die Bazel C++ Tutorial here, im Abschnitt "Zusätzliche Include Paths", sagt Diese externen Include-Verzeichnisse sollten über Copts:

cc_library(
    name = "some_lib", 
    srcs = ["some_lib.cc"], 
    hdrs = ["some_lib.h"], 
    copts = ["-Ithird_party/some_lib"], 
) 
deklariert werden

Aber hinzufügen, dass -I Flag tut nicht git loszuwerden der "undeclared Aufnahme (n)" Fehler!

$ bazel version 
Build label: 0.4.3 
Build target: bazel-out/local-fastbuild/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar 
Build time: Thu Dec 22 12:31:25 2016 (1482409885) 
Build timestamp: 1482409885 
Build timestamp as int: 1482409885 

Antwort

2

Bazel möchte, dass Sie auf den Header abhängen (das heißt, steckte sie in deps). Grundsätzlich sollten Sie eine cc_library für diese Header erstellen. Das Setzen von Headern in hdrs stellt sie nicht öffentlich aus, sondern macht sie nur Regeln zugänglich, die von dieser Bibliothek abhängen (was genau das ist, was Sie wollen). So werden Sie haben:

# third_party/some_lib/BUILD 
cc_library(
    name = "headers", 
    hdrs = glob(["*.h"]), 
    visibility = ["//path/to/package:__pkg__"], 
) 

Beachten Sie, dass Sie ersetzen sollte // path/to/Paket mit Ihrem eigentlichen Ziel des Pakets, aber die __pkg__ oben ist wörtlich: das ist, wie Sie „sichtbar zu diesem Paket“ anzuzeigen. Dann können keine anderen Pakete auf diese Header zugreifen.

Dann fügen Sie //third_party/some_lib:headers in Ihrem Ziel deps hinzu.

Die copts werden nur verwendet, um C++ Header Suchpfade zu modifizieren, nicht Bazel.Bazel geht immer davon aus, dass Sie #include "path/relative/to/your/workspace/dir.h" tun werden, aber wenn Sie eine Quelle haben wie:

#include "foo.h" 

wo foo.h an ist third_party/some_lib/includes/foo.h, Sie copts = ["-Ithird_party/some_lib/includes"] sagen könnte, dass in C++ 's hinzufügen Header Suchpfad.

+0

Danke, @ kristina. Also, der Trick ist, ich muss den Drittanbieter-Source-Tree ändern, um eine minimale Bazel-BUILD-Datei dort drüben hinzuzufügen - ob ich diesen Baum "besitze" oder nicht. Es kann nicht von innerhalb des Quellbaums für mein Paket getan werden. –

+0

Sortieren von, können Sie eine BUILD-Datei an '// dritte_party hinzufügen: BUILD' oder' //: BUILD', wenn Sie eine Quelle von Drittanbietern nicht "verschmutzen" möchten. – kristina

0

Ich traf ähnliche prolblem "undeklarierte Aufnahme (n) in der Regel", löste ich durch Entfernen der Bazel-Cache-Dateien in /root/.cache/bazel/. Hoffnung hilft