#
#  GRUB Utilities --  Utilities for GRUB Legacy, GRUB2 and GRUB for DOS
#  Copyright (C) 2007 Bean (bean123@126.com)
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program 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 General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

#
# Makefile for grubutil
#

OSTYPE   = $(shell uname -s)
#DATE	 = $(shell date --utc --iso-8601)
REV	 = $(shell sh ./genrev.sh ${rev})
NONE     =
SPACE    = $(NONE) $(NONE)
VERSION  = $(subst $(SPACE),-,$(shell cat version))
CC       = gcc
CFLAGS   =
LDFLAGS  =
PREFIX   = /usr/local/bin/

USE_ZIP  ?= y
USE_PERL ?= y
#USE_RC   ?= y

# To build the standalone NTFS boot sector, uncomment the following line
# BUILD_NTFSBS ?= y

# To build the grub2 header, uncomment the following line
BUILD_G2HDR ?= y

ifeq ($(USE_PERL),y)
PERL     = perl
HAVE_PERL= $(shell which perl)
endif

ifeq ($(USE_PERL),y)
HAVE_ZIP = $(shell which zip)
endif

ifneq ($(findstring MINGW,$(OSTYPE)),)
IS_WIN32 = 1

ifeq ($(USE_RC),y)
HAVE_RC  = $(shell which rc.exe)
endif

CFLAGS   += -DWIN32
EXEEXT   = .exe
SYSSTR   = w32
endif

ifneq ($(findstring CYGWIN,$(OSTYPE)),)
IS_WIN32 = 1

ifeq ($(USE_RC),y)
HAVE_RC  = $(shell which rc.exe)
endif

CFLAGS   += -DWIN32 -mno-cygwin
LDFLAGS  += -mno-cygwin
EXEEXT   = .exe
SYSSTR   = w32
endif

ifneq ($(findstring Linux,$(OSTYPE)),)
CFLAGS   += -DLINUX
EXEEXT   =
SYSSTR   = lnx
endif

ifneq ($(findstring FreeBSD,$(OSTYPE)),)
CFLAGS   += -DFREEBSD
EXEEXT   =
SYSSTR   = bsd
endif

grubinst_CSRC = grubinst.c utils.c
grubinst_SRCS = $(grubinst_CSRC)
grubinst_OBJS = $(subst .c,.o,$(grubinst_CSRC))

grubinst_gui_CSRC = grubinst_gui.c utils.c
grubinst_gui_SRCS = $(grubinst_gui_CSRC) grubinst_gui.rc
grubinst_gui_OBJS = $(subst .c,.o,$(grubinst_gui_CSRC)) grubinst_gui.ro

grubmenu_CSRC = grubmenu.c
grubmenu_SRCS = $(grubmenu_CSRC)
grubmenu_OBJS = $(subst .c,.o,$(grubmenu_CSRC))

all_DIST = grubinst_gui.chs readme.txt changelog.txt COPYING
all_SRCS = $(sort $(grubinst_SRCS) $(grubinst_gui_SRCS) $(grubmenu_SRCS)) Makefile Makefile.vc6 version \
           grldr.mbr bin2h.c bin2h.pl ver2h.c ver2h.pl utils.h key_tab.h resource.h \
           ntfsbs.S g2hdr.S grldrstart.S grubinst.ico genrev.sh

all_PROG = grubinst$(EXEEXT) grubmenu$(EXEEXT)
all_CSRC = $(grubinst_CSRC) $(grubmenu_CSRC)
all_OBJS = $(grubinst_OBJS) $(grubmenu_OBJS)

ifeq ($(BUILD_NTFSBS),y)
all_PROG += ntfsbs.bin
endif

ifeq ($(BUILD_G2HDR),y)
all_PROG += g2hdr.bin
endif

ifneq ($(IS_WIN32),)
all_PROG += grubinst_gui$(EXEEXT)
all_CSRC += $(grubinst_gui_CSRC)
all_OBJS += $(grubinst_gui_OBJS)
endif

all: $(all_PROG)

.c.o:
	$(CC) $(CFLAGS) -c -o$@ $<

grubinst$(EXEEXT): $(grubinst_OBJS)
	$(CC) $(LDFLAGS) -o$@ $^

grubmenu$(EXEEXT): $(grubmenu_OBJS)
	$(CC) $(LDFLAGS) -o$@ $^

grldr.mbr: grldrstart.S ntfsbs.S
	gcc -DGRLDR_MBR -c -o grldr.o $<
	gcc -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 -o grldr$(EXEEXT) grldr.o
	objcopy -O binary grldr$(EXEEXT) $@
	rm grldr$(EXEEXT) grldr.o
