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