Bakefile

O  potędze skryptów automatyzujących prace (nie tylko programisty) i wszelkich makefile’ach można byłoby mówić wiele. To one przyśpieszają i ułatwiają pracę, często powtarzane żmudne elementy i czasem pomagają zapomnieć o wklepywaniu niekończących się linii w konsoli.

Osobiście do tej pory rzadko mi się zdarzało pisać ręcznie pliki z regułami make, głownie dzięki używaniu Code-Blocks jako cross platformowego IDE, ale ostatnio trochę się to zmieniło poprzez bakefile, które używane jest m.in. w procesie budowania wxWidgets.

Bakefile jest cross-platformowym generatorem plików makefile (oraz plików projektu) dla rożnych (najpopularniejszych) kompilatorów.

Jest to bardzo użyteczne narzędzie, w pliku XML opisujemy nasz projekt, a następnie na jego podstawie program generuje odpowiednie pliki make. Aktualna wersja potrafi wygenerować:

autoconf      GNU autoconf Makefile.in files
borland       Borland C/C++ makefiles
dmars         Digital Mars makefiles
dmars_smake   Digital Mars makefiles for SMAKE
gnu           GNU toolchain makefiles (Unix)
mingw         MinGW makefiles (mingw32-make)
msevc4prj     MS eMbedded Visual C++ 4 project files
msvc          MS Visual C++ nmake makefiles
msvc6prj      MS Visual C++ 6.0 project files
msvs2003prj   MS Visual Studio 2003 project files
msvs2005prj   MS Visual Studio 2005 project files
msvs2008prj   MS Visual Studio 2008 project files
symbian       Symbian development files
watcom        OpenWatcom makefiles
xcode2        Xcode 2.4 project files

Idealne narzędzie dla cross-platformowych projektów, zostało zrodzone przez jednego z developerów projektu wxWidgets, jako odpowiedź na potrzebę łatwego i prostego zarządzania mechanizmem budowania tej biblioteki, co przy obsłudze wielu kompilatorów i systemów panowanie nad wszystkimi szczegółami byłoby bardzo trudnym zadaniem, a dodawanie nowych plików do projektu stałoby się koszmarem.

Ja narzędzie to wykorzystuję m.in w projekcie xime, do budowania samej aplikacji i niezbędnych do jej działania komponentów, pewnie w przyszłości także do generowania lokalizacji i samego pakietu dystrybucyjnego – instalatora.

Same, ręczne uruchamianie generatora bakefile z odpowiednimi przełącznikami i opcjami może być nużące dla kilku plików z regułami bakefilowymi, wiec jak wspomniałem na początku notki, każde powtarzające się zadania należy automatyzować.

Można napisać jakiś skrypt powłoki do tego celu, ale pakiet bakefile zawiera także specjalnie do tego celu służące narzędzie – bakefile_gen – batch bakefile generation.

Wystarczy utworzyć odpowiedni plik XML o nazwie bakefiles.bkgen określający „środowisko uruchomieniowe” generatora, czyli wszelkie formaty jakie chcemy wygenerować, ustawione flagi dla generatora etc. Wszystko to co można zrobić przy ręcznym generowaniu „z palca” w konsoli. A po zapisaniu pliku, wystarczy tylko wydać polecenie:

bakefile_gen

w danym katalogu, aby rozpocząć proces generowania plików makefile.

Przy aplikacjach wykorzystujących bibliotece wxWidgets, warto wykorzystać bakefile’owe szablony dostarczone z biblioteką, wtedy bardzo łatwo stworzyć plik bakefile naszego projektu bez wchodzenia w znajomość szczegółów i ustawień biblioteki dla poszczególnych platform.

Małym problemem może okazać się podawanie odpowiedniej ścieżki do katalogu z tymi plikami. Można dodać tą ścieżkę do zmiennej środowiskowej BAKEFILE_PATHS, która zawiera listę ścieżek jakie generator przeszukuje w celu zlokalizowania includowanych plików szbalonowych i innych bakefile.

Można w pliku bakefiles.bkgen ustawić odpowiednią flagę z tą ścieżką, aby w pełni uzależnić się od ustawień systemowych. Dla platformy windowsowej wyglądałoby to tak:

<add-flags>
	-I%WXWIN%/build/bakefiles/wxpresets
</add-flags>

Ale niestety, aktualnie zmienne env nie są rozwijane i powyższy sposób nie zadziała, mimo iż w starych wersjach „przypadkowo” działał, mam nadzieje ze w nowych wersjach zostanie to „naprawione” (ticket #236).

Tymczasowo można problem rozwiązać przez prosty skrypt wsadowy powłoki:

@echo off
setlocal
set BAKEFILE_PATHS=%BAKEFILE_PATHS%;%WXWIN%\build\bakefiles\wxpresets
bakefile_gen.exe

Po zapisaniu go pod nazwą „bakefile_gen” w katalogu z plikiem bakefiles.bkgen, będziemy mogli nadal używać polecenia bakefile_gen do wygenerowania plików make, tylko tym razem to nasz skrypt ustawi odpowiednio środowisko, a następnie odda działanie do właściwego programu.

Od strony użytkownika działanie skryptu jest niewidoczne.

Do głębszego poznania tego wspaniałego narzędzia zachęcam do zapoznania się z dokumentacja i tutorialem dostępnym na stronie projektu. W wiki projektu można znaleźć porównanie z innymi podobnymi narzędziami do generowania plików make, a także przydatne rozszerzenia (szablony  i presets) nadesłane przez różnych użytkowników i deweloperów.

3 przemyślenia nt. „Bakefile”

  1. Dopiero tak od tygodnia sie blizej mecze z bakefile, choc po glowie mi to juz dawno chodzilo, ale nie bylo zbyt motywujacego praktycznego powodu ;)

    Ten przyklad z tutoriala w dokumentacji troche ubogi, ja wiekszosc mozliwosc, jak to bywa u programistow, poznalem analizujac wxowe bakefilsy.

    Gdybym mial torche czasu (co aktualnie jest niemozliwe), mogłbym cos wiecej napisac, jakis prosty tutorial, bo sam nie jestem jeszcze ekspertem :P

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *