hbuild

Nowoczesny system budowania dla HackerOS — wielojęzykowy, sandboxowany, świadomy kontenerów. Wbudowany w każdą edycję systemu.

Wprowadzenie

hbuild to narzędzie budowania zaprojektowane wyłącznie dla HackerOS Linux. Zastępuje make, cmake, meson i ninja jednym spójnym interfejsem obsługującym ponad 20 języków programowania, zaawansowane zarządzanie zależnościami (git, lokalne, binarne, systemowe), budowanie w efemerycznych kontenerach, sandbox oparty o Linux namespaces + seccomp, oraz system pluginów (Lua / WASM / dynlib).

hbuild jest wbudowany w HackerOS — nie wymaga żadnej dodatkowej instalacji.

Quickstart

# Zainicjuj projekt (tworzy hbuild.config w aktualnym katalogu)
hbuild setup

# Zbuduj projekt (domyślny profil: release)
hbuild make

# Zbuduj z profilem debug
hbuild make --profile debug

# Zbuduj w izolowanym kontenerze
hbuild make --container

# Zbuduj w sandboxie (namespaces + seccomp)
hbuild make --sandbox

# Cross-kompilacja na aarch64
hbuild make --target aarch64-unknown-linux-gnu

# Wyczyść artefakty
hbuild clean

# Wyczyść i zbuduj od nowa
hbuild remake

# Zainstaluj do systemu (lub ~/.local gdy nie root)
hbuild install

# Spakuj do .deb lub .tar.gz
hbuild bundle

# Wygeneruj dokumentację
hbuild doc

# Zaktualizuj hbuild z repozytorium
hbuild self-update

Podkomendy i opcje

PodkomendaOpis
setupTworzy szkielet hbuild.config w katalogu projektu.
makeBuduje projekt. Pobiera i rozwiązuje zależności, uruchamia odpowiednie kompilatory.
cleanUsuwa katalog build/ oraz pliki stanu.
remakeOdpowiednik clean + make.
installKopiuje artefakty do /usr/local (root) lub ~/.local. Obsługuje zmienną DESTDIR.
bundleTworzy pakiet dystrybucyjny (.deb lub .tar.gz).
docGeneruje dokumentację (cargo doc, Doxygen, pydoc, jsdoc).
self-updateAktualizuje hbuild ze źródeł w ~/.hbuild-src.

Opcje globalne

OpcjaWartościOpis
--profiledebug / release / testing / productionProfil budowania (domyślnie: release).
--targettriple (np. aarch64-linux-gnu)Cel cross-kompilacji.
--sandboxUruchamia kompilatory w izolacji (mount/net namespace + seccomp).
--containerUruchamia cały krok budowania w efemerycznym kontenerze overlay.

Profile budowania

ProfilFlagi C/C++StripLTOPrzeznaczenie
debug-O0 -gnienieDebugowanie, szybka iteracja.
release-O3 -staktakDomyślny — zoptymalizowany.
testing-O1 -gnienieTesty jednostkowe z symbolami.
production-O3 -DNDEBUG -staktakWydanie produkcyjne.

Formaty pliku konfiguracyjnego

hbuild przeszukuje katalog projektu w następującej kolejności:

PlikFormatUwagi
hbuild.configHackerLang (.hk)Podstawowy — autorski format HackerOS.
hbuilt.configTOMLPopularny format konfiguracji.
hbuily.configYAMLCzytelna alternatywa.
hbuilj.configJSONŁatwy do generowania programatycznie.
hbuilh.configHCLZnany z ekosystemu HashiCorp.
Uwaga: Jeśli istnieje więcej niż jeden plik, używany jest ten pierwszy z listy. Zalecamy korzystanie z formatu .hk.

Format .hk — HackerLang

Format .hk używa składni podobnej do TOML, ale z własnym operatorem przypisania -> klucz => wartość.

Kompletny przykład — hbuild.config

[metadata]
-> name    => "my_app"
-> version => "1.0.0"
-> authors => "HackerOS Team <hackeros068@gmail.com>"
-> license => "GPL-3.0"

[description]
-> summary => "Krótki opis projektu"
-> long    => "Dłuższy opis projektu widoczny w pakiecie .deb."

[specs]
-> c++      => "g++"
-> dependencies {
    -> zlib    => ">=1.2.11"
    -> libcurl => ">=7.80.0"
    -> my_lib {
        -> path => "../my_lib"
    }
    -> some_git_dep {
        -> git     => "https://github.com/example/dep.git"
        -> version => "abc123def456abc123def456abc123def456abc1"
    }
}

[runtime]
-> priority     => "normal"
-> auto-restart  => false

