xref: /kvmtool/Makefile (revision 095773e707ae1509f5bca0ad82f4e510e2ecdf80)
1#
2# Define WERROR=0 to disable -Werror.
3#
4
5ifeq ($(strip $(V)),)
6	ifeq ($(findstring s,$(filter-out --%,$(firstword $(MAKEFLAGS)))),)
7		E = @echo
8	else
9		E = @\#
10	endif
11	Q = @
12else
13	E = @\#
14	Q =
15endif
16export E Q
17
18include config/utilities.mak
19include config/feature-tests.mak
20-include $(OUTPUT)KVMTOOLS-VERSION-FILE
21
22CC	:= $(CROSS_COMPILE)gcc
23CFLAGS	:=
24LD	:= $(CROSS_COMPILE)ld
25LDFLAGS	:=
26OBJCOPY	:= $(CROSS_COMPILE)objcopy
27
28FIND	:= find
29CSCOPE	:= cscope
30TAGS	:= ctags
31INSTALL := install
32
33prefix = $(HOME)
34bindir_relative = bin
35bindir = $(prefix)/$(bindir_relative)
36
37DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
38bindir_SQ = $(subst ','\'',$(bindir))
39
40PROGRAM	:= lkvm
41PROGRAM_ALIAS := vm
42
43OBJS	+= builtin-balloon.o
44OBJS	+= builtin-debug.o
45OBJS	+= builtin-help.o
46OBJS	+= builtin-list.o
47OBJS	+= builtin-stat.o
48OBJS	+= builtin-pause.o
49OBJS	+= builtin-resume.o
50OBJS	+= builtin-run.o
51OBJS	+= builtin-setup.o
52OBJS	+= builtin-stop.o
53OBJS	+= builtin-version.o
54OBJS	+= devices.o
55OBJS	+= disk/core.o
56OBJS	+= framebuffer.o
57OBJS	+= guest_compat.o
58OBJS	+= hw/rtc.o
59OBJS	+= irq.o
60OBJS	+= kvm-cpu.o
61OBJS	+= kvm.o
62OBJS	+= main.o
63OBJS	+= mmio.o
64OBJS	+= pci.o
65OBJS	+= term.o
66OBJS	+= vfio/core.o
67OBJS	+= vfio/pci.o
68OBJS	+= virtio/blk.o
69OBJS	+= virtio/scsi.o
70OBJS	+= virtio/console.o
71OBJS	+= virtio/core.o
72OBJS	+= virtio/net.o
73OBJS	+= virtio/rng.o
74OBJS    += virtio/balloon.o
75OBJS	+= virtio/pci.o
76OBJS	+= virtio/vsock.o
77OBJS	+= virtio/pci-legacy.o
78OBJS	+= virtio/pci-modern.o
79OBJS	+= virtio/vhost.o
80OBJS	+= disk/blk.o
81OBJS	+= disk/qcow.o
82OBJS	+= disk/raw.o
83OBJS	+= epoll.o
84OBJS	+= ioeventfd.o
85OBJS	+= net/uip/core.o
86OBJS	+= net/uip/arp.o
87OBJS	+= net/uip/icmp.o
88OBJS	+= net/uip/ipv4.o
89OBJS	+= net/uip/tcp.o
90OBJS	+= net/uip/udp.o
91OBJS	+= net/uip/buf.o
92OBJS	+= net/uip/csum.o
93OBJS	+= net/uip/dhcp.o
94OBJS	+= kvm-cmd.o
95OBJS	+= util/bitmap.o
96OBJS	+= util/find.o
97OBJS	+= util/init.o
98OBJS    += util/iovec.o
99OBJS	+= util/rbtree.o
100OBJS	+= util/threadpool.o
101OBJS	+= util/parse-options.o
102OBJS	+= util/rbtree-interval.o
103OBJS	+= util/strbuf.o
104OBJS	+= util/read-write.o
105OBJS	+= util/util.o
106OBJS	+= virtio/9p.o
107OBJS	+= virtio/9p-pdu.o
108OBJS	+= kvm-ipc.o
109OBJS	+= builtin-sandbox.o
110OBJS	+= virtio/mmio.o
111OBJS	+= virtio/mmio-legacy.o
112OBJS	+= virtio/mmio-modern.o
113
114# Translate uname -m into ARCH string
115ARCH ?= $(shell uname -m | sed -e s/i.86/i386/ -e s/ppc.*/powerpc/ \
116	  -e s/armv.*/arm/ -e s/aarch64.*/arm64/ -e s/mips64/mips/ \
117	  -e s/riscv64/riscv/ -e s/riscv32/riscv/)
118
119ifeq ($(ARCH),i386)
120	override ARCH = x86
121	DEFINES      += -DCONFIG_X86_32
122endif
123ifeq ($(ARCH),x86_64)
124	override ARCH = x86
125	DEFINES      += -DCONFIG_X86_64
126	ARCH_PRE_INIT = x86/init.S
127endif
128
129### Arch-specific stuff
130
131#x86
132ifeq ($(ARCH),x86)
133	DEFINES += -DCONFIG_X86
134	OBJS	+= hw/i8042.o
135	OBJS	+= hw/serial.o
136	OBJS	+= x86/boot.o
137	OBJS	+= x86/cpuid.o
138	OBJS	+= x86/interrupt.o
139	OBJS	+= x86/ioport.o
140	OBJS	+= x86/irq.o
141	OBJS	+= x86/kvm.o
142	OBJS	+= x86/kvm-cpu.o
143	OBJS	+= x86/mptable.o
144# Exclude BIOS object files from header dependencies.
145	OTHEROBJS	+= x86/bios.o
146	OTHEROBJS	+= x86/bios/bios-rom.o
147	ARCH_INCLUDE := x86/include
148	ARCH_HAS_FRAMEBUFFER := y
149endif
150# POWER/ppc:  Actually only support ppc64 currently.
151ifeq ($(ARCH), powerpc)
152	DEFINES += -DCONFIG_PPC
153	OBJS	+= hw/serial.o
154	OBJS	+= powerpc/boot.o
155	OBJS	+= powerpc/ioport.o
156	OBJS	+= powerpc/kvm.o
157	OBJS	+= powerpc/cpu_info.o
158	OBJS	+= powerpc/kvm-cpu.o
159	OBJS	+= powerpc/spapr_hcall.o
160	OBJS	+= powerpc/spapr_rtas.o
161	OBJS	+= powerpc/spapr_hvcons.o
162	OBJS	+= powerpc/spapr_pci.o
163	OBJS	+= powerpc/xics.o
164	ARCH_INCLUDE := powerpc/include
165
166	ARCH_WANT_LIBFDT := y
167endif
168
169# ARM
170OBJS_ARM_COMMON		:= arm/fdt.o arm/gic.o arm/gicv2m.o arm/ioport.o \
171			   arm/kvm.o arm/kvm-cpu.o arm/pci.o arm/timer.o \
172			   hw/serial.o
173HDRS_ARM_COMMON		:= arm/include
174ifeq ($(ARCH), arm)
175	DEFINES		+= -DCONFIG_ARM
176	OBJS		+= $(OBJS_ARM_COMMON)
177	OBJS		+= arm/aarch32/arm-cpu.o
178	OBJS		+= arm/aarch32/kvm-cpu.o
179	OBJS		+= arm/aarch32/kvm.o
180	ARCH_INCLUDE	:= $(HDRS_ARM_COMMON)
181	ARCH_INCLUDE	+= -Iarm/aarch32/include
182	CFLAGS		+= -march=armv7-a
183
184	ARCH_WANT_LIBFDT := y
185	ARCH_HAS_FLASH_MEM := y
186endif
187
188# ARM64
189ifeq ($(ARCH), arm64)
190	DEFINES		+= -DCONFIG_ARM64
191	OBJS		+= $(OBJS_ARM_COMMON)
192	OBJS		+= arm/aarch64/arm-cpu.o
193	OBJS		+= arm/aarch64/kvm-cpu.o
194	OBJS		+= arm/aarch64/kvm.o
195	OBJS		+= arm/aarch64/pvtime.o
196	OBJS		+= arm/aarch64/pmu.o
197	ARCH_INCLUDE	:= $(HDRS_ARM_COMMON)
198	ARCH_INCLUDE	+= -Iarm/aarch64/include
199
200	ARCH_WANT_LIBFDT := y
201	ARCH_HAS_FLASH_MEM := y
202endif
203
204ifeq ($(ARCH),mips)
205	DEFINES		+= -DCONFIG_MIPS
206	ARCH_INCLUDE	:= mips/include
207	OBJS		+= mips/kvm.o
208	OBJS		+= mips/kvm-cpu.o
209endif
210
211# RISC-V (RV32 and RV64)
212ifeq ($(ARCH),riscv)
213	DEFINES		+= -DCONFIG_RISCV
214	ARCH_INCLUDE	:= riscv/include
215	OBJS		+= hw/serial.o
216	OBJS		+= riscv/fdt.o
217	OBJS		+= riscv/ioport.o
218	OBJS		+= riscv/irq.o
219	OBJS		+= riscv/kvm.o
220	OBJS		+= riscv/kvm-cpu.o
221	OBJS		+= riscv/pci.o
222	OBJS		+= riscv/plic.o
223	OBJS		+= riscv/aia.o
224	ifeq ($(RISCV_XLEN),32)
225		CFLAGS	+= -mabi=ilp32d -march=rv32gc
226		GUEST_INIT_FLAGS += -mabi=ilp32d -march=rv32gc
227	endif
228	ifeq ($(RISCV_XLEN),64)
229		CFLAGS	+= -mabi=lp64d -march=rv64gc
230		GUEST_INIT_FLAGS += -mabi=lp64d -march=rv64gc
231	endif
232
233	ARCH_WANT_LIBFDT := y
234endif
235###
236
237ifeq (,$(ARCH_INCLUDE))
238        $(error This architecture ($(ARCH)) is not supported in kvmtool)
239endif
240
241###
242
243# Detect optional features.
244# On a given system, some libs may link statically, some may not; so, check
245# both and only build those that link!
246
247ifeq ($(call try-build,$(SOURCE_STRLCPY),$(CFLAGS),$(LDFLAGS)),y)
248	CFLAGS_DYNOPT	+= -DHAVE_STRLCPY
249	CFLAGS_STATOPT	+= -DHAVE_STRLCPY
250endif
251
252ifeq ($(call try-build,$(SOURCE_BFD),$(CFLAGS),$(LDFLAGS) -lbfd -static),y)
253	CFLAGS_STATOPT	+= -DCONFIG_HAS_BFD
254	OBJS_STATOPT	+= symbol.o
255	LIBS_STATOPT	+= -lbfd
256else
257	ifeq ($(call try-build,$(SOURCE_BFD),$(CFLAGS),$(LDFLAGS) -lbfd),y)
258		CFLAGS_DYNOPT	+= -DCONFIG_HAS_BFD
259		OBJS_DYNOPT	+= symbol.o
260		LIBS_DYNOPT	+= -lbfd
261	else
262		NOTFOUND	+= bfd
263	endif
264endif
265
266ifeq (y,$(ARCH_HAS_FRAMEBUFFER))
267	OBJS	+= hw/vesa.o
268
269	CFLAGS_GTK3 := $(shell pkg-config --cflags gtk+-3.0 2>/dev/null)
270	LDFLAGS_GTK3 := $(shell pkg-config --libs gtk+-3.0 2>/dev/null)
271	ifeq ($(call try-build,$(SOURCE_GTK3),$(CFLAGS) $(CFLAGS_GTK3),$(LDFLAGS) $(LDFLAGS_GTK3)),y)
272		OBJS_DYNOPT	+= ui/gtk3.o
273		CFLAGS_DYNOPT	+= -DCONFIG_HAS_GTK3 $(CFLAGS_GTK3)
274		LIBS_DYNOPT	+= $(LDFLAGS_GTK3)
275	else
276		NOTFOUND	+= GTK3
277	endif
278
279	ifeq ($(call try-build,$(SOURCE_VNCSERVER),$(CFLAGS),$(LDFLAGS) -lvncserver),y)
280		OBJS_DYNOPT	+= ui/vnc.o
281		CFLAGS_DYNOPT	+= -DCONFIG_HAS_VNCSERVER
282		LIBS_DYNOPT	+= -lvncserver
283	else
284		NOTFOUND	+= vncserver
285	endif
286	ifeq ($(call try-build,$(SOURCE_VNCSERVER),$(CFLAGS),$(LDFLAGS) -lvncserver -static),y)
287		OBJS_STATOPT	+= ui/vnc.o
288		CFLAGS_STATOPT	+= -DCONFIG_HAS_VNCSERVER
289		LIBS_STATOPT	+= -lvncserver
290	endif
291
292	ifeq ($(call try-build,$(SOURCE_SDL),$(CFLAGS),$(LDFLAGS) -lSDL),y)
293		OBJS_DYNOPT	+= ui/sdl.o
294		CFLAGS_DYNOPT	+= -DCONFIG_HAS_SDL
295		LIBS_DYNOPT	+= -lSDL
296	else
297		NOTFOUND	+= SDL
298	endif
299	ifeq ($(call try-build,$(SOURCE_SDL),$(CFLAGS),$(LDFLAGS) -lSDL -static), y)
300		OBJS_STATOPT	+= ui/sdl.o
301		CFLAGS_STATOPT	+= -DCONFIG_HAS_SDL
302		LIBS_STATOPT	+= -lSDL
303	endif
304endif
305
306ifeq (y,$(ARCH_HAS_FLASH_MEM))
307	OBJS	+= hw/cfi_flash.o
308endif
309
310ifeq ($(call try-build,$(SOURCE_ZLIB),$(CFLAGS),$(LDFLAGS) -lz),y)
311	CFLAGS_DYNOPT	+= -DCONFIG_HAS_ZLIB
312	LIBS_DYNOPT	+= -lz
313else
314	ifeq ($(call try-build,$(SOURCE_ZLIB),$(CFLAGS),$(LDFLAGS) -lz -static),y)
315		CFLAGS_STATOPT	+= -DCONFIG_HAS_ZLIB
316		LIBS_STATOPT	+= -lz
317	else
318		NOTFOUND	+= zlib
319	endif
320endif
321
322ifeq ($(call try-build,$(SOURCE_AIO),$(CFLAGS),$(LDFLAGS) -laio),y)
323	CFLAGS_DYNOPT	+= -DCONFIG_HAS_AIO
324	LIBS_DYNOPT	+= -laio
325	OBJS_DYNOPT	+= disk/aio.o
326else
327	ifeq ($(call try-build,$(SOURCE_AIO),$(CFLAGS),$(LDFLAGS) -laio -static),y)
328		CFLAGS_STATOPT	+= -DCONFIG_HAS_AIO
329		LIBS_STATOPT	+= -laio
330		OBJS_STATOPT	+= disk/aio.o
331	else
332		NOTFOUND	+= aio
333	endif
334endif
335
336ifeq ($(LTO),1)
337	FLAGS_LTO := -flto
338	ifeq ($(call try-build,$(SOURCE_HELLO),$(CFLAGS),$(LDFLAGS) $(FLAGS_LTO)),y)
339		CFLAGS		+= $(FLAGS_LTO)
340	endif
341endif
342
343ifeq ($(call try-build,$(SOURCE_STATIC),$(CFLAGS),$(LDFLAGS) -static),y)
344	CFLAGS		+= -DCONFIG_GUEST_INIT
345	GUEST_INIT	:= guest/init
346	GUEST_OBJS	= guest/guest_init.o
347	ifeq ($(ARCH_PRE_INIT),)
348		GUEST_INIT_FLAGS	+= -static $(PIE_FLAGS)
349	else
350		CFLAGS			+= -DCONFIG_GUEST_PRE_INIT
351		GUEST_INIT_FLAGS	+= -DCONFIG_GUEST_PRE_INIT
352		GUEST_PRE_INIT		:= guest/pre_init
353		GUEST_OBJS		+= guest/guest_pre_init.o
354	endif
355else
356$(warning No static libc found. Skipping guest init)
357	NOTFOUND        += static-libc
358endif
359
360ifeq (y,$(ARCH_WANT_LIBFDT))
361	ifneq ($(LIBFDT_DIR),)
362		ifeq ($(wildcard $(LIBFDT_DIR)),)
363                        $(error LIBFDT_DIR not found)
364		endif
365
366		LIBFDT_STATIC	:= $(LIBFDT_DIR)/libfdt.a
367
368		ifeq ($(wildcard $(LIBFDT_STATIC)),)
369                        $(error libfdt.a not found)
370		endif
371
372		CFLAGS_DYNOPT	+= -DCONFIG_HAS_LIBFDT
373		CFLAGS_STATOPT	+= -DCONFIG_HAS_LIBFDT
374		CFLAGS		+= -I $(LIBFDT_DIR)
375	else ifeq ($(call try-build,$(SOURCE_LIBFDT),$(CFLAGS),-lfdt),y)
376		LIBFDT_STATIC	:=
377		CFLAGS_DYNOPT	+= -DCONFIG_HAS_LIBFDT
378		CFLAGS_STATOPT	+= -DCONFIG_HAS_LIBFDT
379		LIBS_DYNOPT	+= -lfdt
380		LIBS_STATOPT	+= -lfdt
381	else
382                $(error No libfdt found. Please install libfdt-dev package or set LIBFDT_DIR)
383	endif
384endif
385
386ifeq ($(call try-build,$(SOURCE_HELLO),$(CFLAGS),-no-pie),y)
387	PIE_FLAGS	+= -no-pie
388endif
389
390ifneq ($(NOTFOUND),)
391        $(warning Skipping optional libraries: $(NOTFOUND))
392endif
393
394###
395
396LIBS	+= -lrt
397LIBS	+= -lpthread
398LIBS	+= -lutil
399
400
401comma = ,
402
403# The dependency file for the current target
404depfile = $(subst $(comma),_,$(dir $@).$(notdir $@).d)
405
406DEPS	:= $(foreach obj,$(OBJS) $(OBJS_DYNOPT) $(OTHEROBJS) $(GUEST_OBJS),\
407		$(subst $(comma),_,$(dir $(obj)).$(notdir $(obj)).d))
408
409DEFINES	+= -D_FILE_OFFSET_BITS=64
410DEFINES	+= -D_GNU_SOURCE
411DEFINES	+= -DKVMTOOLS_VERSION='"$(KVMTOOLS_VERSION)"'
412DEFINES	+= -DBUILD_ARCH='"$(ARCH)"'
413
414KVM_INCLUDE := include
415CFLAGS	+= $(CPPFLAGS) $(DEFINES) -I$(KVM_INCLUDE) -I$(ARCH_INCLUDE) -O2 -fno-strict-aliasing -g
416
417WARNINGS += -Wall
418WARNINGS += -Wformat=2
419WARNINGS += -Winit-self
420WARNINGS += -Wmissing-declarations
421WARNINGS += -Wmissing-prototypes
422WARNINGS += -Wnested-externs
423WARNINGS += -Wno-system-headers
424WARNINGS += -Wold-style-definition
425WARNINGS += -Wredundant-decls
426WARNINGS += -Wsign-compare
427WARNINGS += -Wstrict-prototypes
428WARNINGS += -Wundef
429WARNINGS += -Wvolatile-register-var
430WARNINGS += -Wwrite-strings
431WARNINGS += -Wno-format-nonliteral
432
433CFLAGS	+= $(WARNINGS)
434
435ifneq ($(WERROR),0)
436	CFLAGS += -Werror
437endif
438
439all: $(PROGRAM) $(PROGRAM_ALIAS)
440
441# CFLAGS used when building objects
442# This is intentionally not assigned using :=
443c_flags	= -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CFLAGS)
444
445# When building -static all objects are built with appropriate flags, which
446# may differ between static & dynamic .o.  The objects are separated into
447# .o and .static.o.  See the %.o: %.c rules below.
448#
449# $(OTHEROBJS) are things that do not get substituted like this.
450#
451STATIC_OBJS = $(patsubst %.o,%.static.o,$(OBJS) $(OBJS_STATOPT))
452
453STATIC_DEPS	:= $(foreach obj,$(STATIC_OBJS),\
454		$(subst $(comma),_,$(dir $(obj)).$(notdir $(obj)).d))
455
456$(PROGRAM)-static:  $(STATIC_OBJS) $(OTHEROBJS) $(GUEST_OBJS) $(LIBFDT_STATIC)
457	$(E) "  LINK    " $@
458	$(Q) $(CC) -static $(CFLAGS) $(STATIC_OBJS) $(OTHEROBJS) $(GUEST_OBJS) $(LDFLAGS) $(LIBS) $(LIBS_STATOPT) $(LIBFDT_STATIC) -o $@
459
460$(PROGRAM): $(OBJS) $(OBJS_DYNOPT) $(OTHEROBJS) $(GUEST_OBJS) $(LIBFDT_STATIC)
461	$(E) "  LINK    " $@
462	$(Q) $(CC) $(CFLAGS) $(OBJS) $(OBJS_DYNOPT) $(OTHEROBJS) $(GUEST_OBJS) $(LDFLAGS) $(LIBS) $(LIBS_DYNOPT) $(LIBFDT_STATIC) -o $@
463
464$(PROGRAM_ALIAS): $(PROGRAM)
465	$(E) "  LN      " $@
466	$(Q) ln -f $(PROGRAM) $@
467
468ifneq ($(ARCH_PRE_INIT),)
469$(GUEST_PRE_INIT): $(ARCH_PRE_INIT)
470	$(E) "  COMPILE " $@
471	$(Q) $(CC) -s $(PIE_FLAGS) -nostdlib $< -o $@
472
473guest/guest_pre_init.c: $(GUEST_PRE_INIT)
474	$(E) "  CONVERT " $@
475	$(Q) $(call binary-to-C,$<,pre_init_binary,$@)
476endif
477
478$(GUEST_INIT): guest/init.c
479	$(E) "  COMPILE " $@
480	$(Q) $(CC) $(GUEST_INIT_FLAGS) $< -o $@
481
482guest/guest_init.c: $(GUEST_INIT)
483	$(E) "  CONVERT " $@
484	$(Q) $(call binary-to-C,$<,init_binary,$@)
485
486%.s: %.c
487	$(Q) $(CC) -o $@ -S $(CFLAGS) -fverbose-asm $<
488
489$(OBJS):
490
491util/rbtree.static.o util/rbtree.o: util/rbtree.c
492ifeq ($(C),1)
493	$(E) "  CHECK   " $@
494	$(Q) $(CHECK) -c $(CFLAGS) $< -o $@
495endif
496	$(E) "  CC      " $@
497	$(Q) $(CC) -c $(c_flags) $< -o $@
498
499%.static.o: %.c
500ifeq ($(C),1)
501	$(E) "  CHECK   " $@
502	$(Q) $(CHECK) -c $(CFLAGS) $(CFLAGS_STATOPT) $< -o $@
503endif
504	$(E) "  CC      " $@
505	$(Q) $(CC) -c $(c_flags) $(CFLAGS_STATOPT)  $< -o $@
506
507%.o: %.c
508ifeq ($(C),1)
509	$(E) "  CHECK   " $@
510	$(Q) $(CHECK) -c $(CFLAGS) $(CFLAGS_DYNOPT) $< -o $@
511endif
512	$(E) "  CC      " $@
513	$(Q) $(CC) -c $(c_flags) $(CFLAGS_DYNOPT) $< -o $@
514
515
516#
517# BIOS assembly weirdness
518#
519BIOS_CFLAGS += -m32
520BIOS_CFLAGS += -march=i386
521BIOS_CFLAGS += -mregparm=3
522
523BIOS_CFLAGS += -fno-stack-protector
524BIOS_CFLAGS += -fno-pic
525
526x86/bios.o: x86/bios/bios.bin x86/bios/bios-rom.h
527
528x86/bios/bios.bin.elf: x86/bios/entry.S x86/bios/e820.c x86/bios/int10.c x86/bios/int15.c x86/bios/rom.ld.S
529	$(E) "  CC       x86/bios/memcpy.o"
530	$(Q) $(CC) -include code16gcc.h $(CFLAGS) $(BIOS_CFLAGS) -c x86/bios/memcpy.c -o x86/bios/memcpy.o
531	$(E) "  CC       x86/bios/e820.o"
532	$(Q) $(CC) -include code16gcc.h $(CFLAGS) $(BIOS_CFLAGS) -c x86/bios/e820.c -o x86/bios/e820.o
533	$(E) "  CC       x86/bios/int10.o"
534	$(Q) $(CC) -include code16gcc.h $(CFLAGS) $(BIOS_CFLAGS) -c x86/bios/int10.c -o x86/bios/int10.o
535	$(E) "  CC       x86/bios/int15.o"
536	$(Q) $(CC) -include code16gcc.h $(CFLAGS) $(BIOS_CFLAGS) -c x86/bios/int15.c -o x86/bios/int15.o
537	$(E) "  CC       x86/bios/entry.o"
538	$(Q) $(CC) $(CFLAGS) $(BIOS_CFLAGS) -c x86/bios/entry.S -o x86/bios/entry.o
539	$(E) "  LD      " $@
540	$(Q) $(LD) -T x86/bios/rom.ld.S -o x86/bios/bios.bin.elf x86/bios/memcpy.o x86/bios/entry.o x86/bios/e820.o x86/bios/int10.o x86/bios/int15.o
541
542x86/bios/bios.bin: x86/bios/bios.bin.elf
543	$(E) "  OBJCOPY " $@
544	$(Q) $(OBJCOPY) -O binary -j .text x86/bios/bios.bin.elf x86/bios/bios.bin
545
546x86/bios/bios-rom.o: x86/bios/bios-rom.S x86/bios/bios.bin x86/bios/bios-rom.h
547	$(E) "  CC      " $@
548	$(Q) $(CC) -c $(CFLAGS) x86/bios/bios-rom.S -o x86/bios/bios-rom.o
549
550x86/bios/bios-rom.h: x86/bios/bios.bin.elf
551	$(E) "  NM      " $@
552	$(Q) cd x86/bios && sh gen-offsets.sh > bios-rom.h && cd ..
553
554check: all
555	$(MAKE) -C tests
556	./$(PROGRAM) run tests/pit/tick.bin
557	./$(PROGRAM) run -d tests/boot/boot_test.iso -p "init=init"
558.PHONY: check
559
560install: all
561	$(E) "  INSTALL"
562	$(Q) $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
563	$(Q) $(INSTALL) $(PROGRAM) '$(DESTDIR_SQ)$(bindir_SQ)'
564.PHONY: install
565
566clean:
567	$(E) "  CLEAN"
568	$(Q) rm -f x86/bios/*.bin
569	$(Q) rm -f x86/bios/*.elf
570	$(Q) rm -f x86/bios/*.o
571	$(Q) rm -f x86/bios/bios-rom.h
572	$(Q) rm -f tests/boot/boot_test.iso
573	$(Q) rm -rf tests/boot/rootfs/
574	$(Q) rm -f $(DEPS) $(STATIC_DEPS) $(OBJS) $(OTHEROBJS) $(OBJS_DYNOPT) $(STATIC_OBJS) $(PROGRAM) $(PROGRAM_ALIAS) $(PROGRAM)-static $(GUEST_INIT) $(GUEST_PRE_INIT) $(GUEST_OBJS)
575	$(Q) rm -f guest/guest_init.c guest/guest_pre_init.c
576	$(Q) rm -f cscope.*
577	$(Q) rm -f tags
578	$(Q) rm -f TAGS
579	$(Q) rm -f KVMTOOLS-VERSION-FILE
580.PHONY: clean
581
582KVM_DEV	?= /dev/kvm
583
584$(KVM_DEV):
585	$(E) "  MKNOD " $@
586	$(Q) mknod $@ char 10 232
587
588devices: $(KVM_DEV)
589.PHONY: devices
590
591TAGS:
592	$(E) "  GEN" $@
593	$(Q) $(RM) -f TAGS
594	$(Q) $(FIND) . -name '*.[hcS]' -print | xargs etags -a
595.PHONY: TAGS
596
597tags:
598	$(E) "  GEN" $@
599	$(Q) $(RM) -f tags
600	$(Q) $(FIND) . -name '*.[hcS]' -print | xargs ctags -a
601.PHONY: tags
602
603cscope:
604	$(E) "  GEN" $@
605	$(Q) $(FIND) . -name '*.[hcS]' -print > cscope.files
606	$(Q) $(CSCOPE) -bkqu
607.PHONY: cscope
608
609#
610# Escape redundant work on cleaning up
611ifneq ($(MAKECMDGOALS),clean)
612-include $(DEPS)
613-include $(STATIC_DEPS)
614
615KVMTOOLS-VERSION-FILE:
616	@$(SHELL_PATH) util/KVMTOOLS-VERSION-GEN $(OUTPUT)
617endif
618