build-binary.mk revision c1aac4827916ecbe8c1f6248eeb3652e2a4151f5
1# Copyright (C) 2008 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# 15 16# Check that LOCAL_MODULE is defined, then restore its LOCAL_XXXX values 17$(call assert-defined,LOCAL_MODULE) 18$(call module-restore-locals,$(LOCAL_MODULE)) 19 20# For now, only support target (device-specific modules). 21# We may want to introduce support for host modules in the future 22# but that is too experimental for now. 23# 24my := TARGET_ 25 26# LOCAL_MAKEFILE must also exist and name the Android.mk that 27# included the module build script. 28# 29$(call assert-defined,LOCAL_MAKEFILE LOCAL_BUILD_SCRIPT LOCAL_BUILT_MODULE) 30 31include $(BUILD_SYSTEM)/import-locals.mk 32 33# 34# Ensure that 'make <module>' and 'make clean-<module>' work 35# 36.PHONY: $(LOCAL_MODULE) 37$(LOCAL_MODULE): $(LOCAL_BUILT_MODULE) 38 39cleantarget := clean-$(LOCAL_MODULE)-$(TARGET_ARCH_ABI) 40.PHONY: $(cleantarget) 41clean: $(cleantarget) 42 43$(cleantarget): PRIVATE_MODULE := $(LOCAL_MODULE) 44$(cleantarget): PRIVATE_TEXT := [$(TARGET_ARCH_ABI)] 45$(cleantarget): PRIVATE_CLEAN_FILES := $(LOCAL_BUILT_MODULE) \ 46 $($(my)OBJS) 47 48$(cleantarget):: 49 @echo "Clean: $(PRIVATE_MODULE) $(PRIVATE_TEXT)" 50 $(hide) rm -rf $(PRIVATE_CLEAN_FILES) 51 52ifeq ($(NDK_APP_DEBUGGABLE),true) 53$(NDK_APP_GDBSETUP): PRIVATE_SRC_DIRS += $(LOCAL_C_INCLUDES) $(LOCAL_PATH) 54endif 55 56# list of generated object files 57LOCAL_OBJECTS := 58 59# always define ANDROID when building binaries 60# 61LOCAL_CFLAGS := -DANDROID $(LOCAL_CFLAGS) 62 63# 64# Add the default system shared libraries to the build 65# 66ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none) 67 LOCAL_SHARED_LIBRARIES += $(TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES) 68else 69 LOCAL_SHARED_LIBRARIES += $(LOCAL_SYSTEM_SHARED_LIBRARIES) 70endif 71 72 73# 74# Check LOCAL_CPP_EXTENSION, use '.cpp' by default 75# 76LOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION)) 77ifeq ($(LOCAL_CPP_EXTENSION),) 78 LOCAL_CPP_EXTENSION := .cpp 79else 80 ifneq ($(words $(LOCAL_CPP_EXTENSION)),1) 81 $(call __ndk_info, LOCAL_CPP_EXTENSION in $(LOCAL_MAKEFILE) must be one word only, not '$(LOCAL_CPP_EXTENSION)') 82 $(call __ndk_error, Aborting) 83 endif 84endif 85 86# 87# If LOCAL_ALLOW_UNDEFINED_SYMBOLS is not true, the linker will allow the generation 88# of a binary that uses undefined symbols. 89# 90ifneq ($(LOCAL_ALLOW_UNDEFINED_SYMBOLS),true) 91 LOCAL_LDFLAGS += $($(my)NO_UNDEFINED_LDFLAGS) 92endif 93 94# If LOCAL_DISABLE_NO_EXECUTE is not true, we disable generated code from running from 95# the heap and stack by default. 96# 97ifndef ($(LOCAL_DISABLE_NO_EXECUTE),true) 98 ifneq ($(call module-get-class,$(LOCAL_MODULE)),BITCODE) 99 LOCAL_CFLAGS += $($(my)NO_EXECUTE_CFLAGS) 100 LOCAL_LDFLAGS += $($(my)NO_EXECUTE_LDFLAGS) 101 endif 102endif 103 104# 105# The original Android build system allows you to use the .arm prefix 106# to a source file name to indicate that it should be defined in either 107# 'thumb' or 'arm' mode, depending on the value of LOCAL_ARM_MODE 108# 109# First, check LOCAL_ARM_MODE, it should be empty, 'thumb' or 'arm' 110# We make the default 'thumb' 111# 112LOCAL_ARM_MODE := $(strip $(LOCAL_ARM_MODE)) 113ifdef LOCAL_ARM_MODE 114 ifneq ($(words $(LOCAL_ARM_MODE)),1) 115 $(call __ndk_info, LOCAL_ARM_MODE in $(LOCAL_MAKEFILE) must be one word, not '$(LOCAL_ARM_MODE)') 116 $(call __ndk_error, Aborting) 117 endif 118 # check that LOCAL_ARM_MODE is defined to either 'arm' or 'thumb' 119 $(if $(filter-out thumb arm, $(LOCAL_ARM_MODE)),\ 120 $(call __ndk_info, LOCAL_ARM_MODE must be defined to either 'arm' or 'thumb' in $(LOCAL_MAKEFILE) not '$(LOCAL_ARM_MODE)')\ 121 $(call __ndk_error, Aborting)\ 122 ) 123endif 124 125# As a special case, the original Android build system 126# allows one to specify that certain source files can be 127# forced to build in ARM mode by using a '.arm' suffix 128# after the extension, e.g. 129# 130# LOCAL_SRC_FILES := foo.c.arm 131# 132# to build source file $(LOCAL_PATH)/foo.c as ARM 133# 134 135# As a special extension, the NDK also supports the .neon extension suffix 136# to indicate that a single file can be compiled with ARM NEON support 137# We must support both foo.c.neon and foo.c.arm.neon here 138# 139# Also, if LOCAL_ARM_NEON is set to 'true', force Neon mode for all source 140# files 141# 142 143neon_sources := $(filter %.neon,$(LOCAL_SRC_FILES)) 144neon_sources := $(neon_sources:%.neon=%) 145 146LOCAL_ARM_NEON := $(strip $(LOCAL_ARM_NEON)) 147ifdef LOCAL_ARM_NEON 148 $(if $(filter-out true false,$(LOCAL_ARM_NEON)),\ 149 $(call __ndk_info,LOCAL_ARM_NEON must be defined either to 'true' or 'false' in $(LOCAL_MAKEFILE), not '$(LOCAL_ARM_NEON)')\ 150 $(call __ndk_error,Aborting) \ 151 ) 152endif 153ifeq ($(LOCAL_ARM_NEON),true) 154 neon_sources += $(LOCAL_SRC_FILES:%.neon=%) 155endif 156 157neon_sources := $(strip $(neon_sources)) 158ifdef neon_sources 159 ifneq ($(TARGET_ARCH_ABI),armeabi-v7a) 160 $(call __ndk_info,NEON support is only possible for armeabi-v7a ABI) 161 $(call __ndk_info,Please add checks against TARGET_ARCH_ABI in $(LOCAL_MAKEFILE)) 162 $(call __ndk_error,Aborting) 163 endif 164 $(call tag-src-files,$(neon_sources:%.arm=%),neon) 165endif 166 167LOCAL_SRC_FILES := $(LOCAL_SRC_FILES:%.neon=%) 168 169# strip the .arm suffix from LOCAL_SRC_FILES 170# and tag the relevant sources with the 'arm' tag 171# 172arm_sources := $(filter %.arm,$(LOCAL_SRC_FILES)) 173arm_sources := $(arm_sources:%.arm=%) 174thumb_sources := $(filter-out %.arm,$(LOCAL_SRC_FILES)) 175LOCAL_SRC_FILES := $(LOCAL_SRC_FILES:%.arm=%) 176 177ifeq ($(LOCAL_ARM_MODE),arm) 178 arm_sources := $(LOCAL_SRC_FILES) 179endif 180ifeq ($(LOCAL_ARM_MODE),thumb) 181 arm_sources := $(empty) 182endif 183$(call tag-src-files,$(arm_sources),arm) 184 185# Process all source file tags to determine toolchain-specific 186# target compiler flags, and text. 187# 188$(call TARGET-process-src-files-tags) 189 190# only call dump-src-file-tags during debugging 191#$(dump-src-file-tags) 192 193LOCAL_DEPENDENCY_DIRS := 194 195# all_source_patterns contains the list of filename patterns that correspond 196# to source files recognized by our build system 197all_source_extensions := .c .s .S $(LOCAL_CPP_EXTENSION) 198all_source_patterns := $(foreach _ext,$(all_source_extensions),%$(_ext)) 199 200unknown_sources := $(strip $(filter-out $(all_source_patterns),$(LOCAL_SRC_FILES))) 201ifdef unknown_sources 202 $(call __ndk_info,WARNING: Unsupported source file extensions in $(LOCAL_MAKEFILE) for module $(LOCAL_MODULE)) 203 $(call __ndk_info, $(unknown_sources)) 204endif 205 206# 207# Build the sources to object files 208# 209ifeq ($(call module-get-class,$(LOCAL_MODULE)),BITCODE) 210# Overwrite 211LOCAL_OBJECTS := $(LOCAL_SRC_FILES:%.c=%.bc) 212LOCAL_OBJECTS := $(foreach _obj,$(LOCAL_OBJECTS),$(LOCAL_OBJS_DIR)/$(_obj)) 213$(foreach src,$(filter %.c,$(LOCAL_SRC_FILES)), $(call compile-c-source-to-bitcode,$(src))) 214else 215# LOCAL_OBJECTS will list all object files corresponding to the sources 216# listed in LOCAL_SRC_FILES, in the *same* order. 217# 218LOCAL_OBJECTS := $(LOCAL_SRC_FILES) 219$(foreach _ext,$(all_source_extensions),\ 220 $(eval LOCAL_OBJECTS := $$(LOCAL_OBJECTS:%$(_ext)=%.o))\ 221) 222LOCAL_OBJECTS := $(filter %.o,$(LOCAL_OBJECTS)) 223LOCAL_OBJECTS := $(foreach _obj,$(LOCAL_OBJECTS),$(LOCAL_OBJS_DIR)/$(_obj)) 224 225$(foreach src,$(filter %.c,$(LOCAL_SRC_FILES)), $(call compile-c-source,$(src))) 226$(foreach src,$(filter %.S %.s,$(LOCAL_SRC_FILES)), $(call compile-s-source,$(src))) 227 228$(foreach src,$(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_SRC_FILES)),\ 229 $(call compile-cpp-source,$(src))) 230endif 231 232# 233# The compile-xxx-source calls updated LOCAL_OBJECTS and LOCAL_DEPENDENCY_DIRS 234# 235ALL_DEPENDENCY_DIRS += $(sort $(LOCAL_DEPENDENCY_DIRS)) 236CLEAN_OBJS_DIRS += $(LOCAL_OBJS_DIR) 237 238# 239# Handle the static and shared libraries this module depends on 240# 241LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES)) 242LOCAL_WHOLE_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_WHOLE_STATIC_LIBRARIES)) 243LOCAL_SHARED_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_SHARED_LIBRARIES)) 244 245static_libraries := $(call map,module-get-built,$(LOCAL_STATIC_LIBRARIES)) 246whole_static_libraries := $(call map,module-get-built,$(LOCAL_WHOLE_STATIC_LIBRARIES)) 247 248shared_libraries := $(call map,module-get-built,$(LOCAL_SHARED_LIBRARIES))\ 249 $(TARGET_PREBUILT_SHARED_LIBRARIES) 250 251$(LOCAL_BUILT_MODULE): $(static_libraries) $(whole_static_libraries) $(shared_libraries) 252 253# If LOCAL_LDLIBS contains anything like -l<library> then 254# prepend a -L$(SYSROOT)/usr/lib to it to ensure that the linker 255# looks in the right location 256# 257ifneq ($(filter -l%,$(LOCAL_LDLIBS)),) 258 LOCAL_LDLIBS := -L$(call host-path,$(SYSROOT)/usr/lib) $(LOCAL_LDLIBS) 259endif 260 261$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries) 262$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(whole_static_libraries) 263$(LOCAL_BUILT_MODULE): PRIVATE_SHARED_LIBRARIES := $(shared_libraries) 264$(LOCAL_BUILT_MODULE): PRIVATE_OBJECTS := $(LOCAL_OBJECTS) 265 266$(LOCAL_BUILT_MODULE): PRIVATE_LDFLAGS := $(TARGET_LDFLAGS) $(LOCAL_LDFLAGS) 267$(LOCAL_BUILT_MODULE): PRIVATE_LDLIBS := $(LOCAL_LDLIBS) $(TARGET_LDLIBS) 268 269$(LOCAL_BUILT_MODULE): PRIVATE_NAME := $(notdir $(LOCAL_BUILT_MODULE)) 270 271# 272# If this is a bitcode module 273# 274ifeq ($(call module-get-class,$(LOCAL_MODULE)),BITCODE) 275$(LOCAL_BUILT_MODULE): $(LOCAL_OBJECTS) 276 @ mkdir -p $(dir $@) 277 @ echo "Bitcode : $(PRIVATE_NAME)" 278 $(hide) rm -rf $@ 279 $(hide) $(cmd-build-bitcode) 280ALL_BITCODE += $(LOCAL_BUILT_MODULE) 281endif 282 283# 284# If this is a static library module 285# 286ifeq ($(call module-get-class,$(LOCAL_MODULE)),STATIC_LIBRARY) 287$(LOCAL_BUILT_MODULE): $(LOCAL_OBJECTS) 288 @ mkdir -p $(dir $@) 289 @ echo "StaticLibrary : $(PRIVATE_NAME)" 290 $(hide) rm -rf $@ 291 $(hide) $(cmd-build-static-library) 292 293ALL_STATIC_LIBRARIES += $(LOCAL_BUILT_MODULE) 294endif 295 296# 297# If this is a shared library module 298# 299ifeq ($(call module-get-class,$(LOCAL_MODULE)),SHARED_LIBRARY) 300$(LOCAL_BUILT_MODULE): $(LOCAL_OBJECTS) 301 @ mkdir -p $(dir $@) 302 @ echo "SharedLibrary : $(PRIVATE_NAME)" 303 $(hide) $(cmd-build-shared-library) 304 305ALL_SHARED_LIBRARIES += $(LOCAL_BUILT_MODULE) 306endif 307 308# 309# If this is an executable module 310# 311ifeq ($(call module-get-class,$(LOCAL_MODULE)),EXECUTABLE) 312$(LOCAL_BUILT_MODULE): $(LOCAL_OBJECTS) 313 @ mkdir -p $(dir $@) 314 @ echo "Executable : $(PRIVATE_NAME)" 315 $(hide) $(cmd-build-executable) 316 317ALL_EXECUTABLES += $(LOCAL_BUILT_MODULE) 318endif 319 320# 321# If this is a prebuilt module 322# 323ifeq ($(call module-is-prebuilt,$(LOCAL_MODULE)),$(true)) 324$(LOCAL_BUILT_MODULE): $(LOCAL_OBJECTS) 325 @ mkdir -p $(dir $@) 326 @ echo "Prebuilt : $(PRIVATE_NAME) <= $(call pretty-dir,$(dir $<))" 327 $(hide) cp -f $< $@ 328endif 329 330# 331# If this is an installable module 332# 333ifeq ($(call module-is-installable,$(LOCAL_MODULE)),$(true)) 334$(LOCAL_INSTALLED): PRIVATE_NAME := $(notdir $(LOCAL_BUILT_MODULE)) 335$(LOCAL_INSTALLED): PRIVATE_SRC := $(LOCAL_BUILT_MODULE) 336 337ifeq ($(call module-get-class,$(LOCAL_MODULE)),BITCODE) 338# BUG FIXME 339$(LOCAL_INSTALLED): PRIVATE_INSTALLED := res/raw/$(PRIVATE_NAME) 340$(LOCAL_INSTALLED): PRIVATE_DST_DIR := res/raw 341$(LOCAL_INSTALLED): PRIVATE_DST := $(PRIVATE_INSTALLED) 342 343$(LOCAL_INSTALLED): $(LOCAL_BUILT_MODULE) clean-installed-binaries 344 @ echo "Install BC : $(PRIVATE_NAME) => $(call pretty-dir,$(PRIVATE_DST))" 345 $(hide) mkdir -p $(PRIVATE_DST_DIR) 346 $(hide) cp -p $(PRIVATE_SRC) $(PRIVATE_DST) 347 348else 349$(LOCAL_INSTALLED): PRIVATE_DST_DIR := $(NDK_APP_DST_DIR) 350$(LOCAL_INSTALLED): PRIVATE_DST := $(LOCAL_INSTALLED) 351 352$(LOCAL_INSTALLED): $(LOCAL_BUILT_MODULE) clean-installed-binaries 353 @ echo "Install : $(PRIVATE_NAME) => $(call pretty-dir,$(PRIVATE_DST))" 354 $(hide) mkdir -p $(PRIVATE_DST_DIR) 355 $(hide) install -p $(PRIVATE_SRC) $(PRIVATE_DST) 356 $(hide) $(call cmd-strip, $(PRIVATE_DST)) 357endif 358endif 359