summaryrefslogtreecommitdiff
path: root/kernel/build.sh
blob: bf8c971bf4fd345b805bd057308b5c0a67a15ffb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#! /usr/bin/env bash

ASM_PATH="src/"
TARGET_PATH="target"
TMP_PATH="$TARGET_PATH/temp/"
OBJ_PATH="$TMP_PATH"
LINK_SCRIPT_PATH="src/"
GRUB_CFG_PATH="src/grub.cfg"
ARCH="x86_64"
TARGET="$ARCH-uff"
RUST_BIN="$TARGET_PATH/$TARGET/debug/libkernel.a"
QUEMU="qemu-system-x86_64 -cdrom $TARGET_PATH/uff.iso"

cleanup_target() {
    rm -f $TARGET_PATH/uff.iso &> /dev/null
    rm -rf $TARGET_PATH/kernel.bin

    cleanup_temp
}

create_target() {
    mkdir $TARGET_PATH &> /dev/null
    mkdir $TMP_PATH &> /dev/null
}

cleanup_temp() {
    rm -f $TMP_PATH/* &> /dev/null
}

# ---------------------------------------------------

build_kernel_elf() {
    create_target
    for f in $ASM_PATH/*.asm; do
        nasm -felf64 "$f" -o $OBJ_PATH/"$(basename -s .asm $f)".o
    done
    ld -n -o $TARGET_PATH/kernel.bin -gc-sections -T $LINK_SCRIPT_PATH/linker.ld $OBJ_PATH/*.o $RUST_BIN
    cleanup_temp
}

build_kernel_iso() {
    if test ! -e $TARGET_PATH/kernel.bin; then
        build_kernel_elf
    fi
    create_target
    mkdir $TMP_PATH/isofiles &> /dev/null
    mkdir $TMP_PATH/isofiles/boot &> /dev/null
    mkdir $TMP_PATH/isofiles/boot/grub &> /dev/null
    cp $TARGET_PATH/kernel.bin $TMP_PATH/isofiles/boot &> /dev/null
    cp $GRUB_CFG_PATH $TMP_PATH/isofiles/boot/grub/grub.cfg &> /dev/null
    grub-mkrescue -d /usr/lib/grub/i386-pc -o $TARGET_PATH/uff.iso $TMP_PATH/isofiles
    cleanup_temp
}

build_init() {
    create_target
}

build_launch() {
    $QUEMU
}

build_launch_serial() {
    $QUEMU -device isa-debug-exit,iobase=0xf4,iosize=0x04 -serial stdio #-display none
}

build_run() {
    if test ! -e $TARGET_PATH/uff.iso; then
        build_kernel_iso
    fi
    build_launch
}

build_clean() {
    cleanup_target
}

build_build() {
    cargo xbuild
    cleanup_target
    build_run
}
build_tests() {
    cargo xbuild --features testing
    cleanup_target
    build_kernel_iso
    build_launch_serial
}

build_all() {
    build_kernel_elf
}

not_exec=true

for arg in "$@"; do
    case "$arg" in
        "kernel-elf") build_kernel_elf;;
        "kernel-iso") build_kernel_iso;;
        "init") build_init;;
        "launch") build_launch;;
        "run") build_run;;
        "clean") build_clean;;
        "build") build_build;;
        "test") build_tests;;
        "all") build_all;;
        *)
            echo "warn: ignoring unknown option '$arg'"
            continue;;
    esac
    not_exec=false
    break
done

print_help() {
    echo "usage: $0 option"
    echo "options: "
    echo "  init                      initialise directory"
    echo "  clean                     cleanup binaries"
    echo "  launch                    launch iso in qemu"
    echo "  run                       creates iso if necessary and runs it in qemu"
    echo "  test                      runs tests in qemu"
    echo
    echo "  kernel-elf                build the kernel-elf"
    echo "  kernel-iso                build the kernel-elf if necessary and the kernel-iso"
    echo "  build                     build the kernel-iso with rust binaries"
    echo "  all                       build kernel"
}

if $not_exec; then
    echo "error: please specify an argument"
    echo
    print_help
    exit -1
fi