[build]
-> target           => "my_app"
-> sources          => ["src/*.cpp", "src/**/*.cpp"]
-> include_dirs     => ["include"]
-> compiler         => "g++"
-> standard         => "c++20"
-> optimize         => "O2"
-> cflags           => "-Wall -Wextra"
-> ldflags          => "-lpthread"
-> lib_dirs         => ["build/lib"]
-> libs             => ["z", "curl"]
-> pkg_dependencies => ["zlib", "libcurl"]
-> build_type       => "executable"
-> native           => true
-> container        => false
.hk

Składnia .hk w skrócie

ElementSkładnia
Sekcja[nazwa_sekcji]
Przypisanie stringa-> klucz => "wartość"
Przypisanie bool-> klucz => true / false
Przypisanie liczby-> klucz => 42
Tablica-> klucz => ["a", "b", "c"]
Zagnieżdżona mapa-> klucz { -> podklucz => "val" }
Komentarz# komentarz
Interpolacja env"${HOME}/coś"

Sekcje konfiguracji

[metadata]

PoleWymaganeOpis
nameNazwa projektu (używana przy instalacji i pakowaniu).
versionWersja semver (np. "1.2.0").
authorsAutor(zy) — pojawia się w pakiecie .deb.
licenseLicencja SPDX (np. "MIT", "GPL-3.0").

[description]

PoleWymaganeOpis
summaryKrótki opis (jedna linia).
longDłuższy opis projektu.

[specs]

Deklaracja języków i zależności zewnętrznych.

KluczOpis
<język>Dowolna obsługiwana nazwa języka jako klucz (wartość ignorowana). Np. c++ => "g++", rust => "".
dependenciesZagnieżdżona mapa zależności — patrz sekcja Zależności.

[runtime]

PoleOpis
priorityPriorytet procesu: "low" / "normal" / "high".
auto-restartCzy demon ma być automatycznie restartowany przez init.

[build]

Sekcja wymagana dla języków kompilowanych (C/C++, Fortran, Ada, Pascal, …). Języki z własnym systemem budowania (Rust/Cargo, Go/go build, Java/Maven) mogą ją pominąć lub podać tylko target i build_type.

PoleWymaganeOpis
targetNazwa pliku wyjściowego.
sourcesTablica wzorców glob plików źródłowych.
include_dirsKatalogi nagłówkowe (-I).
compilerPolecenie kompilatora (np. g++, clang).
standardStandard języka (np. c++20, c17).
optimizePoziom optymalizacji (np. O2). Nadpisywany przez profil.
build_typeexecutable / shared / static
cflagsDodatkowe flagi kompilatora.
ldflagsDodatkowe flagi linkera.
lib_dirsKatalogi bibliotek (-L).
libsBiblioteki do zlinkowania (-l).
pkg_dependenciesNazwy pakietów dla pkg-config.
nativeCzy budować dla aktualnej architektury (bool).
containerBuduj w efemerycznym kontenerze overlay (bool).

Obsługiwane języki

⚙️
C / C++
gcc, g++, clang — równoległe kompilowanie, compile_commands.json
🦀
Rust
cargo build, automatyczna instalacja rustup targets
Zig
zig build, pełne wsparcie cross-compile
👑
Nim
nim c, profile debug/release/testing/production
🐦
Swift
swiftc, cross-compile przez -target
💎
D
dmd / ldc2, tryby release i debug
λ
Haskell
ghc z -O2 dla release
🌐
WebAssembly
emcc, generuje .wasm + wrapper JS
🐍
Python
PyInstaller — pakuje do standalone binary
🟩
Node.js
pkg — standalone executable z JS
💎
Ruby (mruby)
mrbc — kompiluje do .mrb bytecode
🐹
Go
go build, GOOS/GOARCH dla cross-compile
Java
Maven / Gradle / javac+jar — autodetekcja
🎯
Kotlin
Gradle lub kotlinc standalone
🏛️
Scala
sbt compile / assembly
🐪
OCaml
dune build lub ocamlfind ocamlopt
💜
Elixir
mix compile / mix release
📡
Erlang
rebar3 compile / release
🔢
Fortran
gfortran z optymalizacją per-profil
🛡️
Ada
gprbuild (projekt .gpr) lub gnatmake
🏷️
Pascal
Free Pascal Compiler (fpc)
🔷
V
vlang — v build z -prod dla release
🔶
Odin
odin build z poziomami optymalizacji
🔮
Crystal
crystal build, --release i cross-compile

Zarządzanie zależnościami

hbuild obsługuje cztery typy źródeł zależności. Wszystkie rozwiązane zależności są zapisywane do pliku hbuild.lock (patrz Lockfile).

Systemowe (pkg-config)

-> dependencies {
    -> zlib    => ">=1.2.11"  # weryfikacja przez pkg-config
    -> libcurl => ">=7.80.0"
}

Git

-> my_dep {
    -> git     => "https://github.com/user/repo.git"
    -> version => "a1b2c3d4e5f6..."  # hash commitu lub tag
}

Lokalne

-> my_lib {
    -> path => "../my_lib"  # relatywna lub absolutna ścieżka
}

