Güncel OpenWrt kaynak ağacını (en azından 21.02 ve sonrası) etkileyen bir mesele var: Belirli sistemlerde OpenWrt imgesi oluşur, ama sistem başlangıcında asılı kalır. Bu meselenin etrafından dolaşmak için, lütfen git kaynak kodu “chekout” işleminden önce buradaki (ing) “workaround” başlıklı kısımdaki talimatları takip edin.
Bir inşa sistemi kurulumu sonrası tipik oluşturma adımları:
# Kaynakları indirip güncelle git clone https://git.openwrt.org/openwrt/openwrt.git cd openwrt git pull # Belli bir kod revizyonunu seç git branch -a git tag git checkout v21.02.3 # Besileri güncelleme ./scripts/feeds update -a ./scripts/feeds install -a # Bellenim imajını ve çekirdeği yapılandır make menuconfig make -j $(nproc) kernel_menuconfig # Bellenim imajını oluştur make -j $(nproc) defconfig download clean world
İnşa adımları aşağıda detaylı açıklanmışlardır.
Takip eden komutu kullanarak Git deposunu klonla.
git clone https://git.openwrt.org/openwrt/openwrt.git [<buildroot>]
Olası meseleler:
-bash: git: command not found
- inşa sistemi kurulumunu doğrula.fatal: destination path 'openwrt' already exists and is not an empty directory.
- inşakokü dizinini taşı/adlandır.Geliştirme dalındaki kaynaklar sık değişir. En son kaynaklarla çalışmanız önerilir.
git pull
Olası meseleler:
-bash: cd: openwrt: No such file or directory
- inşakökü dizinini doğrula.fatal: not a git repository (or any of the parent directories): .git
- çalışma dizinini klonlanmış inşakökü'ne değiştir.Eskimiş oldukları durumda, besiler için son güncellemeleri çek.
./scripts/feeds update -a
İndirilmiş paketleri make menuconfig
içine kullanılabilir kıl.
./scripts/feeds install <package_name> ./scripts/feeds install -a
Olası meseleler:
-bash: ./scripts/feeds: No such file or directory
- çalışma dizinini klonlanmış inşaköküne değiştir.Can't exec "make": No such file or directory at ./scripts/feeds line 22. Unsupported version of make found: make Checking 'gcc'... failed. Checking 'working-gcc'... failed. Checking 'g++'... failed. Checking 'working-g++'... failed. Checking 'ncurses'... failed. Checking 'awk'... failed. Checking 'unzip'... failed. Checking 'bzip2'... failed. Checking 'wget'... failed. Checking 'python'... failed. Checking 'python3'... failed. Checking 'file'... failed.
- inşa sistemi kurulumunu doğrula.
<inşakökü>
dizininizi, openwrt kaynaklarını github'dan git klonlama ile hazırlayın (örneğin kendi çatalınızdan).mkdir -p <inşakökü>/paketlerim/<kısım>/<kategori>/<paket_adi>
.<paket_adi>
'nı kendi paketinizle değiştirin.mkdir -p paketlerim/net/network/rpcbind
.Makefile
'da bulunabilirler.Makefile
indirin, github'da örneklere bakabilirsiniz.feeds.conf.default
'a kendi özel besinizle bir satır ekleyin:src-link paketlerim <insakoku>/paketlerim
<insakoku>
'nü klonlanmış openwrt kaynak diziniyle değiştirin örn. ~/openwrt
./scripts/feeds update -a; ./scripts/feeds install <paket_adı>
./scripts/feeds install <paket_adı>
çalıştırın ve bağımlılığın çözümlendiğini farketmelisiniz.Make menuconfig
menüsünde paketi seçinmake package/my_package/{clean,compile}
ile inşa edinBu adım atlanabilir en uç seviye imajlar inşa etmek istiyorsunu.
Her dal sürüm versiyonu için temel kod içerir, örn. openwrt-18.06
, openwrt-19.07
, openwrt-21.02
, master
, ve tekil sürümler, örn. v18.06.2
, v19.07.3
, v21.02.0
.
Her dal, geliştirme dalından geriye aktarılan özenle seçilmiş onarımlar ve güncellemelerle kararlı kod içermesi için tasarlanmıştır.
Bir dalı kullanmak için, Git deposunu yukarıda açıklanan git clone
komutunu kullanarak klonlayın ve sonra git checkout
komutuyla dala geçin.
# Dalları listeleme git branch -a # OpenWrt ana dalını kullan git checkout master # OpenWrt 21.02 dalını kullan git checkout openwrt-21.02
Dal değiştirirken, make distclean
komutunu kullanarak kaynak ağacını iyice temizlemek önerilir.
Böylelikle kaynak ağacınızın önceki derleme çalışmalarından yapı parçaları veya yapılandırma dosyaları içermediğinden emin olursunuz.
Resmi sürüm depolarından paketler yüklemek için uzun süreliğine belirli bir sürüm etiketi seçin. Select an individual release tag to install packages from the official release repositories for a long time.
# Etiketleri getirip listeleme git fetch -t git tag # OpenWrt 21.02.1 sürümünü kullanma git checkout v21.02.1
Belirli bir kod revisyonu özeti seçme ve tüm besileri aynı güne eşitleme.
REV_HASH="4c73c34ec4215deb690bf03faea2a0fe725476f0" git checkout ${REV_HASH} REV_BRANCH="$(git rev-parse --abbrev-ref HEAD)" # Tüm "src-git"'leri "src-git-full" olarak değiştirin: https://openwrt.org/tr/docs/guide-developer/feeds#feed_configuration sed -e "/^src-git\S*/s//src-git-full/" feeds.conf.default > feeds.conf ./scripts/feeds update -a # Bir döngü ile tüm feeds.conf satırlarını seçili revizyon özetlerini ayarlamak için düzenleyin sed -n -e "/^src-git\S*\s/{s///;s/\s.*$//p}" feeds.conf \ | while read -r FEED_ID do REV_DATE="$(git log -1 --format=%cd --date=iso8601-strict)" REV_HASH="$(git -C feeds/${FEED_ID} rev-list -n 1 --before=${REV_DATE} ${REV_BRANCH})" sed -i -e "/\s${FEED_ID}\s.*\.git$/s/$/^${REV_HASH}/" feeds.conf done ./scripts/feeds update -a ./scripts/feeds install -a
OpenWrt'yi varsayılan resmi imajlarla aynı paketleri barındıracak şekilde derleme:
Örneğin archer_c7 için derliyorsanız onun wiki sayfasında fabrika bellenim URL'ini bulabilirsiniz https://downloads.openwrt.org/releases/21.02.1/targets/ath79/generic/openwrt-21.02.1-ath79-generic-tplink_archer-c7-v2-squashfs-factory.bin
'ath79' Hedef'i(Target) söyler, 'generic' Althedefi(Subtarget), 'archer-c7-v2' size belirli cihaz için Hedef profili(Target profile) söyler.
Yapılandırmayı 'generic' althedefine kadarki herşeyi kaldırarak ve 'config.buildinfo' ekleyek indirin:
# OpenWrt 19.07 ve sonrası wget https://downloads.openwrt.org/releases/21.02.1/targets/ath79/generic/config.buildinfo -O .config # OpenWrt 18.06 ve öncesi wget https://downloads.openwrt.org/releases/18.06.0/targets/ramips/mt7621/config.seed -O .config
Bu yapılandırmayı kullanırken hedef ve althedef halihazırda seçiliyken hedef profil için seçili olmayacağından eğer sadece belirli bir cihaz için inşa etmek istiyorsanız bunu kendiniz uyarlamanız gerekecek.
inşa sistemi yapılandırma arayüzü hedef platform seçimini, derlenecek paketleri, bellenim dosyasına dahil edliecek paketleri, bazı çekirdek seçeneklerini, vs. ele alır.
İnşa sistemi yapılandırma arayüzünü takip eden komutu yazarak başlatın:
make menuconfig
Bu, varolan yapılandırmanızın bağımlılıklarını otomatik günceller, ve şimdi güncellenmiş imajlarınızı inşa etmeye devam edebilirsiniz.
Bir seçenekler listesi göreceksiniz. Bu liste aslında bir ağacın tepesi. Bil liste öğesi seçebilir, ve onun ağacına inebilirsiniz.
Ağaçta bir paket veya özellik aramak için, “/” tuşuna basabilir, ve bir metin için arama yapabilirsiniz. Bu size metnin ağaç içindeki konumlarını verecek.
Çoğu paket ve özellik için üç seçeneğiniz vardır:
y
, m
, n
şu şekilde temsil edilir:
Yapılandırmanızı kaydettiğinizde, <inşakökü>/.config
dosyası yapılandırmanıza göre yaratılır.
menuconfig
'i açtığınızda inşa ayarlarını bu sırayla ayarlamaya gereksineceksiniz (aynı zamanda menuconfig
arayüzünde de bu sırayla gösterilir):
Önce cihazınızın Hedef sistemini seçin, sonra doğru Althedefi seçin, sonra cihazınızı desteklenen platformların Hedef profil listesinde bulabilirsiniz.
Örn. tl-wr841n Wi-Fi yönlendirici için hedefi seçip kaydetmek için:
make menuconfig
yanında bir başka yapılandırma yolu bir yapılandırma fark dosyası kullanmaktır.
Bu dosya, geçerli yapılandırmayı varsayılan yapılandırmayla karşılaştırarak sadece farkları barındırır.
Bir yararı bu dosyayı kendi alt projenizde versiyonlandırarak kontrol edebilmenizdir.
Aynı zamanda kaynak güncellemelerinden de daha az etkilenir, çünkü sadece değişiklikleri barındırır.
Derleme yapılandırma değişikliklerini kaydedin.
# Değişiklikleri diffconfig'e yaz ./scripts/diffconfig.sh > diffconfig
Bellenim yapma süreci yapılandırma fark dosyası config.buildinfo
'yu otomatik yaratır, 18.06 ve öncesinde config.seed
adındaydı.
Bu değişiklikler bir config dosyasına temel oluşturur <inşakökü>/.config
.
make defconfig
çalıştırarak, bu değişiklikler tam yapılandırmaya genişletilecektir.
# Değişiklikleri .config'e yaz cp diffconfig .config # Tam yapılandırmaya genişlet make defconfig
Bu değişiklikler yapı dosyasının (<inşakökü>/.config
) sonuna da eklenebilir, make defconfig
çalıştırarak bu değişiklikler önceki yapılandırmanın üstüne geçer.
# Değişiklikleri .config'in sonuna ekle cat diffconfig >> .config # Değişiklikleri uygula make defconfig
Bazı özel yapılandırma dosyaları katmak isterseniz, bunların konacağı doğru yer:
<inşakökü>/files/
Örneğin, diyelim özel /etc/config/firewall
veya özel bir etc/sysctl.conf
ile bir imaj istiyorsunuz, öyleyse bu dosyaları şu şekilde yaratın:
<inşakökü>/files/etc/config/firewall
<inşakökü>/files/etc/sysctl.conf
Örn. eğer sizdeki <inşakökü>
, ~/source
ise ve bazı dosyaların bellenim imajının /etc/config
dizinine copyalanmasını istiyorsanız, onları koyacağınız doğru yer ~/source/files/etc/config
olur.
Sadece gerekli özelleştirmeleri adım adım eklemek için uci-defaults kullanmanız şiddetle önerilir. Bu, versiyonlar arasında değişen, oto-oluşturulan ayarlarla catışmaları en aza intirmeye yardım eder.
make defconfig
bir varsayılan hedev cihaz ve inşa sistemi yapılandırması üretecektir, bağımlılıkların ve inşa ortamı ön gerekliliklerinin kontrolünü de kapsayarak.
Defconfig aynı zamanda .config
dosyasından eskimiş öğeleri kaldırır, örneğin varolmayan paketleri ve yapı ayarlarını.
Aynı zamanda bağımlılıkları da kontrol eder ve olası eksik gerekli bağımlılıkları ekleyecektir. Bu kisa bir .config tarifini (diffconfig çıktısı gibi, hatta daha da budanabilir) oluşturma sürecinde kullanılabilecek bir tam .config'e “genişletmek” için kullanılabilir.
Bilin ki make kernel_menuconfig
komutunun yaptığı değişiklikler inşa ağacının çekirdek yapılandırma şablonlarındadır ve build_dir'ri temizlemek bu değişiklikleri geri almaz.
Ayrıca burada değişiklikler yaparsanız resmi depolardan kernel paketleri yükleyemezsiniz.
Normalde bunu yapmaya ihtiyacınız yokken, bunu yapabilirsiniz:
make kernel_menuconfig CONFIG_TARGET=subtarget
CONFIG_TARGET hangi yapılandırmayı düzenlemek istediğinizi seçmenizi sağlar, olası seçenekler: hedef, althedef, ordam.
Değişiklikler şununla gözden geçirilebilir ve geri alınabilirler:
git diff target/linux/ git checkout target/linux/
'İnşa sistemi ayarları' paket konumlarını değiştirmek için yerel paket kümesini ele almayı kolaylaştıran bazı etkili seçenekler içerir:
İlk seçeneğin durumunda, basitçe paket kaynak kodlarının sunulduğu HTTP veya FTP sunucusunun tam URL'ini girersiniz. İndirme dizini aynı yolla inşa sisteminde (veya ağda) bir yerel dizinin yolu olur. Eğer zifttoplarını sunan bir web/ftp sunucunuz varsa, inşa sistemi Makefile'lada anılan konum(lar)dan indirmeyi denemeden önce bu sunucuyu dener. Benzer şekilde eğer bir yerel 'indirme dizini' inşa sisteminde bulunan, belirtilmişse.
'Çekirdek modülleri' seçeneği belirli bir (standart olmayan) sürücülere ve benzerlerine ihtiyacınız varsa gereklidir - bunlar tipik olarak USB veya belirli ağ arayüzü sunucuları için olan modüller gibi şeyler olacaktır.
Son make(yap)'ten önce bir make dowload
komutu vermek en iyisidir, bu adım tüm bağımlılıklar için kaynak kodunu önden çeker, bu daha çok CPU çekirdeğiyle derlemenize olanak verir, örneğin make -j10
, 4 çekirdekli, 8 iş parçacıklı işlemci için harika çalışacaktır.
Eğer OpenWrt'yi çoklu çekirdekte derlemeyi denerseniz ve tüm bağımlılık paketleri için tüm kaynak kodları indirmez iseniz büyük olasılıkla inşa başarısız olacaktır.
make download
Şimdi imaj(lar)ı inşa etmek için herşey hazır, ki bu bir tek komutla yapılır:
make
Bu aletdizisini derlemeli, kaynaları capraz-derlemeli, paketleri paketlemeli, ve çakılmaya hazır bir imaj oluşturmalı.
Ayrıca bakın: Derleyici optimizasyon ince ayarları(ingilizce)
make download
tüm bağımlılıklar için tüm kaynak kodu önden indirecek, bu çok çekirdekli derlemenin başarılmasını sağlayacaktır; bu olmadan muhtemelen başarısız olur.
make -j
N derlemeyi N'e kadar çekirdek veya donanımsal iş parçacıği kullanarak hızlandıracaktır, make-j9
8 çekirdeğin veya donanımsal iş parçacığının tamamını kullanır.
Önden indir ve imajı 4 CPU çekirdeğiyle derleme örneği:
make -j5 download world
''nproc'' komutu ile kullanılabilecek CPU sayısını edinebilirsiniz:
make -j $(nproc) download world
veya nproc+1
ile daha iyi bir makro:
make -j $(($(nproc)+1))
Derlerken sisteminizi kullanmaya niyetliyseniz, inşa sürecinin sadece serbest girdi/çıktı ve işlemci kapasitesini kullanmasını şu şekilde sağlayabilirsiniz (4 çekirdekli, 8 iş parçacıklı CPU):
make download ionice -c 3 nice -n19 make -j9
Yazılım geliştirirken ve paketlerken, sadece söz konusu paketi inşa edebilecek olmak işlevseldir, örneğin jsonpath
paketiyle:
make package/utils/jsonpath/compile V=s
Yeniden inşa etmek için:
make package/utils/jsonpath/{clean,compile} V=s
Paketin hangi beside yer aldığının önemi yoktur, bu sözdizimi yüklü her paket için çalışır.
Eğer bir nedenle inşa çökerse, hatayı farketmenin en kolay yolu şöyle yapmaktır:
make V=s 2>&1 | tee build.log | grep -i -E "^make.*(error|[12345]...Entering dir)" make V=s 2>&1 | tee build.log | grep -i '[^_-"a-z]error[^_-.a-z]' (may not work)
Eğer grep hata verirse, yerine fgrep kullanın.
Üstteki, inşa çıktısının tam ayrıntılı bir kopyasını ~/source/build.log
'a kaydeder (standart-çıktıyı standart-hata'ya aktararak) ve hataları (ve fazladan bazı 'error' ifadelerini) ekranda gösterir.
Başka bir örnek:
ionice -c 3 nice -n 20 make -j 2 V=s CONFIG_DEBUG_SECTION_MISMATCH=y 2>&1 | tee build.log
Bu da çift çekirdekli bir işlemcide sadece arkaplan kaynakları kullanarak derlerken, inşa çıktısının tam ayrıntılı bir kopyasını (standart-hata'yı standart-çıktı'ya aktararak) build.log
'a kaydeder.
Yukarıda tarif edildiği gibi tonlarca Make çıktısı boyunca ilerlemeye çalışmak zorunda kalmadan probleme odaklanmanın bir yolu da logs
dizininde ki karşılık gelen kayıtları kontrol etmektir.
Örneğin inşa make[3] -C package/kernel/mac80211 compile
ile çökerse, <inşakökü>/logs/package/kernel/mac80211
'e gidip orada bulunan compile.txt
'e bakın.
İşlemcinize bağlı olarak süreç bir süre alacak, veya daha uzun bir süre. Eğer bir akustik uyarı isterseniz, şu yöntemi kullanabilirsiniz:
make ...; echo -e '\a'
Eğer herşeyi derliyorsanız (sadece çakılabilir imaj oluşturmak için paketleri değil), muhtemelen bazıları derleme hatalarıyla oluşmasa bile derlemeyi sürdürmek isteyeceksiniz. If you are building everything (not just the packages to make a flashable image), you will probably want to keep building all packages even if some have compile errors and won't be built.
# Derleme hatalarını yoksay IGNORE_ERRORS=1 make ... # Bellenim birleştirme aşaması dahil tüm hataları yoksay make -i ...
Başarılı bir inşa sonrası, yeni oluşmuş imaj(lar) yeni yaratılmış <inşakökü>/bin
dizini altında bulunabilir.
Derlenmiş dosyalar ek olarak hedef platform ve althedefe göre sınıflandırılırlar, örneğin bir ar71xx
cihaz için oluşturulmüş bir generic
bellenim <inşakökü>/bin/targets/ar71xx/generic
dizininde bulunur (ve paket dosyaları <inşakökü>/bin/packages/mips_24kc
altında).
Örneğin, eğer <inşakökü>
dizininiz ~/source
ise, ikilikleriniz ~/source/bin/targets/ar71xx/generic
ve ~source/bin/packages/mips_24kc
içindedirler.
Ayrıca bakın: Dizin yapısı
Ara sıra inşa ortamınızı temizlemeye ihtiyacınız olabilir.
Oluşturulan parçalar, aletzinciri, inşa araçları ve indirilmiş besi ve kaynaklar seçilip tezmizlenebilir.
Takip edem make
-hedef komutları bu iş için kullanışlıdır.
make clean
en sık gerek duyulan temizleme işlemidir.
> Cleaned components > v make argument v | Compiled binaries: firmware, kernel, packages | Toolchain (target-specific) | Build tools, tmp/ | Compiled config tools | .config | feeds, .ccache, downloaded source files |
---|---|---|---|---|---|---|
clean | x | |||||
targetclean | x | x | ||||
dirclean | x | x | x | x | ||
config-clean | x | |||||
distclean | x | x | x | x | x | x |
make clean
/bin
ve /build_dir
dizinlerinin içeriğini sil.
Bu, alet zincirini kaldırmaz, aynı zamanda .config
dosyanızda seçmiş olduğunuzdan başka mimariler/hedefleri temizlemekten sakınır.
İnşadan önce make clean
yapmak, önceki inşalardan eskimiş parçalar kalmadığından emin olmak için iyi bir pratiktir.
Bu her zaman gerekli olmayabilir, ama genel kural olarak inşa kalitesini sağlamaya yardım eder.
make targetclean
Bu make clean
'e ek olarak hedef-özgül alet zincirini de temizler. musl veya gcc gibi aletzinciri elemanları değiştiğinde gerekebilir.
Bir make clean
yapar ve /build_dir/toolchain*
ve /staging_dir/toolchain*
(= çapraz-derleme araçları) dizinlerini de siler.
Not: make targetclean
22.03'te kullanıma sunulmuştur ve önceki OpenWrt sürümlerinde bulunmaz.
make dirclean
Bu temel “tam temizlik” operasyonunuzdur. Tüm derlenmiş ikilik dosyalar, araçlar, aletzinciri, tmp/ vs.'yi temizler
/bin
, /build_dir
, /staging_dir
, /toolchain
(=çapraz-derleme araçları), /tmp
(örneğin paketlerle ilgili veri) ve /logs
dizinlerinin içeriğini siler.
make distclean
Derlediğiniz veya yapılandırdığınız herşeyi yoketer, ve aynı zamanda tüm indirilmiş besi içeriğini ve paket kaynaklarını siler.
Diğer herşeye ek olarak, <inşakökü>/.config
inşa yapılandırmanızı siler.
Sadece inşa sistemini “fabrika ayarlarına sıfırlama”ya ihtiyacınız varsa kullanın!
Bir süre sonra, o kadar çok nesneyi temizlemek istemeyebilirsiniz, o zaman aşağıdaki komutlardan bazılarını kullanabilirsiniz.
# Linux nesnelerini temizle make target/linux/clean # base-file paketi nesnelerini temizleme make package/base-files/clean # luci nesnelerini temizleme make package/luci/clean
make V=sc
biçiminde çalıştırarak veya çıktı kayıtlarını etkinleştirerek sorunla ilgili daha çok bilgi edinin.make
opsiyonlarıyla ilgili daha çok okuyun: İnşakökü Teknik referans.
Önce make dosyasındaki URL yolunun sonunda fazladan bölü olup olmadığını kontrol edin, varsa bölüyü kaldırıp deneyin.
Olmazsa kaynak kodu elle indirip dl
dizinine koyarak deneyin.
Ana kaynağı ve tüm besileri güncelleştirmeyi deneyin, bununla birlikte diğer olası sorunlardan sakının. İlgili meseleleri hata takipçisinde kontrol edin, yoksa paketi, hedefi (CPU, imaj, vs.) ve kod revizyonunu (ana & paket) anarak sorunu raporlayın.
Bazı paketler eski bağımlılıklara takılı kalıp uygun şekilde güncellenmemiş ve derlenmemiş olabilir, ve bu durum derlemenin başlangıcında şuna benzer uyarılarla sonuçlanır:
WARNING: Makefile 'package/feeds/packages/openssh/Makefile' has a dependency on 'libfido2', which does not exist
İnşa ortamı hata veren paketi kaldırıp yeniden yükleyerek kurtarılabilir
$ ./scripts/feeds uninstall openssh Uninstalling package 'openssh' $ ./scripts/feeds install openssh Installing package 'openssh' from packages Installing package 'libfido2' from packages Installing package 'libcbor' from packages
make menuconfig
çalıştırın ve paketiniz için derlemeyi etkinleştirin.
Düzgün çalışması için <*>
veya <M>
ile işaretlenmiş olmalı
Cihazınız için bir çakılabilir imaj oluşturmak üzere make
komutunu verdiğinizde, hem sysupgrade hem de factory imajları make config
veya make menuconfig
ile seçmiş olduğunuz tüm cihazlarla bağlantılı kartlar için oluşturulacaktır.
Eğer make
çalıştırmak seçmiş olduğunuz cihaz profilleriyle bağlantılı kartlarda biri (veya hepsi) için imaj(lar)ı oluşturmaz ise, olasılıkla çok fazla opsiyon veya paket seçtiniz/etkinleştirdiniz, ve imaj cihazınıza çakmak için fazla büyük oldu.