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)
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ś.
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