mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
Update for bonnibel 2.0
This commit is contained in:
26
README.md
26
README.md
@@ -33,24 +33,20 @@ and my wonderful wife.
|
|||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
jsix uses the [Ninja][] build tool, and generates the build files for it
|
jsix uses the [Ninja][] build tool, and generates the build files for it with a
|
||||||
with a custom tool called [Bonnibel][]. Bonnibel requires [Python 3][] and can
|
custom tool called [Bonnibel][]. Bonnibel can be installed with [Cargo][], or
|
||||||
be downloaded with `pip`:
|
downloaded as a prebuilt binary from its Github repository.
|
||||||
|
|
||||||
```
|
|
||||||
pip3 install bonnibel
|
|
||||||
```
|
|
||||||
|
|
||||||
[Ninja]: https://ninja-build.org
|
[Ninja]: https://ninja-build.org
|
||||||
[Bonnibel]: https://github.com/justinian/bonnibel
|
[Bonnibel]: https://github.com/justinian/bonnibel
|
||||||
[Python 3]: https://python.org
|
[Cargo]: https://crates.io/crates/bonnibel
|
||||||
|
|
||||||
Requrirements:
|
Requrirements:
|
||||||
|
|
||||||
* python 3 (for installing and running Bonnibel)
|
* bonnibel
|
||||||
|
* ninja
|
||||||
* clang
|
* clang
|
||||||
* mtools
|
* mtools
|
||||||
* ninja
|
|
||||||
* curl for downloading the toolchain
|
* curl for downloading the toolchain
|
||||||
|
|
||||||
### Setting up the cross toolchain
|
### Setting up the cross toolchain
|
||||||
@@ -61,17 +57,17 @@ jsix host binaries.
|
|||||||
|
|
||||||
### Building and running jsix
|
### Building and running jsix
|
||||||
|
|
||||||
Once the toolchain has been set up, running Bonnibel's `pb` command will set up the
|
Once the toolchain has been set up, running Bonnibel's `pb init` command will
|
||||||
build configuration, and `ninja -C build` will actually run the build. If you
|
set up the build configuration, and `pb build` will actually run the build. If
|
||||||
have `qemu-system-x86_64` installed, the `qemu.sh` script will to run jsix
|
you have `qemu-system-x86_64` installed, the `qemu.sh` script will to run jsix
|
||||||
in QEMU `-nographic` mode.
|
in QEMU `-nographic` mode.
|
||||||
|
|
||||||
I personally run this either from a real debian amd64 testing/buster machine or
|
I personally run this either from a real debian amd64 testing/buster machine or
|
||||||
a windows WSL debian testing/buster installation. The following should be
|
a windows WSL debian testing/buster installation. The following should be
|
||||||
enough to set up such a system to build the kernel:
|
enough to set up such a system to build the kernel:
|
||||||
|
|
||||||
sudo apt install qemu-system-x86 nasm clang-6.0 mtools python3-pip curl
|
sudo apt install qemu-system-x86 nasm clang-6.0 mtools curl
|
||||||
sudo update-alternatives /usr/bin/clang clang /usr/bin/clang-6.0 1000
|
sudo update-alternatives /usr/bin/clang clang /usr/bin/clang-6.0 1000
|
||||||
sudo update-alternatives /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 1000
|
sudo update-alternatives /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 1000
|
||||||
sudo pip3 install bonnibel
|
curl -L -o pb https://github.com/justinian/bonnibel/releases/download/2.0.0/pb_linux_amd64 && chmod a+x pb
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
name: jsix
|
name: jsix
|
||||||
templates: scripts/templates
|
templates: scripts/templates
|
||||||
|
vars:
|
||||||
|
foo: bar
|
||||||
|
bat: baz
|
||||||
modules:
|
modules:
|
||||||
kernel:
|
kernel:
|
||||||
output: jsix.elf
|
output: jsix.elf
|
||||||
target: host
|
target: host
|
||||||
|
kind: exe
|
||||||
deps:
|
deps:
|
||||||
- elf
|
- elf
|
||||||
- initrd
|
- initrd
|
||||||
|
|||||||
@@ -1,15 +1,122 @@
|
|||||||
{% extends "build.base.j2" %}
|
ninja_required_version = 1.3
|
||||||
|
builddir = {{ buildroot }}
|
||||||
|
srcroot = {{ srcroot }}
|
||||||
|
modulefile = {{ modulefile }}
|
||||||
|
|
||||||
{% block variables %}
|
{%- for var, value in vars %}
|
||||||
{{ super() }}
|
{{ var }} = {{ value }}
|
||||||
ccflags = $ccflags $
|
{%- endfor %}
|
||||||
|
|
||||||
|
warnflags = $
|
||||||
|
-Wformat=2 $
|
||||||
|
-Winit-self $
|
||||||
|
-Wfloat-equal $
|
||||||
|
-Winline $
|
||||||
|
-Wmissing-format-attribute $
|
||||||
|
-Wmissing-include-dirs $
|
||||||
|
-Wswitch $
|
||||||
|
-Wundef $
|
||||||
|
-Wdisabled-optimization $
|
||||||
|
-Wpointer-arith $
|
||||||
|
-Wno-attributes $
|
||||||
|
-Wno-sign-compare $
|
||||||
|
-Wno-multichar $
|
||||||
|
-Wno-div-by-zero $
|
||||||
|
-Wno-endif-labels $
|
||||||
|
-Wno-pragmas $
|
||||||
|
-Wno-format-extra-args $
|
||||||
|
-Wno-unused-result $
|
||||||
|
-Wno-deprecated-declarations $
|
||||||
|
-Wno-unused-function $
|
||||||
|
-Werror
|
||||||
|
|
||||||
|
ccflags = $
|
||||||
-I${srcroot}/src/include $
|
-I${srcroot}/src/include $
|
||||||
-I${srcroot}/src/include/x86_64 $
|
-I${srcroot}/src/include/x86_64 $
|
||||||
-fcolor-diagnostics
|
-fcolor-diagnostics $
|
||||||
{% endblock %}
|
-DVERSION_MAJOR={{ version_major }} $
|
||||||
|
-DVERSION_MINOR={{ version_minor }} $
|
||||||
|
-DVERSION_PATCH={{ version_patch }} $
|
||||||
|
-DVERSION_GITSHA=0x0{{ version_sha }} $
|
||||||
|
-DGIT_VERSION=\"{{ version }}\" $
|
||||||
|
-DGIT_VERSION_WIDE=L\"{{ version }}\" $
|
||||||
|
$warnflags
|
||||||
|
|
||||||
|
asflags = $
|
||||||
|
-DVERSION_MAJOR={{ version_major }} $
|
||||||
|
-DVERSION_MINOR={{ version_minor }} $
|
||||||
|
-DVERSION_PATCH={{ version_patch }} $
|
||||||
|
-DVERSION_GITSHA=0x{{ version_sha }}
|
||||||
|
|
||||||
|
cflags = -std=c11
|
||||||
|
cxxflags = -std=c++14
|
||||||
|
libs =
|
||||||
|
|
||||||
|
rule c
|
||||||
|
deps = gcc
|
||||||
|
depfile = $out.d
|
||||||
|
description = Compiling $name
|
||||||
|
command = $cc -MMD -MF $out.d $ccflags $cflags -o $out -c $in
|
||||||
|
|
||||||
|
rule dump_c_defs
|
||||||
|
description = Dumping C defines for $target
|
||||||
|
command = echo "" | $cc $ccflags $cflags -dM -E - > $out
|
||||||
|
|
||||||
|
rule dump_c_run
|
||||||
|
description = Dumping C arguments for $target
|
||||||
|
command = $
|
||||||
|
echo "#!/bin/bash" > $out; $
|
||||||
|
echo '$cc $ccflags $cflags $$*' > $out; $
|
||||||
|
chmod a+x $out
|
||||||
|
|
||||||
|
rule cpp
|
||||||
|
deps = gcc
|
||||||
|
depfile = $out.d
|
||||||
|
description = Compiling $name
|
||||||
|
command = $cxx -MMD -MF $out.d $cxxflags $ccflags -o $out -c $in
|
||||||
|
|
||||||
|
rule dump_cpp_defs
|
||||||
|
description = Dumping C++ defines for $target
|
||||||
|
command = echo "" | $cxx -x c++ $cxxflags $ccflags -dM -E - > $out
|
||||||
|
|
||||||
|
rule dump_cpp_run
|
||||||
|
description = Dumping C++ arguments for $target
|
||||||
|
command = $
|
||||||
|
echo "#!/bin/bash" > $out; $
|
||||||
|
echo '$cc $cxxflags $ccflags $$*' > $out; $
|
||||||
|
chmod a+x $out
|
||||||
|
|
||||||
|
rule s
|
||||||
|
deps = gcc
|
||||||
|
depfile = $out.d
|
||||||
|
description = Assembling $name
|
||||||
|
command = $nasm -o $out -felf64 -MD $out.d $asflags $in
|
||||||
|
|
||||||
|
rule exe
|
||||||
|
description = Linking $name
|
||||||
|
command = $ld $ldflags -o $out $in $libs
|
||||||
|
|
||||||
|
rule lib
|
||||||
|
description = Archiving $name
|
||||||
|
command = $ar qcs $out $in
|
||||||
|
|
||||||
|
rule regen
|
||||||
|
generator = true
|
||||||
|
description = Regenrating build files
|
||||||
|
command = $
|
||||||
|
{{ generator }} $
|
||||||
|
--file $modulefile $
|
||||||
|
--dir $builddir $
|
||||||
|
generate
|
||||||
|
|
||||||
|
rule cp
|
||||||
|
description = Copying $name
|
||||||
|
command = cp $in $out
|
||||||
|
|
||||||
|
rule dump
|
||||||
|
description = Dumping decompiled $name
|
||||||
|
command = objdump -DSC -M intel $in > $out
|
||||||
|
|
||||||
{% block baserules %}
|
|
||||||
{{ super() }}
|
|
||||||
rule makerd
|
rule makerd
|
||||||
description = Making init ramdisk
|
description = Making init ramdisk
|
||||||
command = $builddir/native/makerd $in $out
|
command = $builddir/native/makerd $in $out
|
||||||
@@ -41,9 +148,22 @@ rule strip
|
|||||||
objcopy --only-keep-debug $out $out.debug; $
|
objcopy --only-keep-debug $out $out.debug; $
|
||||||
strip -g $out; $
|
strip -g $out; $
|
||||||
objcopy --add-gnu-debuglink=$out.debug $out
|
objcopy --add-gnu-debuglink=$out.debug $out
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block extra %}
|
{% for target in targets %}
|
||||||
|
subninja {{ target }}/target.ninja
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
build $
|
||||||
|
{%- for buildfile in buildfiles %}
|
||||||
|
{{ buildfile }} $
|
||||||
|
{%- endfor %}
|
||||||
|
: regen | $
|
||||||
|
{%- for template in templates %}
|
||||||
|
{{ template }} $
|
||||||
|
{%- endfor %}
|
||||||
|
$modulefile $
|
||||||
|
{{ generator }}
|
||||||
|
|
||||||
build $builddir/ovmf_vars.fd : cp $srcroot/assets/ovmf/x64/ovmf_vars.fd
|
build $builddir/ovmf_vars.fd : cp $srcroot/assets/ovmf/x64/ovmf_vars.fd
|
||||||
name = ovmf_vars.fd
|
name = ovmf_vars.fd
|
||||||
|
|
||||||
@@ -81,7 +201,6 @@ default $
|
|||||||
$builddir/jsix.dump $
|
$builddir/jsix.dump $
|
||||||
$builddir/jsix.elf-gdb.py $
|
$builddir/jsix.elf-gdb.py $
|
||||||
$builddir/jsix.img
|
$builddir/jsix.img
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
# vim: ft=ninja et ts=4 sts=4 sw=4
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
|
|||||||
8
scripts/templates/exe.default.j2
Normal file
8
scripts/templates/exe.default.j2
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{% extends "module.base.j2" %}
|
||||||
|
{% block variables %}
|
||||||
|
{{ super() }}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
4
scripts/templates/lib.default.j2
Normal file
4
scripts/templates/lib.default.j2
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{% extends "module.base.j2" %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
45
scripts/templates/module.base.j2
Normal file
45
scripts/templates/module.base.j2
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
moddir = ${builddir}/{{ name }}.dir
|
||||||
|
|
||||||
|
{% block variables %}
|
||||||
|
ccflags = $ccflags $
|
||||||
|
{%- for dep in depmods %}
|
||||||
|
{%- for inc in dep.includes %}
|
||||||
|
-I${srcroot}/{{ inc }} $
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- for inc in module.includes %}
|
||||||
|
-I${srcroot}/{{ inc }} $
|
||||||
|
{%- endfor %}
|
||||||
|
{%- for define in module.defines %}
|
||||||
|
-D{{ define }} $
|
||||||
|
{%- endfor %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% for source in module.source %}
|
||||||
|
build ${moddir}/{{ source.output }} : {{ source.action }} ${srcroot}/{{ source.input }} || {{ buildfile }}
|
||||||
|
name = {{ source.name }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
build ${builddir}/{{ module.output }} : {{ module.kind }} $
|
||||||
|
{%- for source in module.source %}
|
||||||
|
${moddir}/{{ source.output }} $
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- for dep in deplibs %}
|
||||||
|
${builddir}/{{ dep.output }} $
|
||||||
|
{%- endfor %}
|
||||||
|
| $
|
||||||
|
{%- for dep in depexes %}
|
||||||
|
${builddir}/{{ dep.output }} $
|
||||||
|
{%- endfor %}
|
||||||
|
{{ buildfile }}
|
||||||
|
name = {{ name }}
|
||||||
|
|
||||||
|
{% if module.default %}
|
||||||
|
default ${builddir}/{{ module.output }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% block extra %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
26
scripts/templates/target.default.j2
Normal file
26
scripts/templates/target.default.j2
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
builddir = $builddir/{{ target }}
|
||||||
|
target = {{ target }}
|
||||||
|
|
||||||
|
{% block variables %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block binaries %}
|
||||||
|
cc = clang
|
||||||
|
cxx = clang++
|
||||||
|
ld = ld
|
||||||
|
ar = ar
|
||||||
|
nasm = nasm
|
||||||
|
objcopy = objcopy
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% for module in modules %}
|
||||||
|
subninja {{ module }}.ninja
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
build ${builddir}/c.defs : dump_c_defs | {{ buildfile }}
|
||||||
|
build ${builddir}/cpp.defs : dump_cpp_defs | {{ buildfile }}
|
||||||
|
build ${builddir}/c.run : dump_c_run | {{ buildfile }}
|
||||||
|
build ${builddir}/cpp.run : dump_cpp_run | {{ buildfile }}
|
||||||
|
|
||||||
|
# vim: ft=ninja et ts=4 sts=4 sw=4
|
||||||
|
|
||||||
Reference in New Issue
Block a user