Hello!
The attached patch uses per-program flags where possible.
Feel free to remove stage2 and *stage1_5 directories after applying
gcc (not ld) links stage2 now. That stage2 has just booted my Linux.
Pavel Roskin
Index: Makefile.am
===================================================================
RCS file: /usr/local/cvs/grub/Makefile.am,v
retrieving revision 1.1.1.1
retrieving revision 1.5
diff -u -r1.1.1.1 -r1.5
--- Makefile.am 1999/06/19 21:30:04 1.1.1.1
+++ Makefile.am 1999/06/23 19:04:47 1.5
@@ -1,7 +1,5 @@
-SUBDIRS = grub stage1 stage2 \
- e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 \
- docs shared_src debian
-DISTCLEANFILES = ssrcrules.mk
+SUBDIRS = shared_src stage1 grub docs debian
+
EXTRA_DIST = BUGS
# We get $(PACKAGE) and $(VERSION) from debian/changelog.
Index: configure.in
===================================================================
RCS file: /usr/local/cvs/grub/configure.in,v
retrieving revision 1.1.1.2
retrieving revision 1.7
diff -u -r1.1.1.2 -r1.7
--- configure.in 1999/06/23 16:40:28 1.1.1.2
+++ configure.in 1999/06/23 19:14:57 1.7
@@ -49,6 +49,7 @@
AC_CHECK_TOOL(CC, gcc)
AC_PROG_CC
+AC_PROG_RANLIB
# Enforce coding standards.
CPPFLAGS="$CPPFLAGS -Wall -Wmissing-prototypes -Wunused"
@@ -69,44 +70,11 @@
fi
# Check for curses libraries.
-AC_CHECK_LIB(ncurses, getch, [LIBS="$LIBS -lncurses"
+AC_CHECK_LIB(ncurses, getch, [GRUB_LIBS="$GRUB_LIBS -lncurses"
AC_DEFINE(HAVE_LIBCURSES)],
[AC_CHECK_LIB(curses, getch, [LIBS="$LIBS -lcurses"
AC_DEFINE(HAVE_LIBCURSES)])])
+AC_SUBST(GRUB_LIBS)
-# Create rules for our shared sources.
-AC_SUBST_FILE(SHARED_SRC_RULES)dnl
-SHARED_SRC_RULES=./ssrcrules.mk
-echo creating $SHARED_SRC_RULES
-rm -f $SHARED_SRC_RULES
-cat > $SHARED_SRC_RULES <<EOF
-# $SHARED_SRC_RULES - Rules for building objects from files in shared_src.
-# Generated automatically by configure.
-asm.o: \$(top_srcdir)/shared_src/asm.S
- @echo '\$(COMPILE) -c \$(top_srcdir)/shared_src/asm.S'; \\
- if test -d .deps; then \\
- \$(COMPILE) -Wp,-MD,.deps/asm.P -c \$(top_srcdir)/shared_src/asm.S; \\
- else \\
- \$(COMPILE) -c \$(top_srcdir)/shared_src/asm.S; \\
- fi
-EOF
-for f in boot common char_io cmdline disk_io gunzip fsys_ffs \
- fsys_ext2fs fsys_fat stage1_5 stage2 bios; do
-
- cat >> $SHARED_SRC_RULES <<EOF
-
-$f.o: \$(top_srcdir)/shared_src/$f.c
- @echo '\$(COMPILE) -c \$(top_srcdir)/shared_src/$f.c'; \\
- if test -d .deps; then \\
- \$(COMPILE) -Wp,-MD,.deps/$f.P -c \$(top_srcdir)/shared_src/$f.c; \\
- else \\
- \$(COMPILE) -c \$(top_srcdir)/shared_src/$f.c; \\
- fi
-
-EOF
-done
-
-AC_OUTPUT([Makefile grub/Makefile stage1/Makefile stage2/Makefile \
- e2fs_stage1_5/Makefile fat_stage1_5/Makefile \
- ffs_stage1_5/Makefile docs/Makefile shared_src/Makefile \
- debian/Makefile])
+AC_OUTPUT([Makefile grub/Makefile stage1/Makefile docs/Makefile \
+ shared_src/Makefile debian/Makefile])
Index: grub/Makefile.am
===================================================================
RCS file: /usr/local/cvs/grub/grub/Makefile.am,v
retrieving revision 1.1.1.2
retrieving revision 1.5
diff -u -r1.1.1.2 -r1.5
--- grub/Makefile.am 1999/06/23 16:40:28 1.1.1.2
+++ grub/Makefile.am 1999/06/23 19:14:57 1.5
@@ -1,14 +1,8 @@
sbin_PROGRAMS = grub
CLEANFILES = $(EXTRA_PROGRAMS)
-COMPILE = $(CC) -DGRUB_UTIL=1 -fwritable-strings $(DEFS) $(INCLUDES) $(CPPFLAGS)
$(CFLAGS)
-INCLUDES = -I$(top_srcdir)/shared_src
+AM_CFLAGS = -DGRUB_UTIL=1 -fwritable-strings -I$(srcdir)/../shared_src
grub_SOURCES = main.c asmstub.c
-grub_LDADD = boot.o common.o char_io.o cmdline.o disk_io.o gunzip.o \
- fsys_ffs.o fsys_ext2fs.o fsys_fat.o stage2.o
-# FIXME: Automake hackery.
-DEP_FILES = .deps/main.P .deps/asmstub.P $(wildcard .deps/*.P)
-
-@SHARED_SRC_RULES@
+grub_LDADD = ../shared_src/libgrub.a @GRUB_LIBS@
Index: shared_src/Makefile.am
===================================================================
RCS file: /usr/local/cvs/grub/shared_src/Makefile.am,v
retrieving revision 1.1.1.2
retrieving revision 1.8
diff -u -r1.1.1.2 -r1.8
--- shared_src/Makefile.am 1999/06/23 16:40:28 1.1.1.2
+++ shared_src/Makefile.am 1999/06/23 19:35:20 1.8
@@ -2,6 +2,105 @@
fat.h filesys.h freebsd.h fs.h i386-elf.h imgact_aout.h \
mb_header.h mb_info.h pc_slice.h shared.h smp-imps.h
-EXTRA_DIST = asm.S bios.c boot.c char_io.c cmdline.c common.c \
- disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c gunzip.c \
- smp-imps.c stage1_5.c stage2.c
+EXTRA_DIST = smp-imps.c
+
+noinst_LIBRARIES = libgrub.a
+
+pkgdatadir = $(datadir)/$(PACKAGE)/$(host_cpu)-$(host_vendor)
+pkgdata_DATA = stage2 e2fs_stage1_5 fat_stage1_5 ffs_stage1_5
+CLEANFILES = $(pkgdata_DATA) *T
+MOSTLYCLEANFILES = *.exec
+
+noinst_PROGRAMS = stage2.exec e2fs_stage1_5.exec \
+ fat_stage1_5.exec ffs_stage1_5.exec
+
+# Stage 1.5 can be installed into the first cylinder after MBR, so the
+# limit is (63 - 1) * 512 = 31744.
+MBR_SIZE_LIMIT = 31744
+FFS_SIZE_LIMIT = 7168
+
+stage2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
+
+stage2_COMPILE = -fno-builtin -nostdinc
+
+stage1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
+
+stage1_5_COMPILE = $(stage2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1 \
+ -DCONFIG_FILE_ASM='.string "/boot/grub/stage2"'
+
+
+# asm.S absolutely needs to come first!
+stage2_exec_SOURCES = asm.S boot.c common.c char_io.c cmdline.c disk_io.c \
+ gunzip.c fsys_ffs.c fsys_ext2fs.c fsys_fat.c stage2.c bios.c
+
+stage2_exec_CFLAGS = $(stage2_COMPILE)
+
+stage2_exec_LDFLAGS = $(stage2_LINK)
+
+stage2: stage2.exec
+ $(OBJCOPY) -O binary stage2.exec stage2
+
+
+e2fs_stage1_5_exec_SOURCES = asm.S common.c char_io.c disk_io.c \
+ stage1_5.c fsys_ext2fs.c bios.c
+
+e2fs_stage1_5_exec_CFLAGS = $(stage1_5_COMPILE) -DFSYS_EXT2FS=1 \
+ -DNO_BLOCK_FILES=1
+
+e2fs_stage1_5_exec_LDFLAGS = $(stage1_5_LINK)
+
+e2fs_stage1_5: e2fs_stage1_5.exec
+ rm -f $@T $@
+ $(OBJCOPY) -O binary e2fs_stage1_5.exec $@T
+ @set dummy `ls -l $@T`; size=$$6; \
+ if test $$size -le $(MBR_SIZE_LIMIT); then \
+ :; \
+ else \
+ echo "WARNING: stage 1.5 is too big for boot block area ($$size >
+$(MBR_SIZE_LIMIT))."; \
+ fi
+ mv -f $@T $@
+
+
+fat_stage1_5_exec_SOURCES = asm.S common.c char_io.c disk_io.c \
+ stage1_5.c fsys_fat.c bios.c
+
+fat_stage1_5_exec_CFLAGS = $(stage1_5_COMPILE) -DFSYS_FAT=1
+
+fat_stage1_5_exec_LDFLAGS = $(stage1_5_LINK)
+
+fat_stage1_5: fat_stage1_5.exec
+ rm -f $@T $@
+ $(OBJCOPY) -O binary fat_stage1_5.exec $@T
+ @set dummy `ls -l $@T`; size=$$6; \
+ if test $$size -le $(MBR_SIZE_LIMIT); then \
+ :; \
+ else \
+ echo "WARNING: stage 1.5 is too big for boot block area ($$size >
+$(MBR_SIZE_LIMIT))."; \
+ fi
+ mv -f $@T $@
+
+
+ffs_stage1_5_exec_SOURCES = asm.S common.c char_io.c disk_io.c \
+ stage1_5.c fsys_ffs.c bios.c
+
+ffs_stage1_5_exec_CFLAGS = $(stage1_5_COMPILE) -DFSYS_FFS=1 \
+ -DNO_BLOCK_FILES=1
+
+ffs_stage1_5_exec_LDFLAGS = $(stage1_5_LINK)
+
+ffs_stage1_5: ffs_stage1_5.exec
+ rm -f $@T $@
+ $(OBJCOPY) -O binary ffs_stage1_5.exec $@T
+ @set dummy `ls -l $@T`; size=$$6; \
+ if test $$size -le $(FFS_SIZE_LIMIT); then \
+ :; \
+ else \
+ echo "WARNING: stage 1.5 is too big for boot block area ($$size >
+$(FFS_SIZE_LIMIT))."; \
+ fi
+ mv -f $@T $@
+
+
+libgrub_a_SOURCES = boot.c common.c char_io.c cmdline.c disk_io.c \
+ gunzip.c fsys_ffs.c fsys_ext2fs.c fsys_fat.c stage2.c
+
+libgrub_a_CFLAGS = -DGRUB_UTIL=1 -fwritable-strings