Burada C++ projeleri oluşturmak için en yaygın kullanım alanlarından bazılarını bulabilirsiniz yardımcı olabilir. Henüz yapmadıysanız C++ derlemeye başlayın. bir projeyi yönetmek için Bazel'e giriş: C++ projesi oluşturma.
cc_library ve hdrs üstbilgisi dosyaları hakkında bilgi için bkz. cc_library öğesini seçin.
Bir hedefe birden fazla dosya ekleme
Birden çok dosyayı tek bir hedefe dahil edebilirsiniz. glob ifadesini yükleyin. Örneğin:
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
Bu hedefle Bazel, .cc
ve .h
bu hedefi içeren BUILD
dosyasıyla aynı dizin (hariç tutulan)
alt dizinler) için de kullanılabilir.
Geçişli dahil etme özelliğini kullanma
Bir dosyada başlık varsa kaynak olarak bu dosyayı içeren tüm kurallar (yani
srcs
, hdrs
veya textual_hdrs
özelliğine eklenmiş olması gerekir)
eklenen başlığın kitaplık kuralına bağlıdır. Öte yandan, yalnızca doğrudan
bağımlılıklar
bağımlılık olarak belirtilmelidir. Örneğin,
sandwich.h
bread.h
içerir, bread.h
ise flour.h
içerir. sandwich.h
.
flour.h
içermiyor (kim sandviçinde un istiyor?), bu nedenle BUILD
dosyası şöyle görünür:
cc_library(
name = "sandwich",
srcs = ["sandwich.cc"],
hdrs = ["sandwich.h"],
deps = [":bread"],
)
cc_library(
name = "bread",
srcs = ["bread.cc"],
hdrs = ["bread.h"],
deps = [":flour"],
)
cc_library(
name = "flour",
srcs = ["flour.cc"],
hdrs = ["flour.h"],
)
Burada sandwich
kitaplığı şuna göre bread
kitaplığına bağlıdır:
(flour
kitaplığında)
Dahil etme yolları
Bazen, çalışma alanındaki yollar için root işlemi yapamazsınız (veya bunu yapmak istemezsiniz) kök. Mevcut kitaplıklarda, çalışma alanınızdaki yolla eşleşmelidir. Örneğin, aşağıdaki gibi olduğunu varsayalım: dizin yapısı:
└── my-project
├── legacy
│ └── some_lib
│ ├── BUILD
│ ├── include
│ │ └── some_lib.h
│ └── some_lib.cc
└── WORKSPACE
Bazel, some_lib.h
öğesinin
legacy/some_lib/include/some_lib.h
, ancak diyelim ki some_lib.cc
"some_lib.h"
. Bu dahil etme yolunu geçerli kılmak için
legacy/some_lib/BUILD
öğesinin, some_lib/include
dizin, bir "dahil etme" dizinidir:
cc_library(
name = "some_lib",
srcs = ["some_lib.cc"],
hdrs = ["include/some_lib.h"],
copts = ["-Ilegacy/some_lib/include"],
)
Bu, özellikle başlık dosyaları gibi harici bağımlılıklar için yararlıdır.
aksi takdirde /
önekiyle eklenmelidir.
Harici kitaplıklar ekleme
Google Test'i kullandığınızı varsayalım.
WORKSPACE
dosyasındaki depo işlevlerinden birini kullanarak şu işlemleri yapabilirsiniz:
Google Test'i indirin ve deponuzda kullanılabilir hale getirin:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "gtest",
url = "https://github.com/google/googletest/archive/release-1.10.0.zip",
sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91",
build_file = "@//:gtest.BUILD",
)
Ardından, Google Test'i derlemek için kullanılan BUILD
dosyasını gtest.BUILD
oluşturun.
Google Test'in bazı "özel" yaklaşımları var cc_library
kuralını oluşturan şartlar
daha karmaşıktır:
Diğer tüm
googletest-release-1.10.0/src/gtest-all.cc
#include
googletest-release-1.10.0/src/
içindeki dosyalar: bu dosyayı yinelenen simgeler için bağlantı hatalarını önlemek üzere derleyin.Bu özellik,
googletest-release-1.10.0/include/
dizininde ("gtest/gtest.h"
), bu nedenle dizini ekleme yollarına ekleyin.pthread
içinde bağlanması gerekiyor. Bunulinkopt
olarak ekleyin.
Dolayısıyla son kural şu şekilde görünür:
cc_library(
name = "main",
srcs = glob(
["googletest-release-1.10.0/src/*.cc"],
exclude = ["googletest-release-1.10.0/src/gtest-all.cc"]
),
hdrs = glob([
"googletest-release-1.10.0/include/**/*.h",
"googletest-release-1.10.0/src/*.h"
]),
copts = [
"-Iexternal/gtest/googletest-release-1.10.0/include",
"-Iexternal/gtest/googletest-release-1.10.0"
],
linkopts = ["-pthread"],
visibility = ["//visibility:public"],
)
Bu, biraz karmaşık: Her şeyin önünde googletest-release-1.10.0
var
kullanıma sunulmasından ibaret değildir. http_archive
şeridi oluşturabilirsiniz
strip_prefix
özelliğini ekleyerek bu ön eki kullanabilirsiniz:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "gtest",
url = "https://github.com/google/googletest/archive/release-1.10.0.zip",
sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91",
build_file = "@//:gtest.BUILD",
strip_prefix = "googletest-release-1.10.0",
)
Bu durumda gtest.BUILD
şöyle görünür:
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"],
)
Artık cc_
kuralları @gtest//:main
kaynağına bağlı olabilir.
C++ testleri yazma ve çalıştırma
Örneğin, aşağıdaki gibi bir test ./test/hello-test.cc
oluşturabilirsiniz:
#include "gtest/gtest.h"
#include "main/hello-greet.h"
TEST(HelloTest, GetGreet) {
EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}
Ardından testleriniz için ./test/BUILD
dosyası oluşturun:
cc_test(
name = "hello-test",
srcs = ["hello-test.cc"],
copts = ["-Iexternal/gtest/include"],
deps = [
"@gtest//:main",
"//main:hello-greet",
],
)
hello-greet
öğesinin hello-test
tarafından görülebilmesi için şunu eklemeniz gerekir:
./main/BUILD
öğesindeki visibility
özelliğine "//test:__pkg__",
.
Artık testi çalıştırmak için bazel test
kullanabilirsiniz.
bazel test test:hello-test
Bu işlem şu çıkışı üretir:
INFO: Found 1 test target...
Target //test:hello-test up-to-date:
bazel-bin/test/hello-test
INFO: Elapsed time: 4.497s, Critical Path: 2.53s
//test:hello-test PASSED in 0.3s
Executed 1 out of 1 tests: 1 test passes.
Önceden derlenmiş kitaplıklara bağımlılık ekleme
Sadece derlenmiş sürümüne sahip olduğunuz bir kitaplığı kullanmak istiyorsanız (
örnek, başlıklar ve bir .so
dosyası) bir cc_library
kuralına sarmalayın:
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
Bu şekilde, çalışma alanınızdaki diğer C++ hedefleri bu kurala bağlı olabilir.