Yaygın C++ Derleme Kullanım Alanları

Sorun bildirin Kaynağı göster Gece · 7,4 , 7.3 · 7,2 · 7,1 · 7,0 · 6,5

Bazel ile C++ projeleri oluşturmanın en yaygın kullanım alanlarından bazılarını burada bulabilirsiniz. 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"]),
)

Bazel, bu hedefi içeren BUILD dosyasıyla aynı dizinde bulduğu tüm .cc ve .h dosyalarını (alt dizinler hariç) bu hedefle derleyecektir.

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çermez (sandviçinde un isteyen var mı?). 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ı ekleme

Bazen, çalışma alanındaki yollar için root işlemi yapamazsınız (veya bunu yapmak istemezsiniz) kök. Mevcut kitaplıklarda, Workspace'teki yoluyla eşleşmeyen bir dahil dizini olabilir. Ö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'ün legacy/some_lib/include/some_lib.h olarak dahil edilmesini bekler ancak some_lib.cc'de "some_lib.h" olduğunu varsayalım. 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 harici bağımlılıklarda kullanışlıdır. Aksi takdirde, başlık dosyaları bir / ön ekiyle 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 bir BUILD dosyası olan gtest.BUILD dosyasını oluşturun. Google Test'in cc_library kuralını daha karmaşık hale getiren birkaç "özel" koşulu vardı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.

  • googletest-release-1.10.0/include/ dizine ("gtest/gtest.h") göreli başlık dosyaları kullandığından bu dizini dahil edilecek yollara eklemeniz gerekir.

  • pthread'e bağlanması gerektiği için bu öğeyi linkopt olarak ekleyin.

Bu nedenle, nihai 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: Arşivin yapısının bir yan ürünü olarak her şeyin önüne googletest-release-1.10.0 eklenir. strip_prefix özelliğini ekleyerek http_archive'ün bu ön eki kaldırmasını sağlayabilirsiniz:

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-greethello-test için görünür hale getirmek istiyorsanız ./main/BUILD'teki visibility özelliğine "//test:__pkg__", eklemeniz gerekir.

Artık testi çalıştırmak için bazel test simgesini kullanabilirsiniz.

bazel test test:hello-test

Bu işlem sonucunda aşağıdaki çıkış elde edilir:

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ıklar 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.