====== 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]]