====== Kompilace ======
===== GCC =====
Toto je základní varianta pro použití v učebnách.
Pro kompilaci pomocí gcc je třeba mít speciální konfiguraci kompilatoru gcc a to ''arm-linux-gnueabihf-gcc''. V laboratořích a na serveru Postel je tento kompilátor k dispozici.
^ Binární balíčky ^^
| Debian/Ubuntu | ''crossbuild-essential-armhf'' |
| ArchLinux | ''arm-linux-gnueabihf-{gcc,gdb,glibc,binutils}'' |
| Fedora | ''arm-linux-gnu-gcc'' + target glibc copy |
Seznam je průběžně doplňován. Další balíčky můžete navrhnou svému cvičícímu.
==== GCC on Fedora ====
Na systému Fedora je k dispozici kompilátor
sudo dnf install arm-linux-gnu-gcc
ale pro jeho použití je nutné nakopírovat knihovny a hlavičkové soubory odpovídající cílovému systému do adresáře ''/usr/arm-linux-gnu/sys-root''. Lze to buď přímo z MZ_APO kitů nebo z instalace Debian pro prostředí laboratoří
sudo scp -r cvut_login@postel.felk.cvut.cz:/usr/arm-linux-gnueabihf/include /usr/arm-linux-gnu/sys-root
sudo scp -r cvut_login@postel.felk.cvut.cz:/usr/arm-linux-gnueabihf/lib /usr/arm-linux-gnu/sys-root
Kompatibilita mezi verzemi knihovny a kompilátoru nemusí být zaručená.
==== GCC on Nix ====
The Flake file ''flake.nix'' for the cross-toolchain build
# flake.nix
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
};
outputs = {nixpkgs, ...}: let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
crossSystem = {
config = "armv7l-linux-gnueabihf";
};
};
in {
devShells.${system}.default = import ./nix/shell.nix {inherit pkgs;};
};
}
The Shell file ''nix/shell.nix'' for its use
# nix/shell.nix
{pkgs, ...}:
pkgs.mkShell {
buildInputs = [
pkgs.glibc
pkgs.glibc.static
];
makeFlags = [
"CC=${pkgs.stdenv.cc.targetPrefix}cc"
"CXX=${pkgs.stdenv.cc.targetPrefix}g++"
];
}
Suggested by Šimon Brandner.
===== GCC pro Apple MAC OS =====
Archivy se zkompilovaným GCC kompilátorem pro GNU/Linux ARM-32 Hard Float a příslušné konfigurace jsou k dispozici
[[https://cmp.felk.cvut.cz/~pisa/apo/mz_apo/macos/|https://cmp.felk.cvut.cz/~pisa/apo/mz_apo/macos/]]
Je potřeba stáhnout archivy a rozbalit z rootu systému, cesty pro vzájemné hledání assembleru z GCC a naopak GCC z linkeru jsou absolutní a na rozdíl od jiných buildů pro Linux, relativní hledání v MAC OS buildech nechodí...
sudo -i
cd /
tar -xf binutils-arm-linux-gnueabihf_2.44_macos.tar.gz
tar -xf gcc-arm-linux-gnueabihf_12.4.0_macos.tar.gz
tar -xf target-libs-arm-linux.tar.gz
Archiv ''target-libs-arm-linux.tar.gz'' jsou zkopírované knihovny a hlavičkové soubory z křížového překladače na Debianu 12.
Prefix instalace je ''/usr/local'', vlastní hlavní spustitelný příkaz kompilátoru a assembleru se umístí do ''/usr/local/bin'' jako ''arm-linux-gnueabihf-*'' . Knihovny, hlavičky a kopie assembleru pro GCC se umístí do ''/usr/local/arm-linux-gnueabihf'', GCC specifické ARM knihovny a hlavičky do ''/usr/local/lib/gcc/arm-linux-gnueabihf/12.4.0'' a vlastní GCC drivery volané z wrapperů v ''bin'' do ''/usr/local/libexec/gcc/arm-linux-gnueabihf/12.4.0''. Zatím není otestovaná kompilace C++ programů i když kompilátor je přítomný.
Funkčnost již byla ověřená i na jiném Mac počítači než kde byl řetězec kompilovaný, tak by snad měl být přenositelný.
===== Zig cc / Clang =====
Doporučeno pro macOS a Windows
Kompilátor ''Clang'' umožnuje crosscompilaci bez nutnosti specializovaného compileru, nicméně sám o sobě neneřeší druhotné problémy, jako jsou například základní knihovny. S tím nám pomůže nástroj ''zig cc'' (pro jazyk C), případně ''zig cxx'' (pro C++).
==== Instalace ====
Nejjednodušší variantou je instalace pomocí správce balíčků, která je ale dostupná pouze pro některé systémy. [[https://github.com/ziglang/zig/wiki/Install-Zig-from-a-Package-Manager|Detaily naleznete zde.]]
Pokud váš systém není na seznamu, stáhněte si přímo spustitelný soubor ([[https://ziglang.org/download/|zde]]) a umístěte jej do zvoleného adresáře v ''path''. Alternativně můžete v ''Makefile'' použít absolutní cestu ke spustitelnému souboru.
==== Použití ====
Nahraďte v ''Makefile'' ''arm-linux-gnueabihf-gcc'' za ''zig cc --target=arm-linux-gnueabihf'' a ''arm-linux-gnueabihf-g+ +'' za ''zig cxx --target=arm-linux-gnueabihf''
==== Další informace ====
[[https://andrewkelley.me/post/zig-cc-powerful-drop-in-replacement-gcc-clang.html|`zig cc`: a Powerful Drop-In Replacement for GCC/Clang]]