forked from semios/ports
@@ -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,
|
||||
}
|
||||
@@ -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
|
||||
@@ -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")
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user