diff --git a/src/project.conf b/src/project.conf index 8e44bb9..2072643 100644 --- a/src/project.conf +++ b/src/project.conf @@ -1,2 +1,9 @@ subdirs=arch,common,lib,drivers,kernel,loader +targets=DeforaOS.iso dist=Makefile + +#targets +[DeforaOS.iso] +type=script +script=../tools/iso.sh +depends=$(OBJDIR)kernel/uKernel.bin,$(OBJDIR)loader/uLoader.bin,../tools/iso.sh diff --git a/tools/iso.sh b/tools/iso.sh new file mode 100755 index 0000000..86437cc --- /dev/null +++ b/tools/iso.sh @@ -0,0 +1,154 @@ +#!/bin/sh +#$Id$ +#Copyright (c) 2019 Pierre Pronchery +#This file is part of DeforaOS uKernel +# +#Redistribution and use in source and binary forms, with or without +#modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +#IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +#FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +#DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +#SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +#CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +#OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +#OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +#variables +[ -n "$ARCH" ] || ARCH="$(uname -m)" +case "$ARCH" in + i[3456]86) + ARCH="i386" + ;; + amd64|x86_64) + ARCH="amd64" + ;; + *) + exit 0 + ;; +esac +[ -n "$OBJDIR" ] || OBJDIR="./" +PROGNAME="iso.sh" +UKERNELBIN="${OBJDIR}kernel/uKernel.bin" +ULOADERBIN="${OBJDIR}loader/uLoader.bin" +#executables +DATE="date" +DEBUG="_debug" +GRUBMKRESCUE="grub-mkrescue" +MKDIR="mkdir -p" +MKTEMP="mktemp" +RM="rm -f" +RMDIR="rmdir" +UNAME="uname" + + +#functions +#debug +_debug() +{ + echo "$@" 1>&2 + $@ +} + + +#error +_error() +{ + echo "$PROGNAME: $@" 1>&2 + return 2 +} + + +#iso +_iso() +{ + target="$1" + + _info "$target: Creating ISO image ($ARCH)" + tmpdir=$($DEBUG $MKTEMP -d) + if [ $? -ne 0 ]; then + _error "$target: Could not create temporary directory" + return 2 + fi + $DEBUG $MKDIR -- "$tmpdir/boot" "$tmpdir/grub" + $CAT > "$tmpdir/grub/grub.cfg" << EOF +menuentry "DeforaOS" { + multiboot /boot/uKernel.bin +} +EOF + $DEBUG $GRUBMKRESCUE -o "$target" "$tmpdir" + ret=$? + $DEBUG $RM -- "$tmpdir/uKernel.bin" "$tmpdir/uLoader.bin" "$tmpdir/grub/grub.cfg" + $DEBUG $RMDIR -- "$tmpdir/boot" "$tmpdir/grub" "$tmpdir" + if [ $ret -eq 127 ]; then + _error "$target: Could not create ISO image: $GRUBMKRESCUE not available (ignored)" + ret=0 + elif [ $ret -ne 0 ]; then + _error "$target: Could not create ISO image" + ret=$? + fi + return $ret +} + + +#info +_info() +{ + echo "$PROGNAME: $@" +} + + +#usage +_usage() +{ + echo "Usage: $PROGNAME [-c] target..." 1>&2 + return 1 +} + + +#main +clean=0 +while getopts "cO:P:" name; do + case "$name" in + c) + clean=1 + ;; + O) + export "${OPTARG%%=*}"="${OPTARG#*=}" + ;; + P) + #XXX ignored for compatibility + ;; + ?) + _usage + exit $? + ;; + esac +done +shift $((OPTIND - 1)) +if [ $# -lt 1 ]; then + _usage + exit $? +fi + +#clean +[ $clean -ne 0 ] && exit 0 + +exec 3>&1 +while [ $# -gt 0 ]; do + target="$1" + shift + + _iso "$target" || exit 2 +done diff --git a/tools/project.conf b/tools/project.conf index 72486b4..f6bc117 100644 --- a/tools/project.conf +++ b/tools/project.conf @@ -6,7 +6,7 @@ cflags=-W -Wall -g -O2 as=$(CC) asflags_force=$(CFLAGSF) $(CFLAGS) -c ldflags_force=`../tools/platform.sh -V NATIVE_LDFLAGS -C "$$ARCH"` -dist=Makefile,platform.sh +dist=Makefile,iso.sh,platform.sh #targets [crtbegin.o]