Home | History | Annotate | Download | only in build
      1 #
      2 # Copyright (C) 2011 The Android Open Source Project
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 #
     16 
     17 include art/build/Android.common_build.mk
     18 
     19 ART_HOST_EXECUTABLES ?=
     20 ART_TARGET_EXECUTABLES ?=
     21 
     22 ART_EXECUTABLES_CFLAGS :=
     23 
     24 # $(1): executable ("d" will be appended for debug version)
     25 # $(2): source
     26 # $(3): extra shared libraries
     27 # $(4): extra include directories
     28 # $(5): target or host
     29 # $(6): ndebug or debug
     30 # $(7): value for LOCAL_MULTILIB (empty means default)
     31 # $(8): static or shared (empty means shared, applies only for host)
     32 define build-art-executable
     33   ifneq ($(5),target)
     34     ifneq ($(5),host)
     35       $$(error expected target or host for argument 5, received $(5))
     36     endif
     37   endif
     38   ifneq ($(6),ndebug)
     39     ifneq ($(6),debug)
     40       $$(error expected ndebug or debug for argument 6, received $(6))
     41     endif
     42   endif
     43 
     44   art_executable := $(1)
     45   art_source := $(2)
     46   art_libraries := $(3)
     47   art_c_includes := $(4)
     48   art_target_or_host := $(5)
     49   art_ndebug_or_debug := $(6)
     50   art_multilib := $(7)
     51   art_static_or_shared := $(8)
     52   art_out_binary_name :=
     53 
     54   include $(CLEAR_VARS)
     55   LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION)
     56   LOCAL_MODULE_TAGS := optional
     57   LOCAL_SRC_FILES := $$(art_source)
     58   LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime art/cmdline $$(art_c_includes)
     59 
     60   ifeq ($$(art_static_or_shared),static)
     61     LOCAL_STATIC_LIBRARIES += $$(art_libraries)
     62   else
     63     LOCAL_SHARED_LIBRARIES += $$(art_libraries)
     64   endif
     65 
     66   ifeq ($$(art_ndebug_or_debug),ndebug)
     67     LOCAL_MODULE := $$(art_executable)
     68   else #debug
     69     LOCAL_MODULE := $$(art_executable)d
     70   endif
     71 
     72   ifeq ($$(art_static_or_shared),static)
     73     LOCAL_MODULE := $(LOCAL_MODULE)s
     74   endif
     75 
     76   LOCAL_CFLAGS := $(ART_EXECUTABLES_CFLAGS)
     77   # Mac OS linker doesn't understand --export-dynamic.
     78   ifneq ($$(HOST_OS)-$$(art_target_or_host),darwin-host)
     79     LOCAL_LDFLAGS := -Wl,--export-dynamic
     80   endif
     81 
     82   ifeq ($$(art_target_or_host),target)
     83     $(call set-target-local-clang-vars)
     84     $(call set-target-local-cflags-vars,$(6))
     85     LOCAL_SHARED_LIBRARIES += libdl
     86   else # host
     87     LOCAL_CLANG := $(ART_HOST_CLANG)
     88     LOCAL_LDLIBS := $(ART_HOST_LDLIBS)
     89     LOCAL_CFLAGS += $(ART_HOST_CFLAGS)
     90     LOCAL_ASFLAGS += $(ART_HOST_ASFLAGS)
     91     ifeq ($$(art_ndebug_or_debug),debug)
     92       LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS)
     93     else
     94       LOCAL_CFLAGS += $(ART_HOST_NON_DEBUG_CFLAGS)
     95     endif
     96     LOCAL_LDLIBS += -lpthread -ldl
     97     ifeq ($$(art_static_or_shared),static)
     98       LOCAL_LDFLAGS += -static
     99       # We need this because GC stress mode makes use of _Unwind_GetIP and _Unwind_Backtrace and
    100       # the symbols are also defined in libgcc_eh.a(unwind-dw2.o)
    101       # TODO: Having this is not ideal as it might obscure errors. Try to get rid of it.
    102       LOCAL_LDFLAGS += -z muldefs
    103       ifeq ($$(HOST_OS),linux)
    104         LOCAL_LDLIBS += -lrt -lncurses -ltinfo
    105       endif
    106       ifeq ($$(HOST_OS),darwin)
    107         LOCAL_LDLIBS += -lncurses -ltinfo
    108       endif
    109     endif
    110 
    111   endif
    112 
    113   # If dynamically linked add libart by default. Statically linked executables
    114   # needs to specify it in art_libraries to ensure proper ordering.
    115   ifeq ($$(art_ndebug_or_debug),ndebug)
    116     ifneq ($$(art_static_or_shared),static)
    117       LOCAL_SHARED_LIBRARIES += libart
    118     endif
    119   else # debug
    120     ifneq ($$(art_static_or_shared),static)
    121       LOCAL_SHARED_LIBRARIES += libartd
    122     endif
    123   endif
    124 
    125   LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk
    126   LOCAL_ADDITIONAL_DEPENDENCIES += art/build/Android.common_utils.mk
    127   LOCAL_ADDITIONAL_DEPENDENCIES += art/build/Android.executable.mk
    128 
    129   ifeq ($$(art_target_or_host),target)
    130     LOCAL_MODULE_TARGET_ARCH := $(ART_SUPPORTED_ARCH)
    131   endif
    132 
    133   ifdef ART_MULTILIB_OVERRIDE_$$(art_target_or_host)
    134     art_multilib := $$(ART_MULTILIB_OVERRIDE_$$(art_target_or_host))
    135   endif
    136 
    137   LOCAL_MULTILIB := $$(art_multilib)
    138   art_out_binary_name := $$(LOCAL_MODULE)
    139 
    140   # If multilib=both (potentially building both 32-bit and 64-bit), need to provide stem.
    141   ifeq ($$(art_multilib),both)
    142     # Set up a 32-bit/64-bit stem if we are building both binaries.
    143     # In this case, the 32-bit binary has an additional 32-bit suffix.
    144     LOCAL_MODULE_STEM_32 := $$(LOCAL_MODULE)32
    145     LOCAL_MODULE_STEM_64 := $$(LOCAL_MODULE)
    146 
    147     # Remember the binary names so we can add them to the global art executables list later.
    148     art_out_binary_name := $$(LOCAL_MODULE_STEM_32) $$(LOCAL_MODULE_STEM_64)
    149 
    150     # For single-architecture targets, remove any binary name suffixes.
    151     ifeq ($$(art_target_or_host),target)
    152       ifeq (,$(TARGET_2ND_ARCH))
    153         LOCAL_MODULE_STEM_32 := $$(LOCAL_MODULE)
    154         art_out_binary_name := $$(LOCAL_MODULE)
    155       endif
    156     endif
    157 
    158     # For single-architecture hosts, remove any binary name suffixes.
    159     ifeq ($$(art_target_or_host),host)
    160       ifeq (,$(HOST_2ND_ARCH))
    161         LOCAL_MODULE_STEM_32 := $$(LOCAL_MODULE)
    162         art_out_binary_name := $$(LOCAL_MODULE)
    163       endif
    164     endif
    165   endif
    166 
    167   LOCAL_NATIVE_COVERAGE := $(ART_COVERAGE)
    168 
    169   ifeq ($$(art_target_or_host),target)
    170     include $(BUILD_EXECUTABLE)
    171     ART_TARGET_EXECUTABLES := $(ART_TARGET_EXECUTABLES) $$(foreach name,$$(art_out_binary_name),$(TARGET_OUT_EXECUTABLES)/$$(name))
    172   else # host
    173     LOCAL_IS_HOST_MODULE := true
    174     include $(BUILD_HOST_EXECUTABLE)
    175     ART_HOST_EXECUTABLES := $(ART_HOST_EXECUTABLES) $$(foreach name,$$(art_out_binary_name),$(HOST_OUT_EXECUTABLES)/$$(name))
    176   endif
    177 
    178   # Clear out local variables now that we're done with them.
    179   art_executable :=
    180   art_source :=
    181   art_libraries :=
    182   art_c_includes :=
    183   art_target_or_host :=
    184   art_ndebug_or_debug :=
    185   art_multilib :=
    186   art_static_or_shared :=
    187   art_out_binary_name :=
    188 
    189 endef
    190 
    191 #
    192 # Build many art executables from multiple variations (debug/ndebug, host/target, 32/64bit).
    193 # By default only either 32-bit or 64-bit is built (but not both -- see multilib arg).
    194 # All other variations are gated by ANDROID_BUILD_(TARGET|HOST)_[N]DEBUG.
    195 # The result must be eval-uated.
    196 #
    197 # $(1): executable name
    198 # $(2): source files
    199 # $(3): library dependencies (common); debug prefix is added on as necessary automatically.
    200 # $(4): library dependencies (target only)
    201 # $(5): library dependencies (host only)
    202 # $(6): extra include directories
    203 # $(7): multilib (default: empty), valid values: {,32,64,both})
    204 # $(8): host prefer 32-bit: {true, false} (default: false).  If argument
    205 #       `multilib` is explicitly set to 64, ignore the "host prefer 32-bit"
    206 #       setting and only build a 64-bit executable on host.
    207 define build-art-multi-executable
    208   $(foreach debug_flavor,ndebug debug,
    209     $(foreach target_flavor,host target,
    210       art-multi-binary-name := $(1)
    211       art-multi-source-files := $(2)
    212       art-multi-lib-dependencies := $(3)
    213       art-multi-lib-dependencies-target := $(4)
    214       art-multi-lib-dependencies-host := $(5)
    215       art-multi-include-extra := $(6)
    216       art-multi-multilib := $(7)
    217       art-multi-host-prefer-32-bit := $(8)
    218 
    219       # Add either -host or -target specific lib dependencies to the lib dependencies.
    220       art-multi-lib-dependencies += $$(art-multi-lib-dependencies-$(target_flavor))
    221 
    222       # Replace libart- prefix with libartd- for debug flavor.
    223       ifeq ($(debug_flavor),debug)
    224         art-multi-lib-dependencies := $$(subst libart-,libartd-,$$(art-multi-lib-dependencies))
    225       endif
    226 
    227       # Build the env guard var name, e.g. ART_BUILD_HOST_NDEBUG.
    228       art-multi-env-guard := $$(call art-string-to-uppercase,ART_BUILD_$(target_flavor)_$(debug_flavor))
    229 
    230       ifeq ($(target_flavor),host)
    231         ifeq ($$(art-multi-host-prefer-32-bit),true)
    232           ifneq ($$(art-multi-multilib),64)
    233             art-multi-multilib := 32
    234           endif
    235         endif
    236       endif
    237 
    238       # Build the art executable only if the corresponding env guard was set.
    239       ifeq ($$($$(art-multi-env-guard)),true)
    240         $$(eval $$(call build-art-executable,$$(art-multi-binary-name),$$(art-multi-source-files),$$(art-multi-lib-dependencies),$$(art-multi-include-extra),$(target_flavor),$(debug_flavor),$$(art-multi-multilib)))
    241       endif
    242 
    243       # Clear locals now they've served their purpose.
    244       art-multi-binary-name :=
    245       art-multi-source-files :=
    246       art-multi-lib-dependencies :=
    247       art-multi-lib-dependencies-target :=
    248       art-multi-lib-dependencies-host :=
    249       art-multi-include-extra :=
    250       art-multi-multilib :=
    251       art-multi-host-prefer-32-bit :=
    252       art-multi-env-guard :=
    253     )
    254   )
    255 endef
    256