initial commit

Signed-off-by: sisungo <[email protected]>
This commit is contained in:
2026-08-22 11:41:05 +00:00
commit 5c89842dc0
130 changed files with 16319 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
from typing import Callable, TypeAlias
from lib import pkgcomposer
from . import autolink, autopatch, autostrip
PreBuild: TypeAlias = Callable[[], None]
PostBuild: TypeAlias = Callable[[], None]
PostPack: TypeAlias = Callable[[pkgcomposer.PkgComposer], None]
pre_build: dict[str, PreBuild] = {
"autopatch": autopatch.autopatch,
}
post_build: dict[str, PostBuild] = {}
post_pack: dict[str, PostPack] = {
"autolink": autolink.autolink,
"autostrip": autostrip.autostrip,
}
+54
View File
@@ -0,0 +1,54 @@
import os
from lib import arch, common, make, pkgcomposer
def is_abslink(path):
try:
return os.readlink(path).startswith("/")
except:
return False
def autolink_bin(composer: pkgcomposer.PkgComposer):
if is_abslink("bin"):
return
for i in common.treedir("bin"):
if i.is_file() and os.access(i.path, os.X_OK):
make.link(f"bin/{i.name}", "/bin/" + i.name)
def autolink_lib(composer: pkgcomposer.PkgComposer):
if is_abslink("lib"):
return
for i in common.treedir("lib"):
if i.is_file():
make.link(f"lib/{i.name}", "/lib/" + arch.get_target() + "/" + i.name)
def autolink_include(composer: pkgcomposer.PkgComposer):
if is_abslink("include"):
return
for i in common.treedir("include"):
if i.is_file():
make.link(
f"include/{i.name}",
"/lib/" + arch.get_target() + "/include/" + i.name,
)
def autolink(composer: pkgcomposer.PkgComposer):
os.chdir(composer.workdir + "/bundle/")
try:
autolink_bin(composer)
except:
pass
try:
autolink_lib(composer)
except:
pass
try:
autolink_include(composer)
except:
pass
+29
View File
@@ -0,0 +1,29 @@
import os
import subprocess
import lib.sources as sources
def autopatch():
if not os.path.exists("patches"):
return
target_dir = os.getcwd() + "/target"
source_dir = sources.sources_dir_name()
patches_tag_file = f"{target_dir}/patches.tag"
patches_dir = os.getcwd() + "/patches"
patches = os.listdir(patches_dir)
patches.sort()
os.chdir(source_dir)
if not os.path.exists(patches_tag_file):
open(patches_tag_file, "+w").close()
for i in patches:
with open(patches_tag_file, "r") as file:
if i + "\n" in file.readlines():
continue
with open(f"{patches_dir}/{i}", "r") as file:
subprocess.run(["patch", "-p1"], stdin=file)
with open(patches_tag_file, "+a") as file:
file.write(i + "\n")
+61
View File
@@ -0,0 +1,61 @@
import os
import stat
import subprocess
import tempfile
import shutil
from lib import common
strip = os.environ.get("STRIP", "strip")
def _is_elf(filepath):
with open(filepath, "rb") as f:
return f.read(4) == b"\x7fELF"
def autostrip(composer):
processed_inodes = {}
for ent in common.treedir(composer.workdir):
if not ent.is_file(follow_symlinks=False):
continue
if not (os.access(ent.path, os.X_OK) or ".so" in ent.name):
continue
if not _is_elf(ent.path):
continue
stat_info = os.stat(ent.path)
inode_key = (stat_info.st_dev, stat_info.st_ino)
if inode_key in processed_inodes:
continue
processed_inodes[inode_key] = True
oldperm = stat.S_IMODE(stat_info.st_mode)
try:
with tempfile.NamedTemporaryFile(mode='wb', delete=False) as tmp_file:
tmp_path = tmp_file.name
shutil.copy2(ent.path, tmp_path)
os.chmod(tmp_path, 0o777)
subprocess.run([strip, tmp_path], check=True)
with open(tmp_path, 'rb') as tmp_file:
stripped_data = tmp_file.read()
os.chmod(ent.path, 0o777)
with open(ent.path, 'r+b') as original_file:
original_file.truncate(0)
original_file.write(stripped_data)
original_file.flush()
os.fsync(original_file.fileno())
os.chmod(ent.path, oldperm)
os.unlink(tmp_path)
except Exception as e:
if 'tmp_path' in locals() and os.path.exists(tmp_path):
os.unlink(tmp_path)
raise RuntimeError(f"Failed to strip {ent.path}: {e}") from e