Bakefile

tech • 609 słów • 3 minuty czytania

O potędze skryptów automatyzujących pracę (nie tylko programisty) i wszelkich makefile-ach można byłoby długo mówić i pisać. To one przyśpieszają i ułatwiają pracę, często wykonując powtarzane żmudne jej elementy i czasem pomagając 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 dla make-a, a to głównie dzięki używaniu Code-Blocks jako cross-platformowego IDE. Ostatnio się to jednak trochę zmieniło poprzez bakefile, które używane jest m.in. w procesie budowania biblioteki wxWidgets.

Bakefile jest cross-platformowym generatorem plików makefile (oraz plików projektu) dla rożnych (najpopularniejszych) kompilatorów i IDE. Jest to bardzo użyteczne narzędzie. Na podstawie opisanego w pliku XML projektu program generuje odpowiednie pliki wyjściowe. 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

Jest to idealne narzędzie dla cross-platformowych projektów. Zostało stworzone przez jednego z developerów projektu wxWidgets, jako odpowiedź na potrzebę łatwego i prostego zarządzania mechanizmem budowania tej biblioteki. WX-y obsługują wiele kompilatorów i systemów, panowanie nad wszystkimi szczegółami budowania i zarzadzania plikami projektu bez takiego narzędzia byłoby bardzo trudnym zadaniem, wręcz koszmarem.

Ja to narzędzie 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, dlatego takie powtarzające się zadania należy automatyzować. Można napisać jakiś skrypt powłoki do tego celu, ale pakiet bakefile zawiera specjalne do tego celu narzędzie - bakefile_gen - batch bakefile generation.

Wystarczy utworzyć plik XML o nazwie bakefiles.bkgen określający “środowisko uruchomieniowe” generatora, czyli wszystkie formaty jakie chcemy wygenerować, ustawione flagi i opcje dla generatora… wszystko to co można zrobić przy ręcznym generowaniu “z palca” w konsoli. Po zapisaniu pliku wystarczy wydać polecenie bakefile_gen w danym katalogu, aby rozpocząć proces generowania plików wyjściowych (makefile, projects).

Przy aplikacjach wykorzystujących bibliotekę wxWidgets warto wykorzystać bakefile-owe szablony z nią dostarczane. Wtedy bardzo łatwo stworzyć plik bakefile naszego projektu bez wchodzenia w szczegóły ustawień biblioteki dla poszczególnych platform. Małym problemem może okazać się podawanie ścieżki do katalogu z tymi plikami.

Można dodać taką ścieżkę do zmiennej środowiskowej BAKEFILE_PATHS, która zawiera listę ścieżek jakie generator przeszukuje w celu zlokalizowania includowanych plików szablonowych i innych bakefile. Można też 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>

Niestety, aktualnie zmienne env nie są rozwijane i powyższy sposób nie zadziała, mimo iż w starych wersjach “przypadkowo” działał. Mam wielką nadzieję, że w nowych wersjach zostanie to “naprawione” (ticket #236).

Tymczasowo problem można obejść 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.bat w katalogu z plikiem bakefiles.bkgen, będziemy mogli nadal używać polecenia bakefile_gen do wygenerowania plików. Tylko tym razem to ten skrypt ustawi odpowiednio środowisko, a następnie odda działanie do właściwego programu. Od strony użytkownika działanie skryptu będzie niewidoczne.

Do głębszego poznania tego wspaniałego narzędzia zachęcam do zapoznania się z dokumentacją 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.

Komentarze (2)

lmmilewski avatar
lmmilewski
20090116-201706-lmmilewski

Na pewno mi się przyda, bo grzebanie się z autotools… ;-)

Szkoda, że nie dałeś jakiegoś przykładowego kodu z takim plikiem i go nie skomentowałeś.

Malcom avatar
Malcom
20090116-203038-malcom

Dopiero tak od tygodnia się bliżej męczę z bakefile, choć po głowie mi to już dawno chodziło, ale nie było zbyt motywującego praktycznego powodu do zabaw ;)

Ten przykład z tutoriala w dokumentacji jest trochę ubogi. Ja większość możliwość, jak to bywa u programistów, poznałem analizując wx-owe bakefilsy. Gdybym miał trochę wolnego czasu (co aktualnie jest niemożliwe), mógłbym coś więcej napisać, jakiś prosty tutorial, bo sam nie jestem jeszcze ekspertem :P

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/