Home | History | Annotate | Download | only in qemu
      1 # When building this project, we actually generate several components which
      2 # are the following:
      3 #
      4 #  - the emulator-ui program (which is target-agnostic)
      5 #  - the target-specific qemu-android-$ARCH programs (headless emulation engines)
      6 #  - the "standalone" emulator programs (embed both UI and engine in a single
      7 #    binary and process), i.e. "emulator" for ARM and "emulator-x86" for x86.
      8 #
      9 # This file defines static host libraries that will be used by at least two
     10 # of these components.
     11 #
     12 
     13 ##############################################################################
     14 ##############################################################################
     15 ###
     16 ###  gen-hw-config-defs: Generate hardware configuration definitions header
     17 ###
     18 ###  The 'gen-hw-config.py' script is used to generate the hw-config-defs.h
     19 ###  header from the an .ini file like android/avd/hardware-properties.ini
     20 ###
     21 ###  Due to the way the Android build system works, we need to regenerate
     22 ###  it for each module (the output will go into a module-specific directory).
     23 ###
     24 ###  This defines a function that can be used inside a module definition
     25 ###
     26 ###  $(call gen-hw-config-defs)
     27 ###
     28 
     29 # First, define a rule to generate a dummy "emulator_hw_config_defs" module
     30 # which purpose is simply to host the generated header in its output directory.
     31 intermediates := $(call intermediates-dir-for,SHARED_LIBRARIES,emulator_hw_config_defs,true)
     32 
     33 QEMU_HARDWARE_PROPERTIES_INI := $(LOCAL_PATH)/android/avd/hardware-properties.ini
     34 QEMU_HW_CONFIG_DEFS_H := $(intermediates)/android/avd/hw-config-defs.h
     35 $(QEMU_HW_CONFIG_DEFS_H): PRIVATE_PATH := $(LOCAL_PATH)
     36 $(QEMU_HW_CONFIG_DEFS_H): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/android/tools/gen-hw-config.py $< $@
     37 $(QEMU_HW_CONFIG_DEFS_H): $(QEMU_HARDWARE_PROPERTIES_INI) $(LOCAL_PATH)/android/tools/gen-hw-config.py
     38 	$(hide) rm -f $@
     39 	$(transform-generated-source)
     40 
     41 QEMU_HW_CONFIG_DEFS_INCLUDES := $(intermediates)
     42 
     43 # Second, define a function that needs to be called inside each module that contains
     44 # a source file that includes the generated header file.
     45 gen-hw-config-defs = \
     46   $(eval LOCAL_GENERATED_SOURCES += $(QEMU_HW_CONFIG_DEFS_H))\
     47   $(eval LOCAL_C_INCLUDES += $(QEMU_HW_CONFIG_DEFS_INCLUDES))
     48 
     49 ##############################################################################
     50 ##############################################################################
     51 ###
     52 ###  emulator-common: LIBRARY OF COMMON FUNCTIONS
     53 ###
     54 ###  THESE ARE POTENTIALLY USED BY ALL COMPONENTS
     55 ###
     56 
     57 $(call start-emulator-library, emulator-common)
     58 
     59 EMULATOR_COMMON_CFLAGS :=
     60 
     61 # Needed by everything about the host
     62 EMULATOR_COMMON_CFLAGS += \
     63     -I$(LOCAL_PATH)/android/config/$(QEMU_HOST_TAG)
     64 
     65 # add the build ID to the default macro definitions
     66 ifeq ($(BUILD_STANDALONE_EMULATOR),)
     67 EMULATOR_COMMON_CFLAGS += -DANDROID_BUILD_ID="$(strip $(BUILD_ID))-$(strip $(BUILD_NUMBER))"
     68 endif
     69 
     70 # For non-standalone builds, extract the major version number from the Android SDK
     71 # tools revision number.
     72 ifneq ($(BUILD_STANDALONE_EMULATOR),true)
     73     ANDROID_SDK_TOOLS_REVISION := $(shell awk -F= '/Pkg.Revision/ { print $$2; }' sdk/files/tools_source.properties)
     74 endif
     75 
     76 ANDROID_SDK_TOOLS_REVISION := $(strip $(ANDROID_SDK_TOOLS_REVISION))
     77 ifdef ANDROID_SDK_TOOLS_REVISION
     78     EMULATOR_COMMON_CFLAGS += -DANDROID_SDK_TOOLS_REVISION=$(ANDROID_SDK_TOOLS_REVISION)
     79 endif
     80 
     81 # Enable large-file support (i.e. make off_t a 64-bit value)
     82 ifeq ($(HOST_OS),linux)
     83 EMULATOR_COMMON_CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
     84 endif
     85 
     86 ###########################################################
     87 # Zlib sources
     88 #
     89 ZLIB_DIR := distrib/zlib-1.2.3
     90 include $(LOCAL_PATH)/$(ZLIB_DIR)/sources.make
     91 EMULATOR_COMMON_CFLAGS += -I$(LOCAL_PATH)/$(ZLIB_DIR)
     92 
     93 LOCAL_SRC_FILES += $(ZLIB_SOURCES)
     94 
     95 ###########################################################
     96 # Android utility functions
     97 #
     98 LOCAL_SRC_FILES += \
     99 	sockets.c \
    100 	iolooper-select.c \
    101 	android/async-console.c \
    102 	android/async-utils.c \
    103 	android/charmap.c \
    104 	android/framebuffer.c \
    105 	android/keycode-array.c \
    106 	android/avd/hw-config.c \
    107 	android/avd/info.c \
    108 	android/avd/util.c \
    109 	android/sync-utils.c \
    110 	android/utils/assert.c \
    111 	android/utils/bufprint.c \
    112 	android/utils/debug.c \
    113 	android/utils/dll.c \
    114 	android/utils/dirscanner.c \
    115 	android/utils/filelock.c \
    116 	android/utils/ini.c \
    117 	android/utils/intmap.c \
    118 	android/utils/lineinput.c \
    119 	android/utils/mapfile.c \
    120 	android/utils/misc.c \
    121 	android/utils/panic.c \
    122 	android/utils/path.c \
    123 	android/utils/reflist.c \
    124 	android/utils/refset.c \
    125 	android/utils/stralloc.c \
    126 	android/utils/system.c \
    127 	android/utils/tempfile.c \
    128 	android/utils/vector.c \
    129 
    130 $(call gen-hw-config-defs)
    131 
    132 LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS)
    133 
    134 $(call end-emulator-library)
    135 
    136 ##############################################################################
    137 ##############################################################################
    138 ###
    139 ###  emulator-libui: LIBRARY OF UI-RELATED FUNCTIONS
    140 ###
    141 ###  THESE ARE USED BY 'emulator-ui' AND THE STANDALONE PROGRAMS
    142 ###
    143 
    144 $(call start-emulator-library, emulator-libui)
    145 
    146 EMULATOR_LIBUI_CFLAGS :=
    147 
    148 LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS)
    149 
    150 ###########################################################
    151 # Libpng configuration
    152 #
    153 LIBPNG_DIR := distrib/libpng-1.2.19
    154 include $(LOCAL_PATH)/$(LIBPNG_DIR)/sources.make
    155 
    156 EMULATOR_LIBUI_CFLAGS += \
    157     $(LIBPNG_CFLAGS) \
    158     -I$(LOCAL_PATH)/$(LIBPNG_DIR)
    159 
    160 LOCAL_SRC_FILES += $(LIBPNG_SOURCES) loadpng.c
    161 
    162 ##############################################################################
    163 # SDL-related definitions
    164 #
    165 
    166 # Build SDL from sources except in certain cases where we use
    167 # prebuilt libraries instead.
    168 #
    169 BUILD_SDL_FROM_SOURCES := true
    170 
    171 # On linux-x86, using the prebuilts avoid installing all the X11
    172 # development packages on our build servers.
    173 #
    174 ifeq ($(QEMU_HOST_TAG),linux-x86)
    175     BUILD_SDL_FROM_SOURCES := false
    176 endif
    177 
    178 # On darwin-x86, a bug in the Android build system prevents the compilation
    179 # of Objective-C sources. Fixed recently in AOSP, but we still use the
    180 # prebuilts for the benefit of older platform branches.
    181 #
    182 ifeq ($(QEMU_HOST_TAG),darwin-x86)
    183     BUILD_SDL_FROM_SOURCES := false
    184 endif
    185 
    186 # If we're building with android-configure.sh && make, always build from
    187 # sources to catch regressions as soon as they happen.
    188 #
    189 ifeq ($(BUILD_STANDALONE_EMULATOR),true)
    190     BUILD_SDL_FROM_SOURCES := true
    191 endif
    192 
    193 # Except if we used android-configure.sh --sdl-config=<script>
    194 #
    195 ifneq ($(QEMU_SDL_CONFIG),)
    196    BUILD_SDL_FROM_SOURCES := false
    197    SDL_CONFIG := $(QEMU_SDL_CONFIG)
    198 endif
    199 
    200 ifneq ($(BUILD_SDL_FROM_SOURCES),true)
    201 
    202     SDL_CONFIG ?= prebuilt/$(QEMU_HOST_TAG)/sdl/bin/sdl-config
    203     SDL_CFLAGS := $(shell $(SDL_CONFIG) --cflags)
    204 
    205     # We need to filter out the _GNU_SOURCE variable because it breaks recent
    206     # releases of Cygwin when using the -mno-cygwin option. Moreover, we don't
    207     # need this macro at all to build the Android emulator.
    208     SDL_CFLAGS := $(filter-out -D_GNU_SOURCE=1,$(SDL_CFLAGS))
    209     SDL_LDLIBS := $(filter-out %.a %.lib,$(shell $(SDL_CONFIG) --static-libs))
    210 
    211     # Circular dependencies between libSDL and libSDLmain
    212     # We repeat the libraries in the final link to work around it
    213     SDL_STATIC_LIBRARIES := libSDL libSDLmain libSDL libSDLmain
    214 
    215 else # BUILD_SDL_FROM_SOURCES
    216 
    217     SDL_DIR := distrib/sdl-1.2.12
    218     include $(LOCAL_PATH)/$(SDL_DIR)/sources.make
    219     LOCAL_SRC_FILES += $(SDL_SOURCES)
    220 
    221     EMULATOR_LIBUI_CFLAGS += \
    222         -I$(LOCAL_PATH)/$(SDL_DIR)/include
    223 
    224     SDL_STATIC_LIBRARIES :=
    225 
    226 endif # BUILD_SDL_FROM_SOURCES
    227 
    228 EMULATOR_LIBUI_CFLAGS += $(SDL_CFLAGS)
    229 EMULATOR_LIBUI_LDLIBS += $(SDL_LDLIBS)
    230 
    231 # The following is needed by SDL_LoadObject
    232 ifneq ($(HOST_OS),windows)
    233     EMULATOR_LIBUI_LDLIBS += -ldl
    234 endif
    235 
    236 # the skin support sources
    237 #
    238 SKIN_SOURCES := rect.c \
    239                 region.c \
    240                 image.c \
    241                 trackball.c \
    242                 keyboard.c \
    243                 keyset.c \
    244                 file.c \
    245                 window.c \
    246                 scaler.c \
    247                 composer.c \
    248                 surface.c \
    249 
    250 LOCAL_SRC_FILES += $(SKIN_SOURCES:%=android/skin/%)
    251 
    252 LOCAL_SRC_FILES += \
    253              android/user-config.c \
    254              android/resource.c \
    255              android/qemulator.c \
    256              android/keycode.c \
    257 
    258 $(call gen-hw-config-defs)
    259 
    260 # enable MMX code for our skin scaler
    261 ifeq ($(HOST_ARCH),x86)
    262 LOCAL_CFLAGS += -DUSE_MMX=1 -mmmx
    263 endif
    264 
    265 LOCAL_CFLAGS += $(EMULATOR_LIBUI_CFLAGS)
    266 
    267 $(call end-emulator-library)
    268 
    269 ##############################################################################
    270 ##############################################################################
    271 ###
    272 ###  emulator-libqemu: TARGET-INDEPENDENT QEMU FUNCTIONS
    273 ###
    274 ###  THESE ARE USED BY EVERYTHING EXCEPT 'emulator-ui'
    275 ###
    276 
    277 $(call start-emulator-library, emulator-libqemu)
    278 
    279 EMULATOR_LIBQEMU_CFLAGS :=
    280 
    281 LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS)
    282 
    283 AUDIO_SOURCES := noaudio.c wavaudio.c wavcapture.c mixeng.c
    284 AUDIO_CFLAGS  := -I$(LOCAL_PATH)/audio -DHAS_AUDIO
    285 AUDIO_LDLIBS  :=
    286 
    287 LOCAL_CFLAGS += -Wall -Wno-missing-field-initializers
    288 
    289 ifeq ($(HOST_OS),darwin)
    290   CONFIG_COREAUDIO ?= yes
    291   AUDIO_CFLAGS += -DHOST_BSD=1
    292 endif
    293 
    294 ifeq ($(HOST_OS),windows)
    295   CONFIG_WINAUDIO ?= yes
    296 endif
    297 
    298 ifeq ($(HOST_OS),linux)
    299   CONFIG_OSS  ?= yes
    300   CONFIG_ALSA ?= yes
    301   CONFIG_PULSEAUDIO ?= yes
    302   CONFIG_ESD  ?= yes
    303 endif
    304 
    305 ifeq ($(HOST_OS),freebsd)
    306   CONFIG_OSS ?= yes
    307 endif
    308 
    309 ifeq ($(CONFIG_COREAUDIO),yes)
    310   AUDIO_SOURCES += coreaudio.c
    311   AUDIO_CFLAGS  += -DCONFIG_COREAUDIO
    312   AUDIO_LDLIBS  += -Wl,-framework,CoreAudio
    313 endif
    314 
    315 ifeq ($(CONFIG_WINAUDIO),yes)
    316   AUDIO_SOURCES += winaudio.c
    317   AUDIO_CFLAGS  += -DCONFIG_WINAUDIO
    318 endif
    319 
    320 ifeq ($(CONFIG_PULSEAUDIO),yes)
    321   AUDIO_SOURCES += paaudio.c audio_pt_int.c
    322   AUDIO_CFLAGS  += -DCONFIG_PULSEAUDIO
    323 endif
    324 
    325 ifeq ($(CONFIG_ALSA),yes)
    326   AUDIO_SOURCES += alsaaudio.c audio_pt_int.c
    327   AUDIO_CFLAGS  += -DCONFIG_ALSA
    328 endif
    329 
    330 ifeq ($(CONFIG_ESD),yes)
    331   AUDIO_SOURCES += esdaudio.c
    332   AUDIO_CFLAGS  += -DCONFIG_ESD
    333 endif
    334 
    335 ifeq ($(CONFIG_OSS),yes)
    336   AUDIO_SOURCES += ossaudio.c
    337   AUDIO_CFLAGS  += -DCONFIG_OSS
    338 endif
    339 
    340 AUDIO_SOURCES := $(call sort,$(AUDIO_SOURCES:%=audio/%))
    341 
    342 LOCAL_CFLAGS += -Wno-sign-compare \
    343                 -fno-strict-aliasing -W -Wall -Wno-unused-parameter \
    344 
    345 # this is very important, otherwise the generated binaries may
    346 # not link properly on our build servers
    347 ifeq ($(HOST_OS),linux)
    348 LOCAL_CFLAGS += -fno-stack-protector
    349 endif
    350 
    351 LOCAL_SRC_FILES += $(AUDIO_SOURCES)
    352 LOCAL_SRC_FILES += \
    353     android/audio-test.c
    354 
    355 # other flags
    356 ifneq ($(HOST_OS),windows)
    357     AUDIO_LDLIBS += -ldl
    358 else
    359 endif
    360 
    361 
    362 EMULATOR_LIBQEMU_CFLAGS += $(AUDIO_CFLAGS)
    363 EMULATOR_LIBQEMU_LDLIBS += $(AUDIO_LDLIBS)
    364 
    365 LOCAL_CFLAGS += -Wno-missing-field-initializers
    366 
    367 # migration sources
    368 #
    369 ifeq ($(HOST_OS),windows)
    370   LOCAL_SRC_FILES += migration-dummy-android.c
    371 else
    372   LOCAL_SRC_FILES += migration.c \
    373                      migration-exec.c \
    374                      migration-tcp-android.c
    375 endif
    376 
    377 # misc. sources
    378 #
    379 CORE_MISC_SOURCES = \
    380     acl.c \
    381     aes.c \
    382     aio-android.c \
    383     async.c \
    384     bt-host.c \
    385     bt-vhci.c \
    386     buffered_file.c \
    387     cbuffer.c \
    388     charpipe.c \
    389     console.c \
    390     cutils.c \
    391     d3des.c \
    392     input.c \
    393     iohandler.c \
    394     ioport.c \
    395     module.c \
    396     net-android.c \
    397     notify.c \
    398     osdep.c \
    399     path.c \
    400     qemu-char.c \
    401     qemu-config.c \
    402     qemu-error.c \
    403     qemu-malloc.c \
    404     qemu-option.c \
    405     qemu-sockets-android.c \
    406     qerror.c \
    407     readline.c \
    408     savevm.c \
    409     shaper.c \
    410     tcpdump.c \
    411     vnc-android.c \
    412     android/boot-properties.c \
    413     android/config.c \
    414     android/core-init-utils.c   \
    415     android/gps.c \
    416     android/hw-kmsg.c \
    417     android/hw-lcd.c \
    418     android/hw-events.c \
    419     android/hw-control.c \
    420     android/hw-sensors.c \
    421     android/hw-qemud.c \
    422     android/looper-qemu.c \
    423     android/hw-pipe-net.c \
    424     android/qemu-setup.c \
    425     android/snapshot.c \
    426     android/utils/timezone.c \
    427     android/camera/camera-format-converters.c \
    428     android/camera/camera-service.c \
    429     android/adb-server.c \
    430     android/adb-qemud.c
    431 
    432 $(call gen-hw-config-defs)
    433 
    434 ifeq ($(HOST_ARCH),x86)
    435     CORE_MISC_SOURCES += i386-dis.c
    436 endif
    437 ifeq ($(HOST_ARCH),x86_64)
    438     CORE_MISC_SOURCES += i386-dis.c
    439 endif
    440 ifeq ($(HOST_ARCH),ppc)
    441     CORE_MISC_SOURCES += ppc-dis.c \
    442                          cache-utils.c
    443 endif
    444 
    445 ifeq ($(HOST_OS),linux)
    446     CORE_MISC_SOURCES += usb-linux.c \
    447                          qemu-thread.c \
    448                          android/camera/camera-capture-linux.c
    449 else
    450     CORE_MISC_SOURCES += usb-dummy-android.c
    451 endif
    452 
    453 ifeq ($(HOST_OS),windows)
    454   CORE_MISC_SOURCES   += tap-win32.c \
    455                          android/camera/camera-capture-windows.c
    456 
    457 else
    458   CORE_MISC_SOURCES   += posix-aio-compat.c
    459 endif
    460 
    461 ifeq ($(HOST_OS),darwin)
    462   CORE_MISC_SOURCES   += android/camera/camera-capture-mac.m
    463 endif
    464 
    465 LOCAL_SRC_FILES += $(CORE_MISC_SOURCES)
    466 
    467 # Required
    468 LOCAL_CFLAGS += -D_XOPEN_SOURCE=600 -D_BSD_SOURCE=1
    469 
    470 SLIRP_SOURCES := \
    471     bootp.c \
    472     cksum.c \
    473     debug.c \
    474     if.c \
    475     ip_icmp.c \
    476     ip_input.c \
    477     ip_output.c \
    478     mbuf.c \
    479     misc.c \
    480     sbuf.c \
    481     slirp.c \
    482     socket.c \
    483     tcp_input.c \
    484     tcp_output.c \
    485     tcp_subr.c \
    486     tcp_timer.c \
    487     tftp.c \
    488     udp.c
    489 
    490 LOCAL_SRC_FILES += $(SLIRP_SOURCES:%=slirp-android/%)
    491 EMULATOR_LIBQEMU_CFLAGS += -I$(LOCAL_PATH)/slirp-android
    492 
    493 # socket proxy support
    494 #
    495 PROXY_SOURCES := \
    496     proxy_common.c \
    497     proxy_http.c \
    498     proxy_http_connector.c \
    499     proxy_http_rewriter.c \
    500 
    501 LOCAL_SRC_FILES += $(PROXY_SOURCES:%=proxy/%)
    502 EMULATOR_LIBQEMU_CFLAGS += -I$(LOCAL_PATH)/proxy
    503 
    504 # include telephony stuff
    505 #
    506 TELEPHONY_SOURCES := \
    507     android_modem.c \
    508     modem_driver.c \
    509     gsm.c \
    510     sim_card.c \
    511     sysdeps_qemu.c \
    512     sms.c \
    513     remote_call.c
    514 
    515 LOCAL_SRC_FILES += $(TELEPHONY_SOURCES:%=telephony/%)
    516 EMULATOR_LIBQEMU_CFLAGS += -I$(LOCAL_PATH)/telephony
    517 
    518 # sources inherited from upstream, but not fully
    519 # integrated into android emulator
    520 #
    521 LOCAL_SRC_FILES += \
    522     json-lexer.c \
    523     json-parser.c \
    524     json-streamer.c \
    525     qjson.c \
    526     qbool.c \
    527     qdict.c \
    528     qfloat.c \
    529     qint.c \
    530     qlist.c \
    531     qstring.c \
    532 
    533 # gdbstub-xml.c contains C-compilable arrays corresponding to the content
    534 # of $(LOCAL_PATH)/gdb-xml/, and is generated with the 'feature_to_c.sh' script.
    535 #
    536 intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,$(LOCAL_MODULE),true)
    537 
    538 ifeq ($(QEMU_TARGET_XML_SOURCES),)
    539     QEMU_TARGET_XML_SOURCES := arm-core arm-neon arm-vfp arm-vfp3
    540     QEMU_TARGET_XML_SOURCES := $(QEMU_TARGET_XML_SOURCES:%=$(LOCAL_PATH)/gdb-xml/%.xml)
    541 endif
    542 
    543 QEMU_GDBSTUB_XML_C := $(intermediates)/gdbstub-xml.c
    544 $(QEMU_GDBSTUB_XML_C): PRIVATE_PATH := $(LOCAL_PATH)
    545 $(QEMU_GDBSTUB_XML_C): PRIVATE_SOURCES := $(TARGET_XML_SOURCES)
    546 $(QEMU_GDBSTUB_XML_C): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/feature_to_c.sh $@ $(QEMU_TARGET_XML_SOURCES)
    547 $(QEMU_GDBSTUB_XML_C): $(QEMU_TARGET_XML_SOURCES) $(LOCAL_PATH)/feature_to_c.sh
    548 	$(hide) rm -f $@
    549 	$(transform-generated-source)
    550 
    551 LOCAL_GENERATED_SOURCES += $(QEMU_GDBSTUB_XML_C)
    552 
    553 EMULATOR_LIBQEMU_CFLAGS += -I$(intermediates)
    554 
    555 LOCAL_CFLAGS += $(EMULATOR_LIBQEMU_CFLAGS)
    556 
    557 $(call end-emulator-library)
    558 
    559 # Block sources, we must compile them with each executable because they
    560 # are only referenced by the rest of the code using constructor functions.
    561 # If their object files are put in a static library, these are never compiled
    562 # into the final linked executable that uses them.
    563 #
    564 # Normally, one would solve thus using LOCAL_WHOLE_STATIC_LIBRARIES, but
    565 # the Darwin linker doesn't support -Wl,--whole-archive or equivalent :-(
    566 #
    567 BLOCK_SOURCES += \
    568     block.c \
    569     blockdev.c \
    570     block/qcow.c \
    571     block/qcow2.c \
    572     block/qcow2-refcount.c \
    573     block/qcow2-snapshot.c \
    574     block/qcow2-cluster.c \
    575     block/cloop.c \
    576     block/dmg.c \
    577     block/vvfat.c \
    578     block/raw.c
    579 
    580 ifeq ($(HOST_OS),windows)
    581     BLOCK_SOURCES += block/raw-win32.c
    582 else
    583     BLOCK_SOURCES += block/raw-posix.c
    584 endif
    585 
    586 BLOCK_CFLAGS += $(EMULATOR_COMMON_CFLAGS)
    587 BLOCK_CFLAGS += -DCONFIG_BDRV_WHITELIST=""
    588 
    589 
    590 ##############################################################################
    591 ##############################################################################
    592 ###
    593 ###  emulator-libelff: TARGET-INDEPENDENT ELF/DWARD PARSER
    594 ###
    595 ###  THESE ARE USED BY EVERYTHING EXCEPT 'emulator-ui', BUT WE CANNOT PUT
    596 ###  THEM IN emulator-libqemu SINCE THE SOURCES ARE C++
    597 ###
    598 
    599 $(call start-emulator-library, emulator-libelff)
    600 
    601 LOCAL_CPP_EXTENSION := .cc
    602 
    603 ELFF_CFLAGS := -I$(LOCAL_PATH)/elff
    604 ELFF_LDLIBS := -lstdc++
    605 
    606 ELFF_SOURCES := \
    607     dwarf_cu.cc \
    608     dwarf_die.cc \
    609     dwarf_utils.cc \
    610     elf_alloc.cc \
    611     elf_file.cc \
    612     elf_mapped_section.cc \
    613     elff_api.cc \
    614 
    615 LOCAL_SRC_FILES += $(ELFF_SOURCES:%=elff/%)
    616 
    617 LOCAL_CFLAGS += \
    618     -fno-exceptions \
    619     $(ELFF_CFLAGS) \
    620 
    621 $(call end-emulator-library)
    622 
    623 
    624 ##############################################################################
    625 ##############################################################################
    626 ###
    627 ###  gen-hx-header: Generate headers from .hx file with "hxtool" script.
    628 ###
    629 ###  The 'hxtool' script is used to generate header files from an input
    630 ###  file with the .hx suffix. I.e. foo.hx --> foo.h
    631 ###
    632 ###  Due to the way the Android build system works, we need to regenerate
    633 ###  it for each module (the output will go into a module-specific directory).
    634 ###
    635 ###  This defines a function that can be used inside a module definition
    636 ###
    637 ###  $(call gen-hx-header,<input>,<output>,<source-files>)
    638 ###
    639 ###  Where: <input> is the input file, with a .hx suffix (e.g. foo.hx)
    640 ###         <output> is the output file, with a .h or .def suffix
    641 ###         <source-files> is a list of source files that include the header
    642 ###
    643 
    644 
    645 gen-hx-header = $(eval $(call gen-hx-header-ev,$1,$2,$3))
    646 
    647 define gen-hx-header-ev
    648 intermediates := $$(call intermediates-dir-for,$$(LOCAL_MODULE_CLASS),$$(LOCAL_MODULE),true)
    649 
    650 QEMU_HEADER_H := $$(intermediates)/$$2
    651 $$(QEMU_HEADER_H): PRIVATE_PATH := $$(LOCAL_PATH)
    652 $$(QEMU_HEADER_H): PRIVATE_CUSTOM_TOOL = $$(PRIVATE_PATH)/hxtool -h < $$< > $$@
    653 $$(QEMU_HEADER_H): $$(LOCAL_PATH)/$$1 $$(LOCAL_PATH)/hxtool
    654 	$$(transform-generated-source)
    655 
    656 LOCAL_GENERATED_SOURCES += $$(QEMU_HEADER_H)
    657 LOCAL_C_INCLUDES += $$(intermediates)
    658 endef
    659 
    660