Adjust memory layout for 2.6.22+ kernels with 32KB setup code
[mknbi.git] / Makefile
1 VERSION=1.4.4
2 EXTRAVERSION=
3 TARVERSION=1.4.4
4 # spec file can override
5 RPMVERSION=$(VERSION)
6
7 # If you don't have either nasm or the ELKS as86, then just do make
8 # and make install because the assembler sources are supplied preassembled
9 # If you do make realclean you will have to unpack the mknbi archive again
10
11 # Use nasm or as86
12 ASM=nasm
13 # This must be the as86 from the ELKS project, the default Linux one won't do
14 #ASM=as86
15
16 # for first32*.linux
17 # This one makes multiple versions
18 FIRSTRELOCS=    0x98800 0x88800
19 OLDGAS:=        $(shell $(AS) --version | grep -q '2\.9\.1' && echo -DGAS291)
20 CFLAGS=         -I. -Os -ffreestanding -fstrength-reduce -fomit-frame-pointer \
21                 -march=i386 -m32 \
22                 -Wall -W -Wno-format -Wno-unused -DVERSION=\"$(VERSION)$(EXTRAVERSION)\"
23 LDBINARYFLAG=   --oformat binary
24 FIRST32SIZE=    6144
25
26 # for first32dos
27 F32DRELOC=0x93000
28
29 # for FreeDOS
30 FDKSEG= 0x60
31
32 # for menu
33 MENURELOC=      0x60000
34 # Options for auxiliary menu program
35 # Available: -DANSIESC -DMOTD -DUSRPARMS -DPASSWD
36 # -DCONSOLE_CRT -DCONSOLE_SERIAL -DSHOW_NUMERIC -DPOWERSAVE
37 # Might as well take the lot since code size is not a concern
38 # Must pick ANSIMODE=1 if ANSIESC is chosen
39 BOOTMENU_FLAGS= -DCONSOLE_CRT -DANSIESC -DANSIMODE=1 -DMOTD -DUSRPARMS -DPASSWD -DPOWERSAVE -DCOMCONSOLE=0x3f8 -DCOMPRESERVE
40
41 PREFIX=         /usr/local
42 INSTPREFIX=     $(BUILD_ROOT)$(PREFIX)
43 LIBDIR=         $(PREFIX)/lib/mknbi
44 INSTLIBDIR=     $(INSTPREFIX)/lib/mknbi
45 BINDIR=         $(INSTPREFIX)/bin
46 MANDIR=         $(INSTPREFIX)/share/man/man1
47 DOCDIR=         $(INSTPREFIX)/share/doc/packages/mknbi-$(RPMVERSION)
48
49 INSTALL=        install
50
51 PROG=   mknbi disnbi dismbr disdosbb nbitoelf
52 MODULES=Nbi.pm Elf.pm TruncFD.pm
53 FIRSTS= $(foreach i,$(FIRSTRELOCS),first32@$(i).linux first32elf@$(i).linux) \
54         first.dos first.fdos menu nfl
55 ALTBOOT=altboot.bin
56 RMRD=   rmrd.com
57 MANS=   mknbi.1 disnbi.1 menuc.1
58 HTMLS=  mknbi.html disnbi.html menuc.html
59 DOCS=   $(MANS) $(HTMLS)
60
61
62 all:    $(PROG) $(FIRSTS) $(RMRD) $(DOCS)
63
64 # Tagged image builder
65 mknbi:  mknbi.pl Nbi.pm TruncFD.pm
66         perl -ne 's|\@\@VERSION\@\@|$(VERSION)|; s|\@\@LIBDIR\@\@|$(LIBDIR)|; s|\@\@FDKSEG\@\@|$(FDKSEG)|; print $$_;' mknbi.pl > $@
67         chmod 755 $@
68
69 # Tagged image display and disassemble
70 disnbi: disnbi.pl
71         cp -p disnbi.pl disnbi
72         chmod 755 disnbi
73
74 # Master boot record display
75 dismbr: dismbr.pl
76         cp -p dismbr.pl dismbr
77         chmod 755 dismbr
78
79 # DOS boot block display
80 disdosbb:       disdosbb.pl
81         cp -p disdosbb.pl disdosbb
82         chmod 755 disdosbb
83
84 # NBI to ELF converter
85 nbitoelf:       nbitoelf.pl
86         cp -p nbitoelf.pl nbitoelf
87         chmod 755 nbitoelf
88
89 # 32-bit first stage protected mode call setup program
90 first32@%.linux:        start32@%.o first32.o memsizes.o printf.o string.o
91         $(LD) -m elf_i386 -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32.o memsizes.o printf.o string.o
92         @if [ `wc -c < $@` -gt $(FIRST32SIZE) ]; then echo Binary too large; fi
93
94 # 32-bit first stage ELF setup program
95 first32elf@%.linux:     start32@%.o first32elf.o memsizes.o printf.o string.o
96         $(LD) -m elf_i386 -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32elf.o memsizes.o printf.o string.o
97         @if [ `wc -c < $@` -gt $(FIRST32SIZE) ]; then echo Binary too large; fi
98
99 # 32-bit first stage ELF DOS setup program
100 first32elf@%.dos:       start32@%.o first32dos.o printf.o string.o
101         $(LD) -m elf_i386 -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32dos.o printf.o string.o
102
103 start32@%.o:    start32.S
104         gcc -E -DRELOC=$* $(OLDGAS) start32.S | $(AS) -32 -o start32@$*.o
105
106 first32.o:      first32.c etherboot.h start32.h
107         gcc $(CFLAGS) -o first32.o -c first32.c
108
109 first32elf.o:   first32.c etherboot.h start32.h
110         gcc $(CFLAGS) -DFIRST32ELF -o first32elf.o -c first32.c
111
112 first32dos.o:   first32.c etherboot.h start32.h
113         gcc $(CFLAGS) -DRELOC=$(F32DRELOC) -DFIRST32DOS -DFIRST32ELF -o first32dos.o -c first32.c
114
115 memsizes.o:             memsizes.c
116         gcc $(CFLAGS) -c $*.c
117
118 printf.o:               printf.c
119         gcc $(CFLAGS) -c $*.c
120
121 # DOS first stage setup program, depend on Makefile for version number
122 first.dos:      first-dos.S first-dos.h version-dos.h Makefile
123 ifeq ($(ASM),as86)
124         gcc $(ASMCFLAGS) -DUSE_AS86 -DVENDOR_MAGIC=\"mknbi-dos-$(VERSION)\" -E -traditional -o first-dos.s first-dos.S
125         as86 -0 -b first.dos first-dos.s
126 else
127         gcc $(ASMCFLAGS) -DUSE_NASM -DVENDOR_MAGIC=\"mknbi-dos-$(VERSION)\" -E -traditional -o first-dos.s first-dos.S
128         nasm -f bin first-dos.s -o first.dos
129 endif
130
131 # FreeDOS first stage setup program, depend on Makefile for version number
132 first.fdos:     first-dos.S first-dos.h version-dos.h Makefile
133 ifeq ($(ASM),as86)
134         gcc $(ASMCFLAGS) -DFREEDOS -DFDKSEG=$(FDKSEG) -DUSE_AS86 -DVENDOR_MAGIC=\"mknbi-fdos-$(VERSION)\" -E -traditional -o first-fdos.s first-dos.S
135         as86 -0 -b first.fdos first-fdos.s
136 else
137         gcc $(ASMCFLAGS) -DFREEDOS -DFDKSEG=$(FDKSEG) -DUSE_NASM -DVENDOR_MAGIC=\"mknbi-fdos-$(VERSION)\" -E -traditional -o first-fdos.s first-dos.S
138         nasm -f bin first-fdos.s -o first.fdos
139 endif
140
141 first-elf.dos:  first.dos first32elf@$(F32DRELOC).dos
142         cat first.dos first32elf@$(F32DRELOC).dos > first-elf.dos
143
144 first-elf.fdos: first.fdos first32elf@$(F32DRELOC).dos
145         cat first.fdos first32elf@$(F32DRELOC).dos > first-elf.fdos
146
147 # Menu first stage program
148 menu:   startmenu.o menu.o bootmenu.o string.o printf.o ansiesc.o md5.o misc.o serial.o
149         $(LD) -m elf_i386 -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o menu.o bootmenu.o string.o printf.o ansiesc.o md5.o misc.o serial.o
150
151 # Another menu program, this one simpler
152 menu-simple:    startmenu.o menu-simple.o string.o printf.o ansiesc.o
153         $(LD) -m elf_i386 -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o menu-simple.o string.o printf.o ansiesc.o
154
155 # Network FreeLoader (light-bar menu program)
156 nfl:    startmenu.o nfl.o string.o printf.o ansiesc.o
157         $(LD) -m elf_i386 -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o nfl.o string.o printf.o ansiesc.o
158
159 # LUA interpreter
160 lua/bin/lua:
161         cd lua; make
162
163 startmenu.o:    startmenu.S startmenu.h
164         gcc -E -Ui386 -DRELOC=$(MENURELOC) $(OLDGAS) startmenu.S | $(AS) -32 -o startmenu.o
165
166 menu.o:         menu.c stddef.h string.h printf.h ansiesc.h \
167                 misc.h linux-asm-io.h etherboot.h
168         gcc $(CFLAGS) $(BOOTMENU_FLAGS) -c $*.c
169
170 bootmenu.o:     bootmenu.h bootmenu.c stddef.h string.h md5.h misc.h etherboot.h start32.h
171         gcc $(CFLAGS) $(BOOTMENU_FLAGS) -c $*.c
172
173 string.o:       string.h string.c
174         gcc $(CFLAGS) -c $*.c
175
176 ansiesc.o:      ansiesc.h ansiesc.c stddef.h string.h etherboot.h
177         gcc $(CFLAGS) -DGFX -c $*.c
178
179 md5.o:  md5.h md5.c etherboot.h
180         gcc $(CFLAGS) $(BOOTMENU_FLAGS) -c $*.c
181
182 misc.o: misc.h misc.c ansiesc.h etherboot.h start32.h
183         gcc $(CFLAGS) $(BOOTMENU_FLAGS) -c $*.c
184
185 serial.o:       serial.c
186         gcc $(CFLAGS) $(BOOTMENU_FLAGS) -c $*.c
187
188 menu-simple.o:  menu-simple.h menu-simple.c string.h etherboot.h
189         gcc $(CFLAGS) -c $*.c
190
191 # Remove ramdisk utility under DOS
192 rmrd.com:       rmrd.S
193 ifeq ($(ASM),as86)
194         gcc $(ASMCFLAGS) -DUSE_AS86 -E -traditional -o rmrd.s rmrd.S
195         # -s appears to be necessary to start binary at 0x100
196         as86 -0 -b rmrd.com -s rmrd.map rmrd.s
197 else
198         gcc $(ASMCFLAGS) -DUSE_NASM -E -traditional -o rmrd.s rmrd.S
199         nasm -f bin rmrd.s -o rmrd.com
200 endif
201
202 # Alternate boot block, taken from netboot mknbi-dos
203 # Not made by default because not everybody has as86 installed
204 $(ALTBOOT):     altboot.S
205         gcc -E altboot.S > altboot.s
206         as86 -s /dev/null -b $(ALTBOOT) altboot.s
207         $(RM) altboot.s
208
209 $(MANS):        mknbi.pl disnbi.pl Makefile
210         pod2man --date=`date +%Y-%m-%d` --release="Mknbi $(VERSION)$(EXTRAVERSION)" --center="Etherboot tools" mknbi.pl > mknbi.1
211         pod2man --date=`date +%Y-%m-%d` --release="Mknbi $(VERSION)$(EXTRAVERSION)" --center="Etherboot tools" disnbi.pl > disnbi.1
212         pod2man --date=`date +%Y-%m-%d` --release="Mknbi $(VERSION)$(EXTRAVERSION)" --center="Etherboot tools" menuc.pl > menuc.1
213
214 $(HTMLS):       mknbi.pl disnbi.pl
215         pod2html mknbi.pl > mknbi.html
216         pod2html disnbi.pl > disnbi.html
217         pod2html menuc.pl > menuc.html
218
219 install:        all $(ALTBOOT)
220         -mkdir -p $(INSTLIBDIR)
221         $(INSTALL) $(PROG) $(INSTLIBDIR)/
222         $(INSTALL) -m 644 $(MODULES) $(FIRSTS) $(ALTBOOT) $(RMRD) $(INSTLIBDIR)/
223         if [ -e lua-4.0.1/bin/lua ]; then \
224                 cp -p lua-4.0.1/bin/lua lua; \
225         fi
226         if [ -e lua ]; then \
227                 $(INSTALL) -m 644 lua $(INSTLIBDIR)/lua; \
228         fi
229         -mkdir -p $(BINDIR)
230         cd $(BINDIR); \
231         for i in linux rom fdos dos menu nfl; \
232         do \
233                 ln -sf ../lib/mknbi/mknbi mknbi-$$i; \
234         done; \
235         for i in linux img menu nfl lua; \
236         do \
237                 ln -sf ../lib/mknbi/mknbi mkelf-$$i; \
238         done
239         (cd $(BINDIR); ln -sf ../lib/mknbi/disnbi disnbi)
240         (cd $(BINDIR); ln -sf ../lib/mknbi/dismbr dismbr)
241         (cd $(BINDIR); ln -sf ../lib/mknbi/disdosbb disdosbb)
242         (cd $(BINDIR); ln -sf ../lib/mknbi/nbitoelf nbitoelf)
243         -mkdir -p $(MANDIR)
244         $(INSTALL) -m 644 mknbi.1 disnbi.1 $(MANDIR)/
245         cd $(MANDIR); \
246         for i in mkelf mknbi-linux mkelf-linux mknbi-rom mkelf-img mknbi-menu mkelf-menu mknbi-nfl mkelf-nfl mknbi-dos mknbi-fdos mkelf-lua; \
247         do \
248                 ln -sf mknbi.1 $$i.1; \
249         done
250         -mkdir -p $(DOCDIR)
251         $(INSTALL) -m 644 COPYING README LOG spec.txt $(DOCDIR)/
252
253 tarball:
254         mkdir -p luabuild
255         -diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1 lua-4.0.1 > luabuild/luapatch.txt
256         (cd ..; tar zcf /tmp/mknbi-$(TARVERSION).tar.gz --exclude CVS --exclude lua-4.0.1 mknbi-$(TARVERSION))
257
258 clean:
259         $(RM) -f $(PROG) start32*.o first32*.o \
260         printf.o menu.o menu-simple.o nfl.o startmenu.o \
261         bootmenu.o md5.o misc.o serial.o ansiesc.o string.o memsizes.o \
262         first-dos.s first-fdos.s rmrd.s rmrd.map *.l pod2htm*
263
264 realclean:      clean
265         $(RM) -f $(FIRSTS) $(RMRD) $(DOCS)