xref: /haiku/src/system/boot/Jamfile (revision 21258e2674226d6aa732321b6f8494841895af5f)
1SubDir HAIKU_TOP src system boot ;
2
3DEFINES += _BOOT_MODE ;
4
5UsePrivateHeaders [ FDirName libroot locale ] ;
6
7rule BuildOpenFirmwareLoader {
8	local haikuLoader = $(1) ;
9	local bootLoader = $(2) ;
10
11	Depends $(haikuLoader) : $(bootLoader) ;
12	MakeLocateDebug $(haikuLoader) ;
13
14	switch $(TARGET_ARCH) {
15		case ppc :
16			BuildCoffLoader $(haikuLoader) : $(bootLoader) ;
17		case sparc :
18			BuildAoutLoader $(haikuLoader) : $(bootLoader) ;
19		case * :
20			Exit "Currently unsupported arch:" $(TARGET_ARCH) ;
21	}
22}
23
24
25#
26# A.out haiku_loader creation
27#
28rule BuildAoutLoader {
29	local haikuLoader = $(1) ;
30	local bootLoader = $(2) ;
31
32	Depends $(haikuLoader) : $(bootLoader) ;
33	MakeLocateDebug $(haikuLoader) ;
34
35	ELF2AOUT on $(haikuLoader) = <build>elf2aout ;
36	Depends $(haikuLoader) : <build>elf2aout ;
37}
38
39actions BuildAoutLoader bind ELF2AOUT {
40	rm -f $(1)
41	$(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) \
42	$(ELF2AOUT) -o $(1) $(2)
43}
44
45
46#
47# Coff haiku_loader creation
48#
49rule BuildCoffLoader {
50	local coffLoader = $(1) ;
51	local bootLoader = $(2) ;
52	switch $(TARGET_ARCH) {
53		case ppc :
54			COFF_FORMAT on $(coffLoader) = xcoff-powermac ;
55		case * :
56			Exit "Currently unsupported coff arch:" $(TARGET_ARCH) ;
57	}
58	HACK_COFF on $(coffLoader) = <build>hack-coff ;
59
60	Depends $(coffLoader) : <build>hack-coff ;
61}
62
63actions BuildCoffLoader bind HACK_COFF {
64	rm -f $(1)
65	# get the address of the COFF entry
66	$(TARGET_OBJCOPY_$(TARGET_PACKAGING_ARCH)) -O symbolsrec $(2) $(2).syms
67	EP=`grep _coff_start $(2).syms | tr -d '\r' | cut -d'$' -f2`
68	rm -f $(2).syms
69	# copy to XCOFF format and patch the entry point
70	$(TARGET_OBJCOPY_$(TARGET_PACKAGING_ARCH)) -O $(COFF_FORMAT) --set-start="0x${EP}" $(2) $(1)
71	#$(CP) $(2) $(1)
72	# fill-in some fields objcopy missed
73	$(HACK_COFF) $(1)
74}
75
76
77#
78# BIOS haiku_loader creation
79#
80rule BuildBiosLoader {
81	local haikuLoader = $(1) ;
82	local bootLoader = $(2) ;
83
84	Depends $(haikuLoader) : $(bootLoader) ;
85	MakeLocateDebug $(haikuLoader) ;
86
87	on $(1) ResAttr $(1) : $(RESFILES) : false ;
88	if ! [ on $(1) return $(DONT_USE_BEOS_RULES) ] {
89		SetType $(1) ;
90		MimeSet $(1) ;
91	}
92}
93
94actions BuildBiosLoader {
95	rm -f $(1)
96	$(TARGET_OBJCOPY_$(TARGET_PACKAGING_ARCH)) -O binary $(2) $(1)
97}
98
99
100#
101# EFI loader creation
102#
103rule BuildEFILoader {
104	local efiLoader = $(1) ;
105	local bootLoader = $(2) ;
106
107	Depends $(efiLoader) : $(bootLoader) ;
108
109	switch $(TARGET_ARCH) {
110		case x86_64 :
111			OUTPUT_TARGET on $(efiLoader) = pei-x86-64 ;
112		case arm :
113			OUTPUT_TARGET on $(efiLoader) = binary ;
114		case arm64 :
115			OUTPUT_TARGET on $(efiLoader) = binary ;
116		case riscv64 :
117			OUTPUT_TARGET on $(efiLoader) = binary ;
118		case * :
119			Exit "Currently unsupported arch:" $(TARGET_ARCH) ;
120	}
121
122	MakeLocateDebug $(efiLoader) ;
123}
124
125actions BuildEFILoader
126{
127	rm -f $(1)
128	if [ "$(OUTPUT_TARGET)" = "binary" ]; then
129		# no bfd support, fake efi Pe header
130		$(TARGET_OBJCOPY_$(TARGET_PACKAGING_ARCH)) -j .text -j .sdata -j .data \
131			-j .dynamic -j .dynsym -j .rel -j .rela -j .reloc -j .dynstr \
132			--output-target=$(OUTPUT_TARGET) $(2) $(1)
133	else
134		# bfd supports pe + efi for arch
135		$(TARGET_OBJCOPY_$(TARGET_PACKAGING_ARCH)) -j .text -j .sdata -j .data \
136			-j .dynamic -j .dynsym -j .rel -j .rela -j .reloc -j .dynstr \
137			--output-target=$(OUTPUT_TARGET) \
138			--subsystem=efi-app $(2) $(1)
139	fi
140}
141
142
143#
144# U-boot image creation
145#
146rule BuildUImage image : data : args
147{
148    Depends $(image) : $(data) ;
149    LocalClean clean : $(image) ;
150    MKIMAGE_ARGS on $(image) = $(args) ;
151    colon on $(image) = ":" ;
152    local files = $(data:G=) ;
153    BuildUImage1 $(image) : $(data) ;
154}
155
156actions BuildUImage1
157{
158    mkimage $(MKIMAGE_ARGS) -d $(>:J=$(colon)) $(<)
159}
160
161#
162# Given a txt, generate a binary u-boot script
163#
164rule BuildUImageScript script : source
165{
166	Depends $(script) : $(source) ;
167	LocalClean clean : $(script) ;
168	SCRIPTNAME on $(script) = $(script) ;
169	FAKEOS on $(script) = "linux" ;
170	BuildUImageScript1 $(script) : $(source) ;
171}
172
173actions BuildUImageScript1
174{
175	rm -f $(1)
176	mkimage -A $(TARGET_ARCH) -O $(FAKEOS) -T script -C none -n $(SCRIPTNAME) \
177		-d $(2) $(1)
178}
179
180# the bootsector on haiku_loader.amiga_m68k must be checksummed
181rule ChecksumAmigaLoader
182{
183	local haikuLoader = $(1) ;
184	local checksummer = <build>fixup_amiga_boot_checksum ;
185
186	Depends $(haikuLoader) : $(checksummer) ;
187
188	TARGET_CHECKSUM on $(haikuLoader) = $(checksummer) ;
189}
190
191actions ChecksumAmigaLoader bind TARGET_CHECKSUM
192{
193	$(TARGET_CHECKSUM) $(1)
194}
195
196# the bootsector on haiku_loader.atari_m68k must be checksummed
197rule ChecksumAtariLoader
198{
199	local haikuLoader = $(1) ;
200	local checksummer = <build>fixup_tos_boot_checksum ;
201
202	Depends $(haikuLoader) : $(checksummer) ;
203
204	TARGET_CHECKSUM on $(haikuLoader) = $(checksummer) ;
205}
206
207actions ChecksumAtariLoader bind TARGET_CHECKSUM {
208	$(TARGET_CHECKSUM) $(1)
209}
210
211
212
213# atari_m68k: AUTO folder PRG target
214# based on KernelLd
215rule AtariBootPrgLd
216{
217	# AtariBootPrgLd <name> : <objs> : <linkerscript> : <args> ;
218
219	LINK on $(1) = $(TARGET_LD_$(TARGET_PACKAGING_ARCH)) ;
220
221	LINKFLAGS on $(1) = $(4) ;
222	if $(3) { LINKFLAGS on $(1) += --script=$(3) ; }
223
224	# Remove any preset LINKLIBS
225	LINKLIBS on $(1) = ;
226
227	# TODO: Do we really want to invoke SetupKernel here? The objects should
228	# have been compiled with KernelObjects anyway, so we're doing that twice.
229	SetupKernel $(2) ;
230
231	# Show that we depend on the libraries we need
232	LocalClean clean : $(1) ;
233	LocalDepends all : $(1) ;
234	Depends $(1) : $(2) ;
235
236	MakeLocateDebug $(1) ;
237
238}
239
240actions AtariBootPrgLd
241{
242	$(LINK) $(LINKFLAGS) -o "$(1)" "$(2)" $(LINKLIBS) ;
243}
244
245
246local extraSources = ;
247if $(TARGET_GCC_VERSION_$(TARGET_PACKAGING_ARCH)[1]) = 2 {
248	extraSources += atomic.S ;
249}
250
251for platform in [ MultiBootSubDirSetup ] {
252	on $(platform) {
253		if $(TARGET_ARCH) = x86_64 && $(TARGET_BOOT_PLATFORM) = efi {
254			SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) libroot os arch
255								x86_64 ] ;
256		} else {
257			SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) libroot os arch
258									$(TARGET_KERNEL_ARCH) ] ;
259		}
260
261		SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) libroot posix string ] ;
262		SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) libroot posix stdlib ] ;
263		SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) libroot posix locale ] ;
264		SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) kernel lib ] ;
265
266		BootMergeObject boot_libroot_$(platform:G=).o :
267			abs.c
268			ctype.cpp
269			LocaleData.cpp
270			qsort.c
271			kernel_vsprintf.cpp
272			memchr.c
273			memcmp.c
274			memmove.c
275			strdup.cpp
276			strndup.cpp
277			strlen.cpp
278			strnlen.cpp
279			strcmp.c
280			strcasecmp.c
281			strncmp.c
282			strcat.c
283			strcpy.c
284			strerror.c
285			strlcat.c
286			strlcpy.c
287			strchr.c
288			strrchr.c
289			strtol.c
290			strtoul.c
291			$(extraSources)
292		;
293
294		AddResources haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader.rdef ;
295
296		local archGrist = [ FGrist src system boot arch $(TARGET_KERNEL_ARCH) $(platform:G=) ] ;
297		local archObject = boot_arch_$(TARGET_KERNEL_ARCH).o ;
298		local ldflags = $(HAIKU_BOOT_LDFLAGS) $(HAIKU_BOOT_$(platform:G=:U)_LDFLAGS) ;
299		ldflags ?= $(TARGET_BOOT_LDFLAGS) ;
300
301		# efi loader needs to be shared.
302		if $(TARGET_BOOT_PLATFORM) = efi {
303			ldflags += -shared ;
304			ldflags += -Map=efi.map ;
305		}
306
307		BootLd boot_loader_$(platform:G=) :
308			boot_platform_$(platform:G=).o
309			$(archObject:G=$(archGrist))
310			[ MultiBootGristFiles
311				boot_loader.a
312				boot_net.a
313				boot_partitions.a
314
315				# file systems
316				boot_bfs.a
317				boot_amiga_ffs.a
318				boot_tarfs.a
319				boot_fatfs.a
320				boot_packagefs.a
321
322				boot_loader.a
323					# a second time, so undefined references in the file systems can be
324					# resolved
325
326				# needed by tarfs, packagefs, and video_splash.cpp
327				boot_zlib.a
328			]
329			# libroot functions needed by the stage2 boot loader
330			boot_libroot_$(platform:G=).o
331
332			: $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/boot_loader_$(platform:G=).ld
333			: $(ldflags)
334		;
335
336		switch $(TARGET_BOOT_PLATFORM) {
337			case efi :
338				BuildEFILoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ;
339				if $(TARGET_ARCH) = arm || $(TARGET_ARCH) = arm64 {
340					# These platforms sometimes need u-boot to get them going
341					BuildUImage haiku-floppyboot.tgz.$(TARGET_BOOT_PLATFORM) : haiku-floppyboot.tgz :
342						-A $(TARGET_ARCH) -O linux -T ramdisk -C none
343						-n 'Haiku $(TARGET_KERNEL_ARCH) floppyboot' ;
344					BuildUImageScript boot.scr
345						: [ FDirName $(HAIKU_TOP) data boot u-boot boot-$(TARGET_ARCH).scr.txt ] ;
346				}
347
348			case bios_ia32 :
349				BuildBiosLoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ;
350
351			case pxe_ia32 :
352				BuildBiosLoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ;
353
354			case openfirmware :
355				BuildOpenFirmwareLoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ;
356
357			case u-boot :
358				local loader_entry = `printf \"obase=16;ibase=16;10 + %x\\n\" $(HAIKU_BOOT_LOADER_BASE)|bc` ;
359				BuildUImage haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM)
360					:
361					-A $(TARGET_ARCH) -O linux -T kernel -C none
362					-a $(HAIKU_BOOT_LOADER_BASE) -e $(loader_entry)
363					-n 'Haiku $(TARGET_KERNEL_ARCH) loader' ;
364				BuildUImage haiku-floppyboot.tgz.$(TARGET_BOOT_PLATFORM) : haiku-floppyboot.tgz :
365					-A $(TARGET_ARCH) -O linux -T ramdisk -C none
366					-n 'Haiku $(TARGET_KERNEL_ARCH) floppyboot' ;
367				BuildUImageScript boot.scr
368					: [ FDirName $(HAIKU_TOP) data boot u-boot boot-$(TARGET_ARCH).scr.txt ] ;
369
370			case amiga_m68k :
371				BuildBiosLoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ;
372				ChecksumAmigaLoader haiku_loader.$(TARGET_BOOT_PLATFORM) ;
373
374			case atari_m68k :
375				BuildBiosLoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ;
376				ChecksumAtariLoader haiku_loader.$(TARGET_BOOT_PLATFORM) ;
377
378				AtariBootPrgLd haiku.prg :
379					boot_loader_$(TARGET_BOOT_PLATFORM)
380					: $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/boot_prg_$(TARGET_BOOT_PLATFORM).ld
381					: -Bstatic
382				;
383
384			case next_m68k :
385				BuildAoutLoader haiku_loader.$(TARGET_BOOT_PLATFORM) : boot_loader_$(TARGET_BOOT_PLATFORM) ;
386
387			case * :
388				Exit "Currently unsupported haiku_loader:" $(TARGET_BOOT_PLATFORM) ;
389		}
390	}
391}
392
393SubInclude HAIKU_TOP src system boot arch $(TARGET_KERNEL_ARCH) ;
394SubInclude HAIKU_TOP src system boot loader ;
395SubInclude HAIKU_TOP src system boot platform ;
396