From 83897048abd6fde61832eea289d6881d3c6a8780 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sat, 20 Jul 2019 23:19:21 -0700 Subject: [PATCH] Update for bonnibel 2.0 --- README.md | 26 +++-- modules.yaml | 4 + scripts/templates/build.ninja.j2 | 141 +++++++++++++++++++++++++--- scripts/templates/exe.default.j2 | 8 ++ scripts/templates/lib.default.j2 | 4 + scripts/templates/module.base.j2 | 45 +++++++++ scripts/templates/target.default.j2 | 26 +++++ 7 files changed, 228 insertions(+), 26 deletions(-) create mode 100644 scripts/templates/exe.default.j2 create mode 100644 scripts/templates/lib.default.j2 create mode 100644 scripts/templates/module.base.j2 create mode 100644 scripts/templates/target.default.j2 diff --git a/README.md b/README.md index 8e167ee..ad1c71c 100644 --- a/README.md +++ b/README.md @@ -33,24 +33,20 @@ and my wonderful wife. ## Building -jsix uses the [Ninja][] build tool, and generates the build files for it -with a custom tool called [Bonnibel][]. Bonnibel requires [Python 3][] and can -be downloaded with `pip`: - -``` -pip3 install bonnibel -``` +jsix uses the [Ninja][] build tool, and generates the build files for it with a +custom tool called [Bonnibel][]. Bonnibel can be installed with [Cargo][], or +downloaded as a prebuilt binary from its Github repository. [Ninja]: https://ninja-build.org [Bonnibel]: https://github.com/justinian/bonnibel -[Python 3]: https://python.org +[Cargo]: https://crates.io/crates/bonnibel Requrirements: -* python 3 (for installing and running Bonnibel) +* bonnibel +* ninja * clang * mtools -* ninja * curl for downloading the toolchain ### Setting up the cross toolchain @@ -61,17 +57,17 @@ jsix host binaries. ### Building and running jsix -Once the toolchain has been set up, running Bonnibel's `pb` command will set up the -build configuration, and `ninja -C build` will actually run the build. If you -have `qemu-system-x86_64` installed, the `qemu.sh` script will to run jsix +Once the toolchain has been set up, running Bonnibel's `pb init` command will +set up the build configuration, and `pb build` will actually run the build. If +you have `qemu-system-x86_64` installed, the `qemu.sh` script will to run jsix in QEMU `-nographic` mode. 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 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 pip3 install bonnibel + curl -L -o pb https://github.com/justinian/bonnibel/releases/download/2.0.0/pb_linux_amd64 && chmod a+x pb diff --git a/modules.yaml b/modules.yaml index afa4c87..26d3f05 100644 --- a/modules.yaml +++ b/modules.yaml @@ -1,9 +1,13 @@ name: jsix templates: scripts/templates +vars: + foo: bar + bat: baz modules: kernel: output: jsix.elf target: host + kind: exe deps: - elf - initrd diff --git a/scripts/templates/build.ninja.j2 b/scripts/templates/build.ninja.j2 index 61d7088..f003df8 100644 --- a/scripts/templates/build.ninja.j2 +++ b/scripts/templates/build.ninja.j2 @@ -1,15 +1,122 @@ -{% extends "build.base.j2" %} +ninja_required_version = 1.3 +builddir = {{ buildroot }} +srcroot = {{ srcroot }} +modulefile = {{ modulefile }} -{% block variables %} -{{ super() }} -ccflags = $ccflags $ +{%- for var, value in vars %} +{{ var }} = {{ value }} +{%- 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/x86_64 $ - -fcolor-diagnostics -{% endblock %} + -fcolor-diagnostics $ + -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 description = Making init ramdisk command = $builddir/native/makerd $in $out @@ -41,9 +148,22 @@ rule strip objcopy --only-keep-debug $out $out.debug; $ strip -g $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 name = ovmf_vars.fd @@ -81,7 +201,6 @@ default $ $builddir/jsix.dump $ $builddir/jsix.elf-gdb.py $ $builddir/jsix.img -{% endblock %} # vim: ft=ninja et ts=4 sts=4 sw=4 diff --git a/scripts/templates/exe.default.j2 b/scripts/templates/exe.default.j2 new file mode 100644 index 0000000..90c7395 --- /dev/null +++ b/scripts/templates/exe.default.j2 @@ -0,0 +1,8 @@ +{% extends "module.base.j2" %} +{% block variables %} +{{ super() }} + +{% endblock %} + +# vim: ft=ninja et ts=4 sts=4 sw=4 + diff --git a/scripts/templates/lib.default.j2 b/scripts/templates/lib.default.j2 new file mode 100644 index 0000000..ccc74b7 --- /dev/null +++ b/scripts/templates/lib.default.j2 @@ -0,0 +1,4 @@ +{% extends "module.base.j2" %} + +# vim: ft=ninja et ts=4 sts=4 sw=4 + diff --git a/scripts/templates/module.base.j2 b/scripts/templates/module.base.j2 new file mode 100644 index 0000000..d5fcd0c --- /dev/null +++ b/scripts/templates/module.base.j2 @@ -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 + diff --git a/scripts/templates/target.default.j2 b/scripts/templates/target.default.j2 new file mode 100644 index 0000000..6c4e891 --- /dev/null +++ b/scripts/templates/target.default.j2 @@ -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 +