Port rootfs.sh to Python

This commit is contained in:
Andrius Štikonas 2021-04-06 00:12:02 +01:00
parent 4dbc9618a2
commit 713fd9143f
12 changed files with 646 additions and 34 deletions

View File

@ -6,7 +6,7 @@
set timeout -1
spawn ./rootfs.sh qemu-system-x86_64 3500M
spawn python3 rootfs.py --qemu-cmd qemu-system-x86_64 --qemu-ram 3500
expect {
"not syncing: Attempted to kill init" {}
"Bootstrapping completed." {}

View File

@ -1,7 +1,19 @@
# SPDX-FileCopyrightText: 2021 fosslinux <fosslinux@aussies.space>
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
#
# SPDX-License-Identifier: GPL-3.0-or-later
pylint_task:
container:
image: debian:bullseye
deps_script:
- apt-get -y update
- apt-get -y dist-upgrade
- apt-get -y install python3-requests pylint
- apt-get -y clean
check_script:
- pylint rootfs.py sysa.py lib/utils.py
shell_lint_task:
container:
image: debian:stable

1
.gitignore vendored
View File

@ -6,3 +6,4 @@
tmp/
kernel
sources/
__pycache__

53
lib/utils.py Executable file
View File

@ -0,0 +1,53 @@
#!/usr/bin/env python3
"""
This file contains a few self-contained helper functions
"""
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
import os
import shutil
import subprocess
import sys
def run(*args, **kwargs):
"""A small wrapper around subprocess.run"""
arguments = [str(arg) for arg in args]
if kwargs.pop('verbose', False):
print(arguments)
try:
subprocess.run(arguments, check=True, **kwargs)
except subprocess.CalledProcessError:
print("Bootstrapping failed")
sys.exit(1)
def mount(source, target, fs_type, options='', **kwargs):
"""Mount filesystem"""
run('sudo', 'mount', source, target, '-t', fs_type, '-o', options, **kwargs)
def umount(target, **kwargs):
"""Unmount filesystem"""
run('sudo', 'umount', target, **kwargs)
def copytree(src, dst, ignore=shutil.ignore_patterns('*.git*')):
"""Copy directory tree into another directory"""
file_name = os.path.basename(src)
shutil.copytree(src, os.path.join(dst, file_name), ignore=ignore)
def get_target(file_name):
"""Determine package installation directory"""
bname = os.path.basename(file_name)
# Remove file extension. This is not completely trivial because
# tar archives often come with double extensions.
first_ext = os.path.splitext(os.path.basename(bname))
second_ext = os.path.splitext(first_ext[0])
if second_ext[1] == '.tar':
bname = second_ext[0]
else:
bname = first_ext[0]
return bname

103
rootfs.py Executable file
View File

@ -0,0 +1,103 @@
#!/usr/bin/env python3
"""
A helper application used to start bootstrapping process.
It has a few modes of operation, you can create initramfs with
binary seeds and sources that you can boot into or alternatively
you can run bootstap inside chroot.
"""
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
import argparse
import glob
import os
import subprocess
from sysa import SysA
from lib.utils import run
def main():
"""
A few command line arguments to customize bootstrap.
This function also creates SysA object which prepares directory
structure with bootstrap seeds and all sources.
"""
parser = argparse.ArgumentParser()
parser.add_argument("-a", "--arch", help="Bootstrap architecture",
default="x86")
parser.add_argument("-c", "--chroot", help="Run inside chroot",
action="store_true")
parser.add_argument("-p", "--preserve", help="Do not unmount temporary dir",
action="store_true")
parser.add_argument("-t", "--tmpdir", help="Temporary directory")
# QEMU arguments
parser.add_argument("-q", "--qemu-cmd", help="QEMU command",
default="qemu-system-x86_64")
parser.add_argument("-r", "--qemu-ram", help="Memory (in megabytes) allocated to QEMU VM",
default=8000)
parser.add_argument("-k", "--kernel", help="Kernel to use (default is ./kernel)",
default="kernel")
parser.add_argument("-m", "--minikernel", help="Use minikernel",
action="store_true")
args = parser.parse_args()
if args.chroot and args.minikernel:
raise ValueError("chroot and minikernel options cannot be used simultaneously.")
if args.arch != "x86":
raise ValueError("Only x86 is supported at the moment.")
system_a = SysA(arch=args.arch, preserve_tmp=args.preserve, tmpdir=args.tmpdir)
initramfs_path = os.path.join(system_a.tmp_dir, "initramfs")
if not args.chroot:
make_initramfs(system_a.tmp_dir, initramfs_path)
bootstrap(args, system_a.tmp_dir, initramfs_path)
def make_initramfs(tmp_dir, initramfs_path):
"""Package binary bootstrap seeds and sources into initramfs."""
file_list = glob.glob(os.path.join(tmp_dir, '**'), recursive=True)
# Use built-in removeprefix once we can use Python 3.9
def remove_prefix(text, prefix):
if text.startswith(prefix):
return text[len(prefix):]
return text # or whatever
file_list = [remove_prefix(f, tmp_dir + os.sep) for f in file_list]
with open(initramfs_path, "w") as initramfs:
cpio = subprocess.Popen(["cpio", "--format", "newc", "--create", "--directory", tmp_dir],
stdin=subprocess.PIPE, stdout=initramfs)
cpio.communicate(input='\n'.join(file_list).encode())
def bootstrap(args, tmp_dir, initramfs_path):
"""Kick off bootstrap process."""
print("Bootstrapping %s" % (args.arch))
if args.chroot:
init = os.path.join(os.sep, 'bootstrap-seeds', 'POSIX', args.arch, 'kaem-optional-seed')
run('sudo', 'env', '-i', 'PATH=/bin', 'chroot', tmp_dir, init)
return
if args.minikernel:
run('git', 'clone', '--depth', '1', '--branch', 'v0.4',
'https://github.com/bittorf/kritis-linux.git')
run('kritis-linux/ci_helper.sh', '--arch', 'x86_64', '--ramsize',
'-m', str(args.qemu_ram) + 'M', '--kernel', '5.10.8', '--initrd', initramfs_path)
return
run(args.qemu_cmd,
'-enable-kvm',
'-m', str(args.qemu_ram) + 'M',
'-nographic',
'-no-reboot',
'-kernel', args.kernel,
'-initrd', initramfs_path,
'-append', "console=ttyS0")
if __name__=="__main__":
main()

445
sysa.py Executable file
View File

@ -0,0 +1,445 @@
#!/usr/bin/env python3
"""System A"""
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
import hashlib
import os
from distutils.dir_util import copy_tree
import shutil
import requests
from lib.utils import mount, umount, copytree, run, get_target
class SysA:
"""
Class responsible for preparing sources for System A.
"""
def __init__(self, arch, preserve_tmp, tmpdir):
self.git_dir = os.path.dirname(os.path.join(__file__))
self.arch = arch
self.preserve_tmp = preserve_tmp
if tmpdir is None:
self.tmp_dir = os.path.join(self.git_dir, 'sysa', 'tmp')
else:
self.tmp_dir = tmpdir
self.sysa_dir = os.path.join(self.git_dir, 'sysa')
self.after_dir = os.path.join(self.tmp_dir, 'after')
self.prepare()
def __del__(self):
if not self.preserve_tmp:
print("Unmounting tmpfs from %s" % (self.tmp_dir))
umount(self.tmp_dir)
os.rmdir(self.tmp_dir)
def check_file(self, file_name):
"""Check hash of downloaded source file."""
checksum_store = os.path.join(self.git_dir, 'SHA256SUMS.sources')
with open(checksum_store) as checksum_file:
hashes = checksum_file.read().splitlines()
for hash_line in hashes:
if os.path.basename(file_name) in hash_line:
# Hash is in store, check it
expected_hash = hash_line.split()[0]
with open(file_name, "rb") as downloaded_file:
downloaded_content = downloaded_file.read() # read entire file as bytes
readable_hash = hashlib.sha256(downloaded_content).hexdigest()
if expected_hash == readable_hash:
return
raise Exception("Checksum mismatch")
raise Exception("File checksum is not yet recorded")
def download_file(self, url, file_name=None):
"""
Download a single source archive.
"""
cache_dir = os.path.join(self.git_dir, 'sources')
# Automatically determine file name based on URL.
if file_name is None:
file_name = os.path.basename(url)
abs_file_name = os.path.join(cache_dir, file_name)
# Create a cache directory for downloaded sources
if not os.path.isdir(cache_dir):
os.mkdir(cache_dir)
# Actually download the file
if not os.path.isfile(abs_file_name):
print("Downloading: %s" % (file_name))
request = requests.get(url, allow_redirects=True)
open(abs_file_name, 'wb').write(request.content)
# Check SHA256 hash
self.check_file(abs_file_name)
return abs_file_name
def get_file(self, url, mkbuild=False, output=None):
"""
Download and prepares source packages
url can be either:
1. a single URL
2. list of URLs to download. In this case the first URL is the primary URL
from which we derive the name of package directory
output can be used to override file name of the downloaded file(s).
mkbuild=True can be used to pre-create build directories before
mkdir is available.
"""
# Single URL
if isinstance(url, str):
assert output is None or isinstance(output, str)
file_name = url if output is None else output
urls = [url]
outputs = [output]
# Multiple URLs
elif isinstance(url, list):
assert output is None or len(output) == len(url)
file_name = url[0] if output is None else output[0]
urls = url
outputs = output if output is not None else [None] * len(url)
else:
raise TypeError("url must be either a string or a list of strings")
# Determine installation directory
target_name = get_target(file_name)
target_src_dir = os.path.join(self.after_dir, target_name, 'src')
# Install base files
src_tree = os.path.join(self.sysa_dir, target_name)
copytree(src_tree, self.after_dir)
os.mkdir(target_src_dir)
for i, _ in enumerate(urls):
# Download files into cache directory
tarball = self.download_file(urls[i], outputs[i])
# Install sources into target directory
shutil.copy2(tarball, target_src_dir)
if mkbuild:
os.mkdir(os.path.join(self.after_dir, target_name, 'build'))
def prepare(self):
"""
Prepare directory structore for System A.
We create an empty tmpfs, unpack stage0-posix.
Rest of the files are unpacked into more structured directory /after
"""
if not os.path.isdir(self.tmp_dir):
os.mkdir(self.tmp_dir)
print("Mounting tmpfs on %s" % (self.tmp_dir))
mount('tmpfs', self.tmp_dir, 'tmpfs', 'size=8G')
self.stage0_posix()
self.after()
def stage0_posix(self):
"""Copy in all the stage0-posix (formerly known as mescc-tools-seed)"""
mescc_tools_seed_base_dir = os.path.join(self.sysa_dir, 'mescc-tools-seed',
'src', 'mescc-tools-seed')
mescc_tools_seed_dir = os.path.join(mescc_tools_seed_base_dir, self.arch)
copy_tree(mescc_tools_seed_dir, self.tmp_dir)
m2_planet_dir = os.path.join(mescc_tools_seed_base_dir, 'M2-Planet')
copytree(m2_planet_dir, self.tmp_dir)
# At the moment not useful for bootstrap but easier to keep it
mes_m2_dir = os.path.join(mescc_tools_seed_base_dir, 'mes-m2')
copytree(mes_m2_dir, self.tmp_dir)
mescc_tools_patched_dir = os.path.join(self.sysa_dir, 'mescc-tools-seed',
'src', 'mescc-tools-patched')
shutil.copytree(mescc_tools_patched_dir,
os.path.join(self.tmp_dir, 'mescc-tools'), shutil.ignore_patterns('*.git*'))
# bootstrap seeds
bootstrap_seeds_dir = os.path.join(self.sysa_dir, 'bootstrap-seeds')
copytree(bootstrap_seeds_dir, self.tmp_dir)
kaem_optional_seed = os.path.join(bootstrap_seeds_dir, 'POSIX',
self.arch, 'kaem-optional-seed')
shutil.copy2(kaem_optional_seed, os.path.join(self.tmp_dir, 'init'))
# replace the init kaem with our own custom one
shutil.move(os.path.join(self.tmp_dir, 'kaem.run'),
os.path.join(self.tmp_dir, 'mescc-tools-seed.kaem.run'))
shutil.copy2(os.path.join(self.sysa_dir, 'base.kaem.run'),
os.path.join(self.tmp_dir, 'kaem.run'))
# create directories needed
os.mkdir(os.path.join(self.tmp_dir, 'bin'))
def after(self):
"""
Prepare sources in /after directory.
After mescc-tools-seed we get into our own directory because
the mescc-tools-seed one is hella messy.
"""
self.create_after_dirs()
self.mescc_tools_checksum()
self.deploy_extra_files()
self.mescc_tools_extra()
self.mes()
self.tcc_0_9_26()
self.tcc_0_9_27()
self.tar_1_12()
self.get_packages()
def create_after_dirs(self):
"""
Create some empty directories for early bootstrap
This list can be eventually reduced if we include a small
mkdir implementation written for M2-Planet.
"""
bin_dir = os.path.join(self.after_dir, 'bin')
lib_dir = os.path.join(self.after_dir, 'lib')
include_dir = os.path.join(self.after_dir, 'include')
os.mkdir(self.after_dir)
os.mkdir(bin_dir)
os.mkdir(lib_dir)
os.mkdir(include_dir)
os.mkdir(os.path.join(lib_dir, self.arch+'-mes'))
os.mkdir(os.path.join(lib_dir, 'tcc'))
os.mkdir(os.path.join(lib_dir, 'linux'))
os.mkdir(os.path.join(lib_dir, 'linux', self.arch+'-mes'))
os.mkdir(os.path.join(include_dir, 'mes'))
os.mkdir(os.path.join(include_dir, 'gnu'))
os.mkdir(os.path.join(include_dir, 'linux'))
os.mkdir(os.path.join(include_dir, 'linux', self.arch))
os.mkdir(os.path.join(include_dir, 'sys'))
os.mkdir(os.path.join(include_dir, 'mach'))
# Needed for patch to work, although can be fixed with TMPDIR
os.mkdir(os.path.join(self.tmp_dir, 'tmp'))
def mescc_tools_checksum(self):
"""Early fletcher16 checksum files"""
shutil.copy2(os.path.join(self.sysa_dir, 'mescc-tools-seed', 'checksums'),
os.path.join(self.after_dir, 'mescc-tools-seed-checksums'))
def deploy_extra_files(self):
"""Deploy misc files"""
extra_files = ['helpers.sh', 'run.sh', 'run2.sh', 'pre-sha.sha256sums']
for extra_file in extra_files:
shutil.copy2(os.path.join(self.sysa_dir, extra_file), self.after_dir)
shutil.copy2(os.path.join(self.sysa_dir, 'after.kaem'), self.tmp_dir)
shutil.copy2(os.path.join(self.sysa_dir, 'after.kaem.run'),
os.path.join(self.after_dir, 'kaem.run'))
shutil.copy2(os.path.join(self.git_dir, 'SHA256SUMS.sources'), self.after_dir)
def mescc_tools_extra(self):
"""Some additional tools such as cp and chmod (for M2-Planet)"""
copytree(os.path.join(self.sysa_dir, 'mescc-tools-extra'), self.after_dir)
def mes(self):
"""GNU Mes"""
copytree(os.path.join(self.sysa_dir, 'mes'), self.after_dir)
mes_dir = os.path.join(self.after_dir, 'mes', 'src', 'mes')
os.mkdir(os.path.join(mes_dir, 'bin'))
os.mkdir(os.path.join(mes_dir, 'm2'))
def tcc_0_9_26(self):
"""TinyCC 0.9.26 (patched by janneke)"""
copytree(os.path.join(self.sysa_dir, 'tcc-0.9.26'), self.after_dir)
def tcc_0_9_27(self):
"""TinyCC 0.9.27"""
copytree(os.path.join(self.sysa_dir, 'tcc-0.9.27'), self.after_dir)
def tar_1_12(self):
"""GNU Tar 1.12"""
# We have to pre-unpack tar sources.
# Possible alternative is to build a single C file implementation of untar.
tar_url = "https://mirrors.kernel.org/gnu/tar/tar-1.12.tar.gz"
self.get_file(tar_url)
tar_src_dir = os.path.join(self.after_dir, 'tar-1.12', 'src')
tar_tarball = os.path.join(tar_src_dir, os.path.basename(tar_url))
run('tar', '-C', tar_src_dir, '-xf', tar_tarball, '--strip-components=1')
# pylint: disable=line-too-long,too-many-statements
def get_packages(self):
"""Prepare remaining sources"""
# gzip 1.2.4
self.get_file("https://mirrors.kernel.org/gnu/gzip/gzip-1.2.4.tar", mkbuild=True)
# sed 4.0.9
self.get_file("https://mirrors.kernel.org/gnu/sed/sed-4.0.9.tar.gz", mkbuild=True)
# patch 2.5.9
self.get_file("https://ftp.gnu.org/pub/gnu/patch/patch-2.5.9.tar.gz", mkbuild=True)
# sha-2 61555d
self.get_file("https://github.com/amosnier/sha-2/archive/61555d.tar.gz", mkbuild=True,
output="sha-2-61555d.tar.gz")
# make 3.80
self.get_file("https://mirrors.kernel.org/gnu/make/make-3.80.tar.gz", mkbuild=True)
# bzip2 1.0.8
self.get_file("https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz", mkbuild=True)
# coreutils 5.0
self.get_file("https://mirrors.kernel.org/gnu/coreutils/coreutils-5.0.tar.bz2", mkbuild=True)
# heirloom-devtools
self.get_file("http://downloads.sourceforge.net/project/heirloom/heirloom-devtools/070527/heirloom-devtools-070527.tar.bz2")
# bash 2.05b
self.get_file("https://ftp.gnu.org/pub/gnu/bash/bash-2.05b.tar.gz")
# flex 2.5.11
self.get_file("http://download.nust.na/pub2/openpkg1/sources/DST/flex/flex-2.5.11.tar.gz")
# musl 1.1.24
self.get_file("https://musl.libc.org/releases/musl-1.1.24.tar.gz")
# m4 1.4.7
self.get_file("https://mirrors.kernel.org/gnu/m4/m4-1.4.7.tar.gz")
# flex 2.6.4
self.get_file("https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz")
# bison 3.4.1
self.get_file("https://mirrors.kernel.org/gnu/bison/bison-3.4.1.tar.gz")
# grep 2.4
self.get_file("https://mirrors.kernel.org/gnu/grep/grep-2.4.tar.gz")
# diffutils 2.7
self.get_file("https://mirrors.kernel.org/gnu/diffutils/diffutils-2.7.tar.gz")
# coreutils 6.10
self.get_file("https://mirrors.kernel.org/gnu/coreutils/coreutils-6.10.tar.gz")
# gawk 3.0.4
self.get_file("https://mirrors.kernel.org/gnu/gawk/gawk-3.0.4.tar.gz")
# perl 5.000
self.get_file("https://github.com/Perl/perl5/archive/perl-5.000.tar.gz")
# perl 5.003
self.get_file("https://github.com/Perl/perl5/archive/perl-5.003.tar.gz")
# perl 5.004_05
self.get_file("https://www.cpan.org/src/5.0/perl5.004_05.tar.gz")
# perl 5.005_03
self.get_file("https://www.cpan.org/src/5.0/perl5.005_03.tar.gz")
# perl 5.6.2
self.get_file("https://www.cpan.org/src/5.0/perl-5.6.2.tar.gz")
# autoconf 2.52
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.52.tar.bz2")
# automake 1.6.3
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.6.3.tar.bz2")
# automake 1.4-p6
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.4-p6.tar.gz")
# autoconf 2.13
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.13.tar.gz")
# autoconf 2.12
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.12.tar.gz")
# libtool 1.4
self.get_file("https://mirrors.kernel.org/gnu/libtool/libtool-1.4.tar.gz")
# binutils 2.14
self.get_file("https://mirrors.kernel.org/gnu/binutils/binutils-2.14.tar.bz2")
# autoconf 2.53
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.53.tar.bz2")
# automake 1.7
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.7.tar.bz2")
# autoconf 2.54
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.54.tar.bz2")
# autoconf 2.55
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.55.tar.bz2")
# automake 1.7.8
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.7.8.tar.bz2")
# autoconf 2.57
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.57.tar.bz2")
# autoconf 2.59
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.59.tar.bz2")
# automake 1.8.5
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.8.5.tar.bz2")
# help2man 1.36.4
self.get_file("https://mirrors.kernel.org/gnu/help2man/help2man-1.36.4.tar.gz")
# autoconf 2.61
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.61.tar.bz2")
# automake 1.9.6
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.9.6.tar.bz2")
# findutils 4.2.33
self.get_file(["https://mirrors.kernel.org/gnu/findutils/findutils-4.2.33.tar.gz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-8e128e.tar.gz"])
# libtool 2.2.4
self.get_file("https://mirrors.kernel.org/gnu/libtool/libtool-2.2.4.tar.bz2")
# automake 1.10.3
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.10.3.tar.bz2")
# autoconf 2.65
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.65.tar.bz2")
# gcc 4.0.4
self.get_file("https://mirrors.kernel.org/gnu/gcc/gcc-4.0.4/gcc-core-4.0.4.tar.bz2",
output="gcc-4.0.4.tar.bz2")
# musl 1.2.2
self.get_file("https://musl.libc.org/releases/musl-1.2.2.tar.gz")
# bash 5.1
self.get_file("https://mirrors.kernel.org/gnu/bash/bash-5.1.tar.gz")
# xz 5.0.5
self.get_file("https://tukaani.org/xz/xz-5.0.5.tar.bz2")
# automake 1.11.2
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.11.2.tar.bz2")
# autoconf 2.69
self.get_file("https://mirrors.kernel.org/gnu/autoconf/autoconf-2.69.tar.xz")
# automake 1.12.6
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.12.6.tar.xz")
# automake 1.13.4
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.13.4.tar.xz")
# automake 1.15.1
self.get_file("https://mirrors.kernel.org/gnu/automake/automake-1.15.1.tar.xz")
# tar 1.34
self.get_file(["https://mirrors.kernel.org/gnu/tar/tar-1.34.tar.xz",
"https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-30820c.tar.gz"])
# gmp 6.2.1
self.get_file("https://mirrors.kernel.org/gnu/gmp/gmp-6.2.1.tar.xz")

View File

@ -1,13 +1,13 @@
63031 /after/bin/mes
23643 /after/bin/mescc.scm
36724 /after/lib/crt1.s
42390 /after/lib/crt1.o
39638 /after/lib/x86.M1
526 /after/lib/libmescc.s
10591 /after/lib/libc+tcc.s
45027 /after/lib/libc.s
17259 /after/lib/libmescc.a
20204 /after/lib/libc+tcc.a
34645 /after/lib/libc.a
8245 /after/lib/linux/elf32-header.hex2
15474 /after/lib/linux/elf32-footer-single-main.hex2
36724 /after/lib/x86-mes/crt1.s
42390 /after/lib/x86-mes/crt1.o
39638 /after/lib/x86-mes/x86.M1
526 /after/lib/x86-mes/libmescc.s
10591 /after/lib/x86-mes/libc+tcc.s
45027 /after/lib/x86-mes/libc.s
17259 /after/lib/x86-mes/libmescc.a
20204 /after/lib/x86-mes/libc+tcc.a
34645 /after/lib/x86-mes/libc.a
8245 /after/lib/linux/x86-mes/elf32-header.hex2
15474 /after/lib/linux/x86-mes/elf32-footer-single-main.hex2

View File

@ -212,17 +212,17 @@ ${MES} --no-auto-compile -e main ${bindir}/mescc.scm -- -L ${libdir} -nostdlib -
cp ${bindir}/mes-new ${bindir}/mes
# Install libraries
cp ${libdir}/x86-mes/libc.a ${prefix}/lib/
cp ${libdir}/x86-mes/libc+tcc.a ${prefix}/lib/
cp ${libdir}/x86-mes/libmescc.a ${prefix}/lib/
cp ${libdir}/x86-mes/libc.s ${prefix}/lib/
cp ${libdir}/x86-mes/libc+tcc.s ${prefix}/lib/
cp ${libdir}/x86-mes/libmescc.s ${prefix}/lib/
cp ${libdir}/x86-mes/x86.M1 ${prefix}/lib/
cp crt1.o ${prefix}/lib/
cp crt1.s ${prefix}/lib/
cp ${libdir}/linux/x86-mes/elf32-footer-single-main.hex2 ${prefix}/lib/linux/
cp ${libdir}/linux/x86-mes/elf32-header.hex2 ${prefix}/lib/linux/
cp ${libdir}/x86-mes/libc.a ${prefix}/lib/x86-mes/
cp ${libdir}/x86-mes/libc+tcc.a ${prefix}/lib/x86-mes/
cp ${libdir}/x86-mes/libmescc.a ${prefix}/lib/x86-mes/
cp ${libdir}/x86-mes/libc.s ${prefix}/lib/x86-mes/
cp ${libdir}/x86-mes/libc+tcc.s ${prefix}/lib/x86-mes/
cp ${libdir}/x86-mes/libmescc.s ${prefix}/lib/x86-mes/
cp ${libdir}/x86-mes/x86.M1 ${prefix}/lib/x86-mes/
cp crt1.o ${prefix}/lib/x86-mes/
cp crt1.s ${prefix}/lib/x86-mes/
cp ${libdir}/linux/x86-mes/elf32-footer-single-main.hex2 ${prefix}/lib/linux/x86-mes/
cp ${libdir}/linux/x86-mes/elf32-header.hex2 ${prefix}/lib/linux/x86-mes/
# Install header files
cp include/alloca.h ${incdir}/alloca.h

View File

@ -20,18 +20,18 @@ bc9ddf9854bd954c71bb1cf5b0af77fd65b8fa7f290b42c75020fb8893deb53c /after/bin/sha
cacc2cda3ce6c2cc0cb761b8aa2115a003e166c94d1039974fc0221263897c52 /after/bin/tcc-0.9.26
fc2d3f6a7227836526d278d4e4b642a72c1a83c03c3363f3376100798e0eb145 /after/bin/zcat
44b5f15e1f015685fe4c3d66eda5ba52aac77b94f2edd98b764cec05ca350d49 /after/lib/crt1.o
90811dafd33ad56b8e4b0adcc04263f9329b9047b7cc337abe8151a75017172c /after/lib/crt1.s
90811dafd33ad56b8e4b0adcc04263f9329b9047b7cc337abe8151a75017172c /after/lib/x86-mes/crt1.s
09d4f9821a2566f7e56381a19259c41bd97f3c5ed83f490705acbfd1139a7736 /after/lib/crti.o
461ca1494737fab86fe1c1d3addeaf9d0ece413e353abcdea8674db3f700cda3 /after/lib/crtn.o
34f62227f8cc61d365d92a182f8f3cc91cc6c50a1bbb8f4774a4383bceaefa5f /after/lib/libc.a
34f62227f8cc61d365d92a182f8f3cc91cc6c50a1bbb8f4774a4383bceaefa5f /after/lib/libc+gnu.a
b5ce4e1288a27864156d74268090c13aea6b5a261fa81c75bfbe844d0689d03d /after/lib/libc.s
3156e619dbd85c471e2a8d053ba536eaaa8f91da657003777b8e87e7bab4266d /after/lib/libc+tcc.a
aaf89a9d6818cdb8ece73454631b1a1ae83503e5eb7777d38cdaf141cba0e530 /after/lib/libc+tcc.s
b5ce4e1288a27864156d74268090c13aea6b5a261fa81c75bfbe844d0689d03d /after/lib/x86-mes/libc.s
3156e619dbd85c471e2a8d053ba536eaaa8f91da657003777b8e87e7bab4266d /after/lib/x86-mes/libc+tcc.a
aaf89a9d6818cdb8ece73454631b1a1ae83503e5eb7777d38cdaf141cba0e530 /after/lib/x86-mes/libc+tcc.s
12c07ae103e7e3b390150a79e5c600d88de14e9bb73a066f6342582729ef5a3f /after/lib/libgetopt.a
52f697278ccdff5e457f27e10f465a91ab9858f0c6cee0683831cadb3109bbb7 /after/lib/libmescc.a
d8646707db6aa2a76fdc5dbb3521376439e357f9f1de1d67f02a1afeefd342ac /after/lib/libmescc.s
f9873d9aab12e70f24d97f8319e17a1e698ca60779ae9a6ab3ede648cd60fc61 /after/lib/linux/elf32-footer-single-main.hex2
b16ab368bc4c7b8bd896d03cba565a60e97760dea4da9f5c8a1a3d2902a79df6 /after/lib/linux/elf32-header.hex2
52f697278ccdff5e457f27e10f465a91ab9858f0c6cee0683831cadb3109bbb7 /after/lib/x86-mes/libmescc.a
d8646707db6aa2a76fdc5dbb3521376439e357f9f1de1d67f02a1afeefd342ac /after/lib/x86-mes/libmescc.s
f9873d9aab12e70f24d97f8319e17a1e698ca60779ae9a6ab3ede648cd60fc61 /after/lib/linux/x86-mes/elf32-footer-single-main.hex2
b16ab368bc4c7b8bd896d03cba565a60e97760dea4da9f5c8a1a3d2902a79df6 /after/lib/linux/x86-mes/elf32-header.hex2
a650b13efc65073fb851e9db89728089d8845c401f85faaa09801874ab058089 /after/lib/tcc/libtcc1.a
c9944a799d584abfa76f385c14ac0caf6f46d03b34bf2712493602b12826c6b2 /after/lib/x86.M1
c9944a799d584abfa76f385c14ac0caf6f46d03b34bf2712493602b12826c6b2 /after/lib/x86-mes/x86.M1

View File

@ -9,7 +9,6 @@
35666 /after/bin/tcc-0.9.26
47832 /after/lib/libc.a
47832 /after/lib/libc+gnu.a
20204 /after/lib/libc+tcc.a
54049 /after/lib/libgetopt.a
23061 /after/lib/crt1.o
16980 /after/lib/crti.o

View File

@ -1,7 +1,6 @@
35075 /after/bin/tcc
47832 /after/lib/libc.a
47832 /after/lib/libc+gnu.a
20204 /after/lib/libc+tcc.a
54049 /after/lib/libgetopt.a
23061 /after/lib/crt1.o
16980 /after/lib/crti.o