Firmware selber bauen: Unterschied zwischen den Versionen

Aus Freifunk Dresden - Anwender-Wiki
Zur Navigation springen Zur Suche springen
(python2 -> python3)
 
(19 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 18: Zeile 18:
  
 
== Github ==
 
== Github ==
Github enthält einen relativen stabilen Softwarestand,wird aber nur in größeren Abständen synchronisiert.
+
Github enthält einen relativen stabilen Softwarestand,wird aber nur in größeren Abständen synchronisiert.<br/>
 
+
https://github.com/Freifunk-Dresden/firmware-freifunk-dresden
https://github.com/Freifunk-Dresden/firmware-freifunk-dresden
 
  
 
== Firmware Bauen ==
 
== Firmware Bauen ==
Zeile 27: Zeile 26:
 
Die Entwicklungsumgebung ist ein Linux. Die Firmware wurde bisher immer auf einem Ubuntu-System entwickelt. Bei Nutzung anderer Linux-Distributionen müssen evt. weitere Softwarepakete installiert werden, die hier nicht aufgeführt sind.
 
Die Entwicklungsumgebung ist ein Linux. Die Firmware wurde bisher immer auf einem Ubuntu-System entwickelt. Bei Nutzung anderer Linux-Distributionen müssen evt. weitere Softwarepakete installiert werden, die hier nicht aufgeführt sind.
  
'''System:''' mind. Ubuntu 16.04/18.04 64bit (z. B.: Ubuntu-Mate)
+
[[Datei:Firmbuspei.JPG|200px|thumb|right|]]
 +
'''System:''' mind. Ubuntu 20.04 64bit auch in VM möglich. 
 +
'''Es empfiehlt sich:'''
 +
* unbedingt die Verwendung einer SSD
 +
* mindestens 8GB RAM (besser 16GB)
 +
* soviel Kerne wie möglich
 +
* für einen kompletten Build Version (8.1.4 ca. 100GB) (8.1.7 ca. 165GB) freien Platz auf dem Massenspeicher (12/2022)
 +
* geschätzte Dauer mit 16 Kernen Ryzen 9 9590X + M2.SSD = 2 Stunden (12/2022)
 +
 +
'''Benötigte Softwarepakete'''
 +
https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem
 +
 
 +
* Aktualisieren der Paketliste und bereits installierter Pakete:
 +
  apt-get update && apt-get full-upgrade -y
  
'''Benötigte Softwarepakete'''
+
* Falls notwendig (z.B. in Dockercontainern oder auf Serverinstallationen, wo es fehlt).<br/> ''DEBIAN_FRONTEND'' ist notwendig wenn Timezone Pakete installiert und konfiguriert werden sollen. Diese erfordern normalerweise eine Nutzerinteraktion, was aber beim Installieren in Docker-Containern nicht möglich ist.
Python2 (2.7) muss deinstalliert werden, damit openwrt die installierte Version python3 verwendet.
+
  DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
apt-get remove python python2.7-minimal
+
 
  apt-get install unzip wget time rsync jq gawk gettext
+
* Installieren der notwendigen Pakete
  apt-get install git subversion build-essential flex python3
+
<pre>
apt-get install libssl-dev libncurses5-dev zlib1g-dev zlib1g-dev gcc-multilib
+
# Ubuntu bis Version 22.04 (bei 24.04 hat Ubuntu noch mehr Zeug eingeschränkt,
  apt-get install python-pathlib python-pathlib2 python-scandir
+
# so dass wichtige Pakete nicht mehr verfügbar sind)
 +
  apt-get install -y nodejs git build-essential devscripts debhelper \
 +
                dh-systemd python python3 python3-distutils dh-python libssl-dev libncurses5-dev unzip \
 +
                gawk zlib1g-dev subversion gcc-multilib flex gettext curl \
 +
                wget time rsync jq \
 +
                python3-pip python3-pypathlib python-pathlib2 python-scandir \
 +
                automake autoconf m4
 +
#-----------------------------------------------------------------------------------------------------------
 +
# Debian 12 (empfohlen)
 +
  apt-get install nodejs git build-essential devscripts debhelper python3 python3-distutils \
 +
                libssl-dev libncurses5-dev unzip gawk zlib1g-dev subversion \
 +
gcc-multilib flex gettext curl wget time rsync jq tmux
 +
 
 +
  # installiere python2 (nur wenn Openwrt 18 images gebaut werden sollen)
 +
  echo "deb http://archive.debian.org/debian/ stretch contrib main non-free" > /etc/apt/sources.list.d/debian-archive.list
 +
  apt update
 +
  apt install python2
 +
</pre>
  
 
=== Firmware-Checkout ===
 
=== Firmware-Checkout ===
  
Um die Firmware auf den eigenen Rechner zu bringen, wird das Kommando ''git'' verwendet. Wechsel dazu im Usermodus auf dem Entwicklungsrechner (wo die Firmware gebaut werden soll) in ein Verzeichnis, in welchem ''git'' das eigentliche Firmware-Verzeichnis anlegen soll.
+
Um die Firmware auf den eigenen Rechner zu bringen, wird das Kommando ''git'' verwendet. Wechsel dazu <span style="color: red"> im '''Usermodus''' (Nicht ROOT!)</span> auf dem Entwicklungsrechner (wo die Firmware gebaut werden soll) in ein Verzeichnis, in welchem ''git'' das eigentliche Firmware-Verzeichnis anlegen soll.
  
  git clone https://github.com/freifunk-dresden/firmware-freifunk-dresden.git
+
  git clone https://gitlab.freifunk-dresden.de/firmware-developer/firmware.git
  cd firmware-freifunk-dresden
+
  cd firmware
  
 
=== Firmware konfigurieren ===
 
=== Firmware konfigurieren ===
 
Die Firmware kann für verschieden Plattformen (Chipsets) gebaut werden. Alle aktuell unterstützten Plattformen/Geräte sind in <code>build.targets</code> definiert. Abhängig von der gewählten Plattform werden entweder gleich alle Router-Firmware-Varianten gebaut oder es muss jedes einzelne Geräte angegeben werden.
 
Die Firmware kann für verschieden Plattformen (Chipsets) gebaut werden. Alle aktuell unterstützten Plattformen/Geräte sind in <code>build.targets</code> definiert. Abhängig von der gewählten Plattform werden entweder gleich alle Router-Firmware-Varianten gebaut oder es muss jedes einzelne Geräte angegeben werden.
  
Dabei gibt es für jede dieser Zeilen ein eigenes Config-File im Verzeichnis ''lede-configs''. Für mehr Informationen dazu siehe die Kommentare in diesem File.
+
Dabei gibt es für jede dieser Zeilen ein eigenes Config-File im Verzeichnis ''openwrt-configs''. Für mehr Informationen dazu siehe die Kommentare in diesem File.
 
 
  
 
=== Firmware bauen ===
 
=== Firmware bauen ===
Zeile 54: Zeile 82:
 
Das Bauen übernimmt dann das Script <code> build.sh</code>.
 
Das Bauen übernimmt dann das Script <code> build.sh</code>.
  
<pre>
+
<pre style="font-size: 10px;">
> ./build.sh
+
$ ./build.sh  
Version: 6
+
Version: 13
usage: build.sh list | clean | feed-revisions | (target | all [menuconfig ] [rerun] [ <make params ...> ])
+
usage: build.sh list | search <string> | clean | feed-revisions | (target | all | failed [menuconfig ] [rerun] [ <make params ...> ])
 
  list            - lists all available targets
 
  list            - lists all available targets
 +
list-targets    - lists only target names for usage in IDE
 +
search          - search specific router (target)
 
  clean            - cleans buildroot/bin and buildroot/build_dir (keeps toolchains)
 
  clean            - cleans buildroot/bin and buildroot/build_dir (keeps toolchains)
 
  feed-revisions  - returns the git HEAD revision hash for current date (now).
 
  feed-revisions  - returns the git HEAD revision hash for current date (now).
Zeile 65: Zeile 95:
 
           that are defined by build.json. use 'list' for supported targets.
 
           that are defined by build.json. use 'list' for supported targets.
 
           'all'                  - builds all targets
 
           'all'                  - builds all targets
 +
          'failed'                - builds only previously failed or not built targets
 
           'ramips.*'              - builds all ramips targets only
 
           'ramips.*'              - builds all ramips targets only
 
           'ramips.rt305x.generic' - builds exact this target
 
           'ramips.rt305x.generic' - builds exact this target
 
           '^rt30.*'              - builds all that start with 'rt30'
 
           '^rt30.*'              - builds all that start with 'rt30'
 +
          'ramips.mt7621.generic ar71xx.tiny.lowmem' - space or pipe separates targets
 +
          'ramips.mt7621.generic | ar71xx.tiny.lowmem'
  
 
  menuconfig      - displays configuration menu
 
  menuconfig      - displays configuration menu
Zeile 73: Zeile 106:
 
                     If first make failes a second make is tried with this option
 
                     If first make failes a second make is tried with this option
 
  make params      - all paramerters that follows are passed to make command
 
  make params      - all paramerters that follows are passed to make command
 
 
</pre>
 
</pre>
 
''list'' liefert Informationen über die aktuell möglichen Targets. Verschiede Targets können dabei
 
''list'' liefert Informationen über die aktuell möglichen Targets. Verschiede Targets können dabei
 
aber mit verschiedenen Versionen von openwrt, feeds, files gebaut werden. Das hängt davon ab, wie die
 
aber mit verschiedenen Versionen von openwrt, feeds, files gebaut werden. Das hängt davon ab, wie die
 
Unterstützung durch openwrt noch gegeben ist.
 
Unterstützung durch openwrt noch gegeben ist.
<pre>
+
<pre style="font-size: 10px;">
./build.sh list
+
~/firmware$ ./build.sh list
-------------------------------------------------------------------------------------------------
+
build locally.
target                              | wrt_rev | wrt_var | config | feeds   | files   | patches
+
----------------------------------+------------+---------+----------+---------+---------+---------+------------------------------
--------------------------------------+---------+---------+---------+---------+---------+--------
+
  Name                            | Openwrt    | Openwrt | Openwrt | Feeds   | Files   | Patches | Build date
ar71xx.tiny.lowmem                   | f6de1fa | lowmem  | 18.06  | 18.06  |        | 18.06
+
                                  | Revision  | Variant | Selector |        |        |        |
ar71xx.generic.lowmem               | f6de1fa | lowmem  | 18.06  | 18.06  |        | 18.06
+
----------------------------------+------------+---------+----------+---------+---------+---------+------------------------------
ar71xx.generic                       | 74a8e36 |        | 19.07   | 19.07   |         | 19.07
+
+ ar71xx.generic.lowmem           | 5625f5bc3  | lowmem  | 18.06    | 18.06  | 18.06  | 18.06   | So 4. Dez 17:42:41 CET 2022
ar71xx.generic.gl-mifi               | 74a8e36 |        | 19.07   | 19.07   |         | 19.07
+
+ ar71xx.tiny.lowmem             | 5625f5bc3  | lowmem  | 18.06    | 18.06  | 18.06  | 18.06   | So 4. Dez 17:44:57 CET 2022
ar71xx.nand                         | 74a8e36 |        | 19.07   | 19.07   |        | 19.07
+
+ ath79.generic                   | 42a15ca37  |        | 21.02    | 21.02   | 21.02   | 21.02  | So 4. Dez 18:01:39 CET 2022
  x86.generic                         | 74a8e36 |        | 19.07   | 19.07   |        | 19.07
+
+ ath79.generic.gl-mifi           | 42a15ca37  |        | 21.02    | 21.02   | 21.02   | 21.02  | So 4. Dez 18:05:15 CET 2022
x64.generic                         | 74a8e36 |        | 19.07   | 19.07   |         | 19.07
+
+ ath79.nand                     | 42a15ca37  |        | 21.02    | 21.02  | 21.02   | 21.02   | So 4. Dez 18:08:09 CET 2022
  ramips.mt7621.generic               | 74a8e36 |        | 19.07   | 19.07   |        | 19.07
+
+ ath79.small                    | 42a15ca37  |        | 21.02    | 21.02  | 21.02  | 21.02  | So 4. Dez 18:10:54 CET 2022
  ramips.mt7621.ubiquiti-edgerouter-x | 74a8e36 |         | 19.07   | 19.07   |         | 19.07
+
+ ath79.small.smallbuffers        | 42a15ca37 |        | 21.02    | 21.02  | 21.02  | 21.02  | So 4. Dez 18:13:15 CET 2022
ramips.mt76x8.generic               | 74a8e36 |        | 19.07   | 19.07   |         | 19.07
+
+ ipq40xx.generic                 | 42a15ca37  |        | 21.02    | 21.02  | 21.02   | 21.02   | So 4. Dez 18:21:49 CET 2022
ramips.lantiq.xrx200                | 74a8e36 |        | 19.07   | 19.07   |         | 19.07
+
+ ipq40xx.generic.fritz-tffs-nand | 42a15ca37  |        | 21.02    | 21.02  | 21.02  | 21.02  | So 4. Dez 18:24:20 CET 2022
sunxi.cortexa7.generic               | 74a8e36 |        | 19.07   | 19.07   |         | 19.07
+
+ lantiq-xrx200.generic           | 42a15ca37  |        | 21.02    | 21.02   | 21.02   | 21.02  | So 4. Dez 18:26:56 CET 2022
ath79.generic                       | 74a8e36 |        | 19.07   | 19.07   |         | 19.07
+
+ lantiq-xrx200.small            | 42a15ca37 |        | 21.02    | 21.02  | 21.02  | 21.02  | So 4. Dez 18:29:11 CET 2022
ipq40xx.generic                     | 74a8e36 |        | 19.07   | 19.07   |        | 19.07
+
+ lantiq-xway.generic             | 42a15ca37  |        | 21.02    | 21.02  | 21.02   | 21.02   | So 4. Dez 18:31:40 CET 2022
-------------------------------------------------------------------------------------------------
+
+ lantiq-xway.small              | 42a15ca37  |        | 21.02    | 21.02  | 21.02  | 21.02  | So 4. Dez 18:33:55 CET 2022
 +
+ mediatek.mt7622.generic        | 677e3c18f |        | 22.03    | 22.03  | 22.03  | 22.03  | So 4. Dez 18:44:09 CET 2022
 +
+ mpc85xx.p1020                  | 42a15ca37 |         | 21.02    | 21.02   | 21.02   | 21.02  | So 4. Dez 18:51:56 CET 2022
 +
+ ramips.mt7620.generic           | 42a15ca37  |        | 21.02    | 21.02   | 21.02   | 21.02  | So 4. Dez 18:59:40 CET 2022
 +
+ ramips.mt7620.small            | 42a15ca37  |        | 21.02    | 21.02   | 21.02   | 21.02  | So 4. Dez 19:01:56 CET 2022
 +
+ ramips.mt7621.generic           | 42a15ca37  |        | 21.02    | 21.02   | 21.02   | 21.02  | So 4. Dez 19:04:45 CET 2022
 +
- ramips.mt7621.generic.22        | 677e3c18f  |        | 22.03    | 22.03  | 22.03  | 22.03  | So 4. Dez 19:06:55 CET 2022
 +
+ ramips.mt7621.offloader        | 42a15ca37  |        | 21.02    | 21.02   | 21.02   | 21.02  | So 4. Dez 19:09:12 CET 2022
 +
+ ramips.mt76x8.generic           | 42a15ca37  |        | 21.02    | 21.02  | 21.02  | 21.02  | So 4. Dez 19:11:28 CET 2022
 +
+ ramips.rt305x.tiny.lowmem      | 5625f5bc3  | lowmem  | 18.06    | 18.06   | 18.06  | 18.06  | So 4. Dez 19:17:38 CET 2022
 +
+ sunxi.cortexa7.offloader        | 42a15ca37  |        | 21.02    | 21.02  | 21.02   | 21.02  | So 4. Dez 19:21:08 CET 2022
 +
+ x86.64.offloader                | 42a15ca37  |        | 21.02    | 21.02  | 21.02  | 21.02  | So 4. Dez 19:36:46 CET 2022
 +
----------------------------------+------------+---------+----------+---------+---------+---------+------------------------------
 
</pre>
 
</pre>
  
 
=== Neue Plattformen hinzufügen ===
 
=== Neue Plattformen hinzufügen ===
  
Das Hinzufügen neuer Targets ist etwas komplex. Es gibt dazu mehrere Schritte:
+
Das Hinzufügen neuer Targets ist etwas komplex.
Wenn ein Router hinzugefügt werden soll, für den es ein Target bereits existiert, so sollte das '''generic''' target
+
Wenn ein Router hinzugefügt werden soll, für den es ein Target bereits existiert, so sollte das '''generic''' target genutzt werden. <br>
genutzt werden. <br>
+
Beispiel (sobald der Befehl ausgeführt wird, werden evtl. bereits erstellte Targets gelöscht):
Beispiel:
+
 
 
  ./build.sh ar71xx.generic menuconfig
 
  ./build.sh ar71xx.generic menuconfig
  
Nun wird die Konfiguration von openwrt angezeigt, in der der neue Router hinzugefügt werden kann. Alles andere bleibt
+
Nun wird die Konfiguration von openwrt angezeigt, in der ein neuer Router hinzugefügt werden kann. Alles andere bleibt unverändert. Nach dem Speichern und beenden, wird das entsprechende Config-File in openwrt-config/.../ automatisch angepasst.<br>
unverändert. Nach dem Speichern und beenden, wird das entsprechende Config-File in openwrt-config/.../ angepasst.<br>
 
 
Gebaut wird dann mit
 
Gebaut wird dann mit
./build.sh ar71xx.generic -j4  # -j4 ist optional und gibt die Anzahl der CPU cores an, die das Bauen beschleunigen.
 
  
Muss eine neue Plattform angelegt werden, so erfolgt diese in mehreren Schritten mit Hilfe des folgenden Scripts:
+
  ./build.sh ar71xx.generic
  ~/firmware/openwrt-configs/post-process-config.sh
 
Dieses Zeigt ohne Parameter die Schritte an, wie die Konfiguration angelegt werden muss.
 
  
Generell dürfen für eine Platform nicht pauschal Module hinzugefügt werden,
+
Muss eine neue Plattform angelegt werden, so erfolgt diese in mehreren Schritten:<br/>
da Kernelmodule unkontrolliert im firmware Image landen. Das hat zur Folge, dass die images zu groß werden, oder ein Softwareupdate
+
* Anlegen eines neuen Eintrages in ''build.json'' .Meist wird generic verwendet, nur bei speziellen Anpassungen kann hier ein anderer Name spezifiziert werden. Dieses dient dazu verschiedene Openwrt-Buildumgebungen nebeneinander zu halten, die unterschiedliche Patches beinhalten.<br/>Hat man zwei Router mit speziellen nachträglichen Anpassungen (via patches), so können diese sich gegenseitig stören und Funktionalitäten unkontrolliert beeinflussen. Damit das nicht passiert, können für eine Plattform diese Build-Umgebungen getrennt werden.
anschliessend nicht mehr möglich ist.
+
* Aufruf des Buildsystems mit 'menuconfig'
 +
./build.sh platform.generic menuconfig
 +
Unterhalb des Konfigurationsverzeichnisses ''openwrt-config'' gibt es für jede unterstützte Openwrt Version ein eigenes Verzeichnis (18.06, 19.04, 21.04).<br/>
 +
Hier liegt bereits eine ''default'' configuration, die beim Aufruf von ''build.sh'' automatisch als Vorlage dient, so dass mit dem Konfigurationsmenu nur noch die Freifunk Dresden spezifischen Dinge gewählt werden müssen.

Aktuelle Version vom 10. September 2024, 21:46 Uhr

Die Firmware kann entweder unter Download fertig kompiliert herruntergeladen werden oder man kann sich diese selber bauen.

Ein Knoten, welcher aus diesem Repository gebaut wird, taucht dann als 'Alternativer' Knoten in der Hotspot-Liste auf. Werden keine weiteren Anpassungen gemacht, erfüllt dieser die Knoten Spezifikation.

Bei Anpassungen müssen diese Spezifikationen aber weiterhin sichergestellt sein! Falls das nicht möglich ist, bitte kontaktiert Freifunk Dresden diesbezüglich. Dann können wir sehen, inwieweit davon abgewichen werden kann.

Hinter dieser Spezifikation stecken verschiedene Ideen, um anderen Leuten eine bestimmte Funktionalität zu garantieren.

Quellcode

Haupt Git-Repository

Das Haupt Repository ist öffentlich (schreibgeschützt) enthält immer jede Änderung. Der Hauptserver implementiert dazu einen Linux-Container.

HTTPS: https://gitlab.freifunk-dresden.de/firmware-developer/firmware.git
SSH: ssh://git@git.freifunk-dresden.de:2201/~/firmware.git

Github

Github enthält einen relativen stabilen Softwarestand,wird aber nur in größeren Abständen synchronisiert.
https://github.com/Freifunk-Dresden/firmware-freifunk-dresden

Firmware Bauen

Entwicklungsumgebung

Die Entwicklungsumgebung ist ein Linux. Die Firmware wurde bisher immer auf einem Ubuntu-System entwickelt. Bei Nutzung anderer Linux-Distributionen müssen evt. weitere Softwarepakete installiert werden, die hier nicht aufgeführt sind.

Firmbuspei.JPG

System: mind. Ubuntu 20.04 64bit auch in VM möglich.

Es empfiehlt sich: 
* unbedingt die Verwendung einer SSD
* mindestens 8GB RAM (besser 16GB) 
* soviel Kerne wie möglich
* für einen kompletten Build Version (8.1.4 ca. 100GB) (8.1.7 ca. 165GB) freien Platz auf dem Massenspeicher (12/2022) 
* geschätzte Dauer mit 16 Kernen Ryzen 9 9590X + M2.SSD = 2 Stunden (12/2022)

Benötigte Softwarepakete https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem

  • Aktualisieren der Paketliste und bereits installierter Pakete:
  apt-get update && apt-get full-upgrade -y
  • Falls notwendig (z.B. in Dockercontainern oder auf Serverinstallationen, wo es fehlt).
    DEBIAN_FRONTEND ist notwendig wenn Timezone Pakete installiert und konfiguriert werden sollen. Diese erfordern normalerweise eine Nutzerinteraktion, was aber beim Installieren in Docker-Containern nicht möglich ist.
  DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
  • Installieren der notwendigen Pakete
 # Ubuntu bis Version 22.04 (bei 24.04 hat Ubuntu noch mehr Zeug eingeschränkt, 
 # so dass wichtige Pakete nicht mehr verfügbar sind)
 apt-get install -y nodejs git build-essential devscripts debhelper \
                dh-systemd python python3 python3-distutils dh-python libssl-dev libncurses5-dev unzip \
                gawk zlib1g-dev subversion gcc-multilib flex gettext curl \
                wget time rsync jq \
                python3-pip python3-pypathlib python-pathlib2 python-scandir \
                automake autoconf m4
 #-----------------------------------------------------------------------------------------------------------
 # Debian 12 (empfohlen)
 apt-get install nodejs git build-essential devscripts debhelper python3 python3-distutils \
                libssl-dev libncurses5-dev unzip gawk zlib1g-dev subversion \
		gcc-multilib flex gettext curl wget time rsync jq tmux

 # installiere python2 (nur wenn Openwrt 18 images gebaut werden sollen)
  echo "deb http://archive.debian.org/debian/ stretch contrib main non-free" > /etc/apt/sources.list.d/debian-archive.list
  apt update
  apt install python2

Firmware-Checkout

Um die Firmware auf den eigenen Rechner zu bringen, wird das Kommando git verwendet. Wechsel dazu im Usermodus (Nicht ROOT!) auf dem Entwicklungsrechner (wo die Firmware gebaut werden soll) in ein Verzeichnis, in welchem git das eigentliche Firmware-Verzeichnis anlegen soll.

git clone https://gitlab.freifunk-dresden.de/firmware-developer/firmware.git
cd firmware

Firmware konfigurieren

Die Firmware kann für verschieden Plattformen (Chipsets) gebaut werden. Alle aktuell unterstützten Plattformen/Geräte sind in build.targets definiert. Abhängig von der gewählten Plattform werden entweder gleich alle Router-Firmware-Varianten gebaut oder es muss jedes einzelne Geräte angegeben werden.

Dabei gibt es für jede dieser Zeilen ein eigenes Config-File im Verzeichnis openwrt-configs. Für mehr Informationen dazu siehe die Kommentare in diesem File.

Firmware bauen

Das Bauen übernimmt dann das Script build.sh.

$ ./build.sh 
Version: 13
usage: build.sh list | search <string> | clean | feed-revisions | (target | all | failed [menuconfig ] [rerun] [ <make params ...> ])
 list             - lists all available targets
 list-targets     - lists only target names for usage in IDE
 search           - search specific router (target)
 clean            - cleans buildroot/bin and buildroot/build_dir (keeps toolchains)
 feed-revisions   - returns the git HEAD revision hash for current date (now).
                    The revisions then could be set in build.json
 target           - target to build (can have regex)
          that are defined by build.json. use 'list' for supported targets.
          'all'                   - builds all targets
          'failed'                - builds only previously failed or not built targets
          'ramips.*'              - builds all ramips targets only
          'ramips.rt305x.generic' - builds exact this target
          '^rt30.*'               - builds all that start with 'rt30'
          'ramips.mt7621.generic ar71xx.tiny.lowmem' - space or pipe separates targets
          'ramips.mt7621.generic | ar71xx.tiny.lowmem' 

 menuconfig       - displays configuration menu
 rerun            - enables a second compilation with make option 'V=s'
                    If first make failes a second make is tried with this option
 make params      - all paramerters that follows are passed to make command

list liefert Informationen über die aktuell möglichen Targets. Verschiede Targets können dabei aber mit verschiedenen Versionen von openwrt, feeds, files gebaut werden. Das hängt davon ab, wie die Unterstützung durch openwrt noch gegeben ist.

~/firmware$ ./build.sh list
build locally.
----------------------------------+------------+---------+----------+---------+---------+---------+------------------------------
  Name                            | Openwrt    | Openwrt | Openwrt  | Feeds   | Files   | Patches | Build date
                                  | Revision   | Variant | Selector |         |         |         |
----------------------------------+------------+---------+----------+---------+---------+---------+------------------------------
+ ar71xx.generic.lowmem           | 5625f5bc3  | lowmem  | 18.06    | 18.06   | 18.06   | 18.06   | So 4. Dez 17:42:41 CET 2022
+ ar71xx.tiny.lowmem              | 5625f5bc3  | lowmem  | 18.06    | 18.06   | 18.06   | 18.06   | So 4. Dez 17:44:57 CET 2022
+ ath79.generic                   | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:01:39 CET 2022
+ ath79.generic.gl-mifi           | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:05:15 CET 2022
+ ath79.nand                      | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:08:09 CET 2022
+ ath79.small                     | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:10:54 CET 2022
+ ath79.small.smallbuffers        | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:13:15 CET 2022
+ ipq40xx.generic                 | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:21:49 CET 2022
+ ipq40xx.generic.fritz-tffs-nand | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:24:20 CET 2022
+ lantiq-xrx200.generic           | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:26:56 CET 2022
+ lantiq-xrx200.small             | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:29:11 CET 2022
+ lantiq-xway.generic             | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:31:40 CET 2022
+ lantiq-xway.small               | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:33:55 CET 2022
+ mediatek.mt7622.generic         | 677e3c18f  |         | 22.03    | 22.03   | 22.03   | 22.03   | So 4. Dez 18:44:09 CET 2022
+ mpc85xx.p1020                   | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:51:56 CET 2022
+ ramips.mt7620.generic           | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 18:59:40 CET 2022
+ ramips.mt7620.small             | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 19:01:56 CET 2022
+ ramips.mt7621.generic           | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 19:04:45 CET 2022
- ramips.mt7621.generic.22        | 677e3c18f  |         | 22.03    | 22.03   | 22.03   | 22.03   | So 4. Dez 19:06:55 CET 2022
+ ramips.mt7621.offloader         | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 19:09:12 CET 2022
+ ramips.mt76x8.generic           | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 19:11:28 CET 2022
+ ramips.rt305x.tiny.lowmem       | 5625f5bc3  | lowmem  | 18.06    | 18.06   | 18.06   | 18.06   | So 4. Dez 19:17:38 CET 2022
+ sunxi.cortexa7.offloader        | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 19:21:08 CET 2022
+ x86.64.offloader                | 42a15ca37  |         | 21.02    | 21.02   | 21.02   | 21.02   | So 4. Dez 19:36:46 CET 2022
----------------------------------+------------+---------+----------+---------+---------+---------+------------------------------

Neue Plattformen hinzufügen

Das Hinzufügen neuer Targets ist etwas komplex. Wenn ein Router hinzugefügt werden soll, für den es ein Target bereits existiert, so sollte das generic target genutzt werden.
Beispiel (sobald der Befehl ausgeführt wird, werden evtl. bereits erstellte Targets gelöscht):

./build.sh ar71xx.generic menuconfig

Nun wird die Konfiguration von openwrt angezeigt, in der ein neuer Router hinzugefügt werden kann. Alles andere bleibt unverändert. Nach dem Speichern und beenden, wird das entsprechende Config-File in openwrt-config/.../ automatisch angepasst.
Gebaut wird dann mit

./build.sh ar71xx.generic 

Muss eine neue Plattform angelegt werden, so erfolgt diese in mehreren Schritten:

  • Anlegen eines neuen Eintrages in build.json .Meist wird generic verwendet, nur bei speziellen Anpassungen kann hier ein anderer Name spezifiziert werden. Dieses dient dazu verschiedene Openwrt-Buildumgebungen nebeneinander zu halten, die unterschiedliche Patches beinhalten.
    Hat man zwei Router mit speziellen nachträglichen Anpassungen (via patches), so können diese sich gegenseitig stören und Funktionalitäten unkontrolliert beeinflussen. Damit das nicht passiert, können für eine Plattform diese Build-Umgebungen getrennt werden.
  • Aufruf des Buildsystems mit 'menuconfig'
./build.sh platform.generic menuconfig

Unterhalb des Konfigurationsverzeichnisses openwrt-config gibt es für jede unterstützte Openwrt Version ein eigenes Verzeichnis (18.06, 19.04, 21.04).
Hier liegt bereits eine default configuration, die beim Aufruf von build.sh automatisch als Vorlage dient, so dass mit dem Konfigurationsmenu nur noch die Freifunk Dresden spezifischen Dinge gewählt werden müssen.