Wiki:help/howtos/development/create_cross-compiler_toolchain

Howtos: Entwicklung

  1. Entpacken und Packen von Firmware-Images
    1. Tools und Syntax
    2. Vorgehensweise
    3. Verwendung von fwmod im "no freetz"-Modus
  2. Patches in Freetz einspielen
  3. Example 3: NZBGet
    1. Build manually
    2. Add package to Freetz
    3. Create new image with added package
    4. Testing
    5. Preparing New Package for Public Integration to Freetz Trunk
  4. Example 2: par2cmdline
    1. Build manually
    2. Add package to Freetz
    3. Create new image with added package
    4. Testing
    5. Preparing New Package for Public Integration to Freetz Trunk
  5. Example 1: Httptunnel
    1. Build manually
    2. Add package to Freetz
    3. Call Procedures "make menuconfig" and "make"
    4. Testing
    5. Preparing New Package for Public Integration to Freetz Trunk
    1. Signieren von Firmware
    2. Konkrete Anwendung in Freetz
  6. Ablauf eines Firmware-Updates
  7. Eigene Programme kompilieren
  8. Dynamische Bandbreitenanzeige per SVG
    1. Anleitung zur Test-Installation
  9. Platz sparen im Dateisystem der FritzBox
    1. Vorwort und Motivation
    2. Bestandsaufnahme: Wo stecken die Platzfresser?
    3. Weitere Spartricks
    4. Schlußwort
  10. Flash-Partitionen im laufenden Betrieb sichern
    1. Motivation
    2. Voraussetzungen
    3. Lösungsweg
    4. Wege, sich schnell einen Überblick zu verschaffen
    5. Zusammenfassung
  11. Release Management
    1. Subversion Repository
    2. Checklists
    3. GIT
    4. Downloads
    5. References
  12. First steps - How to start your first freetz package
    1. Info
    2. Build Environment
    3. File Structure
    4. Examples Binary Package
    5. Configuration Handling
    6. Examples Web-Interface
    7. Trouble shooting
  13. Kernel konfigurieren und kompilieren
  14. Menükonfiguration pflegen
    1. Einstieg
    2. Beispiel-Konfiguration für ein neues Paket
    3. Menuconfig-Warnungen beheben
    4. Erklärung und Anwendung der erweiterten MK-Targets
    5. Syntax-Fehler in MK-Dateien finden
    6. Syntax-Hervorhebung für MK-Dateien
  15. ADAM2-Bootloader
    1. Bootloader-Backup anlegen
    2. Bootloader überschreiben
    3. Bootloader-Befehle
    4. Bootloader-Quelltext
    5. Aufbau des Bootloaders
    6. Bootloader und Freetz
  16. Einstellungen speichern im Urlader-Environment
    1. Vorwort und Motivation
    2. Lösungsmöglichkeiten
    3. Bootloader Environment
    4. Variable "kernel_args"
    5. Kernel_Args-API
    6. Mögliche Anwendungsfälle
  17. Busybox konfigurieren und kompilieren
  18. Wie baue ich ein eigenes Paket für Freetz?
  19. Firmware-Image-Namen analysieren und interpretieren
    1. Einleitung
    2. Skript-Code
    3. Daten im Rohformat
    4. Ausgabe grundlegender Informationen
    5. Ausgabe erweiterter Informationen
    1. Web-interface HTTPTunnel
  20. Developer Information
  21. Addon Paket installieren
  22. Paketverwaltung für Freetz
    1. Erweiterung des Dateisystems
    2. Paketverwaltung
    3. Links
    4. Kommentare
  23. Wie die FritzBox Manipulationen erkennt
    1. Ursachen
    2. Diagnose
    3. Lösungen
    4. Schlußwort und Ausblick
  24. Shell Coding Conventions
    1. Shell Language
    2. Basic Format
    3. If, For, and While
    4. Test Built-in
    5. Single-line conditional statements
    6. Infinite Loops
    7. Exit Status and If/While Statements
    8. Variable References
    9. Variable Naming
    10. Quoting
    11. Variable Assignments
    12. Testing for (Non-)Empty Strings
    13. Commenting
    14. Pathnames
    15. Interpreter Magic
  25. Package Development
    1. Persistent Package Settings
  26. Erstellen einer GUI für Pakete in Freetz
    1. Motivation
    2. Grundlagen
    3. Wie funktioniert das mit der GUI?
  27. Flash Partitionierung
    1. Hidden SquashFS
    2. Contiguous SquashFS
    3. Hidden Root
    4. NAND Root
    5. Dateisystem
    6. Kernel
    7. Weblinks
  28. Trac Hooks
    1. trac-post-commit-hook
    2. trac-post-revprop-change-hook
  29. Package Developing - Advanced Topics
    1. Adding conditional patches
    2. Adding multi-binary packages
  30. Eigene Dateien in die Firmware integrieren
    1. Feste Integration über das Freetz Image
    2. Erzeugen der Dateien aus der debug.cfg
    3. Nachladen vom Webserver
    4. Nachladen vom USB-Stick
    5. WebDAV Share mounten
    6. NFS-Share mounten
  31. Freetz Build-Prozeß
    1. Vorwort und Motivation
    2. Grundsätzliches
  32. Flash-Partitionen von außen mit FTP sichern
    1. Motivation
    2. Voraussetzungen
    3. Allgemeine Informationen zur Datensicherung
    4. Sicherung mit Linux-Standard-FTP (ftp)
    5. Sicherung mit Linux-NcFTP (ncftpget)
    6. Sicherung mit Cygwin-NcFTP (ncftpget)
    7. Uploads via FTP
  33. libmodcgi.sh
    1. cgi
    2. cgi_begin
    3. cgi_end
    4. sec_begin
    5. sec_end
    6. html
    7. check, select
    8. href
    9. back_button
    10. sec_level
    11. stat_bar
    12. cgi_param
    13. cgi_error, print_error
    14. path_info
    15. valid
  34. Cross-Compiler / Toolchain erstellen
  35. Eigene Download-Toolchain erstellen
  36. Target/Native-Compiler-Toolchain erstellen
    1. Using the dev-tools package to install compiler and tools