ifneq ($(IS_WIN32),)
	mv $@ grldr.tmp
	head -c 8192 grldr.tmp > $@	# grldr.mbr is 16 sectors long
	rm grldr.tmp
endif

ntfsbs.bin: ntfsbs.S
	gcc -c -o ntfsbs.o $<
	gcc -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 -o ntfsbs$(EXEEXT) ntfsbs.o
	objcopy -O binary ntfsbs$(EXEEXT) ntfsbs.bin
	rm ntfsbs$(EXEEXT) ntfsbs.o
ifneq ($(IS_WIN32),)
	mv $@ ntfsbs.tmp
	head -c 1536 ntfsbs.tmp > $@	# ntfs.bin is 3 sectors long
	rm ntfsbs.tmp
endif

g2hdr.bin: g2hdr.S
	gcc -c -o g2hdr.o $<
	gcc -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 -o g2hdr$(EXEEXT) g2hdr.o
	objcopy -O binary g2hdr$(EXEEXT) g2hdr.bin
	rm g2hdr$(EXEEXT) g2hdr.o
ifneq ($(IS_WIN32),)
	mv $@ g2hdr.tmp
	head -c 512 g2hdr.tmp > $@	# g2hdr.bin is 1 sector long
	rm g2hdr.tmp
endif

ifneq ($(IS_WIN32),)

ifneq ($(HAVE_RC),)

grubinst_gui.ro: grubinst_gui.rc resource.h grubinst.ico
	rc -fo grubinst_gui.res $<
	cvtres -nologo -machine:ix86 -out:$@ grubinst_gui.res
	rm -f grubinst_gui.res

else

grubinst_gui.ro: grubinst_gui.rc resource.h grubinst.ico
	windres $< $@

endif

grubinst_gui$(EXEEXT): $(grubinst_gui_OBJS)
	$(CC) $(LDFLAGS) -o$@ $^ -mwindows

endif

ifneq ($(HAVE_PERL),)

version.h: version ver2h.pl
	$(PERL) ver2h.pl $< $@

grub_mbr.h: grldr.mbr bin2h.pl
	$(PERL) bin2h.pl $< $@ grub_mbr

else

ver2h$(EXEEXT): ver2h.c
	$(CC) -o$@ $<

version.h: version ver2h$(EXEEXT)
	./ver2h$(EXEEXT) $< $@

bin2h$(EXEEXT): bin2h.c
	$(CC) -o$@ $<

grub_mbr.h: grldr.mbr bin2h$(EXEEXT)
	./bin2h$(EXEEXT) $< $@ grub_mbr

all_OBJS += ver2h$(EXEEXT) bin2h$(EXEEXT)

endif

install: all
	install -m 755 $(all_PROG) $(PREFIX)

clean:
	rm -f $(all_PROG) $(sort $(all_OBJS))

distclean: clean
	rm -f objects.dep grub_mbr.h version.h

pkg_bin: all
	mkdir grubutil-$(VERSION)-bin-$(SYSSTR)-$(REV)
	cp $(all_PROG) $(all_DIST) grubutil-$(VERSION)-bin-$(SYSSTR)-$(REV)/
ifneq ($(HAVE_ZIP),)
	zip -q -r grubutil-$(VERSION)-bin-$(SYSSTR)-$(REV).zip grubutil-$(VERSION)-bin-$(SYSSTR)-$(REV)/
else
	tar czf grubutil-$(VERSION)-bin-$(SYSSTR)-$(REV).tar.gz grubutil-$(VERSION)-bin-$(SYSSTR)-$(REV)/
endif
	rm -rf grubutil-$(VERSION)-bin-$(SYSSTR)-$(REV)/

pkg_src:
	mkdir grubutil-$(VERSION)-src-$(REV)
	cp $(all_SRCS) $(all_DIST) grubutil-$(VERSION)-src-$(REV)/
ifneq ($(HAVE_ZIP),)
	zip -q -r grubutil-$(VERSION)-src-$(REV).zip grubutil-$(VERSION)-src-$(REV)/
else
	tar czf grubutil-$(VERSION)-src-$(REV).tar.gz grubutil-$(VERSION)-src-$(REV)/
endif
	rm -rf grubutil-$(VERSION)-src-$(REV)/

objects.dep: version.h grub_mbr.h
	rm -f $@
	for csrc in $(sort $(all_CSRC)) ; do $(CC) -MM $$csrc >> $@ ; done	# create objects.dep

depend:
	rm -f objects.dep
	$(MAKE) --no-print-directory objects.dep

ifeq ($(filter-out objects.dep clean dist-clean,$(MAKECMDGOALS)),$(MAKECMDGOALS))
-include objects.dep
endif