​Bazel je besplatan alat koji ima za cilj da automatizuje build-ovanje i testiranje softvera. Pre nego da postane javno dostupan 2015. godine, korišćen je interno od strane Google-a, kao deo većeg alata Blaze-a. Slično kao Apache maven, Bazel build-uje aplikacije na osnovu skupa pravila. Ova pravila i markoi su kreirani u Starlark jeziku, koji je varijanta Python-a. Bazel ima podršku za veliki skup build pravila, koja pokrivaju softver pisan u različitim programskom jezicima: Java, C, C++, Go, Python, Objective-C i Bourne shell skripte. Osim toga, Bazel ima mogućnost izvoza aplikacija u formatima koji su podržani od strane Android i iOS mobilnih operativnih sistema.

Kao prednosti ovog alata u odnosu na druge, on se ističe po brzini build-ovanja i mogućnosti reprodukcije. Osim toga, iskorišćava paralelizaciju gde god je to moguće sa ciljem da ubrza ceo process. Između ostalog, Bazel obuhvata i upitni jezik – Bazel Query Language, koji se može iskoristiti za analizu zavisnosti u složeni build grafovima.

Osnovni koncept u Bazel projektu je radni prostor (work space). Workspace je direktorijum unutar kojeg se nalaze svi fajlovi izvornog koda našeg projekta, ali i produkti procesa build-ovanja. Osim toga, workspace sadrži i dva specijalna Bazel fajla:

  • WORKSPACE fajl, koji određuje neki direktorijum i njegov sadržaj kao Bazel workspace,  a nalazi se u root direktorijumu projekta. Ukoliko želimo da neki direktorijum učinimo Bazel workspace-om, potrebno je unutar njega kreirati WORKSPACE fajl. Ovaj fajl može biti prazan ili sadrži reference na eksterne zavisnosti koje su neophodne za build-ovanje projekta
  • BUILD fajlovi, jedan ili više njih, a cilj im je da daju instrukcije Bazel-u kako se vrši build različitih delova projekta. Svaki direktorijum u workspace-u koji ima svoj BUILD fajl se naziva se paketom.

Kada Bazel build-uje projekat, svi ulazni fajlovi i zavisnosti mora da se nađu unutar istog workspace-a. Fajlovi koji se nalaze u različitim workspace-ovima su podrazumevano nezavisni jedni od drugih, osim ako se eksplicitno ne povežu. Unutar WORKSPACE fajla se definišu pravila kojima se ukazuje na spoljašnje zavisnoti, pri čemu su najčešća sledeća:

  • local_repository – zavisnost od drugog, lokalnog Bazel projekta
  • git_repository – zasvisnost od Bazel projekta na Git-u
  • http_archive – zavisnost od Bazel projekta u okviru HTTP arhive koju treba preuzeti
  • new_local_repository – zavisnost od projekata koji ne koriste Bazel

U Listingu 1 je dat primer WORKSPACE fajla sa primenom svih navedenih pravila. Kao što se može videti, svaki od njih ima neke specifične parameter, dok je naziv zajednički. Osim toga, svi oni poseduju neku vrstu putanje, što je kod HTTP arhive URL, za Git repozitorijum je njegova remote adresa, za druge Bazel I ostale lokalne projekte – putanja na disku. Osim toga, prilikom korišćenja git_repository i http_archive pravila, potrebno je primeniti i load deklaraciju, kao što je prikazano.

Listing 1 Primer WORKSPACE fajla Bazel projekta

Što se BUILD fajla tiče, on sadrži različite tipove instrukcija kojima se Bazel vodi prilikom build-ovanja. Najčešći tip pravila koji se javlja jesu build pravila, koja Bazel-u kaži kako se build-uju željeni izlazi, poput biblioteka ili izvršivih binarnih datoteka. Scaka instance build pravila unutar BUILD fajla se odnosi na skup fajlova izvornog koda i zavisnosti (dependencies). Listing 2 prikazuje dva primera najčešće korišćenih pravila: cc_library – za biblioteke i cc_binary – za izvršne datoteke. U ovom slučaju binarni fajl izvrsivi se oslanja na biblioteku1. Osim toga, za test case-ove postoji zasebno pravilo cc_test.

Kao što se može videti, imamo sledeće parameter:  

- name – naziv biblioteke ili izvršive datoteke;

-srcs (sources) – C++ izvorni kod na osnovu koga se pakuje biblioteka ili izvršivi fajl;

-hdrs (headers) – zaglavlja koja sadrže deklaracije;

-deps (dependencies) – zavisnosti, odnosno spoljašnje biblioteke na koje se izvršivi fajl ili biblioteka oslanja

Listing 2 Primeri Bazel build pravila unutar BUILD fajla

Za build-ovanje binarnog fajla izvrsivi pokrećemo sledeću komandu

bazel build //main:izvrsivi

Konačno, ukoliko želimo da build-ujemo, ali Ii pokrenemo nakon build-ovanja, koristimo komandu

bazel run //main:izvrsivi

Autori: Maša Radenković, Nenad Petrović

Add comment