Andreas Färber | 0e8c921 | 2010-01-06 20:24:05 +0100 | [diff] [blame] | 1 | ####################################################################### |
Paolo Bonzini | a372823 | 2012-12-20 16:10:26 +0100 | [diff] [blame] | 2 | # Common libraries for tools and emulators |
Paolo Bonzini | 44e9f23 | 2019-08-06 15:12:18 +0200 | [diff] [blame] | 3 | stub-obj-y = stubs/ |
Paolo Bonzini | b8d89ba | 2019-07-29 15:55:47 +0200 | [diff] [blame] | 4 | util-obj-y = crypto/ util/ qobject/ qapi/ |
Paolo Bonzini | 3bc2f57 | 2012-11-16 18:35:27 +0100 | [diff] [blame] | 5 | |
Marc-André Lureau | 32d955a | 2016-12-12 15:49:01 +0300 | [diff] [blame] | 6 | chardev-obj-y = chardev/ |
| 7 | |
Paolo Bonzini | 3bc2f57 | 2012-11-16 18:35:27 +0100 | [diff] [blame] | 8 | ####################################################################### |
Daniel P. Berrange | 5b76dd1 | 2015-10-21 13:16:21 +0100 | [diff] [blame] | 9 | # authz-obj-y is code used by both qemu system emulation and qemu-img |
| 10 | |
| 11 | authz-obj-y = authz/ |
| 12 | |
| 13 | ####################################################################### |
Andreas Färber | 0e8c921 | 2010-01-06 20:24:05 +0100 | [diff] [blame] | 14 | # block-obj-y is code used by both qemu system emulation and qemu-img |
| 15 | |
Paolo Bonzini | f72036f | 2019-02-15 10:15:22 +0100 | [diff] [blame] | 16 | block-obj-y = nbd/ |
Kevin Wolf | 33e9e9b | 2018-04-12 17:29:59 +0200 | [diff] [blame] | 17 | block-obj-y += block.o blockjob.o job.o |
Paolo Bonzini | e5b5728 | 2017-08-22 07:08:27 +0200 | [diff] [blame] | 18 | block-obj-y += block/ scsi/ |
Kevin Wolf | 587da2c | 2013-06-05 14:19:41 +0200 | [diff] [blame] | 19 | block-obj-y += qemu-io-cmds.o |
Changlong Xie | 190b9a8 | 2016-07-27 15:01:49 +0800 | [diff] [blame] | 20 | block-obj-$(CONFIG_REPLICATION) += replication.o |
Andreas Färber | 0e8c921 | 2010-01-06 20:24:05 +0100 | [diff] [blame] | 21 | |
Fam Zheng | cc47569 | 2014-02-10 14:48:59 +0800 | [diff] [blame] | 22 | block-obj-m = block/ |
| 23 | |
Daniel P. Berrange | fb37726 | 2015-09-02 10:57:27 +0100 | [diff] [blame] | 24 | ####################################################################### |
| 25 | # crypto-obj-y is code used by both qemu system emulation and qemu-img |
| 26 | |
| 27 | crypto-obj-y = crypto/ |
Gautham R Shenoy | 74db920 | 2010-04-29 17:44:43 +0530 | [diff] [blame] | 28 | |
Daniel P. Berrange | 0c7012e | 2015-09-02 11:18:16 +0100 | [diff] [blame] | 29 | ####################################################################### |
| 30 | # qom-obj-y is code used by both qemu system emulation and qemu-img |
| 31 | |
| 32 | qom-obj-y = qom/ |
| 33 | |
Daniel P. Berrange | 666a3af | 2015-02-27 16:19:33 +0000 | [diff] [blame] | 34 | ####################################################################### |
| 35 | # io-obj-y is code used by both qemu system emulation and qemu-img |
| 36 | |
| 37 | io-obj-y = io/ |
| 38 | |
Andreas Färber | 0e8c921 | 2010-01-06 20:24:05 +0100 | [diff] [blame] | 39 | ###################################################################### |
Chen Wei-Ren | 050d994 | 2011-11-15 20:47:11 +0800 | [diff] [blame] | 40 | # Target independent part of system emulation. The long term path is to |
| 41 | # suppress *all* target specific code in case of system emulation, i.e. a |
| 42 | # single QEMU executable should support all CPUs and machines. |
Andreas Färber | 0e8c921 | 2010-01-06 20:24:05 +0100 | [diff] [blame] | 43 | |
Paolo Bonzini | 0008234 | 2013-01-19 11:06:47 +0100 | [diff] [blame] | 44 | ifeq ($(CONFIG_SOFTMMU),y) |
Fam Zheng | ba1183d | 2014-02-10 14:48:52 +0800 | [diff] [blame] | 45 | common-obj-y = blockdev.o blockdev-nbd.o block/ |
Thomas Huth | 5ddc648 | 2017-06-26 07:22:57 +0200 | [diff] [blame] | 46 | common-obj-y += bootdevice.o iothread.o |
Markus Armbruster | 2608b3d | 2019-06-19 22:10:50 +0200 | [diff] [blame] | 47 | common-obj-y += dump/ |
Kevin Wolf | 1a90bc8 | 2018-05-03 19:01:14 +0200 | [diff] [blame] | 48 | common-obj-y += job-qmp.o |
Kevin Wolf | 7e3c0de | 2019-06-13 17:34:00 +0200 | [diff] [blame] | 49 | common-obj-y += monitor/ |
Paolo Bonzini | fd9400b | 2012-10-24 11:27:28 +0200 | [diff] [blame] | 50 | common-obj-y += net/ |
Paolo Bonzini | 1559e0d | 2013-02-04 17:20:47 +0100 | [diff] [blame] | 51 | common-obj-y += qdev-monitor.o device-hotplug.o |
Blue Swirl | b0cb640a | 2010-06-12 05:49:30 +0000 | [diff] [blame] | 52 | common-obj-$(CONFIG_WIN32) += os-win32.o |
| 53 | common-obj-$(CONFIG_POSIX) += os-posix.o |
Gerd Hoffmann | 254e595 | 2010-05-21 11:54:32 +0200 | [diff] [blame] | 54 | |
Paolo Bonzini | ee20477 | 2012-05-22 13:46:08 +0200 | [diff] [blame] | 55 | common-obj-$(CONFIG_LINUX) += fsdev/ |
Paolo Bonzini | ee20477 | 2012-05-22 13:46:08 +0200 | [diff] [blame] | 56 | |
Paolo Bonzini | 03a7a19 | 2019-11-14 12:06:52 +0100 | [diff] [blame] | 57 | common-obj-y += accel/ |
Dr. David Alan Gilbert | 60fe637 | 2014-12-12 11:13:38 +0000 | [diff] [blame] | 58 | common-obj-y += migration/ |
Andreas Färber | 0e8c921 | 2010-01-06 20:24:05 +0100 | [diff] [blame] | 59 | |
Paolo Bonzini | b0b68fc | 2012-05-22 13:49:02 +0200 | [diff] [blame] | 60 | common-obj-y += audio/ |
Gerd Hoffmann | 08a05b3 | 2018-03-06 08:40:49 +0100 | [diff] [blame] | 61 | common-obj-m += audio/ |
Paolo Bonzini | 3d5a3f9 | 2012-05-29 11:08:47 +0200 | [diff] [blame] | 62 | common-obj-y += hw/ |
Paolo Bonzini | 6f99198 | 2012-12-17 18:17:08 +0100 | [diff] [blame] | 63 | |
Pavel Dovgalyuk | d73abd6 | 2015-09-17 19:23:37 +0300 | [diff] [blame] | 64 | common-obj-y += replay/ |
| 65 | |
Paolo Bonzini | 8867aef | 2012-05-22 13:48:15 +0200 | [diff] [blame] | 66 | common-obj-y += ui/ |
Gerd Hoffmann | 61b4d9a | 2018-03-01 11:05:41 +0100 | [diff] [blame] | 67 | common-obj-m += ui/ |
Corentin Chary | 3e230dd | 2010-07-07 20:57:52 +0200 | [diff] [blame] | 68 | |
Stefan Weil | c9159fe | 2012-10-05 19:39:33 +0200 | [diff] [blame] | 69 | common-obj-y += dma-helpers.o |
Stefan Weil | c9159fe | 2012-10-05 19:39:33 +0200 | [diff] [blame] | 70 | common-obj-y += vl.o |
Michael Tokarev | 849d828 | 2014-05-02 15:40:53 +0400 | [diff] [blame] | 71 | vl.o-cflags := $(GPROF_CFLAGS) $(SDL_CFLAGS) |
Philippe Mathieu-Daudé | c39f95d | 2017-10-24 09:20:43 -0300 | [diff] [blame] | 72 | common-obj-$(CONFIG_TPM) += tpm.o |
Andreas Färber | 0e8c921 | 2010-01-06 20:24:05 +0100 | [diff] [blame] | 73 | |
Anthony Liguori | a9b7b2a | 2012-06-25 10:03:47 -0500 | [diff] [blame] | 74 | common-obj-y += backends/ |
Marc-André Lureau | 6b10e57 | 2017-05-29 12:39:42 +0400 | [diff] [blame] | 75 | common-obj-y += chardev/ |
Anthony Liguori | a9b7b2a | 2012-06-25 10:03:47 -0500 | [diff] [blame] | 76 | |
Paolo Bonzini | 737f351 | 2013-01-19 11:06:46 +0100 | [diff] [blame] | 77 | common-obj-$(CONFIG_SECCOMP) += qemu-seccomp.o |
Fam Zheng | c3883e1 | 2017-09-07 16:53:16 +0800 | [diff] [blame] | 78 | qemu-seccomp.o-cflags := $(SECCOMP_CFLAGS) |
| 79 | qemu-seccomp.o-libs := $(SECCOMP_LIBS) |
Eduardo Otubo | f794573 | 2012-08-14 18:44:05 -0300 | [diff] [blame] | 80 | |
Peter Crosthwaite | 7df057b | 2015-05-24 13:20:14 -0700 | [diff] [blame] | 81 | common-obj-$(CONFIG_FDT) += device_tree.o |
| 82 | |
Michael Roth | 2345c77 | 2011-07-19 14:50:32 -0500 | [diff] [blame] | 83 | ###################################################################### |
| 84 | # qapi |
| 85 | |
Markus Armbruster | 88554a2 | 2019-02-14 16:22:40 +0100 | [diff] [blame] | 86 | common-obj-y += qapi/ |
Paolo Bonzini | 0008234 | 2013-01-19 11:06:47 +0100 | [diff] [blame] | 87 | endif |
Anthony Liguori | e319360 | 2011-09-02 12:34:47 -0500 | [diff] [blame] | 88 | |
Paolo Bonzini | 9444e9e | 2012-12-20 15:24:49 +0100 | [diff] [blame] | 89 | ####################################################################### |
| 90 | # Target-independent parts used in system and user emulation |
Richard Henderson | c482cb1 | 2016-06-28 11:37:27 -0700 | [diff] [blame] | 91 | common-obj-y += cpus-common.o |
Paolo Bonzini | 0008234 | 2013-01-19 11:06:47 +0100 | [diff] [blame] | 92 | common-obj-y += hw/ |
| 93 | common-obj-y += qom/ |
| 94 | common-obj-y += disas/ |
Andreas Färber | ce008c1 | 2012-03-04 21:32:36 +0100 | [diff] [blame] | 95 | |
Michael Roth | 957f1f9 | 2011-08-11 15:38:12 -0500 | [diff] [blame] | 96 | ###################################################################### |
Stefan Weil | 0b516ef | 2013-08-08 20:18:07 +0200 | [diff] [blame] | 97 | # Resource file for Windows executables |
| 98 | version-obj-$(CONFIG_WIN32) += $(BUILD_DIR)/version.o |
Stefan Weil | 0b516ef | 2013-08-08 20:18:07 +0200 | [diff] [blame] | 99 | |
| 100 | ###################################################################### |
Lluís Vilanova | 341ea69 | 2014-05-30 14:11:56 +0200 | [diff] [blame] | 101 | # tracing |
| 102 | util-obj-y += trace/ |
Lluís Vilanova | 341ea69 | 2014-05-30 14:11:56 +0200 | [diff] [blame] | 103 | |
| 104 | ###################################################################### |
Michael Roth | 957f1f9 | 2011-08-11 15:38:12 -0500 | [diff] [blame] | 105 | # guest agent |
| 106 | |
Markus Armbruster | eb815e2 | 2018-02-11 10:36:05 +0100 | [diff] [blame] | 107 | # FIXME: a few definitions from qapi/qapi-types.o and |
| 108 | # qapi/qapi-visit.o are needed by libqemuutil.a. These should be |
| 109 | # extracted into a QAPI schema module, or perhaps a separate schema. |
Fam Zheng | 169a24a | 2014-08-07 10:34:41 +0800 | [diff] [blame] | 110 | qga-obj-y = qga/ |
Tomoki Sekiyama | b39297a | 2013-08-07 11:40:18 -0400 | [diff] [blame] | 111 | qga-vss-dll-obj-y = qga/ |
David Marchand | a75eb03 | 2014-09-08 11:17:48 +0200 | [diff] [blame] | 112 | |
| 113 | ###################################################################### |
| 114 | # contrib |
Viktor Prutyanov | 3fa2d38 | 2018-08-29 15:41:25 +0300 | [diff] [blame] | 115 | elf2dmp-obj-y = contrib/elf2dmp/ |
Kamil Rytarowski | b1449ed | 2017-07-14 09:33:45 +0100 | [diff] [blame] | 116 | ivshmem-client-obj-$(CONFIG_IVSHMEM) = contrib/ivshmem-client/ |
| 117 | ivshmem-server-obj-$(CONFIG_IVSHMEM) = contrib/ivshmem-server/ |
Marc-André Lureau | 7b2e5c6 | 2016-10-18 12:24:04 +0300 | [diff] [blame] | 118 | libvhost-user-obj-y = contrib/libvhost-user/ |
Felipe Franciosi | 49cc034 | 2017-03-02 10:25:53 -0800 | [diff] [blame] | 119 | vhost-user-scsi.o-cflags := $(LIBISCSI_CFLAGS) |
| 120 | vhost-user-scsi.o-libs := $(LIBISCSI_LIBS) |
| 121 | vhost-user-scsi-obj-y = contrib/vhost-user-scsi/ |
Changpeng Liu | 406d2aa | 2018-01-04 09:53:34 +0800 | [diff] [blame] | 122 | vhost-user-blk-obj-y = contrib/vhost-user-blk/ |
Yuval Shaia | a5d2f6f | 2018-12-21 16:40:15 +0200 | [diff] [blame] | 123 | rdmacm-mux-obj-y = contrib/rdmacm-mux/ |
Marc-André Lureau | 06914c9 | 2019-05-14 12:41:26 +0200 | [diff] [blame] | 124 | vhost-user-input-obj-y = contrib/vhost-user-input/ |
Marc-André Lureau | d52c454 | 2019-05-24 15:09:42 +0200 | [diff] [blame] | 125 | vhost-user-gpu-obj-y = contrib/vhost-user-gpu/ |
Daniel P. Berrange | 1412cf5 | 2016-06-16 09:39:47 +0100 | [diff] [blame] | 126 | |
| 127 | ###################################################################### |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 128 | trace-events-subdirs = |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 129 | trace-events-subdirs += accel/kvm |
| 130 | trace-events-subdirs += accel/tcg |
Laurent Vivier | 29de280 | 2019-04-01 16:12:22 +0200 | [diff] [blame] | 131 | trace-events-subdirs += crypto |
Kevin Wolf | e84328f | 2019-06-13 17:33:57 +0200 | [diff] [blame] | 132 | trace-events-subdirs += monitor |
Laurent Vivier | 29de280 | 2019-04-01 16:12:22 +0200 | [diff] [blame] | 133 | ifeq ($(CONFIG_USER_ONLY),y) |
| 134 | trace-events-subdirs += linux-user |
| 135 | endif |
| 136 | ifeq ($(CONFIG_BLOCK),y) |
Daniel P. Berrange | 5b76dd1 | 2015-10-21 13:16:21 +0100 | [diff] [blame] | 137 | trace-events-subdirs += authz |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 138 | trace-events-subdirs += block |
Laurent Vivier | 29de280 | 2019-04-01 16:12:22 +0200 | [diff] [blame] | 139 | trace-events-subdirs += io |
| 140 | trace-events-subdirs += nbd |
| 141 | trace-events-subdirs += scsi |
| 142 | endif |
Laurent Vivier | 5b4a969 | 2019-04-01 16:12:18 +0200 | [diff] [blame] | 143 | ifeq ($(CONFIG_SOFTMMU),y) |
Laurent Vivier | 8d5d515 | 2019-04-01 16:12:21 +0200 | [diff] [blame] | 144 | trace-events-subdirs += chardev |
Laurent Vivier | 5b4a969 | 2019-04-01 16:12:18 +0200 | [diff] [blame] | 145 | trace-events-subdirs += audio |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 146 | trace-events-subdirs += hw/9pfs |
| 147 | trace-events-subdirs += hw/acpi |
| 148 | trace-events-subdirs += hw/alpha |
| 149 | trace-events-subdirs += hw/arm |
| 150 | trace-events-subdirs += hw/audio |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 151 | trace-events-subdirs += hw/block |
| 152 | trace-events-subdirs += hw/block/dataplane |
| 153 | trace-events-subdirs += hw/char |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 154 | trace-events-subdirs += hw/dma |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 155 | trace-events-subdirs += hw/hppa |
Philippe Mathieu-Daudé | 08bb9b3 | 2018-06-08 13:15:33 +0100 | [diff] [blame] | 156 | trace-events-subdirs += hw/i2c |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 157 | trace-events-subdirs += hw/i386 |
| 158 | trace-events-subdirs += hw/i386/xen |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 159 | trace-events-subdirs += hw/ide |
| 160 | trace-events-subdirs += hw/input |
| 161 | trace-events-subdirs += hw/intc |
| 162 | trace-events-subdirs += hw/isa |
| 163 | trace-events-subdirs += hw/mem |
Philippe Mathieu-Daudé | ab6bff4 | 2019-06-25 00:28:40 +0200 | [diff] [blame] | 164 | trace-events-subdirs += hw/mips |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 165 | trace-events-subdirs += hw/misc |
| 166 | trace-events-subdirs += hw/misc/macio |
| 167 | trace-events-subdirs += hw/net |
| 168 | trace-events-subdirs += hw/nvram |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 169 | trace-events-subdirs += hw/pci |
Mark Cave-Ayland | bfec08b | 2018-01-21 08:59:45 +0000 | [diff] [blame] | 170 | trace-events-subdirs += hw/pci-host |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 171 | trace-events-subdirs += hw/ppc |
| 172 | trace-events-subdirs += hw/rdma |
| 173 | trace-events-subdirs += hw/rdma/vmw |
Philippe Mathieu-Daudé | 877c181 | 2019-10-04 01:03:52 +0200 | [diff] [blame] | 174 | trace-events-subdirs += hw/rtc |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 175 | trace-events-subdirs += hw/s390x |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 176 | trace-events-subdirs += hw/scsi |
| 177 | trace-events-subdirs += hw/sd |
| 178 | trace-events-subdirs += hw/sparc |
| 179 | trace-events-subdirs += hw/sparc64 |
| 180 | trace-events-subdirs += hw/timer |
Stefan Berger | ec42749 | 2018-03-02 20:18:41 -0500 | [diff] [blame] | 181 | trace-events-subdirs += hw/tpm |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 182 | trace-events-subdirs += hw/usb |
| 183 | trace-events-subdirs += hw/vfio |
| 184 | trace-events-subdirs += hw/virtio |
Peter Maydell | 050c2ea | 2018-08-20 11:24:33 +0100 | [diff] [blame] | 185 | trace-events-subdirs += hw/watchdog |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 186 | trace-events-subdirs += hw/xen |
Steffen Görtz | 805f61b | 2019-01-07 15:23:47 +0000 | [diff] [blame] | 187 | trace-events-subdirs += hw/gpio |
Fabien Chouteau | 30efbf3 | 2019-02-12 18:38:39 +0100 | [diff] [blame] | 188 | trace-events-subdirs += hw/riscv |
Laurent Vivier | 5b4a969 | 2019-04-01 16:12:18 +0200 | [diff] [blame] | 189 | trace-events-subdirs += migration |
| 190 | trace-events-subdirs += net |
| 191 | trace-events-subdirs += ui |
| 192 | endif |
| 193 | trace-events-subdirs += hw/display |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 194 | trace-events-subdirs += qapi |
| 195 | trace-events-subdirs += qom |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 196 | trace-events-subdirs += target/arm |
Sven Schnelle | 23c3d56 | 2019-03-11 20:15:55 +0100 | [diff] [blame] | 197 | trace-events-subdirs += target/hppa |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 198 | trace-events-subdirs += target/i386 |
Philippe Mathieu-Daudé | b44a7fb | 2017-03-04 15:56:52 -0300 | [diff] [blame] | 199 | trace-events-subdirs += target/mips |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 200 | trace-events-subdirs += target/ppc |
Michael Clark | 929f0a7 | 2019-03-16 01:21:12 +0000 | [diff] [blame] | 201 | trace-events-subdirs += target/riscv |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 202 | trace-events-subdirs += target/s390x |
| 203 | trace-events-subdirs += target/sparc |
Philippe Mathieu-Daudé | eb7ccb3 | 2018-05-28 02:40:55 -0300 | [diff] [blame] | 204 | trace-events-subdirs += util |
Alexey Kardashevskiy | 26b8e6d | 2019-06-13 15:09:37 +1000 | [diff] [blame] | 205 | trace-events-subdirs += hw/core |
Daniel P. Berrange | 0ab8ed1 | 2017-01-25 16:14:15 +0000 | [diff] [blame] | 206 | |
| 207 | trace-events-files = $(SRC_PATH)/trace-events $(trace-events-subdirs:%=$(SRC_PATH)/%/trace-events) |
| 208 | |
| 209 | trace-obj-y = trace-root.o |
| 210 | trace-obj-y += $(trace-events-subdirs:%=%/trace.o) |
| 211 | trace-obj-$(CONFIG_TRACE_UST) += trace-ust-all.o |
| 212 | trace-obj-$(CONFIG_TRACE_DTRACE) += trace-dtrace-root.o |
| 213 | trace-obj-$(CONFIG_TRACE_DTRACE) += $(trace-events-subdirs:%=%/trace-dtrace.o) |