Binarne (z weryfikacją SHA-256)

-> prebuilt_tool {
    -> binary => "https://example.com/tool-v1.0-linux.tar.gz"
    -> sha256 => "e3b0c44298fc1c149afbf4c8996fb924..."
}

Tymczasowe kontenery budowania

hbuild może uruchamiać cały krok budowania wewnątrz efemerycznego kontenera overlay opartego o Linux user namespaces i overlay-mount. Kontener jest tworzony tuż przed kompilacją i automatycznie niszczony po jej zakończeniu — żadnych pozostałości na dysku.

Nie wymaga Docker ani Podman. Kontenery hbuild działają wyłącznie poprzez mechanizmy jądra Linux (unshare, bind-mount, overlay) — zero zewnętrznych zależności.

Jak włączyć

W pliku konfiguracyjnym:

[build]
-> container => true
# ... reszta sekcji build

Lub przez CLI (nadpisuje ustawienie z pliku):

hbuild make --container

Co dzieje się wewnątrz

Kontener tworzy warstwowany system plików:

  • Warstwa dolna (read-only): /usr, /bin, /lib, /lib64, /etc z hosta + katalog projektu.
  • Warstwa górna (read-write): katalog build/ — artefakty kompilacji trafiają tutaj i są widoczne na hoście.
  • Brak dostępu do sieci (nowy network namespace).
  • Brak dostępu do innych procesów (nowy mount namespace).

Połączenie z sandboxem

Uwaga: Flagi --container i --sandbox są wzajemnie wyłączne — gdy kontener jest aktywny, sandbox jest automatycznie pomijany, ponieważ kontener dostarcza własną izolację.

Sandbox (izolacja procesu)

Tryb sandbox (--sandbox) uruchamia kompilatory w nowym namespace sieciowym i montażowym (Linux namespaces). Przy kompilacji z featurem sandbox dodawane są również filtry seccomp (blokada syscalli) i Landlock (ograniczenie dostępu do systemu plików).

# Buduj z sandboxem
hbuild make --sandbox

# Zbuduj hbuild z pełnym sandboxem (seccomp + Landlock)
cargo build --release --features sandbox

Cross-kompilacja

Przekaż triple docelowej architektury przez --target:

# C++ na ARM64
hbuild make --target aarch64-unknown-linux-gnu

# Rust na ARM64 (rustup target instalowany automatycznie)
hbuild make --target aarch64-unknown-linux-gnu

# Go cross-compile (GOOS/GOARCH)
hbuild make --target linux/arm64

# Zig — natywne cross-compile
hbuild make --target aarch64-linux-musl
C/C++: Wymagany cross-compiler (np. aarch64-linux-gnu-g++) w PATH. Flaga --target jest przekazywana jako --target=... do kompilatora.

System pluginów

Pluginy są ładowane z ~/.hbuild/plugins/. Obsługiwane typy:

RozszerzenieFeatureOpis
.luaplugins-luaSkrypty Lua 5.4 (domyślnie włączone).
.wasmplugins-wasmModuły WebAssembly przez Wasmtime.
.soplugins-dynlibBiblioteki dynamiczne C ABI.

Przykład pluginu Lua

-- ~/.hbuild/plugins/notify.lua
hooks = {}

function hooks.pre_build(config)
  print("Budowanie: " .. config.name)
end

function hooks.post_build(config)
  os.execute("notify-send 'hbuild' 'Budowanie zakończone: " .. config.name .. "'")
end

Dostępne hooki

HookKiedy wywoływany
pre_buildPrzed rozpoczęciem kompilacji.
post_buildPo zakończeniu kompilacji (sukces).

Dokumentacja i artefakty

JęzykNarzędzieWyjście
rustcargo doctarget/doc/
c / c++Doxygen (auto-generuje Doxyfile)docs/html/
pythonpydocPliki .html w katalogu projektu
nodejsjsdoc (wymaga jsdoc.json)Katalog docs/

Pełna referencja pól konfiguracji

Typy wartości .hk

TypPrzykład
String"wartość"
Number (f64)42, 3.14
Booltrue, false
Array["a", "b", "c"]
Map{ -> klucz => "val" }
Interpolacja env"${HOME}/bin"

Lockfile (hbuild.lock)

Po rozwiązaniu zależności hbuild zapisuje plik hbuild.lock w katalogu projektu. Commit go do systemu kontroli wersji, aby zapewnić reprodukowalne buildy.

// hbuild.lock (JSON)
{
  "version": 1,
  "dependencies": {
    "my_dep": {
      "source": { "type": "git", "url": "...", "commit": "abc123..." },
      "version": "abc123...",
      "sha256": null
    }
  }
}

Zmienne środowiskowe

ZmiennaOpis
DESTDIRNadpisuje katalog instalacji dla hbuild install.
HOMEUżywane do lokalizacji cache (~/.hbuild/cache) i pluginów.