Update for bonnibel 2.0

This commit is contained in:
Justin C. Miller
2019-07-20 23:19:21 -07:00
parent 7cc59770b8
commit 83897048ab
7 changed files with 228 additions and 26 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,8 @@
{% extends "module.base.j2" %}
{% block variables %}
{{ super() }}
{% endblock %}
# vim: ft=ninja et ts=4 sts=4 sw=4

View File

@@ -0,0 +1,4 @@
{% extends "module.base.j2" %}
# vim: ft=ninja et ts=4 sts=4 sw=4

View 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

View 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