Burada, Bazel ile C++ projeleri oluşturmaya yönelik en yaygın kullanım alanlarından bazılarını bulabilirsiniz. Henüz yapmadıysanız Introduction to Bazel: Build a C++ Project (Bazel'e Giriş: C++ Projesi Oluşturma) adlı eğitime katılarak Bazel ile C++ projeleri oluşturmaya başlayın.
cc_library ve hdrs üstbilgi dosyaları hakkında bilgi edinmek için cc_library başlıklı makaleyi inceleyin.
Bir hedefe birden fazla dosya ekleme
glob ile tek bir hedefe birden fazla dosya ekleyebilirsiniz. Örneğin:
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
Bu hedefle Bazel, bu hedefi içeren BUILD
dosyasıyla aynı dizinde bulduğu tüm .cc
ve .h
dosyalarını (alt dizinler hariç) oluşturur.
Geçişli dahil etme işlemlerini kullanma
Bir dosya üstbilgi içeriyorsa bu dosyayı kaynak olarak kullanan tüm kurallar (yani srcs
, hdrs
veya textual_hdrs
özelliğinde bu dosyanın bulunduğu kurallar) eklenen üstbilginin kitaplık kuralına bağlı olmalıdır. Buna karşılık, yalnızca doğrudan bağımlılıklar bağımlılık olarak belirtilmelidir. Örneğin, sandwich.h
'nın bread.h
'ı ve bread.h
'ın flour.h
'ı içerdiğini varsayalım. sandwich.h
flour.h
(sandviçinde un olmasını kim ister?) içermediği için 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ığı, bread
kitaplığına, bread
kitaplığı ise flour
kitaplığına bağlıdır.
Dahil etme yolları ekleme
Bazen yolları çalışma alanı köküne dahil edemezsiniz (veya dahil etmek istemezsiniz). Mevcut kitaplıklar, çalışma alanınızdaki yoluyla eşleşmeyen bir include dizinine sahip olabilir. Örneğin, aşağıdaki dizin yapısına sahip olduğunuzu varsayalım:
└── my-project
├── legacy
│ └── some_lib
│ ├── BUILD
│ ├── include
│ │ └── some_lib.h
│ └── some_lib.cc
└── MODULE.bazel
Bazel, some_lib.h
öğesinin legacy/some_lib/include/some_lib.h
olarak eklenmesini bekler ancak some_lib.cc
öğesinin "some_lib.h"
içerdiğini varsayalım. Bu include yolunun geçerli olması için legacy/some_lib/BUILD
, some_lib/include
dizininin bir include dizini olduğunu belirtmelidir:
cc_library(
name = "some_lib",
srcs = ["some_lib.cc"],
hdrs = ["include/some_lib.h"],
copts = ["-Ilegacy/some_lib/include"],
)
Bu, özellikle harici bağımlılıklar için kullanışlıdır. Aksi takdirde, bunların başlık dosyaları /
önekiyle birlikte eklenmelidir.
Harici kitaplıkları dahil etme
Google Test'i kullandığınızı varsayalım.
{: .external}.
Google Test'i indirmek ve deponuzda kullanılabilir hale getirmek için MODULE.bazel
dosyasına bağımlılık ekleyebilirsiniz:
bazel_dep(name = "googletest", version = "1.15.2")
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/googletest/include",
"-Iexternal/gtest/googletest",
],
deps = [
"@googletest//:gtest_main",
"//main:hello-greet",
],
)
hello-greet
özelliğinin hello-test
tarafından görünür olması için ./main/BUILD
içindeki visibility
özelliğine "//test:__pkg__",
eklemeniz gerekir.
Artık testi çalıştırmak için bazel test
kullanabilirsiniz.
bazel test test:hello-test
Bu işlem aşağıdaki çı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
Yalnızca derlenmiş bir sürümüne sahip olduğunuz bir kitaplığı (ör. başlıklar ve bir .so
dosyası) kullanmak istiyorsanız bunu bir cc_library
kuralına sarın:
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
Bu sayede, çalışma alanınızdaki diğer C++ hedefleri bu kurala bağlı olabilir.