# Copyright (C) 2001  MandrakeSoft S.A.
#
#   MandrakeSoft S.A.
#   43, rue d'Aboukir
#   75002 Paris - France
#   http://www.linux-mandrake.com/
#   http://www.mandrakesoft.com/
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

# Makefile for the BIOS component of bochs


@SUFFIX_LINE@

srcdir = @srcdir@
VPATH = @srcdir@

SHELL = /bin/sh

@SET_MAKE@

CXX = @CXX@
CXXFLAGS = @CXXFLAGS@

LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
RANLIB = @RANLIB@

BCC = bcc
GCC = gcc
GCC32 = gcc -m32 -fno-stack-protector
AS86 = as86

BX_INCDIRS = -I.. -I$(srcdir)/.. -I../iodev -I$(srcdir)/../iodev
LOCAL_CXXFLAGS =

BUILDDATE = `date '+%m/%d/%y'`
BIOS_BUILD_DATE = "-DBIOS_BUILD_DATE=\"$(BUILDDATE)\""
#
# -------- end configurable options --------------------------
#


.@CPP_SUFFIX@.o:
	$(CXX) -c $(BX_INCDIRS) $(CXXFLAGS) $(LOCAL_CXXFLAGS) @CXXFP@$< @OFP@$@


bios: biossums BIOS-bochs-latest BIOS-bochs-legacy

clean:
	@RMCOMMAND@ *.o *.a *.s _rombios*_.c rombios*.txt rombios*.sym
	@RMCOMMAND@ usage biossums rombios16.bin
	@RMCOMMAND@ rombios32.bin rombios32.out

dist-clean: clean
	@RMCOMMAND@ Makefile

bios-clean:
	@RMCOMMAND@ BIOS-bochs-*

BIOS-bochs-legacy: rombios.c apmbios.S biossums rombios.h
	$(GCC32) $(BIOS_BUILD_DATE) -DLEGACY -E -P $< > _rombiosl_.c
	$(BCC) -o rombiosl.s -C-c -D__i86__ -0 -S _rombiosl_.c
	sed -e 's/^\.text//' -e 's/^\.data//' rombiosl.s > _rombiosl_.s
	$(AS86) _rombiosl_.s -b tmpl.bin -u- -w- -g -0 -j -O -l rombiosl.txt
	-perl ${srcdir}/makesym.perl < rombiosl.txt > rombiosl.sym
	mv tmpl.bin $@
	./biossums $@
	@RMCOMMAND@ _rombiosl_.s


rombios16.bin: rombios.c apmbios.S biossums rombios.h
	$(GCC32) $(BIOS_BUILD_DATE) -E -P $< > _rombios_.c
	$(BCC) -o rombios.s -C-c -D__i86__ -0 -S _rombios_.c
	sed -e 's/^\.text//' -e 's/^\.data//' rombios.s > _rombios_.s
	$(AS86) _rombios_.s -b tmp.bin -u- -w- -g -0 -j -O -l rombios.txt
	-perl ${srcdir}/makesym.perl < rombios.txt > rombios.sym
	mv tmp.bin rombios16.bin
	./biossums rombios16.bin
	@RMCOMMAND@ _rombios_.s


rombios32.bin: rombios32.out rombios.h
	objcopy -O binary $< $@
	./biossums -pad $@

rombios32.out: rombios32start.o rombios32.o rombios32.ld
	ld -o $@ -T $(srcdir)/rombios32.ld rombios32start.o rombios32.o

rombios32.o: rombios32.c acpi-dsdt.hex
	$(GCC32) -O2 -Wall -c -o $@ $<

ifeq ("1", "0")
acpi-dsdt.hex: acpi-dsdt.dsl
	cpp -P $< $<.i
	iasl -tc -p $@ $<.i
	rm $<.i
	sed -i -e's/^unsigned/const unsigned/' $@
endif

rombios32start.o: rombios32start.S
	$(GCC32) -c -o $@ $<

BIOS-bochs-latest: rombios16.bin rombios32.bin
	cat rombios32.bin rombios16.bin > $@

biossums: biossums.o