Cross-Compiler / Toolchain erstellen

Das Erstellen eines Cross-Compilers ist mit Freetz denkbar einfach:

  1. make menuconfig Hier unter Advanced options → Compiler options die Optionen für den Cross-Compiler wählen. Soll der Compiler Programme für eine mit Freetz erzeugte Firmware kompilieren, so ist in der Regel nichts zu ändern. Soll der Compiler hingegen für eine originale Firmware kompilieren können, so solltest du bei "uClibc config" die entsprechende Konfiguration auswählen.
    /!\ ACHTUNG: Im zweiten Fall sollte diese entpackte Instanz von Freetz nicht mehr zum Erstellen von Images verwendet werden, sondern nur noch der Cross-Compiler selbst.
  2. Benötigt wird gcc, binutils, make, bison, flex und texinfo: make toolchain
    Eine ganze Weile und ca 2 GB später wurden zwei Cross-Compiler erstellt:
    • ./toolchain/kernel/bin/*-unknown-linux-gnu-gcc : Cross-Compiler für die Kernel Sourcen
    • ./toolchain/target/bin/*-linux-uclibc-gcc : Cross-Compiler für Userspace Programme
  3. make libs Erstellt alle im menuconfig ausgewählten Libraries und installiert deren Header.

Eigene Download-Toolchain erstellen

Aus und seit r9983:

From now on one can build his own toolchains and use them as download toolchains by overriding the corresponding options under "Override options/Override precompiled toolchain options":

  1. activate "Toolchain options/Build own toolchains"
  2. set toolchain related options to the desired ones under "Toolchain options"
  3. (optional) make your own modifications under $(freetz_root)/toolchain
  4. call "make KTV=freetz-${MY_VERSION}-${MY_SUFFIX} TTV=freetz-${MY_VERSION}-${MY_SUFFIX} toolchain"
  5. wait the build to complete
  6. (optional) upload created download toolchain files to some site

The toolchains created in steps above can then be reused:

  1. activate "Toolchain options/Download and use precompiled toolchains"
  2. activate "Override options/Override precompiled toolchain options"
  3. set version/suffix/md5/download-site values to the values used in the steps above
  4. adjust gcc/uClibc versions under "Toolchain options", set them to the same values as in step 2

Target/Native-Compiler-Toolchain erstellen

Some times it is easier to use a native development tools and compiler on the FritzBox directly by calling ./configure and build dependent libraries, test the according binaries directly on the box and find out configure options for packages which do not work for cross-compiling. Compiling can already be done for an 7270 box, performance-wise.

There are some general pre-requisite to meet:

  • connect an external USB-drive with an additional swap and ext3 partition
  • add a directory/mountpoint /usr/local , easy creatable with the addon package to point to your writeable USB drive achievable with a mount command which is executed with the autorun.sh script using the Freetzmount mechanism, e.g.
    mount -o /var/InternerSpecher/uStor03/local /usr/local

Now you have only to create the according target compiler and libraries

  • select Level of user (Expert), select Toolchain options → Build binutils and gcc for target and select needed libraries in Shared libraries
  • select Busybox applets → developer tools and the make binaries
  • build freetz image and copy some necessary libs to the addon package and re-build the image
    cp -R toolchain/target/target-utils/lib addon/own-files-0.1/root
  • now you have only to archive the cross compiled native binaries and unpack this binaries on your box to /usr/local and to correct some links:
    tar -cf ~/compiler.tar -C toolchain/target/target-utils/usr .
    tar -cf ~/libsincs.tar -C toolchain/target/ bin lib include share
    rm /usr/local/lib/libc.so /usr/local/lib/libpthread.so && (cd /usr/local/lib; ln -s /lib/libc.so.0 libc.so; ln -s /lib/libpthread.so.0 libpthread.so)

This is already enough for writing and testing hello world programs.

Using the linux configure mechanism on the box needs some further things to do

  • adapting the paths in pkgconfig files (*.pc), config files and library linker files (*.la)
    for i in /usr/local/lib/pkgconfig/*.pc; do sed 's~/home.*uclibc/usr~/usr/local~' $i > $i.tmp; mv $i.tmp $i; done
    for i in /usr/local/bin/*-config; do sed 's~/home.*uclibc/usr~/usr/local~' $i > $i.tmp; mv $i.tmp $i; chmod a+x $i; done
    for i in /usr/local/lib/*.la; do sed 's~/home.*uclibc/usr~/usr/local~' $i > $i.tmp; mv $i.tmp $i; done
  • the tools m4, autoconf, automake, bison and flex have to be downloaded and installed, whereas the sources should be unpacked to /usr/local/src
    ./configure --prefix=/usr/local --disable-nls && make install

There you are, now configuring and making perl or other complex linux packages from source should be fine.

Using the dev-tools package to install compiler and tools

  • add dev-tools patch from #2722 and toolchain.patch from #2650 using similar commands as:
    for f in $(svn --dry-run patch dev-tools_v4.patch | grep target | tr -d "'" | cut -d' ' -f4); do mkdir -p $(dirname $f); touch $f; svn add $(dirname $f) 2> /dev/null; rm $f; done
    svn patch dev-tools_v4.patch
    svn patch toolchain.patch
  • use your Download toolchain and select Dev-Tools package and choose Amount of tools → compiler (fully functional ..), select External processing → Dev-Tools
  • create image and external file, the external file can be uploaded via the Freetz web interface
    (only if the external file becomes too big, you have to split it into several files package-wise with acccording option or you have to copy it manually to your box and to untar into the external directory
    tar -xf *.external -C /usr/local
  • before building you have to set the environment by sourcing the compiler settings /usr/local/bin/CFLAGS.sh
    . /usr/local/bin/CFLAGS.sh