Na początek wyjaśnijmy jedna kwestie. Opis przedstawiony poniżej to jedynie wstęp do obszernej wiedzy jaką jest kompilowanie własnych pakietów w środowisku OpenWrt, ale i nie tylko. Podobnie to wygląda w innych systemach Linux Embedded. Kompilowanie własnych paczek wymaga troche umiejetności programowania w C oraz ogólnej dobre znajmości Linuxa.
Zanim zaczniesz kompilować Swój Pierwszy Pakiet zainstaluj niezbędne paczki na swoim komputerze takie jak opisano na stronie o kompilowaniu z SVN.
W celu kompilowania pakietów na Kamikaze 7.09 pobieramy odpowiednie SDK dla docelowej architektury. Plik nazywa się OpenWrt-SDK-<architektura>-for-Linux-i686.tar.bz2 i znajduje się w folderach wspieranych architektur przez Kamikaze 7.09, link. Istnieje również wersja dla x86_64.
W przypadku Kamikaze 8.09.1 oraz Backfire, należy sobie samemu takie SDK stworzyć. W tym celu należy pobrać kod źródłowy z svn/git wg. opisu - kompilacja_svn i zaznaczyć w „menu makeconfig” opcję „Build the OpenWrt SDK”. Następnie wydać standardowe „make”.
CDN
# # Copyright (C) 2009 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # include $(TOPDIR)/rules.mk PKG_NAME:=fbgetty PKG_VERSION:=0.1.698 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=http://projects.meuh.org/fbgetty/downloads/ PKG_MD5SUM:= 5b2e98da2310c71c703d4617b88a173f include $(INCLUDE_DIR)/package.mk define Package/fbgetty SECTION:=utils CATEGORY:=Utilities TITLE:=fbgetty URL:=http://sourceforge.net/projects/fbgetty/ endef define Package/fbgetty/description console getty like mingetty, which supports framebuffers endef define Build/Configure $(call Build/Configure/Default) endef $(eval $(call BuildPackage,fbgetty))
Wyjaśnienie:
Każdy plik Makefile zawiera pewne informacje o kompilowanej paczce, jak nazwa, wersja, mdsuma oraz link do zródeł
include $(TOPDIR)/rules.mk # musi być, definiuje zasady kompilowania PKG_NAME:=fbgetty # nazwa kompilowanej paczki PKG_VERSION:=0.1.698 # wersja kompilowanej paczki PKG_RELEASE:=1 # wydanie - numer porządkowy, niema znaczenia, przeważnie 1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz # czasami jest tar.bz2, .zip, .tar PKG_SOURCE_URL:=http://projects.meuh.org/fbgetty/downloads/ # url do zródeł PKG_MD5SUM:= 5b2e98da2310c71c703d4617b88a173f # suma kontrolna, na czas testowania można zakomentować
Opis pakietu:
include $(INCLUDE_DIR)/package.mk # musi być define Package/fbgetty # początek definicji naszej paczki SECTION:=utils # skrótowy zapis kategorii CATEGORY:=Utilities # kategoria w "make menuconfig" TITLE:=fbgetty # nazwa paczki URL:=http://sourceforge.net/projects/fbgetty/ # url do projektu endef # koniec definicji define Package/fbgetty/description # definjujemy opis pakietu (nie istotne) console getty like mingetty, which supports framebuffers # co to za pakiet, do czego służy ? endef # koniec
Konfigurujemy:
define Build/Configure # definicja konfiguracji (opcjonalnie) $(call Build/Configure/Default) # standardowe ./configure endef # koniec definicji
Jeżeli procedura konfiguracji jest standardowa (”./configure”) to można pominąć tą sekcje i dodać na początku PKG_INSTALL:=1 (przykład - pakiet ekg)
Kompilujemy:
define Build/Compile # definicja kompilacji $(MAKE) -C $(PKG_BUILD_DIR) \ # wykonywanie "make" w katalogu rozpakowanego pakietu $(TARGET_CONFIGURE_OPTS) \ ze specyficznymi ustawieniami dla architektury oraz CFLAGS="$(TARGET_CFLAGS)" \ standardowymi parametrami OpenWrt(np brak NLS) all # odpowiednik make all, czasami moze byc "install" endef # koniec ;-)
Instalujemy:
define Package/fbgetty/install # instalacja pakietu (tworzenie .ipk) $(INSTALL_DIR) $(1)/usr/sbin # tworzymy katalog /usr/bin na routerze $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/fbgetty $(1)/usr/sbin/ # kopjujemy binarkę "fbgetty" do /usr/bin endef # koniec $(eval $(call BuildPackage,fbgetty)) # ?
Kompilacja odbywa się przez wydanie polecenia
make
lub jeżeli chcemy skompilować konkretny pakiet
make package/<nasz_pakiet>/{clean,compile,install}
Jednak zanim skompilujemy pakiet należy zaznaczyć go w „make menuconfig”
