Home | History | Annotate | Download | only in tools
      1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 #
      6 # GNU Make based build file.  For details on GNU Make see:
      7 #   http://www.gnu.org/software/make/manual/make.html
      8 #
      9 
     10 #
     11 # Macros for TOOLS
     12 #
     13 ifneq ($(TOOLCHAIN),bionic)
     14 X86_32_CC := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=cc)
     15 X86_32_CXX := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=c++)
     16 X86_32_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=c++)
     17 X86_32_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=ar)
     18 X86_32_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=strip)
     19 X86_32_NM := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=nm)
     20 
     21 X86_64_CC := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=cc)
     22 X86_64_CXX := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=c++)
     23 X86_64_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=c++)
     24 X86_64_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=ar)
     25 X86_64_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=strip)
     26 X86_64_NM := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=nm)
     27 endif
     28 
     29 ifeq (,$(findstring $(TOOLCHAIN),glibc))
     30 ARM_CC := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=cc)
     31 ARM_CXX := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=c++)
     32 ARM_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=c++)
     33 ARM_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=ar)
     34 ARM_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=strip)
     35 ARM_NM := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=nm)
     36 endif
     37 
     38 NCVAL ?= python $(NACL_SDK_ROOT)/tools/ncval.py
     39 
     40 # Architecture-specific variables
     41 ifeq (,$(MULTI_PLATFORM))
     42 X86_32_OUTDIR ?= $(OUTDIR)
     43 X86_64_OUTDIR ?= $(OUTDIR)
     44 ARM_OUTDIR ?= $(OUTDIR)
     45 else
     46 X86_32_OUTDIR ?= $(OUTDIR)/_platform_specific/x86-32
     47 X86_64_OUTDIR ?= $(OUTDIR)/_platform_specific/x86-64
     48 ARM_OUTDIR ?= $(OUTDIR)/_platform_specific/arm
     49 endif
     50 
     51 # Architecture-specific flags
     52 X86_32_CFLAGS ?=
     53 X86_64_CFLAGS ?=
     54 X86_32_CXXFLAGS ?=
     55 X86_64_CXXFLAGS ?=
     56 
     57 # Use DWARF v3 which is more commonly available when debugging
     58 ifeq ($(CONFIG),Debug)
     59 ARM_CFLAGS ?= -gdwarf-3
     60 ARM_CXXFLAGS ?= -gdwarf-3
     61 else
     62 ARM_CFLAGS ?=
     63 ARM_CXXFLAGS ?=
     64 endif
     65 
     66 ifeq (,$(MULTI_PLATFORM))
     67 X86_32_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_x86_32.map
     68 X86_64_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_x86_64.map
     69 ARM_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_arm.map
     70 else
     71 X86_32_LDFLAGS ?= -Wl,-Map,$(X86_32_OUTDIR)/$(TARGET)_x86_32.map
     72 X86_64_LDFLAGS ?= -Wl,-Map,$(X86_64_OUTDIR)/$(TARGET)_x86_64.map
     73 ARM_LDFLAGS ?= -Wl,-Map,$(ARM_OUTDIR)/$(TARGET)_arm.map
     74 endif
     75 
     76 #
     77 # Choose between static and dynamic linking for Bionic
     78 # (Default to dynamic)
     79 #
     80 ifeq ($(TOOLCHAIN),bionic)
     81 ifeq (,$(BIONIC_USE_DYNAMIC))
     82 BIONIC_LINK:=-static
     83 else
     84 BIONIC_LINK:=-Wl,-Ttext-segment=0x100000
     85 endif
     86 endif
     87 
     88 LDFLAGS_SHARED = -shared
     89 
     90 #
     91 # Compile Macro
     92 #
     93 # $1 = Source Name
     94 # $2 = Compile Flags
     95 #
     96 define C_COMPILER_RULE
     97 -include $(call SRC_TO_DEP,$(1),_x86_32)
     98 $(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     99 	$(call LOG,CC  ,$$@,$(X86_32_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_32_CFLAGS))
    100 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32)
    101 
    102 -include $(call SRC_TO_DEP,$(1),_x86_64)
    103 $(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    104 	$(call LOG,CC  ,$$@,$(X86_64_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_64_CFLAGS))
    105 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64)
    106 
    107 -include $(call SRC_TO_DEP,$(1),_arm)
    108 $(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    109 	$(call LOG,CC  ,$$@,$(ARM_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(ARM_CFLAGS))
    110 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm)
    111 
    112 -include $(call SRC_TO_DEP,$(1),_x86_32_pic)
    113 $(call SRC_TO_OBJ,$(1),_x86_32_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    114 	$(call LOG,CC  ,$$@,$(X86_32_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_32_CFLAGS))
    115 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32_pic)
    116 
    117 -include $(call SRC_TO_DEP,$(1),_x86_64_pic)
    118 $(call SRC_TO_OBJ,$(1),_x86_64_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    119 	$(call LOG,CC  ,$$@,$(X86_64_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_64_CFLAGS))
    120 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64_pic)
    121 
    122 -include $(call SRC_TO_DEP,$(1),_arm_pic)
    123 $(call SRC_TO_OBJ,$(1),_arm_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    124 	$(call LOG,CC  ,$$@,$(ARM_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(ARM_CFLAGS))
    125 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm_pic)
    126 endef
    127 
    128 define CXX_COMPILER_RULE
    129 -include $(call SRC_TO_DEP,$(1),_x86_32)
    130 $(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    131 	$(call LOG,CXX ,$$@,$(X86_32_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_32_CXXFLAGS))
    132 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32)
    133 
    134 -include $(call SRC_TO_DEP,$(1),_x86_64)
    135 $(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    136 	$(call LOG,CXX ,$$@,$(X86_64_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_64_CXXFLAGS))
    137 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64)
    138 
    139 -include $(call SRC_TO_DEP,$(1),_arm)
    140 $(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    141 	$(call LOG,CXX ,$$@,$(ARM_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(ARM_CXXFLAGS))
    142 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm)
    143 
    144 -include $(call SRC_TO_DEP,$(1),_x86_32_pic)
    145 $(call SRC_TO_OBJ,$(1),_x86_32_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    146 	$(call LOG,CXX ,$$@,$(X86_32_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_32_CXXFLAGS))
    147 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32_pic)
    148 
    149 -include $(call SRC_TO_DEP,$(1),_x86_64_pic)
    150 $(call SRC_TO_OBJ,$(1),_x86_64_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    151 	$(call LOG,CXX ,$$@,$(X86_64_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_64_CXXFLAGS))
    152 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64_pic)
    153 
    154 -include $(call SRC_TO_DEP,$(1),_arm_pic)
    155 $(call SRC_TO_OBJ,$(1),_arm_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    156 	$(call LOG,CXX ,$$@,$(ARM_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(ARM_CXXFLAGS))
    157 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm_pic)
    158 endef
    159 
    160 
    161 #
    162 # $1 = Source Name
    163 # $2 = POSIX Compile Flags
    164 # $3 = Include Directories
    165 # $4 = VC Flags (unused)
    166 #
    167 define COMPILE_RULE
    168 ifeq ($(suffix $(1)),.c)
    169 $(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
    170 else
    171 $(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
    172 endif
    173 endef
    174 
    175 #
    176 # Determine which architectures to build for.  The user can set NACL_ARCH or
    177 # ARCHES in the environment to control this.
    178 #
    179 ifneq ($(TOOLCHAIN),bionic)
    180 VALID_ARCHES := x86_32 x86_64
    181 endif
    182 ifneq (glibc,$(TOOLCHAIN))
    183 VALID_ARCHES += arm
    184 endif
    185 
    186 ifdef NACL_ARCH
    187 ifeq (,$(findstring $(NACL_ARCH),$(VALID_ARCHES)))
    188 $(error Invalid arch specified in NACL_ARCH: $(NACL_ARCH).  Valid values are: $(VALID_ARCHES))
    189 endif
    190 ARCHES = ${NACL_ARCH}
    191 else
    192 ARCHES ?= ${VALID_ARCHES}
    193 endif
    194 
    195 GLIBC_REMAP :=
    196 
    197 #
    198 # SO Macro
    199 #
    200 # As well as building and installing a shared library this rule adds dependencies
    201 # on the library's .stamp file in STAMPDIR.  However, the rule for creating the stamp
    202 # file is part of LIB_RULE, so users of the DEPS system are currently required to
    203 # use the LIB_RULE macro as well as the SO_RULE for each shared library.
    204 #
    205 # $1 = Target Name
    206 # $2 = List of Sources
    207 # $3 = List of LIBS
    208 # $4 = List of DEPS
    209 # $5 = Library Paths
    210 # $6 = 1 => Don't add to NMF.
    211 #
    212 define SO_LINKER_RULE
    213 ifneq (,$(findstring x86_32,$(ARCHES)))
    214 all: $(X86_32_OUTDIR)/lib$(1)_x86_32.so
    215 $(X86_32_OUTDIR)/lib$(1)_x86_32.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32_pic)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    216 	$(MKDIR) -p $$(dir $$@)
    217 	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter %.o,$$^) $(LDFLAGS_SHARED) -m32 $(NACL_LDFLAGS) $(X86_32_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(TOOLCHAIN)_x86_32/$(CONFIG)) $(foreach lib,$(3),-l$(lib)))
    218 	$(call LOG,VALIDATE,$$@,$(NCVAL) $$@)
    219 
    220 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so
    221 install: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so
    222 $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so: $(X86_32_OUTDIR)/lib$(1)_x86_32.so
    223 	$(MKDIR) -p $$(dir $$@)
    224 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    225 ifneq ($(6),1)
    226 GLIBC_SO_LIST += $(X86_32_OUTDIR)/lib$(1)_x86_32.so
    227 GLIBC_REMAP += -n lib$(1)_x86_32.so,lib$(1).so
    228 endif
    229 endif
    230 
    231 ifneq (,$(findstring x86_64,$(ARCHES)))
    232 all: $(X86_64_OUTDIR)/lib$(1)_x86_64.so
    233 $(X86_64_OUTDIR)/lib$(1)_x86_64.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64_pic)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    234 	$(MKDIR) -p $$(dir $$@)
    235 	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter %.o,$$^) $(LDFLAGS_SHARED) -m64 $(NACL_LDFLAGS) $(X86_64_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(TOOLCHAIN)_x86_64/$(CONFIG)) $(foreach lib,$(3),-l$(lib)))
    236 	$(call LOG,VALIDATE,$$@,$(NCVAL) $$@)
    237 
    238 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so
    239 install: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so
    240 $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so: $(X86_64_OUTDIR)/lib$(1)_x86_64.so
    241 	$(MKDIR) -p $$(dir $$@)
    242 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    243 ifneq ($(6),1)
    244 GLIBC_SO_LIST += $(X86_64_OUTDIR)/lib$(1)_x86_64.so
    245 GLIBC_REMAP += -n lib$(1)_x86_64.so,lib$(1).so
    246 endif
    247 endif
    248 
    249 ifneq (,$(findstring arm,$(ARCHES)))
    250 all: $(ARM_OUTDIR)/lib$(1)_arm.so
    251 $(ARM_OUTDIR)/lib$(1)_arm.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm_pic)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    252 	$(MKDIR) -p $$(dir $$@)
    253 	$(call LOG,LINK,$$@,$(ARM_LINK) -o $$@ $$(filter %.o,$$^) $(LDFLAGS_SHARED) -marm $(NACL_LDFLAGS) $(ARM_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(TOOLCHAIN)_arm/$(CONFIG)) $(foreach lib,$(3),-l$(lib)))
    254 	$(call LOG,VALIDATE,$$@,$(NCVAL) $$@)
    255 
    256 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).so
    257 install: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).so
    258 $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).so: $(ARM_OUTDIR)/lib$(1)_arm.so
    259 	$(MKDIR) -p $$(dir $$@)
    260 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    261 ifneq ($(6),1)
    262 GLIBC_SO_LIST += $(ARM_OUTDIR)/lib$(1)_arm.so
    263 GLIBC_REMAP += -n lib$(1)_arm.so,lib$(1).so
    264 endif
    265 endif
    266 endef
    267 
    268 #
    269 # $1 = Target Name
    270 # $2 = List of Sources
    271 # $3 = List of LIBS
    272 # $4 = List of DEPS
    273 # $5 = 1 => Don't add to NMF.
    274 #
    275 define SO_RULE
    276 $(call SO_LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(LIB_PATHS),$(5))
    277 endef
    278 
    279 #
    280 # LIB Macro
    281 #
    282 # $1 = Target Name
    283 # $2 = List of Sources
    284 # $3 = POSIX Link Flags
    285 # $4 = VC Link Flags (unused)
    286 #
    287 define LIB_RULE
    288 $(STAMPDIR)/$(1).stamp:
    289 	@echo "  STAMP $$@"
    290 	@echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp
    291 
    292 ifneq (,$(findstring x86_32,$(ARCHES)))
    293 all: $(X86_32_OUTDIR)/lib$(1)_x86_32.a
    294 $(X86_32_OUTDIR)/lib$(1)_x86_32.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32))
    295 	$(MKDIR) -p $$(dir $$@)
    296 	$(RM) -f $$@
    297 	$(call LOG,LIB ,$$@,$(X86_32_LIB) -cr $$@ $$^)
    298 
    299 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
    300 install: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
    301 $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a: $(X86_32_OUTDIR)/lib$(1)_x86_32.a
    302 	$(MKDIR) -p $$(dir $$@)
    303 	$(RM) -f $$@
    304 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    305 endif
    306 
    307 ifneq (,$(findstring x86_64,$(ARCHES)))
    308 all: $(X86_64_OUTDIR)/lib$(1)_x86_64.a
    309 $(X86_64_OUTDIR)/lib$(1)_x86_64.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64))
    310 	$(MKDIR) -p $$(dir $$@)
    311 	$(RM) -f $$@
    312 	$(call LOG,LIB ,$$@,$(X86_64_LIB) -cr $$@ $$^)
    313 
    314 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
    315 install: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
    316 $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a: $(X86_64_OUTDIR)/lib$(1)_x86_64.a
    317 	$(MKDIR) -p $$(dir $$@)
    318 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    319 endif
    320 
    321 ifneq (,$(findstring arm,$(ARCHES)))
    322 ifneq ($(TOOLCHAIN),glibc)
    323 all: $(ARM_OUTDIR)/lib$(1)_arm.a
    324 $(ARM_OUTDIR)/lib$(1)_arm.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm))
    325 	$(MKDIR) -p $$(dir $$@)
    326 	$(RM) -f $$@
    327 	$(call LOG,LIB ,$$@,$(ARM_LIB) -cr $$@ $$^)
    328 
    329 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
    330 install: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
    331 $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a: $(ARM_OUTDIR)/lib$(1)_arm.a
    332 	$(MKDIR) -p $$(dir $$@)
    333 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    334 endif
    335 endif
    336 endef
    337 
    338 
    339 #
    340 # Specific Link Macro
    341 #
    342 # $1 = Target Name
    343 # $2 = List of Sources
    344 # $3 = List of LIBS
    345 # $4 = List of DEPS
    346 # $5 = Link Flags
    347 # $6 = Library Paths
    348 #
    349 define LINKER_RULE
    350 ifneq (,$(findstring x86_32,$(ARCHES)))
    351 all: $(X86_32_OUTDIR)/$(1)_x86_32.nexe
    352 $(X86_32_OUTDIR)/$(1)_x86_32.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    353 	$(MKDIR) -p $$(dir $$@)
    354 	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(X86_32_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_x86_32/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
    355 	$(call LOG,VALIDATE,$$@,$(NCVAL) $$@)
    356 endif
    357 
    358 ifneq (,$(findstring x86_64,$(ARCHES)))
    359 all: $(X86_64_OUTDIR)/$(1)_x86_64.nexe
    360 $(X86_64_OUTDIR)/$(1)_x86_64.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    361 	$(MKDIR) -p $$(dir $$@)
    362 	$(call LOG,LINK,$$@,$(X86_64_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(X86_64_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_x86_64/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
    363 	$(call LOG,VALIDATE,$$@,$(NCVAL) $$@)
    364 endif
    365 
    366 ifneq (,$(findstring arm,$(ARCHES)))
    367 all: $(ARM_OUTDIR)/$(1)_arm.nexe
    368 $(ARM_OUTDIR)/$(1)_arm.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    369 	$(MKDIR) -p $$(dir $$@)
    370 	$(call LOG,LINK,$$@,$(ARM_LINK) $(BIONIC_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(ARM_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_arm/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
    371 	$(call LOG,VALIDATE,$$@,$(NCVAL) $$@)
    372 endif
    373 endef
    374 
    375 
    376 #
    377 # Generalized Link Macro
    378 #
    379 # $1 = Target Name
    380 # $2 = List of Sources
    381 # $3 = List of LIBS
    382 # $4 = List of DEPS
    383 # $5 = POSIX Linker Switches
    384 # $6 = VC Linker Switches
    385 #
    386 define LINK_RULE
    387 $(call LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(5),$(LIB_PATHS))
    388 endef
    389 
    390 
    391 #
    392 # Strip Macro for each arch (e.g., each arch supported by LINKER_RULE).
    393 #
    394 # $1 = Target Name
    395 # $2 = Source Name
    396 #
    397 define STRIP_ALL_RULE
    398 ifneq (,$(findstring x86_32,$(ARCHES)))
    399 $(X86_32_OUTDIR)/$(1)_x86_32.nexe: $(X86_32_OUTDIR)/$(2)_x86_32.nexe
    400 	$(call LOG,STRIP,$$@,$(X86_32_STRIP) -o $$@ $$^)
    401 endif
    402 
    403 ifneq (,$(findstring x86_64,$(ARCHES)))
    404 $(X86_64_OUTDIR)/$(1)_x86_64.nexe: $(X86_64_OUTDIR)/$(2)_x86_64.nexe
    405 	$(call LOG,STRIP,$$@,$(X86_64_STRIP) -o $$@ $$^)
    406 endif
    407 
    408 ifneq (,$(findstring arm,$(ARCHES)))
    409 $(ARM_OUTDIR)/$(1)_arm.nexe: $(ARM_OUTDIR)/$(2)_arm.nexe
    410 	$(call LOG,STRIP,$$@,$(ARM_STRIP) -o $$@ $$^)
    411 endif
    412 endef
    413 
    414 
    415 #
    416 # Top-level Strip Macro
    417 #
    418 # $1 = Target Basename
    419 # $2 = Source Basename
    420 #
    421 define STRIP_RULE
    422 $(call STRIP_ALL_RULE,$(1),$(2))
    423 endef
    424 
    425 
    426 #
    427 # Strip Macro for each arch (e.g., each arch supported by MAP_RULE).
    428 #
    429 # $1 = Target Name
    430 # $2 = Source Name
    431 #
    432 define MAP_ALL_RULE
    433 ifneq (,$(findstring x86_32,$(ARCHES)))
    434 all: $(X86_32_OUTDIR)/$(1)_x86_32.map
    435 $(X86_32_OUTDIR)/$(1)_x86_32.map: $(X86_32_OUTDIR)/$(2)_x86_32.nexe
    436 	$(call LOG,MAP,$$@,$(X86_32_NM) -l $$^ > $$@)
    437 endif
    438 
    439 ifneq (,$(findstring x86_64,$(ARCHES)))
    440 all: $(X86_64_OUTDIR)/$(1)_x86_64.map
    441 $(X86_64_OUTDIR)/$(1)_x86_64.map: $(X86_64_OUTDIR)/$(2)_x86_64.nexe
    442 	$(call LOG,MAP,$$@,$(X86_64_NM) -l $$^ > $$@)
    443 endif
    444 
    445 ifneq (,$(findstring arm,$(ARCHES)))
    446 all: $(ARM_OUTDIR)/$(1)_arm.map
    447 $(ARM_OUTDIR)/$(1)_arm.map: $(ARM_OUTDIR)/$(2)_arm.nexe
    448 	$(call LOG,MAP,$$@,$(ARM_NM) -l $$^ > $$@ )
    449 endif
    450 endef
    451 
    452 
    453 #
    454 # Top-level MAP Generation Macro
    455 #
    456 # $1 = Target Basename
    457 # $2 = Source Basename
    458 #
    459 define MAP_RULE
    460 $(call MAP_ALL_RULE,$(1),$(2))
    461 endef
    462 
    463 
    464 #
    465 # NMF Manifiest generation
    466 #
    467 # Use the python script create_nmf to scan the binaries for dependencies using
    468 # objdump.  Pass in the (-L) paths to the default library toolchains so that we
    469 # can find those libraries and have it automatically copy the files (-s) to
    470 # the target directory for us.
    471 #
    472 # $1 = Target Name (the basename of the nmf
    473 # $2 = Additional create_nmf.py arguments
    474 #
    475 NMF := python $(NACL_SDK_ROOT)/tools/create_nmf.py
    476 ifeq ($(CONFIG),Debug)
    477 NMF_FLAGS += --debug-libs
    478 HTML_FLAGS += --debug-libs
    479 endif
    480 
    481 EXECUTABLES = $(GLIBC_SO_LIST)
    482 ifneq (,$(findstring x86_32,$(ARCHES)))
    483 EXECUTABLES += $(X86_32_OUTDIR)/$(1)_x86_32.nexe
    484 endif
    485 ifneq (,$(findstring x86_64,$(ARCHES)))
    486 EXECUTABLES += $(X86_64_OUTDIR)/$(1)_x86_64.nexe
    487 endif
    488 ifneq (,$(findstring arm,$(ARCHES)))
    489 EXECUTABLES += $(ARM_OUTDIR)/$(1)_arm.nexe
    490 endif
    491 
    492 ifneq (,$(MULTI_PLATFORM))
    493 # When building a multi-platform package, stage all dependent shared libraries
    494 # in the same directory as the .nexe (which will be an architecture-specific
    495 # directory under _platform_specific).
    496 NMF_FLAGS += -s $(OUTDIR) --no-arch-prefix
    497 else
    498 # Otherwise stage dependent libraries the normal way, under lib32 for x86_32
    499 # libraries, and lib64 for x86_64 libraries.
    500 NMF_FLAGS += -s $(OUTDIR)
    501 endif
    502 
    503 ifneq (,$(MULTI_PLATFORM))
    504 # This script fixes the manifest.json file for this App to point to:
    505 #
    506 #   <toolchain>/<config>/_platform_specific/<arch>/
    507 #
    508 # instead of
    509 #
    510 #   _platform_specific/<arch>
    511 FIX_MANIFEST := python $(NACL_SDK_ROOT)/tools/fix_manifest.py
    512 MANIFEST_JSON ?= manifest.json
    513 endif
    514 
    515 define NMF_RULE
    516 all: $(OUTDIR)/$(1).nmf
    517 $(OUTDIR)/$(1).nmf $(MANIFEST_JSON): $(EXECUTABLES)
    518 	$(call LOG,CREATE_NMF,$$@,$(NMF) $(NMF_FLAGS) -o $$@ $$^ $(GLIBC_PATHS) $(2) $(GLIBC_REMAP))
    519 ifneq (,$(MULTI_PLATFORM))
    520 	$(call LOG,FIX_MANIFEST,$(MANIFEST_JSON),$(FIX_MANIFEST) $(MANIFEST_JSON)) -p "$(TOOLCHAIN)/$(CONFIG)"
    521 endif
    522 endef
    523 
    524 #
    525 # HTML file generation
    526 #
    527 CREATE_HTML := python $(NACL_SDK_ROOT)/tools/create_html.py
    528 
    529 define HTML_RULE
    530 all: $(OUTDIR)/$(1).html
    531 $(OUTDIR)/$(1).html: $(EXECUTABLES)
    532 	$(call LOG,CREATE_HTML,$$@,$(CREATE_HTML) $(HTML_FLAGS) -o $$@ $$^)
    533 endef
    534 
    535 
    536 #
    537 # Determine which executable to pass into the debugger.  For newlib
    538 # this is the NEXE which will actually be used.  For glibc, runnable-ld.so
    539 # is the "app", and the "app" is actual an .so we load.
    540 #
    541 ifeq (x86_32,$(SYSARCH))
    542 LIB_NAME = lib32
    543 else
    544 LIB_NAME = lib64
    545 endif
    546 
    547 
    548 ifeq (newlib,$(TOOLCHAIN))
    549 GDB_DEBUG_TARGET = $(abspath $(OUTDIR))/$(TARGET)_$(SYSARCH).nexe
    550 else
    551 GDB_DEBUG_TARGET = $(abspath $(OUTDIR))/$(LIB_NAME)/runnable-ld.so
    552 endif
    553 
    554 ifdef STANDALONE
    555 run: all
    556 ifndef NACL_ARCH
    557 	$(error Cannot run in sel_ldr unless $$NACL_ARCH is set)
    558 endif
    559 	$(SEL_LDR_PATH) $(SEL_LDR_ARGS) $(OUTDIR)/$(TARGET)_$(NACL_ARCH).nexe -- $(EXE_ARGS)
    560 
    561 debug: all
    562 ifndef NACL_ARCH
    563 	$(error Cannot run in sel_ldr unless $$NACL_ARCH is set)
    564 endif
    565 	$(SEL_LDR_PATH) -d $(SEL_LDR_ARGS) $(OUTDIR)/$(TARGET)_$(NACL_ARCH).nexe -- $(EXE_ARGS)
    566 endif
    567