Compare commits
50 Commits
55ad47acd7
...
43df581f68
Author | SHA1 | Date |
---|---|---|
Andrius Štikonas | 43df581f68 | |
fosslinux | fbb3e97149 | |
fosslinux | b59170519f | |
fosslinux | c1a1ef64e7 | |
fosslinux | 813ec9498a | |
Eduardo Sánchez Muñoz | c42dd53634 | |
Eduardo Sánchez Muñoz | 18919e03f4 | |
Gábor Stefanik | bb067d2856 | |
fosslinux | 9afe93298c | |
fosslinux | f4c1b488d6 | |
fosslinux | 51fe3f9991 | |
fosslinux | ca0e701ee8 | |
Eduardo Sánchez Muñoz | 45b635ef97 | |
Eduardo Sánchez Muñoz | 9042539165 | |
Eduardo Sánchez Muñoz | fc6aee0c5f | |
Gábor Stefanik | c8837203c8 | |
Gábor Stefanik | 81e3123262 | |
fosslinux | 9179f4bd01 | |
fosslinux | 81790a3271 | |
Gábor Stefanik | fe9cb1222f | |
Gábor Stefanik | f67c7d1144 | |
Gábor Stefanik | 896c618bd1 | |
Gábor Stefanik | 30fb367e7a | |
Gábor Stefanik | 63c0a52067 | |
Gábor Stefanik | 591959924f | |
Gábor Stefanik | 2c6ac94974 | |
Gábor Stefanik | 97f31072ce | |
Gábor Stefanik | 2823e16325 | |
Gábor Stefanik | e9787b55c8 | |
Gábor Stefanik | f66f9efa2c | |
Gábor Stefanik | 1481ad0d20 | |
Gábor Stefanik | 9ed4ae9a59 | |
fosslinux | 3fd101e70a | |
fosslinux | 6905852107 | |
fosslinux | 7d0e1c0e75 | |
Gábor Stefanik | 47711cfea9 | |
Gábor Stefanik | 529ea4cae1 | |
Gábor Stefanik | ab9455f918 | |
Gábor Stefanik | be1333ee8b | |
Gábor Stefanik | b45e1f81ae | |
Gábor Stefanik | 32dc4c702b | |
Gábor Stefanik | 55d3c36e09 | |
Gábor Stefanik | 3305f2a41b | |
Gábor Stefanik | a68ae62f9e | |
Gábor Stefanik | 8d193df823 | |
Gábor Stefanik | faad907fba | |
Gábor Stefanik | c188185ad4 | |
Gábor Stefanik | b4d9c5e7cb | |
Gábor Stefanik | dc62d8242c | |
fosslinux | 191c013e23 |
|
@ -12,8 +12,8 @@ on:
|
|||
- master
|
||||
|
||||
jobs:
|
||||
sysa:
|
||||
name: Run sysa under bubblewrap
|
||||
pass1:
|
||||
name: Run up to Linux build under bubblewrap
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install bubblewrap
|
||||
|
@ -30,9 +30,8 @@ jobs:
|
|||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: |
|
||||
sysa/distfiles
|
||||
sysc/distfiles
|
||||
key: cache-${{ hashFiles('sys*/*/sources') }}
|
||||
distfiles
|
||||
key: cache-${{ hashFiles('steps/*/sources') }}
|
||||
- name: Get sources
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
run: ./download-distfiles.sh
|
||||
|
@ -41,28 +40,27 @@ jobs:
|
|||
uses: actions/cache/save@v3
|
||||
with:
|
||||
path: |
|
||||
sysa/distfiles
|
||||
sysc/distfiles
|
||||
key: cache-${{ hashFiles('sys*/*/sources') }}
|
||||
distfiles
|
||||
key: cache-${{ hashFiles('steps/*/sources') }}
|
||||
- name: Run bootstrap
|
||||
run: ./rootfs.py --bwrap --external-sources --build-kernels --preserve --cores 2 --internal-ci pass1
|
||||
run: ./rootfs.py --bwrap --external-sources --build-kernels --cores 2 --internal-ci pass1
|
||||
- name: Archive created packages
|
||||
if: failure() # archive failed builds progress
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: packages
|
||||
path: tmp/sysa/usr/src/repo/**
|
||||
- name: Tar sysc_image
|
||||
run: tar -cf sysc_image.tar tmp/sysa/sysc_image/
|
||||
- name: Archive sysc_image
|
||||
path: target/external/repo/**
|
||||
- name: Tar pass1 image
|
||||
run: tar -cf pass1_image.tar target
|
||||
- name: Archive pass1_image
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: internal_sysc_image
|
||||
path: sysc_image.tar
|
||||
name: internal_pass1_image
|
||||
path: pass1_image.tar
|
||||
|
||||
sysc1:
|
||||
name: Run sysc (part 1) under bubblewrap
|
||||
needs: sysa
|
||||
pass2:
|
||||
name: Run up to Python bootstrap under bubblewrap
|
||||
needs: pass1
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install bubblewrap
|
||||
|
@ -74,24 +72,48 @@ jobs:
|
|||
# There is a strange bug(?) in nongnu, when you clone a git repository
|
||||
# against a commit != HEAD with depth=1, it errors out.
|
||||
fetch-depth: 0
|
||||
- name: Get sysc_image
|
||||
- name: Get pass1_image
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: internal_sysc_image
|
||||
- name: Extract sysc_image
|
||||
run: tar -xf sysc_image.tar
|
||||
name: internal_pass1_image
|
||||
- name: Extract pass1_image
|
||||
run: tar -xf pass1_image.tar
|
||||
- name: Query cache for sources
|
||||
id: cache
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: |
|
||||
distfiles
|
||||
key: cache-${{ hashFiles('steps/*/sources') }}
|
||||
- name: Get sources
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
run: ./download-distfiles.sh
|
||||
- name: Cache sources
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
uses: actions/cache/save@v3
|
||||
with:
|
||||
path: |
|
||||
distfiles
|
||||
key: cache-${{ hashFiles('steps/*/sources') }}
|
||||
- name: Run bootstrap
|
||||
run: ./rootfs.py --bwrap --external-sources --build-kernels --preserve --cores 2 --internal-ci pass2
|
||||
run: ./rootfs.py --bwrap --external-sources --build-kernels --cores 2 --internal-ci pass2
|
||||
- name: Archive created packages
|
||||
if: always() # archive failed builds progress
|
||||
if: failure() # archive failed builds progress
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: internal_packages_sysc1
|
||||
path: tmp/sysa/sysc_image/usr/src/repo/**
|
||||
name: internal_packages_pass2
|
||||
path: target/external/repo/**
|
||||
- name: Tar pass2 image
|
||||
run: tar -cf pass2_image.tar target
|
||||
- name: Archive pass2_image
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: internal_pass2_image
|
||||
path: pass2_image.tar
|
||||
|
||||
sysc2:
|
||||
name: Run sysc (part 2) under bubblewrap
|
||||
needs: sysc1
|
||||
pass3:
|
||||
name: Run remaining builds under bubblewrap
|
||||
needs: pass2
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install bubblewrap
|
||||
|
@ -103,23 +125,34 @@ jobs:
|
|||
# There is a strange bug(?) in nongnu, when you clone a git repository
|
||||
# against a commit != HEAD with depth=1, it errors out.
|
||||
fetch-depth: 0
|
||||
- name: Get sysc_image
|
||||
- name: Get pass2_image
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: internal_sysc_image
|
||||
- name: Extract sysc_image
|
||||
run: tar -xf sysc_image.tar
|
||||
# By doing this, all packages that have already been compiled will come from the preseed.
|
||||
- name: Get packages repo progress
|
||||
uses: actions/download-artifact@v3
|
||||
name: internal_pass2_image
|
||||
- name: Extract pass2_image
|
||||
run: tar -xf pass2_image.tar
|
||||
- name: Query cache for sources
|
||||
id: cache
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
name: internal_packages_sysc1
|
||||
path: tmp/sysa/sysc_image/usr/src/repo-preseeded/
|
||||
path: |
|
||||
distfiles
|
||||
key: cache-${{ hashFiles('steps/*/sources') }}
|
||||
- name: Get sources
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
run: ./download-distfiles.sh
|
||||
- name: Cache sources
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
uses: actions/cache/save@v3
|
||||
with:
|
||||
path: |
|
||||
distfiles
|
||||
key: cache-${{ hashFiles('steps/*/sources') }}
|
||||
- name: Run bootstrap
|
||||
run: ./rootfs.py --bwrap --external-sources --build-kernels --preserve --cores 2 --internal-ci pass3
|
||||
run: ./rootfs.py --bwrap --external-sources --build-kernels --cores 2 --internal-ci pass3
|
||||
- name: Archive created packages
|
||||
if: always() # archive failed builds
|
||||
if: always() # archive both failed and successful builds
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: packages
|
||||
path: tmp/sysa/sysc_image/usr/src/repo/**
|
||||
path: target/external/repo/**
|
||||
|
|
|
@ -21,7 +21,7 @@ jobs:
|
|||
- name: Install pylint
|
||||
run: sudo pip3 install pylint
|
||||
- name: pylint
|
||||
run: pylint rootfs.py lib/utils.py lib/generator.py lib/tmpdir.py --disable=duplicate-code
|
||||
run: pylint rootfs.py lib/utils.py lib/generator.py lib/target.py --disable=duplicate-code
|
||||
|
||||
shellcheck:
|
||||
name: Lint shell files
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
tmp/
|
||||
target/
|
||||
kernel
|
||||
distfiles/
|
||||
__pycache__
|
||||
|
|
167
lib/generator.py
167
lib/generator.py
|
@ -14,6 +14,7 @@ import shutil
|
|||
import tarfile
|
||||
import requests
|
||||
|
||||
# pylint: disable=too-many-instance-attributes
|
||||
class Generator():
|
||||
"""
|
||||
Class responsible for generating the basic media to be consumed.
|
||||
|
@ -22,24 +23,33 @@ class Generator():
|
|||
git_dir = os.path.join(os.path.dirname(os.path.join(__file__)), '..')
|
||||
distfiles_dir = os.path.join(git_dir, 'distfiles')
|
||||
|
||||
# pylint: disable=too-many-arguments
|
||||
def __init__(self, tmpdir, arch, external_sources,
|
||||
early_preseed, repo_path):
|
||||
def __init__(self, arch, external_sources, early_preseed, repo_path):
|
||||
self.arch = arch
|
||||
self.early_preseed = early_preseed
|
||||
self.external_sources = external_sources
|
||||
self.repo_path = repo_path
|
||||
self.tmpdir = tmpdir
|
||||
self.tmp_dir = tmpdir.path
|
||||
self.external_dir = os.path.join(self.tmp_dir, 'external')
|
||||
self.source_manifest = self.get_source_manifest(not self.external_sources)
|
||||
self.target_dir = None
|
||||
self.external_dir = None
|
||||
|
||||
def prepare(self, using_kernel=False, kernel_bootstrap=False):
|
||||
def reuse(self, target):
|
||||
"""
|
||||
Reuse a previously prepared bwrap environment for further stages.
|
||||
"""
|
||||
self.target_dir = target.path
|
||||
self.external_dir = os.path.join(self.target_dir, 'external')
|
||||
self.distfiles()
|
||||
|
||||
def prepare(self, target, using_kernel=False, kernel_bootstrap=False, target_size=0):
|
||||
"""
|
||||
Prepare basic media of live-bootstrap.
|
||||
/steps -- contains steps to be built
|
||||
/ -- contains seed to allow steps to be built, containing custom
|
||||
scripts and stage0-posix
|
||||
"""
|
||||
self.target_dir = target.path
|
||||
self.external_dir = os.path.join(self.target_dir, 'external')
|
||||
|
||||
# We use ext3 here; ext4 actually has a variety of extensions that
|
||||
# have been added with varying levels of recency
|
||||
# Linux 4.9.10 does not support a bunch of them
|
||||
|
@ -49,30 +59,33 @@ class Generator():
|
|||
# argument matrix ... or we could just use ext3 instead which
|
||||
# is effectively universally the same
|
||||
if kernel_bootstrap:
|
||||
init_path = os.path.join(self.tmp_dir, 'init')
|
||||
init_path = os.path.join(self.target_dir, 'init')
|
||||
|
||||
os.mkdir(init_path)
|
||||
self.tmp_dir = init_path
|
||||
self.target_dir = init_path
|
||||
|
||||
if self.repo_path or self.external_sources:
|
||||
self.tmpdir.add_disk("external", filesystem="ext3")
|
||||
self.tmpdir.mount_disk("external", "external")
|
||||
target.add_disk("external", filesystem="ext3")
|
||||
target.mount_disk("external", "external")
|
||||
else:
|
||||
self.tmpdir.add_disk("external", tabletype="none")
|
||||
self.external_dir = os.path.join(self.target_dir, 'external')
|
||||
elif using_kernel:
|
||||
self.tmp_dir = os.path.join(self.tmp_dir, 'disk')
|
||||
self.tmpdir.add_disk("disk", filesystem="ext3")
|
||||
self.tmpdir.mount_disk("disk", "disk")
|
||||
self.external_dir = os.path.join(self.tmp_dir, 'external')
|
||||
self.target_dir = os.path.join(self.target_dir, 'disk')
|
||||
target.add_disk("disk",
|
||||
filesystem="ext3",
|
||||
size=(target_size + "M") if target_size else "16G",
|
||||
bootable=True)
|
||||
target.mount_disk("disk", "disk")
|
||||
self.external_dir = os.path.join(self.target_dir, 'external')
|
||||
|
||||
os.makedirs(self.external_dir, exist_ok=True)
|
||||
|
||||
if self.early_preseed:
|
||||
# Extract tar containing preseed
|
||||
with tarfile.open(self.early_preseed, "r") as seed:
|
||||
seed.extractall(self.tmp_dir)
|
||||
seed.extractall(self.target_dir)
|
||||
shutil.copy2(os.path.join(self.git_dir, 'seed', 'preseeded.kaem'),
|
||||
os.path.join(self.tmp_dir, 'kaem.x86'))
|
||||
os.path.join(self.target_dir, 'kaem.x86'))
|
||||
else:
|
||||
self.stage0_posix()
|
||||
self.seed()
|
||||
|
@ -88,44 +101,44 @@ class Generator():
|
|||
shutil.copytree(self.repo_path, repo_dir)
|
||||
|
||||
if kernel_bootstrap:
|
||||
self.create_builder_hex0_disk_image(os.path.join(self.tmp_dir, 'disk.img'))
|
||||
self.create_builder_hex0_disk_image(self.target_dir + '.img', target_size)
|
||||
|
||||
if kernel_bootstrap and (self.external_sources or self.repo_path):
|
||||
self.tmpdir.umount_disk('external')
|
||||
target.umount_disk('external')
|
||||
elif using_kernel:
|
||||
self.tmpdir.umount_disk('disk')
|
||||
target.umount_disk('disk')
|
||||
|
||||
def steps(self):
|
||||
"""Copy in steps."""
|
||||
source_manifest = self.get_source_manifest()
|
||||
self.get_packages(source_manifest)
|
||||
self.get_packages()
|
||||
|
||||
shutil.copytree(os.path.join(self.git_dir, 'steps'), os.path.join(self.tmp_dir, 'steps'))
|
||||
shutil.copytree(os.path.join(self.git_dir, 'steps'), os.path.join(self.target_dir, 'steps'))
|
||||
|
||||
def stage0_posix(self):
|
||||
"""Copy in all of the stage0-posix"""
|
||||
stage0_posix_base_dir = os.path.join(self.git_dir, 'seed', 'stage0-posix')
|
||||
for f in os.listdir(stage0_posix_base_dir):
|
||||
orig = os.path.join(stage0_posix_base_dir, f)
|
||||
to = os.path.join(self.tmp_dir, f)
|
||||
for entry in os.listdir(stage0_posix_base_dir):
|
||||
orig = os.path.join(stage0_posix_base_dir, entry)
|
||||
target = os.path.join(self.target_dir, entry)
|
||||
if os.path.isfile(orig):
|
||||
shutil.copy2(orig, to)
|
||||
shutil.copy2(orig, target)
|
||||
else:
|
||||
shutil.copytree(orig, to)
|
||||
shutil.copytree(orig, target)
|
||||
|
||||
arch = stage0_arch_map.get(self.arch, self.arch)
|
||||
kaem_optional_seed = os.path.join(self.git_dir, 'seed', 'stage0-posix', 'bootstrap-seeds',
|
||||
'POSIX', arch, 'kaem-optional-seed')
|
||||
shutil.copy2(kaem_optional_seed, os.path.join(self.tmp_dir, 'init'))
|
||||
shutil.copy2(kaem_optional_seed, os.path.join(self.target_dir, 'init'))
|
||||
|
||||
def seed(self):
|
||||
"""Copy in extra seed files"""
|
||||
seed_dir = os.path.join(self.git_dir, 'seed')
|
||||
for f in os.listdir(seed_dir):
|
||||
if os.path.isfile(os.path.join(seed_dir, f)):
|
||||
shutil.copy2(os.path.join(seed_dir, f), os.path.join(self.tmp_dir, f))
|
||||
for entry in os.listdir(seed_dir):
|
||||
if os.path.isfile(os.path.join(seed_dir, entry)):
|
||||
shutil.copy2(os.path.join(seed_dir, entry), os.path.join(self.target_dir, entry))
|
||||
|
||||
def add_fiwix_files(self, file_list_path, dirpath):
|
||||
@staticmethod
|
||||
def add_fiwix_files(file_list_path, dirpath):
|
||||
"""Add files to the list to populate Fiwix file system"""
|
||||
for root, _, filepaths in os.walk(dirpath):
|
||||
if 'stage0-posix' in root:
|
||||
|
@ -136,14 +149,14 @@ class Generator():
|
|||
|
||||
def create_fiwix_file_list(self):
|
||||
"""Create a list of files to populate Fiwix file system"""
|
||||
file_list_path = os.path.join(self.tmp_dir, 'steps', 'lwext4-1.0.0-lb1',
|
||||
file_list_path = os.path.join(self.target_dir, 'steps', 'lwext4-1.0.0-lb1',
|
||||
'files', 'fiwix-file-list.txt')
|
||||
shutil.copyfile(os.path.join(self.tmp_dir, 'steps', 'lwext4-1.0.0-lb1',
|
||||
shutil.copyfile(os.path.join(self.target_dir, 'steps', 'lwext4-1.0.0-lb1',
|
||||
'files', 'early-artifacts-needed-after-fiwix.txt'),
|
||||
file_list_path)
|
||||
|
||||
save_cwd = os.getcwd()
|
||||
os.chdir(self.tmp_dir)
|
||||
os.chdir(self.target_dir)
|
||||
self.add_fiwix_files(file_list_path, 'steps')
|
||||
self.add_fiwix_files(file_list_path, 'distfiles')
|
||||
os.chdir(save_cwd)
|
||||
|
@ -151,24 +164,21 @@ class Generator():
|
|||
def distfiles(self):
|
||||
"""Copy in distfiles"""
|
||||
def copy_no_network_distfiles(out):
|
||||
# Note that no network == no disk for kernel bootstrap mode
|
||||
pre_src_path = os.path.join(self.git_dir, 'steps', 'pre-network-sources')
|
||||
with open(pre_src_path, 'r', encoding="utf-8") as source_list:
|
||||
for file in source_list.readlines():
|
||||
file = file.strip()
|
||||
shutil.copy2(os.path.join(self.distfiles_dir, file),
|
||||
os.path.join(out, file))
|
||||
# Note that "no disk" implies "no network" for kernel bootstrap mode
|
||||
for file in self.source_manifest:
|
||||
file = file[3].strip()
|
||||
shutil.copy2(os.path.join(self.distfiles_dir, file),
|
||||
os.path.join(out, file))
|
||||
|
||||
early_distfile_dir = os.path.join(self.tmp_dir, 'external', 'distfiles')
|
||||
early_distfile_dir = os.path.join(self.target_dir, 'external', 'distfiles')
|
||||
main_distfile_dir = os.path.join(self.external_dir, 'distfiles')
|
||||
|
||||
if early_distfile_dir != main_distfile_dir:
|
||||
os.makedirs(early_distfile_dir)
|
||||
os.makedirs(early_distfile_dir, exist_ok=True)
|
||||
copy_no_network_distfiles(early_distfile_dir)
|
||||
|
||||
if self.external_sources:
|
||||
os.mkdir(main_distfile_dir)
|
||||
shutil.copytree(self.distfiles_dir, main_distfile_dir)
|
||||
shutil.copytree(self.distfiles_dir, main_distfile_dir, dirs_exist_ok=True)
|
||||
else:
|
||||
os.mkdir(main_distfile_dir)
|
||||
copy_no_network_distfiles(main_distfile_dir)
|
||||
|
@ -207,7 +217,7 @@ class Generator():
|
|||
"""Append srcfs file system to disk image"""
|
||||
save_cwd = os.getcwd()
|
||||
|
||||
os.chdir(self.tmp_dir)
|
||||
os.chdir(self.target_dir)
|
||||
self.output_tree(image_file, '.')
|
||||
|
||||
# Add commands to kick off stage0-posix
|
||||
|
@ -224,7 +234,7 @@ class Generator():
|
|||
|
||||
os.chdir(save_cwd)
|
||||
|
||||
def create_builder_hex0_disk_image(self, image_file_name):
|
||||
def create_builder_hex0_disk_image(self, image_file_name, size):
|
||||
"""Create builder-hex0 disk image"""
|
||||
shutil.copyfile(os.path.join('seed', 'stage0-posix', 'bootstrap-seeds',
|
||||
'NATIVE', 'x86', 'builder-hex0-x86-stage1.img'),
|
||||
|
@ -252,13 +262,13 @@ class Generator():
|
|||
image_file.write(b'\0' * round_up)
|
||||
current_size += round_up
|
||||
|
||||
# fill file with zeros up to desired size, one megabyte at a time
|
||||
with open(image_file_name, 'ab') as image_file:
|
||||
while current_size < 16384 * megabyte:
|
||||
image_file.write(b'\0' * megabyte)
|
||||
current_size += megabyte
|
||||
# extend file up to desired size
|
||||
if current_size < size * megabyte:
|
||||
with open(image_file_name, 'ab') as image_file:
|
||||
image_file.truncate(size * megabyte)
|
||||
|
||||
def check_file(self, file_name, expected_hash):
|
||||
@staticmethod
|
||||
def check_file(file_name, expected_hash):
|
||||
"""Check hash of downloaded source file."""
|
||||
with open(file_name, "rb") as downloaded_file:
|
||||
downloaded_content = downloaded_file.read() # read entire file as bytes
|
||||
|
@ -271,7 +281,8 @@ actual: {readable_hash}\n\
|
|||
When in doubt, try deleting the file in question -- it will be downloaded again when running \
|
||||
this script the next time")
|
||||
|
||||
def download_file(self, url, directory, file_name):
|
||||
@staticmethod
|
||||
def download_file(url, directory, file_name):
|
||||
"""
|
||||
Download a single source archive.
|
||||
"""
|
||||
|
@ -293,45 +304,53 @@ this script the next time")
|
|||
with open(abs_file_name, 'wb') as target_file:
|
||||
target_file.write(response.raw.read())
|
||||
else:
|
||||
raise requests.HTTPError("Download failed.")
|
||||
raise requests.HTTPError("Download failed: HTTP " +
|
||||
response.status_code + " " + response.reason)
|
||||
return abs_file_name
|
||||
|
||||
def get_packages(self, source_manifest):
|
||||
def get_packages(self):
|
||||
"""Prepare remaining sources"""
|
||||
for line in source_manifest.split("\n"):
|
||||
line = line.strip().split(" ")
|
||||
|
||||
for line in self.source_manifest:
|
||||
path = self.download_file(line[2], line[1], line[3])
|
||||
self.check_file(path, line[0])
|
||||
|
||||
@classmethod
|
||||
def get_source_manifest(cls):
|
||||
def get_source_manifest(cls, pre_network=False):
|
||||
"""
|
||||
Generate a source manifest for the system.
|
||||
"""
|
||||
manifest_lines = []
|
||||
entries = []
|
||||
directory = os.path.relpath(cls.distfiles_dir, cls.git_dir)
|
||||
|
||||
# Find all source files
|
||||
steps_dir = os.path.join(cls.git_dir, 'steps')
|
||||
for file in os.listdir(steps_dir):
|
||||
if os.path.isdir(os.path.join(steps_dir, file)):
|
||||
sourcef = os.path.join(steps_dir, file, "sources")
|
||||
with open(os.path.join(steps_dir, 'manifest'), 'r', encoding="utf_8") as file:
|
||||
for line in file:
|
||||
if pre_network and line.strip().startswith("improve: ") and "network" in line:
|
||||
break
|
||||
|
||||
if not line.strip().startswith("build: "):
|
||||
continue
|
||||
|
||||
step = line.split(" ")[1].split("#")[0].strip()
|
||||
sourcef = os.path.join(steps_dir, step, "sources")
|
||||
if os.path.exists(sourcef):
|
||||
# Read sources from the source file
|
||||
with open(sourcef, "r", encoding="utf_8") as sources:
|
||||
for line in sources.readlines():
|
||||
line = line.strip().split(" ")
|
||||
for source in sources.readlines():
|
||||
source = source.strip().split(" ")
|
||||
|
||||
if len(line) > 2:
|
||||
file_name = line[2]
|
||||
if len(source) > 2:
|
||||
file_name = source[2]
|
||||
else:
|
||||
# Automatically determine file name based on URL.
|
||||
file_name = os.path.basename(line[0])
|
||||
file_name = os.path.basename(source[0])
|
||||
|
||||
manifest_lines.append(f"{line[1]} {directory} {line[0]} {file_name}")
|
||||
entry = (source[1], directory, source[0], file_name)
|
||||
if entry not in entries:
|
||||
entries.append(entry)
|
||||
|
||||
return "\n".join(manifest_lines)
|
||||
return entries
|
||||
|
||||
stage0_arch_map = {
|
||||
"amd64": "AMD64",
|
||||
|
|
|
@ -4,34 +4,32 @@
|
|||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
"""
|
||||
Contains a class that represents a tmpdir
|
||||
Contains a class that represents a target directory
|
||||
"""
|
||||
|
||||
import enum
|
||||
import getpass
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from lib.utils import mount, umount, create_disk, run_as_root
|
||||
|
||||
class TmpType(enum.Enum):
|
||||
"""Different types of tmpdirs we can have"""
|
||||
class TargetType(enum.Enum):
|
||||
"""Different types of target dirs we can have"""
|
||||
NONE = 0
|
||||
TMPFS = 1
|
||||
|
||||
class Tmpdir:
|
||||
class Target:
|
||||
"""
|
||||
Represents a tmpdir
|
||||
Represents a target directory
|
||||
"""
|
||||
|
||||
_disks = {}
|
||||
_disk_filesystems = {}
|
||||
_mountpoints = {}
|
||||
|
||||
def __init__(self, preserve, path="tmp"):
|
||||
def __init__(self, path="target"):
|
||||
self.path = os.path.abspath(path)
|
||||
self.preserve = preserve
|
||||
self._type = TmpType.NONE
|
||||
self._type = TargetType.NONE
|
||||
|
||||
if not os.path.exists(self.path):
|
||||
os.mkdir(self.path)
|
||||
|
@ -41,29 +39,32 @@ class Tmpdir:
|
|||
print(f"Unmounting {path}")
|
||||
umount(path)
|
||||
|
||||
if not self.preserve:
|
||||
for disk in self._disks.values():
|
||||
print(f"Detaching {disk}")
|
||||
run_as_root("losetup", "-d", disk)
|
||||
|
||||
if self._type == TmpType.TMPFS:
|
||||
print(f"Unmounting tmpdir from {self.path}")
|
||||
umount(self.path)
|
||||
|
||||
print(f"Removing {self.path}")
|
||||
shutil.rmtree(self.path, ignore_errors=True)
|
||||
for disk in self._disks.values():
|
||||
print(f"Detaching {disk}")
|
||||
run_as_root("losetup", "-d", disk)
|
||||
|
||||
def tmpfs(self, size="8G"):
|
||||
"""Mount a tmpfs"""
|
||||
print(f"Mounting tmpfs on {self.path}")
|
||||
mount("tmpfs", self.path, "tmpfs", f"size={size}")
|
||||
self._type = TmpType.TMPFS
|
||||
self._type = TargetType.TMPFS
|
||||
|
||||
# pylint: disable=too-many-arguments
|
||||
def add_disk(self, name, size="16G", filesystem="ext4", tabletype="msdos", mkfs_args=None):
|
||||
def add_disk(self,
|
||||
name,
|
||||
size="16G",
|
||||
filesystem="ext4",
|
||||
tabletype="msdos",
|
||||
bootable=False,
|
||||
mkfs_args=None):
|
||||
"""Add a disk"""
|
||||
disk_path = os.path.join(self.path, f"{name}.img")
|
||||
self._disks[name] = create_disk(disk_path, tabletype, filesystem, size, mkfs_args=mkfs_args)
|
||||
self._disks[name] = create_disk(disk_path,
|
||||
tabletype,
|
||||
filesystem,
|
||||
size,
|
||||
bootable,
|
||||
mkfs_args)
|
||||
self._disk_filesystems[name] = filesystem
|
||||
# Allow executing user to access it
|
||||
run_as_root("chown", getpass.getuser(), self._disks[name])
|
||||
|
@ -87,4 +88,4 @@ class Tmpdir:
|
|||
|
||||
def get_disk(self, name):
|
||||
"""Get the path to a device of a disk"""
|
||||
return self._disks[name]
|
||||
return self._disks.get(name)
|
|
@ -31,7 +31,8 @@ def run_as_root(*args, **kwargs):
|
|||
return run("sudo", *args, **kwargs)
|
||||
return run(*args, **kwargs)
|
||||
|
||||
def create_disk(image, disk_type, fs_type, size, mkfs_args=None):
|
||||
# pylint: disable=too-many-arguments
|
||||
def create_disk(image, disk_type, fs_type, size, bootable=False, mkfs_args=None):
|
||||
"""Create a disk image, with a filesystem on it"""
|
||||
if mkfs_args is None:
|
||||
mkfs_args = []
|
||||
|
@ -42,7 +43,7 @@ def create_disk(image, disk_type, fs_type, size, mkfs_args=None):
|
|||
# Create the partition
|
||||
if disk_type != "none":
|
||||
run_as_root('parted', '--script', image, 'mklabel', disk_type, 'mkpart',
|
||||
'primary', fs_type, '0%', '100%')
|
||||
'primary', fs_type, '1GiB' if bootable else '1MiB', '100%')
|
||||
run_as_root('partprobe', loop_dev)
|
||||
run_as_root('mkfs.' + fs_type, loop_dev + "p1", *mkfs_args)
|
||||
return loop_dev
|
||||
|
|
26
parts.rst
26
parts.rst
|
@ -747,7 +747,7 @@ kexec-linux
|
|||
===========
|
||||
|
||||
If the kernel bootstrap option is enabled then a C program ``kexec-linux`` is compiled.
|
||||
This can be used to launch a Linux kernel from Fiwix.
|
||||
This can be used to launch a Linux kernel from Fiwix (when not using ``--kernel``).
|
||||
|
||||
kexec-tools 2.0.22
|
||||
==================
|
||||
|
@ -755,7 +755,8 @@ kexec-tools 2.0.22
|
|||
``kexec`` is a utility for the Linux kernel that allows the re-execution of the
|
||||
Linux kernel without a manual restart from within a running system. It is a
|
||||
kind of soft-restart. It is only built for non-chroot mode, as we only use it
|
||||
in non-chroot mode. It is used to go into sysb/sysc.
|
||||
in non-chroot mode. It is used to boot the Linux kernel that will be built next
|
||||
from the current Linux kernel (when using ``--kernel``).
|
||||
|
||||
Linux kernel 4.9.10
|
||||
===================
|
||||
|
@ -767,7 +768,7 @@ However, the docs are also wrong, as the latest of the 4.9.x series does not
|
|||
work with our version of binutils. However, a much earlier 4.9.10 does
|
||||
(selected arbitrarily, could go newer but did not test), with a small amount
|
||||
of patching. This is also modern enough for most hardware and to cause few
|
||||
problems with software built in sysc. Secondly, the linux-libre scripts are used
|
||||
problems with software built afterwards. Secondly, the linux-libre scripts are used
|
||||
to deblob the kernel. Every other pregenerated file is appended with ``_shipped``
|
||||
so we use a ``find`` command to remove those, which are automatically regenerated.
|
||||
The kernel config was originally taken from Void Linux, and was then modified
|
||||
|
@ -778,11 +779,18 @@ subsequent systems, and we do not have ``modprobe``.
|
|||
We then kexec to use the new Linux kernel, using ``kexec-tools`` for a Linux
|
||||
kernel and ``kexec-linux`` for Fiwix.
|
||||
|
||||
musl 1.2.4
|
||||
==========
|
||||
|
||||
At this point, it is guaranteed that we are running on Linux with thread support,
|
||||
so we rebuild musl with thread support.
|
||||
|
||||
curl 7.88.1
|
||||
===========
|
||||
|
||||
``curl`` is used to download files using various protocols including HTTP and HTTPS.
|
||||
However, this first build does not support encrypted HTTPS yet.
|
||||
However, this first build does not support encrypted HTTPS yet. ``curl`` requires
|
||||
Linux and musl with thread support, which are now available.
|
||||
|
||||
bash 5.2.15
|
||||
===========
|
||||
|
@ -792,16 +800,6 @@ and is built with GNU readline support so it can be used as a fully-featured
|
|||
interactive shell. ``autoconf-2.69`` is used to regenerate the configure
|
||||
script and ``bison`` is used to recreate some included generated files.
|
||||
|
||||
curl 7.83.0
|
||||
===========
|
||||
|
||||
``curl`` is built in sysc because Linux must be running with support for threads
|
||||
(which is not the case if kernel bootstrapping is being used). curl requires
|
||||
musl with thread support, which was built at the end of sysa.
|
||||
``curl`` is built first in sysc so the rest of the packages can be downloaded.
|
||||
Note that the tar file for curl itself was copied over from sysa because
|
||||
curl is not yet available to download it.
|
||||
|
||||
xz 5.4.1
|
||||
========
|
||||
|
||||
|
|
151
rootfs.py
151
rootfs.py
|
@ -15,10 +15,9 @@ you can run bootstap inside chroot.
|
|||
|
||||
import argparse
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from lib.utils import run, run_as_root
|
||||
from lib.tmpdir import Tmpdir
|
||||
from lib.target import Target
|
||||
from lib.generator import Generator, stage0_arch_map
|
||||
|
||||
def create_configuration_file(args):
|
||||
|
@ -30,16 +29,15 @@ def create_configuration_file(args):
|
|||
with open(config_path, "w", encoding="utf_8") as config:
|
||||
config.write(f"FORCE_TIMESTAMPS={args.force_timestamps}\n")
|
||||
config.write(f"CHROOT={args.chroot or args.bwrap}\n")
|
||||
config.write(f"CHROOT_ONLY_SYSA={args.bwrap}\n")
|
||||
config.write(f"UPDATE_CHECKSUMS={args.update_checksums}\n")
|
||||
config.write(f"JOBS={args.cores}\n")
|
||||
config.write(f"INTERNAL_CI={args.internal_ci}\n")
|
||||
config.write(f"INTERNAL_CI={args.internal_ci or False}\n")
|
||||
config.write(f"BARE_METAL={args.bare_metal}\n")
|
||||
if (args.bare_metal or args.qemu) and not args.kernel:
|
||||
if args.repo or args.external_sources:
|
||||
config.write("DISK=sdb1\n")
|
||||
else:
|
||||
config.write("DISK=sdb\n")
|
||||
config.write("DISK=sda\n")
|
||||
config.write("KERNEL_BOOTSTRAP=True\n")
|
||||
else:
|
||||
config.write("DISK=sda1\n")
|
||||
|
@ -60,11 +58,9 @@ def main():
|
|||
action="store_true")
|
||||
parser.add_argument("-bw", "--bwrap", help="Run inside a bwrap sandbox",
|
||||
action="store_true")
|
||||
parser.add_argument("-p", "--preserve", help="Do not remove temporary dir",
|
||||
action="store_true")
|
||||
parser.add_argument("-t", "--tmpdir", help="Temporary directory",
|
||||
default="tmp")
|
||||
parser.add_argument("--tmpfs", help="Use a tmpfs on tmpdir",
|
||||
parser.add_argument("-t", "--target", help="Target directory",
|
||||
default="target")
|
||||
parser.add_argument("--tmpfs", help="Use a tmpfs on target",
|
||||
action="store_true")
|
||||
parser.add_argument("--tmpfs-size", help="Size of the tmpfs",
|
||||
default="8G")
|
||||
|
@ -98,7 +94,9 @@ def main():
|
|||
default="qemu-system-x86_64")
|
||||
parser.add_argument("-qr", "--qemu-ram", help="Memory (in megabytes) allocated to QEMU VM",
|
||||
default=4096)
|
||||
parser.add_argument("-qk", "--kernel", help="Custom sysa kernel to use")
|
||||
parser.add_argument("-qs", "--target-size", help="Size of the target image (for QEMU only)",
|
||||
default="16G")
|
||||
parser.add_argument("-qk", "--kernel", help="Custom early kernel to use")
|
||||
|
||||
parser.add_argument("-b", "--bare-metal", help="Build images for bare metal",
|
||||
action="store_true")
|
||||
|
@ -128,7 +126,7 @@ def main():
|
|||
if args.arch != "x86":
|
||||
print("Only x86 is supported at the moment, other arches are for development only.")
|
||||
|
||||
# Tmp validation
|
||||
# Tmpfs validation
|
||||
if args.bwrap and args.tmpfs:
|
||||
raise ValueError("tmpfs cannot be used with bwrap.")
|
||||
|
||||
|
@ -136,33 +134,41 @@ def main():
|
|||
if int(args.cores) < 1:
|
||||
raise ValueError("Must use one or more cores.")
|
||||
|
||||
# Target image size validation
|
||||
if args.qemu:
|
||||
if int(str(args.target_size).rstrip('gGmM')) < 1:
|
||||
raise ValueError("Please specify a positive target size for qemu.")
|
||||
args.target_size = (int(str(args.target_size).rstrip('gGmM')) *
|
||||
(1024 if str(args.target_size).lower().endswith('g') else 1))
|
||||
else:
|
||||
args.target_size = 0
|
||||
|
||||
# bootstrap.cfg
|
||||
try:
|
||||
os.remove(os.path.join('sysa', 'bootstrap.cfg'))
|
||||
os.remove(os.path.join('steps', 'bootstrap.cfg'))
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
if not args.no_create_config:
|
||||
create_configuration_file(args)
|
||||
else:
|
||||
with open(os.path.join('sysa', 'bootstrap.cfg'), 'a', encoding='UTF-8'):
|
||||
with open(os.path.join('steps', 'bootstrap.cfg'), 'a', encoding='UTF-8'):
|
||||
pass
|
||||
|
||||
# tmpdir
|
||||
tmpdir = Tmpdir(path=args.tmpdir, preserve=args.preserve)
|
||||
# target
|
||||
target = Target(path=args.target)
|
||||
if args.tmpfs:
|
||||
tmpdir.tmpfs(size=args.tmpfs_size)
|
||||
target.tmpfs(size=args.tmpfs_size)
|
||||
|
||||
generator = Generator(tmpdir=tmpdir,
|
||||
arch=args.arch,
|
||||
generator = Generator(arch=args.arch,
|
||||
external_sources=args.external_sources,
|
||||
repo_path=args.repo,
|
||||
early_preseed=args.early_preseed)
|
||||
|
||||
bootstrap(args, generator, tmpdir)
|
||||
bootstrap(args, generator, target, args.target_size)
|
||||
|
||||
def bootstrap(args, generator, tmpdir):
|
||||
def bootstrap(args, generator, target, size):
|
||||
"""Kick off bootstrap process."""
|
||||
print(f"Bootstrapping {args.arch} -- SysA")
|
||||
print(f"Bootstrapping {args.arch}", flush=True)
|
||||
if args.chroot:
|
||||
find_chroot = """
|
||||
import shutil
|
||||
|
@ -171,95 +177,88 @@ print(shutil.which('chroot'))
|
|||
chroot_binary = run_as_root('python3', '-c', find_chroot,
|
||||
capture_output=True).stdout.decode().strip()
|
||||
|
||||
generator.prepare(using_kernel=False)
|
||||
generator.prepare(target, using_kernel=False)
|
||||
|
||||
arch = stage0_arch_map.get(args.arch, args.arch)
|
||||
init = os.path.join(os.sep, 'bootstrap-seeds', 'POSIX', arch, 'kaem-optional-seed')
|
||||
run_as_root('env', '-i', 'PATH=/bin', chroot_binary, generator.tmp_dir, init)
|
||||
run_as_root('env', '-i', 'PATH=/bin', chroot_binary, generator.target_dir, init)
|
||||
|
||||
elif args.bwrap:
|
||||
init = '/init'
|
||||
if not args.internal_ci or args.internal_ci == "pass1":
|
||||
generator.prepare(using_kernel=False)
|
||||
generator.prepare(target, using_kernel=False)
|
||||
|
||||
arch = stage0_arch_map.get(args.arch, args.arch)
|
||||
init = os.path.join(os.sep, 'bootstrap-seeds', 'POSIX', arch, 'kaem-optional-seed')
|
||||
run('bwrap', '--unshare-user',
|
||||
'--uid', '0',
|
||||
'--gid', '0',
|
||||
'--unshare-net',
|
||||
'--clearenv',
|
||||
'--setenv', 'PATH', '/usr/bin',
|
||||
'--bind', generator.tmp_dir, '/',
|
||||
'--dir', '/dev',
|
||||
'--dev-bind', '/dev/null', '/dev/null',
|
||||
'--dev-bind', '/dev/zero', '/dev/zero',
|
||||
'--dev-bind', '/dev/random', '/dev/random',
|
||||
'--dev-bind', '/dev/urandom', '/dev/urandom',
|
||||
'--dev-bind', '/dev/ptmx', '/dev/ptmx',
|
||||
'--dev-bind', '/dev/tty', '/dev/tty',
|
||||
init)
|
||||
else:
|
||||
generator.reuse(target)
|
||||
|
||||
if not args.internal_ci or args.internal_ci == "pass2" or args.internal_ci == "pass3":
|
||||
shutil.copy2(os.path.join('sysa', 'bootstrap.cfg'),
|
||||
os.path.join('tmp', 'sysa', 'sysc_image', 'usr', 'src', 'bootstrap.cfg'))
|
||||
run('bwrap', '--unshare-user',
|
||||
'--uid', '0',
|
||||
'--gid', '0',
|
||||
'--unshare-net' if args.external_sources else None,
|
||||
'--clearenv',
|
||||
'--setenv', 'PATH', '/usr/bin',
|
||||
'--bind', generator.tmp_dir + "/sysc_image", '/',
|
||||
'--dir', '/dev',
|
||||
'--dev-bind', '/dev/null', '/dev/null',
|
||||
'--dev-bind', '/dev/zero', '/dev/zero',
|
||||
'--dev-bind', '/dev/random', '/dev/random',
|
||||
'--dev-bind', '/dev/urandom', '/dev/urandom',
|
||||
'--dev-bind', '/dev/ptmx', '/dev/ptmx',
|
||||
'--dev-bind', '/dev/tty', '/dev/tty',
|
||||
'--tmpfs', '/dev/shm',
|
||||
'--proc', '/proc',
|
||||
'--bind', '/sys', '/sys',
|
||||
'--tmpfs', '/tmp',
|
||||
'/init')
|
||||
run('env', '-i', 'bwrap', '--unshare-user',
|
||||
'--uid', '0',
|
||||
'--gid', '0',
|
||||
'--unshare-net' if args.external_sources else None,
|
||||
'--setenv', 'PATH', '/usr/bin',
|
||||
'--bind', generator.target_dir, '/',
|
||||
'--dir', '/dev',
|
||||
'--dev-bind', '/dev/null', '/dev/null',
|
||||
'--dev-bind', '/dev/zero', '/dev/zero',
|
||||
'--dev-bind', '/dev/random', '/dev/random',
|
||||
'--dev-bind', '/dev/urandom', '/dev/urandom',
|
||||
'--dev-bind', '/dev/ptmx', '/dev/ptmx',
|
||||
'--dev-bind', '/dev/tty', '/dev/tty',
|
||||
'--tmpfs', '/dev/shm',
|
||||
'--proc', '/proc',
|
||||
'--bind', '/sys', '/sys',
|
||||
'--tmpfs', '/tmp',
|
||||
init)
|
||||
|
||||
elif args.bare_metal:
|
||||
if args.kernel:
|
||||
generator.prepare(using_kernel=True)
|
||||
generator.prepare(target, using_kernel=True, target_size=size)
|
||||
path = os.path.join(args.target, os.path.relpath(generator.target_dir, args.target))
|
||||
print("Please:")
|
||||
print(" 1. Take tmp/initramfs and your kernel, boot using this.")
|
||||
print(" 2. Take tmp/disk.img and put this on a writable storage medium.")
|
||||
print(f" 1. Take {path}/initramfs and your kernel, boot using this.")
|
||||
print(f" 2. Take {path}/disk.img and put this on a writable storage medium.")
|
||||
else:
|
||||
generator.prepare(kernel_bootstrap=True)
|
||||
generator.prepare(target, kernel_bootstrap=True, target_size=size)
|
||||
path = os.path.join(args.target, os.path.relpath(generator.target_dir, args.target))
|
||||
print("Please:")
|
||||
print(" 1. Take tmp/disk.img and write it to a boot drive and then boot it.")
|
||||
print(f" 1. Take {path}.img and write it to a boot drive and then boot it.")
|
||||
|
||||
else:
|
||||
if args.kernel:
|
||||
generator.prepare(using_kernel=True)
|
||||
generator.prepare(target, using_kernel=True, target_size=size)
|
||||
|
||||
run(args.qemu_cmd,
|
||||
'-enable-kvm',
|
||||
'-m', str(args.qemu_ram) + 'M',
|
||||
'-smp', str(args.cores),
|
||||
'-no-reboot',
|
||||
'-drive', 'file=' + tmpdir.get_disk("disk") + ',format=raw',
|
||||
'-drive', 'file=' + tmpdir.get_disk("external") + ',format=raw',
|
||||
'-drive', 'file=' + target.get_disk("disk") + ',format=raw',
|
||||
'-drive', 'file=' + target.get_disk("external") + ',format=raw',
|
||||
'-nic', 'user,ipv6=off,model=e1000',
|
||||
'-kernel', args.kernel,
|
||||
'-nographic',
|
||||
'-append', 'console=ttyS0 root=/dev/sda1 rootfstype=ext3 init=/init rw')
|
||||
else:
|
||||
generator.prepare(kernel_bootstrap=True)
|
||||
run(args.qemu_cmd,
|
||||
generator.prepare(target, kernel_bootstrap=True, target_size=size)
|
||||
arg_list = [
|
||||
'-enable-kvm',
|
||||
'-m', "4G",
|
||||
'-m', str(args.qemu_ram) + 'M',
|
||||
'-smp', str(args.cores),
|
||||
'-no-reboot',
|
||||
'-drive', 'file=' + os.path.join(generator.tmp_dir, 'disk.img') + ',format=raw',
|
||||
'-drive', 'file=' + tmpdir.get_disk("external") + ',format=raw',
|
||||
'-drive', 'file=' + generator.target_dir + '.img' + ',format=raw'
|
||||
]
|
||||
if target.get_disk("external") is not None:
|
||||
arg_list += [
|
||||
'-drive', 'file=' + target.get_disk("external") + ',format=raw',
|
||||
]
|
||||
arg_list += [
|
||||
'-machine', 'kernel-irqchip=split',
|
||||
'-nic', 'user,ipv6=off,model=e1000',
|
||||
'-nographic')
|
||||
'-nographic'
|
||||
]
|
||||
run(args.qemu_cmd, *arg_list)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
|
@ -461,8 +461,10 @@ void output_call_script(FILE *out, char *type, char *name, int using_bash, int s
|
|||
fputs("kaem --file ", out);
|
||||
}
|
||||
fputs("/steps/", out);
|
||||
fputs(type, out);
|
||||
fputs("/", out);
|
||||
if (strlen(type) != 0) {
|
||||
fputs(type, out);
|
||||
fputs("/", out);
|
||||
}
|
||||
fputs(name, out);
|
||||
fputs(".sh\n", out);
|
||||
}
|
||||
|
|
|
@ -9,27 +9,11 @@ for the bootstrapping process.
|
|||
|
||||
import argparse
|
||||
|
||||
from sysa import SysA
|
||||
from sysc import SysC
|
||||
from lib.generator import Generator
|
||||
|
||||
def main():
|
||||
"""Generate a source manifest for a system"""
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
parser.add_argument("-s", "--system",
|
||||
help="Generate source manifest for the specified systems",
|
||||
choices=["sysa", "sysc"],
|
||||
nargs="+",
|
||||
action="extend",
|
||||
required=True)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if "sysa" in args.system:
|
||||
print(SysA.get_source_manifest())
|
||||
|
||||
if "sysc" in args.system:
|
||||
print(SysC.get_source_manifest())
|
||||
print('\n'.join(map(' '.join, Generator.get_source_manifest())))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
|
@ -9,10 +9,10 @@ d5fcce4baea5e11f983a7e4b7148545ab6720bb4e010898c73387f6711be67f4 autoconf-2.64_
|
|||
298dcf17a439adb306237b308e3c4ed3d376cb863ae0f0f08bfdf1f3199a548b autoconf-2.69_0.tar.bz2
|
||||
8c2401edf1c68910005bbcb8b8e84727a46f7d9643d2ad1267bd0259078dadc4 autoconf-2.71_0.tar.bz2
|
||||
6ff691e3ddd4f3d1796d28b07a2a96691dbd9801844c99ccbe660da59dabd74b autoconf-archive-2021.02.19_0.tar.bz2
|
||||
56cb475253b1175f09d69bc81a5b1d954f486c9b97b1a0ae3217e63d18f64573 autogen-5.18.16_0.tar.bz2
|
||||
9b52663ad7c591520805b96c519c4a291d8a9a960a907341c5b78cd631ebb344 autogen-5.18.16_0.tar.bz2
|
||||
02a426e82a52d4a2cd7e73fe3dc5a2c58b3ed100f24a92c57e42511fd86e247c automake-1.10.3_0.tar.bz2
|
||||
34925adeaa2876a5e068adeb17b71fe7c7105244c3cb5439d33f7406310674da automake-1.11.2_0.tar.bz2
|
||||
a7bd12bd0c639783ce1c0e9f640cf004a87460bbda8154bc550c5e6884457b48 automake-1.15.1_0.tar.bz2
|
||||
7e36e9e4b3957c95b6de8ff475c9b37aa007e2f9735b01c0eaf14b711fdd112f automake-1.15.1_0.tar.bz2
|
||||
57100612d902537b72ee2fd3dfecc903f2ea3959f1a480af87c6a1ef9a9d7c03 automake-1.16.3_0.tar.bz2
|
||||
1c7e09ac08f156960420fca1f6e8560c1855bf01b001a0648b56153d6ceb9c28 automake-1.6.3_0.tar.bz2
|
||||
444131776779d1f27628088a817bfb8c9aa85f4b036b934794a71e484ec9bd70 automake-1.6.3_1.tar.bz2
|
||||
|
@ -23,15 +23,15 @@ c5807850a377e4bb9aa4121d9781d145bdd80327626a9419630a75ce2c8d9c71 automake-1.9.6
|
|||
f8a55bf656f950ee3c5cea48af03f552166f6db9926b78c78843f3cc52a6e22d bash-5.2.15_0.tar.bz2
|
||||
ebc631ee8e9382650005984ec5f3910492ccb6fb2656b4c0af0f4afc16998906 bc-1.07.1_0.tar.bz2
|
||||
28b38078f88d77ebfa8ad1a514a5724fe11581bdbfc72b79f087fa24986ac9cb binutils-2.30_0.tar.bz2
|
||||
6eb26a856e1eb79a1b3f6d76e42138bf1b868fc5f229c3a1e22d3eb68dfb88ba binutils-2.38_0.tar.bz2
|
||||
57e339eb76a5a0f4b7298d0071f83354911dda928f4aa54e47a21ebc9c8390a7 binutils-2.38_1.tar.bz2
|
||||
da658346866061324b92a6b734561257acfdb981783ad5794d67a0cd56e14e58 binutils-2.41_0.tar.bz2
|
||||
026447a32ab08a8a5150bab82a2f150af4a2ed90c47cfde631e1460eaed019aa binutils-2.41_1.tar.bz2
|
||||
f0bb18831983493b82fde53917e8d16c6a380761ac5e71e14769a82193fee788 bison-2.3_0.tar.bz2
|
||||
7018edd13a1dd5ba35fdc8be49af91b28901aad3080fdeebdb98b79f8a90d7ed bison-3.4.1_0.tar.bz2
|
||||
41c9a95b11cf183524927f52f9f7e97a479e0261c0551f6a4c22690b931243db bison-3.4.1_1.tar.bz2
|
||||
4a291da4dc1d2a49eeff6bd6017d0d91f804d0a8a2b701de9ed5c53cf5061fe4 bison-3.4.1_2.tar.bz2
|
||||
6d5e4debdec03aee096dbcefcad878fb5c6a069f895ee7ade878d9eeb97fb83e bison-3.4.2_0.tar.bz2
|
||||
e196396a3073992ca4d8ce1606831e3a6e06fd22753f89b778eec01eed549a92 bzip2-1.0.8_0.tar.bz2
|
||||
c511d571d24675a141258e0e198c5ed1bcfd4889ddd736ff8e25c0d97b44e2cf ca-certificates-3.88.1_0.tar.bz2
|
||||
543214998317d764595d3dd247a1fb2e0803ad77978b8474bd24d64c161b9530 ca-certificates-3.95_0.tar.bz2
|
||||
692ec3f83fdd94a3687c764e6246f608e4600bc8f9fec953a0b23617ad24d08d coreutils-5.0_0.tar.bz2
|
||||
09092e187588c5d33c023ac41671b367aef9f7ee967d2c7c03430b33cc03f251 coreutils-6.10_0.tar.bz2
|
||||
f49900486ae7f0c8107d729b71ede155ee44544cdf8d562b50fbea4095bd05b2 coreutils-8.32_0.tar.bz2
|
||||
|
@ -49,20 +49,20 @@ b3a8d59229289ca5a1de6a24c9c828d2847144f6662e0d5b7f41e7ff6e57abaa flex-2.5.33_0.
|
|||
408131b1c033a5f8a6845997b049784be0b466cec107a71270e5a04dae2c1e6c flex-2.6.4_0.tar.bz2
|
||||
5ff7fbe16b55563719b108260bd6a34ebabab0465d758ca98cba522932532e45 gawk-3.0.4_0.tar.bz2
|
||||
6de1c1380026ef9948387e665610185b6014f47a80453177a6c81898c95cbbd3 gc-8.0.4_0.tar.bz2
|
||||
872eabeff12a0b1b9dc2bd146f2c1e493597281795548377ff1ec5f6a1853e88 gcc-10.4.0_0.tar.bz2
|
||||
4f50d8f5e1f123a8e6d34dff1d5892f79d250f2fb5d7fa2a94cff1f2e8f9649c gcc-13.1.0_0.tar.bz2
|
||||
c99d080cf17ac3f75cbae67095cb76220a92d96d877c92c896a7f05c9c94e92d gcc-10.4.0_0.tar.bz2
|
||||
e0c9e7f4f0cd0d5027f2a38eb262f883133c31ac9ec93ee6afa5abc028096bc0 gcc-13.1.0_0.tar.bz2
|
||||
526c3710b5067bd2fc869371541d7e71dcff1cffcba7ddecabedc33967e19e2c gcc-4.0.4_0.tar.bz2
|
||||
c1bf792e90df13bf7a24d3f8ce3939fd96ff61b8117e4dcef75605974f3fcf25 gcc-4.0.4_1.tar.bz2
|
||||
7ac087bf006188154c28401d0c875ede56076c19d41bc54ffa0d7cc18ce40800 gcc-4.7.4_0.tar.bz2
|
||||
dc67fc1b132fa3945349efe74c5b2197bd0b6babf4d29d2deddd04f09d9af680 gettext-0.21_0.tar.bz2
|
||||
309282ba840f80b5e10897b1221f3ff3329b9e05b982c788d03652f411974524 gmp-6.2.1_0.tar.bz2
|
||||
f5917ffad5dd282d5ea17e791b470455c328ea0ebc845ed5ec80937a8d0eb933 gperf-3.1_0.tar.bz2
|
||||
62edfa633f64202b2d29199d11d56a897654a441c7ae39a4d59ca5fe75199f61 gperf-3.1_0.tar.bz2
|
||||
67d706423e079a9cd764fd9607027d296c0ff2380c1104006a2230a299eb2c1d grep-2.4_0.tar.bz2
|
||||
0939a34d58ff31e2c234f6f47f964633ceae4839de49ce368ad027c016850d58 grep-3.7_0.tar.bz2
|
||||
9dacbb0d2a12585079ba2527af5bb165337aa6fe68fa42b93842abe3b8d46ef6 guile-3.0.9_0.tar.bz2
|
||||
8e612afb9a439aa8bf5db0fc2589eec890a6017690412d5c8e88a5838730b42c grep-3.7_0.tar.bz2
|
||||
e2a85aad6d51e52c9a30afeed058f95172fde1215f77243549274672990f6237 guile-3.0.9_0.tar.bz2
|
||||
8d2015b87337abbf287f7a39ee4cf53514120b5d3e90a93fe7d533dcc43f14fa help2man-1.36.4_0.tar.bz2
|
||||
f650c3b24de6edd49cd662c9e9ce11f7b0b5ea6df66d561b46a032b08fc34faa kbd-1.15_0.tar.bz2
|
||||
3e3bc64af937c351be2538bb89de99f36ffc240721c32fcc84a76769e235ed66 kexec-linux-1.0.0_0.tar.bz2
|
||||
50a0f881161c68fe7c9ec6836b11a905b0d54e08e99b2476e8d1f5ac3212769e kexec-linux-1.0.0_0.tar.bz2
|
||||
1be7bf0319635b8bd22fd3c1a5a88ea267730a9a2e3cfff37473a5fea0779efb kexec-tools-2.0.22_0.tar.bz2
|
||||
453c10220178f097e1ab26fac6dffbee63b61890cdb8d7d24dcd6acad6ad08a3 libarchive-3.5.2_0.tar.bz2
|
||||
36550df491767bb24d2ccab304ce70a3b4956e7c0c0e0c343d922fd57cdafbdd libatomic_ops-7.6.10_0.tar.bz2
|
||||
|
@ -70,7 +70,7 @@ b39826742e236890f3562cdf19492e7ef4224b271f3e75ddeab1f07982b03ebe libffi-3.3_0.t
|
|||
daae709e98d2df2190d1d13b4e86f7f3fe90fa7a975282fe0bb03289b6539f29 libtool-2.2.4_0.tar.bz2
|
||||
6cefa575362149620f8008a32c8af54f0198a18bc6ab910bd3cead196c1507d7 libtool-2.4.7_0.tar.bz2
|
||||
503007bbcddcf4e49d26514c59b4c9501f8b42f0c994a59dfdc388b1ae6b7900 libunistring-0.9.10_0.tar.bz2
|
||||
e10734d700e3ab870374d3f37f6e6cb394d6ba7e2da6f4e70bb324e834b0ad7f linux-4.9.10_0.tar.bz2
|
||||
fd2264a08cbeeb28f3e2580cba174376a154c77b0ef6cbf67b55fd13c0987f52 linux-4.9.10_0.tar.bz2
|
||||
d15c922973c15a8206e09020e8cfe6a78f7e93614de212f2b37ff80163799c6c linux-headers-4.9.10_0.tar.bz2
|
||||
3864f2c66516fc4f5086f626f4da2b2a7635e21babca86ba478f866920868e2b m4-1.4.7_0.tar.bz2
|
||||
e69554b0a77b419ddd5d0a0e418ba4005ecd0f6784c92a6928a0270bd929a098 make-3.82_0.tar.bz2
|
||||
|
@ -82,7 +82,7 @@ e69554b0a77b419ddd5d0a0e418ba4005ecd0f6784c92a6928a0270bd929a098 make-3.82_0.ta
|
|||
b79e0f8a39ba8880d43aa27551b72915655c62af39125e1f4ac8f8e69e71aaca musl-1.1.24_2.tar.bz2
|
||||
81f79a0faf58e105c5f12d9f538d3ea7578a3b361e633ab8f47324ec23ec9de6 musl-1.2.4_0.tar.bz2
|
||||
6dc5e763b747b66f72692c6820d7f46b7f4cf2e2fe05229a1d01c03919c1c936 musl-1.2.4_1.tar.bz2
|
||||
107548dd69ff4d5dfceb5891eed8a237cc6a22fd65915b44c838be1eba07668b musl-1.2.4_2.tar.bz2
|
||||
820203286127e7c22cee9f1b3cff664431f10d14c3f22f00b3e771fd849fd449 musl-1.2.4_2.tar.bz2
|
||||
c490016e49bbf77e7f63071f7aa60e8290a0c67f017846def1c3f65bd10d5712 openssl-1.1.1l_0.tar.bz2
|
||||
71864d042cdc564b65eab21360902c714e9b43f80a19689c5600589529b267e7 patch-2.7.6_0.tar.bz2
|
||||
914a7abf36a64723b6e9f9b0b6ccd19c8e544fa798896a2bb1151dc341890c22 perl-5.000_0.tar.bz2
|
||||
|
@ -93,19 +93,19 @@ b86fc586d72a6d204d0b9017afe17aa2439529e13f43befc56648b78de17c8f8 perl5.004-05_0
|
|||
fdccd3ba27a44d2149f159040414a04b39bfc72673ba36f50051b61199cc425c perl-5.32.1_0.tar.bz2
|
||||
9fa8850897248d77d554caa2b3d52e7890308cbf28750ffc24c09f498aee563c perl-5.6.2_0.tar.bz2
|
||||
1b9d4260edf7b2241d10e4c4ad17d0f90047bd4bf42f2487a7133902529e9dfe pkg-config-0.29.2_0.tar.bz2
|
||||
d4a263a4039b8d18ab95b5a7188a5c8b0defdf17d1cf899bf23a597be2df0658 python-2.0.1_0.tar.bz2
|
||||
95ecbf909a8781d77e9b89e6ff3dc39e3ed702aebdec8b0a491df2dd4af8c780 python-2.0.1_1.tar.bz2
|
||||
14b20bd76f6dfab0cc19141fd8d39c2841227b3876e5d107b1b57b05a51a83aa python-2.3.7_0.tar.bz2
|
||||
5395d185003b22c607eb55a5b9f1adca5bbe178e7c774faabe758d0499936397 python-2.3.7_1.tar.bz2
|
||||
374fc8c2577d681b7aa2670000fcc2450e2b50eb1cc8d739994ece69f83f4155 python-2.5.6_0.tar.bz2
|
||||
e1321250c6421515f982a89ee4ceb8a8b7d2ecc3e192c7c7ede58e98f2bc75de python-3.11.1_0.tar.bz2
|
||||
8f096d93f799a6575bae06a578625b92a888c25ed6b4d296173fc20fcadb003a python-3.1.5_0.tar.bz2
|
||||
fb123d00e591452a6f077aaa8aa22ab8693e665ffa95e185a2bf79883d3d4684 python-3.1.5_1.tar.bz2
|
||||
a9b73271407427f749406e1d3eabd51f627fd0fbe92332b792eeff1b9bfc44a5 python-3.3.7_0.tar.bz2
|
||||
f95ce9de6002c47d82c41804e943a7079614fe7bc669fba15fe4552f9f08a7e3 python-3.4.10_0.tar.bz2
|
||||
18bf5480d894d65bb11cad9d8591410e8a3b399f6eef3568d45144c363cd7d43 python-3.8.16_0.tar.bz2
|
||||
1e882c3206f9d1de2a9be8b5c6ae4cc65e80a4de607bd521058577bf4169c0e9 python-2.0.1_0.tar.bz2
|
||||
aba9710341db75b78c7bc1eb4ef45b9496e23f7a356128af6c2b116ee0f3f31a python-2.0.1_1.tar.bz2
|
||||
d497c9b614194b941620bb5c5111fc72eca8cafd7d4f476eacb24fb7f909b614 python-2.3.7_0.tar.bz2
|
||||
8a977205933431c2a4207f647cb683b570dfdb0146e21abf5fab3f8426e1356b python-2.3.7_1.tar.bz2
|
||||
34e5083ed3e72da5aa5950acebf9e95464089d693e3d6a047a2b69b6103f5ca9 python-2.5.6_0.tar.bz2
|
||||
52ffb1ea6f2b893a6fd26f930c8ff63f78ddcc31ac3ec9c2ddade555205aa1ef python-3.11.1_0.tar.bz2
|
||||
3508248f299b73c50e3607c4c294d40face05170476a5026b0821aed69025863 python-3.1.5_0.tar.bz2
|
||||
12b1ffc7ec98ba8f807160b93ba69a694d5395567c3bcac1e49e8f8d1d50de43 python-3.1.5_1.tar.bz2
|
||||
60b93253a2078f849f81e7e1ed6233e30702f03b1893640eee95671d814f5514 python-3.3.7_0.tar.bz2
|
||||
da7c8ec579dd225c0d8bee63d95aeeb27ac2d5a60d4eefe298508cbf86bf506c python-3.4.10_0.tar.bz2
|
||||
0be505f63205b4bc1b1421896c610468ad1a2194bbc4c9abf58f61685c2023d1 python-3.8.16_0.tar.bz2
|
||||
6081832f1fc258df7dd927986821991b49fa78a71b76f4b37b5c34a8ebc9bc86 sed-4.0.9_0.tar.bz2
|
||||
e58d8ec46c5b31175de9598bf0da214b88ccbd4cca7a787f3d048c44edaf3ceb sed-4.8_0.tar.bz2
|
||||
e8daec00b2c2de7b18efbec057dc9290eed06668806c6f5a48914d4a5cd95eb4 sed-4.8_0.tar.bz2
|
||||
912d8f344104f1322255d6210c7c7e1371413ab530b2c6796e6aa565c74bf647 tar-1.34_0.tar.bz2
|
||||
d5d0df210248a385ae255cc5651369108e9a71fa8668821a6b1ed30a8d7364a1 tcc-0.9.27_0.tar.bz2
|
||||
79276f54bc57933b6002e5511e6d8d88e22159dcf1cbbc9da763c38691a2c628 tcc-0.9.27_1.tar.bz2
|
||||
|
@ -113,6 +113,6 @@ d5d0df210248a385ae255cc5651369108e9a71fa8668821a6b1ed30a8d7364a1 tcc-0.9.27_0.t
|
|||
2b503cd31d3326ac1ed0eb9f506ac93c93770da51164e152a812cd248961069c tcc-0.9.27_3.tar.bz2
|
||||
50ebaa1d8fcc4a03a43d431eb71e2f435cc8712ae47d400564df3716037d553a texinfo-6.7_0.tar.bz2
|
||||
229d9189adac10ad2a2c76fc147a4c317fc5b34026cef1c47edc9159aee480da util-linux-2.19.1_0.tar.bz2
|
||||
5a1fdd2b42080f3b4808ceb1bf80a95873e614a25524545e6803b7d9f1fd5605 which-2.21_0.tar.bz2
|
||||
ecdb7ffeb9256f6a9760be70969fe5dea9cde6a538cc88595281fe44340e98a1 which-2.21_0.tar.bz2
|
||||
3fade2079cc91f2c5624ff7247220059caee82e7de493332103d7a78155400b2 xz-5.4.1_0.tar.bz2
|
||||
ca8ec9876a7334f5f87e1159e0efe343b8b497ffb0dea8b548223035ecd67f9e zlib-1.2.13_0.tar.bz2
|
||||
|
|
|
@ -12,17 +12,17 @@ src_prepare() {
|
|||
sed -i '/doc\/Makefile.inc/d' Makefile.am
|
||||
sed -i '/t\/Makefile.inc/d' Makefile.am
|
||||
|
||||
AUTOCONF=autoconf-2.69 AUTOM4TE=autom4te-2.69 ./bootstrap
|
||||
AUTOCONF="autoconf-2.69 -f" AUTOM4TE=autom4te-2.69 ./bootstrap
|
||||
|
||||
rm doc/automake-history.info doc/automake.info*
|
||||
}
|
||||
|
||||
src_configure() {
|
||||
AUTORECONF=autoreconf-2.69 AUTOM4TE=autom4te-2.69 AUTOHEADER=autoheader-2.69 AUTOCONF=autoconf-2.69 ./configure --prefix="${PREFIX}"
|
||||
AUTORECONF=autoreconf-2.69 AUTOM4TE=autom4te-2.69 AUTOHEADER=autoheader-2.69 AUTOCONF="autoconf-2.69 -f" ./configure --prefix="${PREFIX}"
|
||||
}
|
||||
|
||||
src_compile() {
|
||||
AUTORECONF=autoreconf-2.69 AUTOM4TE=autom4te-2.69 AUTOHEADER=autoheader-2.69 AUTOCONF=autoconf-2.69 make -j1 MAKEINFO=true
|
||||
AUTORECONF=autoreconf-2.69 AUTOM4TE=autom4te-2.69 AUTOHEADER=autoheader-2.69 AUTOCONF="autoconf-2.69 -f" make -j1 MAKEINFO=true
|
||||
}
|
||||
|
||||
src_install() {
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
SPDX-FileCopyrightText: 2022 Dor Askayo <dor.askayo@gmail.com>
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
Add missing AC_CONFIG_MACRO_DIR.
|
||||
|
||||
Required by autoreconf to create aclocal.m4 correctly.
|
||||
|
||||
--- /libiberty/configure.ac 2022-01-22 14:14:09.000000000 +0200
|
||||
+++ libiberty/configure.ac 2022-09-04 00:01:02.941738129 +0300
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
AC_INIT
|
||||
AC_CONFIG_SRCDIR([xmalloc.c])
|
||||
+AC_CONFIG_MACRO_DIR(../config)
|
||||
|
||||
# This works around the fact that libtool configuration may change LD
|
||||
# for this particular configuration, but some shells, instead of
|
|
@ -1,17 +0,0 @@
|
|||
SPDX-FileCopyrightText: 2022 Dor Askayo <dor.askayo@gmail.com>
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
Ensure i386-init.h dependencies are satisfied.
|
||||
|
||||
--- opcodes/Makefile.am 2022-01-22 14:14:09.000000000 +0200
|
||||
+++ opcodes/Makefile.am 2022-09-13 21:09:04.353324699 +0300
|
||||
@@ -575,7 +575,7 @@ i386-gen.o: i386-gen.c i386-opc.h $(srcd
|
||||
$(srcdir)/i386-tbl.h: $(srcdir)/i386-init.h
|
||||
@echo $@
|
||||
|
||||
-$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl i386-opc.h
|
||||
+$(srcdir)/i386-init.h: i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl i386-opc.h
|
||||
$(CPP) -P $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) - \
|
||||
< $(srcdir)/i386-opc.tbl \
|
||||
| ./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
|
|
@ -1 +0,0 @@
|
|||
https://mirrors.kernel.org/gnu/binutils/binutils-2.38.tar.xz e316477a914f567eccc34d5d29785b8b0f5a10208d36bbacedcc39048ecfe024
|
|
@ -11,11 +11,13 @@ src_prepare() {
|
|||
|
||||
# Remove unused generated files
|
||||
rm etc/Makefile.in etc/configure
|
||||
|
||||
rm zlib/aclocal.m4 zlib/configure
|
||||
|
||||
# Remove gprofng
|
||||
rm -r gprofng
|
||||
|
||||
# Regenerate autoconf
|
||||
for dir in bfd binutils gas gold gprof intl ld libctf libiberty opcodes; do
|
||||
for dir in bfd binutils gas gold gprof intl ld libctf libiberty libsframe opcodes; do
|
||||
cd $dir
|
||||
AUTOPOINT=true ACLOCAL=aclocal-1.15 AUTOMAKE=automake-1.15 autoreconf-2.69 -fi
|
||||
cd ..
|
||||
|
@ -26,9 +28,6 @@ src_prepare() {
|
|||
pushd gold
|
||||
automake-1.15 -fai testsuite/Makefile
|
||||
popd
|
||||
pushd bfd
|
||||
automake-1.15 -fai doc/Makefile
|
||||
popd
|
||||
|
||||
# Rebuild bison files
|
||||
touch -- */*.y
|
||||
|
@ -59,12 +58,14 @@ src_prepare() {
|
|||
-delete
|
||||
|
||||
# Remove pregenerated opcodes files
|
||||
rm opcodes/i386-init.h opcodes/i386-tbl.h
|
||||
rm opcodes/i386-init.h opcodes/i386-tbl.h opcodes/i386-mnem.h
|
||||
rm opcodes/ia64-asmtab.c
|
||||
rm opcodes/z8k-opc.h
|
||||
rm opcodes/aarch64-asm-2.c opcodes/aarch64-opc-2.c opcodes/aarch64-dis-2.c
|
||||
rm $(grep -l 'MACHINE GENERATED' opcodes/*.c opcodes/*.h)
|
||||
|
||||
rm libiberty/functions.texi
|
||||
|
||||
# Regenerate MeP sections
|
||||
./bfd/mep-relocs.pl
|
||||
|
||||
|
@ -73,7 +74,7 @@ src_prepare() {
|
|||
}
|
||||
|
||||
src_configure() {
|
||||
for dir in intl libctf libiberty opcodes bfd binutils gas gprof ld; do
|
||||
for dir in intl libctf libiberty libsframe opcodes bfd binutils gas gprof ld; do
|
||||
cd $dir
|
||||
|
||||
./configure \
|
||||
|
@ -95,13 +96,13 @@ src_configure() {
|
|||
|
||||
src_compile() {
|
||||
make -C bfd headers
|
||||
for dir in libiberty bfd opcodes libctf binutils gas gprof ld; do
|
||||
for dir in libiberty libsframe bfd opcodes libctf binutils gas gprof ld; do
|
||||
make "${MAKEJOBS}" -C $dir tooldir=${PREFIX} CFLAGS="-std=c99"
|
||||
done
|
||||
}
|
||||
|
||||
src_install() {
|
||||
for dir in libiberty bfd opcodes libctf binutils gas gprof ld; do
|
||||
for dir in libiberty bfd opcodes libctf libsframe binutils gas gprof ld; do
|
||||
make -C $dir tooldir=${PREFIX} DESTDIR="${DESTDIR}" install
|
||||
done
|
||||
|
|
@ -17,7 +17,7 @@ src_prepare() {
|
|||
ACLOCAL=aclocal-1.15 autoreconf-2.69 -fi
|
||||
|
||||
# Regenerate autoconf
|
||||
for dir in bfd binutils gas gold gprof intl ld libctf libiberty opcodes; do
|
||||
for dir in bfd binutils gas gold gprof intl ld libctf libiberty libsframe opcodes; do
|
||||
cd $dir
|
||||
ACLOCAL=aclocal-1.15 AUTOMAKE=automake-1.15 autoreconf-2.69 -fi
|
||||
cd ..
|
||||
|
@ -27,8 +27,10 @@ src_prepare() {
|
|||
pushd gold
|
||||
automake-1.15 -fai testsuite/Makefile
|
||||
popd
|
||||
pushd bfd
|
||||
pushd gprofng
|
||||
automake-1.15 -fai doc/Makefile
|
||||
automake-1.15 -fai gp-display-html/Makefile
|
||||
automake-1.15 -fai src/Makefile
|
||||
popd
|
||||
|
||||
# intl/ Makefile is a bit broken because of new gettext
|
||||
|
@ -67,12 +69,14 @@ src_prepare() {
|
|||
-delete
|
||||
|
||||
# Remove pregenerated opcodes files
|
||||
rm opcodes/i386-init.h opcodes/i386-tbl.h
|
||||
rm opcodes/i386-init.h opcodes/i386-tbl.h opcodes/i386-mnem.h
|
||||
rm opcodes/ia64-asmtab.c
|
||||
rm opcodes/z8k-opc.h
|
||||
rm opcodes/aarch64-asm-2.c opcodes/aarch64-opc-2.c opcodes/aarch64-dis-2.c
|
||||
rm $(grep -l 'MACHINE GENERATED' opcodes/*.c opcodes/*.h)
|
||||
|
||||
rm libiberty/functions.texi
|
||||
|
||||
# Regenerate MeP sections
|
||||
./bfd/mep-relocs.pl
|
||||
|
||||
|
@ -95,6 +99,7 @@ src_configure() {
|
|||
--disable-nls \
|
||||
--disable-multilib \
|
||||
--disable-plugins \
|
||||
--disable-gprofng \
|
||||
--enable-threads \
|
||||
--enable-64-bit-bfd \
|
||||
--enable-gold \
|
|
@ -0,0 +1,26 @@
|
|||
SPDX-FileCopyrightText: 2023 fosslinux <fosslinux@aussies.space>
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
Ensure functions.texi dependencies are satisfied.
|
||||
|
||||
--- libiberty/Makefile.in 2023-12-08 15:18:57.985791235 +1100
|
||||
+++ libiberty/Makefile.in 2023-12-08 15:19:15.391252344 +1100
|
||||
@@ -368,12 +368,12 @@
|
||||
libiberty.html : $(srcdir)/libiberty.texi $(TEXISRC)
|
||||
$(MAKEINFO) --no-split --html -I$(srcdir) -o $@ $<
|
||||
|
||||
-@MAINT@$(srcdir)/functions.texi : stamp-functions
|
||||
-@MAINT@ @true
|
||||
+$(srcdir)/functions.texi : stamp-functions
|
||||
+ @true
|
||||
|
||||
-@MAINT@stamp-functions : $(CFILES:%=$(srcdir)/%) $(TEXIFILES:%=$(srcdir)/%) $(srcdir)/gather-docs Makefile
|
||||
-@MAINT@@HAVE_PERL@ $(PERL) $(srcdir)/gather-docs $(srcdir) $(srcdir)/functions.texi $(CFILES) $(TEXIFILES)
|
||||
-@MAINT@ echo stamp > stamp-functions
|
||||
+stamp-functions : $(CFILES:%=$(srcdir)/%) $(TEXIFILES:%=$(srcdir)/%) $(srcdir)/gather-docs Makefile
|
||||
+@HAVE_PERL@ $(PERL) $(srcdir)/gather-docs $(srcdir) $(srcdir)/functions.texi $(CFILES) $(TEXIFILES)
|
||||
+ echo stamp > stamp-functions
|
||||
|
||||
INSTALL_DEST = @INSTALL_DEST@
|
||||
install: install_to_$(INSTALL_DEST) install-subdir
|
|
@ -0,0 +1,18 @@
|
|||
SPDX-FileCopyrightText: 2022 Dor Askayo <dor.askayo@gmail.com>
|
||||
SPDX-FileCopyrightText: 2023 fosslinux <fosslinux@aussies.space>
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
Ensure i386-tbl.h dependencies are satisfied.
|
||||
|
||||
--- opcodes/Makefile.am 2023-12-08 17:13:05.669136957 +1100
|
||||
+++ opcodes/Makefile.am 2023-12-08 17:13:18.410480026 +1100
|
||||
@@ -540,7 +540,7 @@
|
||||
# i386-gen will generate all headers in one go. Use a pattern rule to properly
|
||||
# express this, with the inner dash ('-') arbitrarily chosen to be the stem.
|
||||
$(srcdir)/i386%tbl.h $(srcdir)/i386%init.h $(srcdir)/i386%mnem.h: \
|
||||
- @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl i386-opc.h
|
||||
+ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl i386-opc.h
|
||||
$(AM_V_GEN)$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) - \
|
||||
< $(srcdir)/i386-opc.tbl \
|
||||
| ./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
|
|
@ -0,0 +1 @@
|
|||
https://mirrors.kernel.org/gnu/binutils/binutils-2.41.tar.xz ae9a5789e23459e59606e6714723f2d3ffc31c03174191ef0d015bdf06007450
|
|
@ -1 +0,0 @@
|
|||
http://ftp.mozilla.org/pub/security/nss/releases/NSS_3_88_1_RTM/src/nss-3.88.1.tar.gz 27d243edf87d1cf1bb9c861f03d387e0e9230ce5017f4308c941f558b54b3496
|
|
@ -0,0 +1 @@
|
|||
http://ftp.mozilla.org/pub/security/nss/releases/NSS_3_95_RTM/src/nss-3.95.tar.gz 469888e41e8a780051ce00edcd914e8a6bd38da88a82cfb84898dd388635822a
|
|
@ -1,15 +0,0 @@
|
|||
# SPDX-FileCopyrightText: 2023 fosslinux <fosslinux@aussies.space>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# Save because linux deletes all distfiles to save space
|
||||
cp "${DISTFILES}"/musl-1.2.4.tar.gz /tmp
|
||||
cp "${DISTFILES}"/curl-7.88.1.tar.bz2 /tmp
|
||||
|
||||
# Clear up some RAM space
|
||||
grep --no-filename '^build' "${SOURCES}"/run*.sh | grep -v musl-1.2.4 | sed "s/build //" | sed "s/ .*$//" | while read -r p ; do
|
||||
rm -rf "${SOURCES:?}/${p:?}"
|
||||
done
|
||||
|
||||
mv /tmp/musl-1.2.4.tar.gz "${DISTFILES}"
|
||||
mv /tmp/curl-7.88.1.tar.bz2 "${DISTFILES}"
|
|
@ -0,0 +1,43 @@
|
|||
# SPDX-FileCopyrightText: 2023 Eduardo Sánchez Muñoz <eduardosm-dev@e64.io>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# Delete sources of packages before linux kernel
|
||||
|
||||
get_source_filename() {
|
||||
local url="${1}"
|
||||
local fname="${3}"
|
||||
# Default to basename of url if not given
|
||||
echo "${fname:-$(basename "${url}")}"
|
||||
}
|
||||
|
||||
# List all packages from linux kernel onwards
|
||||
# Ideally, we would use arrays here, but they are not supported by
|
||||
# the bash version we have at this point.
|
||||
pkgs="$(awk '/^build:/ { print $2 }' "${SRCDIR}/manifest" | awk '/^linux-[0-9]/,EOF { print $0 }')"
|
||||
|
||||
# Gather source names for all packages in pkgs, which we want to keep
|
||||
keep_sources=""
|
||||
for pkg in ${pkgs}; do
|
||||
while read line; do
|
||||
keep_sources="${keep_sources} $(get_source_filename ${line})"
|
||||
done < "${SRCDIR}/${pkg}/sources"
|
||||
done
|
||||
|
||||
for source in "${DISTFILES}/"*; do
|
||||
source_name="$(basename "${source}")"
|
||||
for keep_source in ${keep_sources}; do
|
||||
if [ "${keep_source}" = "${source_name}" ]; then
|
||||
# Countinue the outer loop to skip deletion
|
||||
continue 2
|
||||
fi
|
||||
done
|
||||
|
||||
# Delete this source
|
||||
rm "${source}"
|
||||
done
|
||||
|
||||
unset get_source_filename
|
||||
unset pkgs pkg line
|
||||
unset keep_sources keep_source
|
||||
unset source source_name
|
|
@ -15,19 +15,6 @@ test -c "/dev/urandom" || mknod -m 444 "/dev/urandom" c 1 9
|
|||
test -c "/dev/ptmx" || mknod -m 666 "/dev/ptmx" c 5 2
|
||||
test -c "/dev/tty" || mknod -m 666 "/dev/tty" c 5 0
|
||||
|
||||
test -b "/dev/sda" || mknod -m 600 "/dev/sda" b 8 0
|
||||
test -b "/dev/sda1" || mknod -m 600 "/dev/sda1" b 8 1
|
||||
test -b "/dev/sda2" || mknod -m 600 "/dev/sda2" b 8 2
|
||||
test -b "/dev/sda3" || mknod -m 600 "/dev/sda3" b 8 3
|
||||
test -b "/dev/sdb" || mknod -m 600 "/dev/sdb" b 8 16
|
||||
test -b "/dev/sdb1" || mknod -m 600 "/dev/sdb1" b 8 17
|
||||
test -b "/dev/sdb2" || mknod -m 600 "/dev/sdb2" b 8 18
|
||||
test -b "/dev/sdb2" || mknod -m 600 "/dev/sdb3" b 8 19
|
||||
test -b "/dev/sdc" || mknod -m 600 "/dev/sdc" b 8 32
|
||||
test -b "/dev/sdc1" || mknod -m 600 "/dev/sdc1" b 8 33
|
||||
test -b "/dev/sdc2" || mknod -m 600 "/dev/sdc2" b 8 34
|
||||
test -b "/dev/sdc3" || mknod -m 600 "/dev/sdc3" b 8 35
|
||||
|
||||
test -e "/dev/stdout" || ln -s "/proc/self/fd/1" "/dev/stdout"
|
||||
|
||||
if mount --version >/dev/null 2>&1; then
|
||||
|
@ -37,4 +24,16 @@ fi
|
|||
|
||||
if [ "${CHROOT}" = False ]; then
|
||||
test -c "/dev/console" || mknod -m 666 "/dev/console" c 5 1
|
||||
test -b "/dev/sda" || mknod -m 600 "/dev/sda" b 8 0
|
||||
test -b "/dev/sda1" || mknod -m 600 "/dev/sda1" b 8 1
|
||||
test -b "/dev/sda2" || mknod -m 600 "/dev/sda2" b 8 2
|
||||
test -b "/dev/sda3" || mknod -m 600 "/dev/sda3" b 8 3
|
||||
test -b "/dev/sdb" || mknod -m 600 "/dev/sdb" b 8 16
|
||||
test -b "/dev/sdb1" || mknod -m 600 "/dev/sdb1" b 8 17
|
||||
test -b "/dev/sdb2" || mknod -m 600 "/dev/sdb2" b 8 18
|
||||
test -b "/dev/sdb2" || mknod -m 600 "/dev/sdb3" b 8 19
|
||||
test -b "/dev/sdc" || mknod -m 600 "/dev/sdc" b 8 32
|
||||
test -b "/dev/sdc1" || mknod -m 600 "/dev/sdc1" b 8 33
|
||||
test -b "/dev/sdc2" || mknod -m 600 "/dev/sdc2" b 8 34
|
||||
test -b "/dev/sdc3" || mknod -m 600 "/dev/sdc3" b 8 35
|
||||
fi
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
# SPDX-FileCopyrightText: 2023 Eduardo Sánchez Muñoz <eduardosm-dev@e64.io>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
pushd /external/repo
|
||||
sha256sum -- * | tee "${SRCDIR}/SHA256SUMS.pkgs"
|
||||
popd
|
|
@ -16,6 +16,7 @@ SRCDIR=${SRCDIR}
|
|||
MAKEJOBS=-j${JOBS}
|
||||
export HOME=/tmp
|
||||
export SOURCE_DATE_EPOCH=0
|
||||
export KBUILD_BUILD_TIMESTAMP='@0'
|
||||
export SHELL=/usr/bin/bash
|
||||
DESTDIR=/tmp/destdir
|
||||
EOF
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2023 Gábor Stefanik <netrolller.3d@gmail.com>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
exit 0
|
|
@ -6,14 +6,6 @@
|
|||
# XXX: Fix package after builder-hex0
|
||||
|
||||
src_unpack() {
|
||||
# Remove all previous source tarballs
|
||||
mkdir /tmp/keep
|
||||
for keep in deblob-4.9 ${pkg}.tar.gz musl-1.2.4.tar.gz curl-7.88.1.tar.bz2; do
|
||||
mv "${DISTFILES}/${keep}" /tmp/keep
|
||||
done
|
||||
rm -r "${DISTFILES}/"*
|
||||
mv /tmp/keep/* "${DISTFILES}"
|
||||
|
||||
mkdir "${pkg}"
|
||||
mv "${DISTFILES}/deblob-4.9" "${pkg}/"
|
||||
default || true # Predictable link errors - not a problem
|
||||
|
|
|
@ -16,6 +16,13 @@
|
|||
# - jump: jump (usually) to a new kernel, executes a script with that name
|
||||
# eg, jump: fiwix
|
||||
#
|
||||
# The following directives have special significance:
|
||||
# - build directives beginning with "bash" (as well as jumps) trigger the generation of
|
||||
# a new script
|
||||
# - the first improve directive containing "network" is used by generator.py to deduce
|
||||
# what source files need to be downloaded in advance (files referenced after that will
|
||||
# be downloaded during bootstrap, unless --external-sources is given)
|
||||
#
|
||||
# Other features:
|
||||
# - predicate; based on variables set in bootstrap.cfg, require for something to execute
|
||||
# must be enclosed in brackets with spaces padded
|
||||
|
@ -107,7 +114,9 @@ build: bc-1.07.1
|
|||
define: BUILD_LINUX = ( CHROOT == False || BUILD_KERNELS == True )
|
||||
build: kexec-linux-1.0.0 ( BUILD_LINUX == True )
|
||||
build: kexec-tools-2.0.22 ( BUILD_LINUX == True )
|
||||
improve: clean_sources
|
||||
build: linux-4.9.10 ( BUILD_LINUX == True )
|
||||
jump: break ( INTERNAL_CI == pass1 )
|
||||
jump: linux ( CHROOT == False )
|
||||
improve: finalize_fhs
|
||||
build: musl-1.2.4
|
||||
|
@ -135,7 +144,7 @@ build: dist-3.5-236
|
|||
build: perl-5.32.1
|
||||
build: libarchive-3.5.2
|
||||
build: openssl-1.1.1l
|
||||
build: ca-certificates-3.88.1
|
||||
build: ca-certificates-3.95
|
||||
build: curl-7.88.1
|
||||
build: zlib-1.2.13
|
||||
build: automake-1.16.3
|
||||
|
@ -144,7 +153,7 @@ build: patch-2.7.6
|
|||
build: gettext-0.21
|
||||
build: texinfo-6.7
|
||||
build: gcc-4.7.4
|
||||
build: binutils-2.38
|
||||
build: binutils-2.41
|
||||
build: gperf-3.1
|
||||
build: libunistring-0.9.10
|
||||
build: libffi-3.3
|
||||
|
@ -167,7 +176,9 @@ build: python-3.3.7
|
|||
build: python-3.4.10
|
||||
build: python-3.8.16
|
||||
build: python-3.11.1
|
||||
jump: break ( INTERNAL_CI == pass1 ) # scripts are generated in pass1
|
||||
build: gcc-10.4.0
|
||||
build: binutils-2.38
|
||||
build: binutils-2.41
|
||||
build: gcc-13.1.0
|
||||
improve: null_time ( FORCE_TIMESTAMPS == True )
|
||||
improve: update_checksums ( UPDATE_CHECKSUMS == True )
|
||||
|
|
|
@ -1,86 +0,0 @@
|
|||
mes-0.25.tar.gz
|
||||
nyacc-1.00.2.tar.gz
|
||||
tcc-0.9.26.tar.gz
|
||||
tcc-0.9.27.tar.bz2
|
||||
fiwix-1.4.0-lb3.tar.gz
|
||||
lwext4-1.0.0-lb1.tar.gz
|
||||
make-3.82.tar.bz2
|
||||
patch-2.5.9.tar.gz
|
||||
gzip-1.2.4.tar.gz
|
||||
tar-1.12.tar.gz
|
||||
sed-4.0.9.tar.gz
|
||||
bzip2-1.0.8.tar.gz
|
||||
coreutils-5.0.tar.bz2
|
||||
heirloom-devtools-070527.tar.bz2
|
||||
bash-2.05b.tar.gz
|
||||
flex-2.5.11.tar.gz
|
||||
tcc-0.9.27.tar.bz2
|
||||
musl-1.1.24.tar.gz
|
||||
tcc-0.9.27.tar.bz2
|
||||
musl-1.1.24.tar.gz
|
||||
tcc-0.9.27.tar.bz2
|
||||
sed-4.0.9.tar.gz
|
||||
bzip2-1.0.8.tar.gz
|
||||
m4-1.4.7.tar.gz
|
||||
flex-2.6.4.tar.gz
|
||||
bison-3.4.1.tar.gz
|
||||
bison-3.4.1.tar.gz
|
||||
bison-3.4.1.tar.gz
|
||||
grep-2.4.tar.gz
|
||||
diffutils-2.7.tar.gz
|
||||
coreutils-5.0.tar.bz2
|
||||
coreutils-6.10.tar.gz
|
||||
gawk-3.0.4.tar.gz
|
||||
perl-5.000.tar.gz
|
||||
perl-5.003.tar.gz
|
||||
perl5.004_05.tar.gz
|
||||
perl5.005_03.tar.gz
|
||||
perl-5.6.2.tar.gz
|
||||
autoconf-2.52.tar.bz2
|
||||
automake-1.6.3.tar.bz2
|
||||
automake-1.6.3.tar.bz2
|
||||
autoconf-2.53.tar.bz2
|
||||
automake-1.7.tar.bz2
|
||||
autoconf-2.54.tar.bz2
|
||||
autoconf-2.55.tar.bz2
|
||||
automake-1.7.8.tar.bz2
|
||||
autoconf-2.57.tar.bz2
|
||||
autoconf-2.59.tar.bz2
|
||||
automake-1.8.5.tar.bz2
|
||||
help2man-1.36.4.tar.gz
|
||||
autoconf-2.61.tar.bz2
|
||||
automake-1.9.6.tar.bz2
|
||||
automake-1.10.3.tar.bz2
|
||||
autoconf-2.64.tar.bz2
|
||||
automake-1.11.2.tar.bz2
|
||||
autoconf-2.69.tar.gz
|
||||
libtool-2.2.4.tar.bz2
|
||||
automake-1.15.1.tar.gz
|
||||
binutils-2.30.tar.bz2
|
||||
musl-1.1.24.tar.gz
|
||||
tcc-0.9.27.tar.bz2
|
||||
gcc-core-4.0.4.tar.bz2
|
||||
automake-1.16.3.tar.gz
|
||||
findutils-4.2.33.tar.gz
|
||||
gnulib-8e128e.tar.gz
|
||||
musl-1.2.4.tar.gz
|
||||
gcc-core-4.0.4.tar.bz2
|
||||
automake-1.16.3.tar.gz
|
||||
util-linux-2.19.1.tar.gz
|
||||
e2fsprogs-1.45.7.tar.gz
|
||||
CaseFolding.txt
|
||||
DerivedAge.txt
|
||||
DerivedCombiningClass.txt
|
||||
DerivedCoreProperties.txt
|
||||
NormalizationCorrections.txt
|
||||
NormalizationTest.txt
|
||||
UnicodeData.txt
|
||||
v10.0.1.tar.gz
|
||||
kbd-1.15.tar.gz
|
||||
make-3.82.tar.bz2
|
||||
ed-1.4.tar.gz
|
||||
bc-1.07.1.tar.gz
|
||||
v2.0.22.tar.gz
|
||||
linux-4.9.10.tar.gz
|
||||
deblob-4.9
|
||||
curl-7.88.1.tar.bz2
|
Loading…
Reference in New Issue