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 #
     12 # Default library paths
     13 #
     14 LD_X86_32 := -L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)
     15 LD_X86_64 := -L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)
     16 LD_ARM := -L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)
     17 
     18 
     19 #
     20 # Macros for TOOLS
     21 #
     22 # We always link with the C++ compiler but include -Wl,-as-needed flag
     23 # in LD_FLAGS so the linker should drop libc++ unless it's actually needed.
     24 #
     25 X86_TC_BIN ?= $(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin
     26 ARM_TC_BIN ?= $(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin
     27 
     28 X86_32_CC ?= $(NACL_COMPILER_PREFIX) $(X86_TC_BIN)/i686-nacl-gcc
     29 X86_32_CXX ?= $(NACL_COMPILER_PREFIX) $(X86_TC_BIN)/i686-nacl-g++
     30 X86_32_LINK ?= $(X86_TC_BIN)/i686-nacl-g++
     31 X86_32_LIB ?= $(X86_TC_BIN)/i686-nacl-ar
     32 X86_32_STRIP ?= $(X86_TC_BIN)/i686-nacl-strip
     33 X86_32_NM ?= $(X86_TC_BIN)/i686-nacl-nm
     34 
     35 X86_64_CC ?= $(NACL_COMPILER_PREFIX) $(X86_TC_BIN)/x86_64-nacl-gcc
     36 X86_64_CXX ?= $(NACL_COMPILER_PREFIX) $(X86_TC_BIN)/x86_64-nacl-g++
     37 X86_64_LINK ?= $(X86_TC_BIN)/x86_64-nacl-g++
     38 X86_64_LIB ?= $(X86_TC_BIN)/x86_64-nacl-ar
     39 X86_64_STRIP ?= $(X86_TC_BIN)/x86_64-nacl-strip
     40 X86_64_NM ?= $(X86_TC_BIN)/x86_64-nacl-nm
     41 
     42 ARM_CC ?= $(NACL_COMPILER_PREFIX) $(ARM_TC_BIN)/arm-nacl-gcc
     43 ARM_CXX ?= $(NACL_COMPILER_PREFIX) $(ARM_TC_BIN)/arm-nacl-g++
     44 ARM_LINK ?= $(ARM_TC_BIN)/arm-nacl-g++
     45 ARM_LIB ?= $(ARM_TC_BIN)/arm-nacl-ar
     46 ARM_STRIP ?= $(ARM_TC_BIN)/arm-nacl-strip
     47 ARM_NM ?= $(ARM_TC_BIN)/arm-nacl-nm
     48 
     49 # Architecture-specific flags
     50 X86_32_CFLAGS ?=
     51 X86_64_CFLAGS ?=
     52 ARM_CFLAGS ?=
     53 
     54 X86_32_CXXFLAGS ?=
     55 X86_64_CXXFLAGS ?=
     56 ARM_CXXFLAGS ?=
     57 
     58 X86_32_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_x86_32.map
     59 X86_64_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_x86_64.map
     60 ARM_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_arm.map
     61 
     62 #
     63 # Compile Macro
     64 #
     65 # $1 = Source Name
     66 # $2 = Compile Flags
     67 #
     68 define C_COMPILER_RULE
     69 -include $(call SRC_TO_DEP,$(1),_x86_32)
     70 $(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     71 	$(call LOG,CC  ,$$@,$(X86_32_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_32_CFLAGS))
     72 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32)
     73 
     74 -include $(call SRC_TO_DEP,$(1),_x86_64)
     75 $(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     76 	$(call LOG,CC  ,$$@,$(X86_64_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_64_CFLAGS))
     77 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64)
     78 
     79 -include $(call SRC_TO_DEP,$(1),_arm)
     80 $(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     81 	$(call LOG,CC  ,$$@,$(ARM_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(ARM_CFLAGS))
     82 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm)
     83 
     84 -include $(call SRC_TO_DEP,$(1),_x86_32_pic)
     85 $(call SRC_TO_OBJ,$(1),_x86_32_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     86 	$(call LOG,CC  ,$$@,$(X86_32_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_32_CFLAGS))
     87 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32_pic)
     88 
     89 -include $(call SRC_TO_DEP,$(1),_x86_64_pic)
     90 $(call SRC_TO_OBJ,$(1),_x86_64_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     91 	$(call LOG,CC  ,$$@,$(X86_64_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_64_CFLAGS))
     92 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64_pic)
     93 
     94 -include $(call SRC_TO_DEP,$(1),_arm_pic)
     95 $(call SRC_TO_OBJ,$(1),_arm_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     96 	$(call LOG,CC  ,$$@,$(ARM_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(ARM_CFLAGS))
     97 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm_pic)
     98 endef
     99 
    100 define CXX_COMPILER_RULE
    101 -include $(call SRC_TO_DEP,$(1),_x86_32)
    102 $(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    103 	$(call LOG,CXX ,$$@,$(X86_32_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_32_CXXFLAGS))
    104 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32)
    105 
    106 -include $(call SRC_TO_DEP,$(1),_x86_64)
    107 $(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    108 	$(call LOG,CXX ,$$@,$(X86_64_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_64_CXXFLAGS))
    109 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64)
    110 
    111 -include $(call SRC_TO_DEP,$(1),_arm)
    112 $(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    113 	$(call LOG,CXX ,$$@,$(ARM_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(ARM_CXXFLAGS))
    114 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm)
    115 
    116 -include $(call SRC_TO_DEP,$(1),_x86_32_pic)
    117 $(call SRC_TO_OBJ,$(1),_x86_32_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    118 	$(call LOG,CXX ,$$@,$(X86_32_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_32_CXXFLAGS))
    119 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32_pic)
    120 
    121 -include $(call SRC_TO_DEP,$(1),_x86_64_pic)
    122 $(call SRC_TO_OBJ,$(1),_x86_64_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    123 	$(call LOG,CXX ,$$@,$(X86_64_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_64_CXXFLAGS))
    124 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64_pic)
    125 
    126 -include $(call SRC_TO_DEP,$(1),_arm_pic)
    127 $(call SRC_TO_OBJ,$(1),_arm_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
    128 	$(call LOG,CXX ,$$@,$(ARM_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(ARM_CXXFLAGS))
    129 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm_pic)
    130 endef
    131 
    132 
    133 #
    134 # $1 = Source Name
    135 # $2 = POSIX Compile Flags
    136 # $3 = Include Directories
    137 # $4 = VC Flags (unused)
    138 #
    139 define COMPILE_RULE
    140 ifeq ($(suffix $(1)),.c)
    141 $(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
    142 else
    143 $(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
    144 endif
    145 endef
    146 
    147 #
    148 # Determine which architectures to build for.  The user can set NACL_ARCH or
    149 # ARCHES in the environment to control this.
    150 #
    151 VALID_ARCHES := x86_32 x86_64
    152 ifeq (newlib,$(TOOLCHAIN))
    153 VALID_ARCHES += arm
    154 endif
    155 
    156 ifdef NACL_ARCH
    157 ifeq (,$(findstring $(NACL_ARCH),$(VALID_ARCHES)))
    158 $(error Invalid arch specified in NACL_ARCH: $(NACL_ARCH).  Valid values are: $(VALID_ARCHES))
    159 endif
    160 ARCHES = ${NACL_ARCH}
    161 else
    162 ARCHES ?= ${VALID_ARCHES}
    163 endif
    164 
    165 GLIBC_REMAP :=
    166 
    167 #
    168 # SO Macro
    169 #
    170 # As well as building and installing a shared library this rule adds dependencies
    171 # on the library's .stamp file in STAMPDIR.  However, the rule for creating the stamp
    172 # file is part of LIB_RULE, so users of the DEPS system are currently required to
    173 # use the LIB_RULE macro as well as the SO_RULE for each shared library.
    174 #
    175 # $1 = Target Name
    176 # $2 = List of Sources
    177 # $3 = List of LIBS
    178 # $4 = List of DEPS
    179 # $5 = 1 => Don't add to NMF.
    180 #
    181 define SO_RULE
    182 ifneq (,$(findstring x86_32,$(ARCHES)))
    183 all: $(OUTDIR)/lib$(1)_x86_32.so
    184 $(OUTDIR)/lib$(1)_x86_32.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32_pic)) $(4)
    185 	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m32 $(LD_X86_32) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib)))
    186 
    187 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so
    188 install: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so
    189 $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so: $(OUTDIR)/lib$(1)_x86_32.so
    190 	$(MKDIR) -p $$(dir $$@)
    191 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    192 ifneq ($(5),1)
    193 GLIBC_SO_LIST += $(OUTDIR)/lib$(1)_x86_32.so
    194 GLIBC_REMAP += -n lib$(1)_x86_32.so,lib$(1).so
    195 endif
    196 endif
    197 
    198 ifneq (,$(findstring x86_64,$(ARCHES)))
    199 all: $(OUTDIR)/lib$(1)_x86_64.so
    200 $(OUTDIR)/lib$(1)_x86_64.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64_pic)) $(4)
    201 	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m64 $(LD_X86_64) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib)))
    202 
    203 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so
    204 install: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so
    205 $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so: $(OUTDIR)/lib$(1)_x86_64.so
    206 	$(MKDIR) -p $$(dir $$@)
    207 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    208 ifneq ($(5),1)
    209 GLIBC_SO_LIST += $(OUTDIR)/lib$(1)_x86_64.so
    210 GLIBC_REMAP += -n lib$(1)_x86_64.so,lib$(1).so
    211 endif
    212 endif
    213 endef
    214 
    215 #
    216 # LIB Macro
    217 #
    218 # $1 = Target Name
    219 # $2 = List of Sources
    220 # $3 = POSIX Link Flags
    221 # $4 = VC Link Flags (unused)
    222 #
    223 define LIB_RULE
    224 $(STAMPDIR)/$(1).stamp:
    225 	@echo "  STAMP $$@"
    226 	@echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp
    227 
    228 ifneq (,$(findstring x86_32,$(ARCHES)))
    229 all: $(OUTDIR)/lib$(1)_x86_32.a
    230 $(OUTDIR)/lib$(1)_x86_32.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32))
    231 	$(MKDIR) -p $$(dir $$@)
    232 	$(call LOG,LIB ,$$@,$(X86_32_LIB) -cr $$@ $$^)
    233 
    234 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
    235 install: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
    236 $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_x86_32.a
    237 	$(MKDIR) -p $$(dir $$@)
    238 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    239 endif
    240 
    241 ifneq (,$(findstring x86_64,$(ARCHES)))
    242 all: $(OUTDIR)/lib$(1)_x86_64.a
    243 $(OUTDIR)/lib$(1)_x86_64.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64))
    244 	$(MKDIR) -p $$(dir $$@)
    245 	$(call LOG,LIB ,$$@,$(X86_64_LIB) -cr $$@ $$^)
    246 
    247 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
    248 install: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
    249 $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_x86_64.a
    250 	$(MKDIR) -p $$(dir $$@)
    251 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    252 endif
    253 
    254 ifneq (,$(findstring arm,$(ARCHES)))
    255 ifneq ($(TOOLCHAIN),glibc)
    256 all: $(OUTDIR)/lib$(1)_arm.a
    257 $(OUTDIR)/lib$(1)_arm.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm))
    258 	$(MKDIR) -p $$(dir $$@)
    259 	$(call LOG,LIB ,$$@,$(ARM_LIB) -cr $$@ $$^)
    260 
    261 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
    262 install: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
    263 $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_arm.a
    264 	$(MKDIR) -p $$(dir $$@)
    265 	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
    266 endif
    267 endif
    268 endef
    269 
    270 
    271 #
    272 # Specific Link Macro
    273 #
    274 # $1 = Target Name
    275 # $2 = List of Sources
    276 # $3 = List of LIBS
    277 # $4 = List of DEPS
    278 # $5 = POSIX Link Flags
    279 # $6 = Library Paths
    280 #
    281 define LINKER_RULE
    282 ifneq (,$(findstring x86_32,$(ARCHES)))
    283 all: $(OUTDIR)/$(1)_x86_32.nexe
    284 $(OUTDIR)/$(1)_x86_32.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    285 	$(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))
    286 endif
    287 
    288 ifneq (,$(findstring x86_64,$(ARCHES)))
    289 all: $(OUTDIR)/$(1)_x86_64.nexe
    290 $(OUTDIR)/$(1)_x86_64.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    291 	$(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))
    292 endif
    293 
    294 ifneq (,$(findstring arm,$(ARCHES)))
    295 all: $(OUTDIR)/$(1)_arm.nexe
    296 $(OUTDIR)/$(1)_arm.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    297 	$(call LOG,LINK,$$@,$(ARM_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(ARM_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_arm/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
    298 endif
    299 endef
    300 
    301 
    302 #
    303 # Generalized Link Macro
    304 #
    305 # $1 = Target Name
    306 # $2 = List of Sources
    307 # $3 = List of LIBS
    308 # $4 = List of DEPS
    309 # $5 = POSIX Linker Switches
    310 # $6 = VC Linker Switches
    311 #
    312 define LINK_RULE
    313 $(call LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(5),$(LIB_PATHS))
    314 endef
    315 
    316 
    317 #
    318 # Strip Macro for each arch (e.g., each arch supported by LINKER_RULE).
    319 #
    320 # $1 = Target Name
    321 # $2 = Source Name
    322 #
    323 define STRIP_ALL_RULE
    324 ifneq (,$(findstring x86_32,$(ARCHES)))
    325 $(OUTDIR)/$(1)_x86_32.nexe: $(OUTDIR)/$(2)_x86_32.nexe
    326 	$(call LOG,STRIP,$$@,$(X86_32_STRIP) -o $$@ $$^)
    327 endif
    328 
    329 ifneq (,$(findstring x86_64,$(ARCHES)))
    330 $(OUTDIR)/$(1)_x86_64.nexe: $(OUTDIR)/$(2)_x86_64.nexe
    331 	$(call LOG,STRIP,$$@,$(X86_64_STRIP) -o $$@ $$^)
    332 endif
    333 
    334 ifneq (,$(findstring arm,$(ARCHES)))
    335 $(OUTDIR)/$(1)_arm.nexe: $(OUTDIR)/$(2)_arm.nexe
    336 	$(call LOG,STRIP,$$@,$(ARM_STRIP) -o $$@ $$^)
    337 endif
    338 endef
    339 
    340 
    341 #
    342 # Top-level Strip Macro
    343 #
    344 # $1 = Target Basename
    345 # $2 = Source Basename
    346 #
    347 define STRIP_RULE
    348 $(call STRIP_ALL_RULE,$(1),$(2))
    349 endef
    350 
    351 
    352 #
    353 # Strip Macro for each arch (e.g., each arch supported by MAP_RULE).
    354 #
    355 # $1 = Target Name
    356 # $2 = Source Name
    357 #
    358 define MAP_ALL_RULE
    359 ifneq (,$(findstring x86_32,$(ARCHES)))
    360 all: $(OUTDIR)/$(1)_x86_32.map
    361 $(OUTDIR)/$(1)_x86_32.map: $(OUTDIR)/$(2)_x86_32.nexe
    362 	$(call LOG,MAP,$$@,$(X86_32_NM) -l $$^ > $$@)
    363 endif
    364 
    365 ifneq (,$(findstring x86_64,$(ARCHES)))
    366 all: $(OUTDIR)/$(1)_x86_64.map
    367 $(OUTDIR)/$(1)_x86_64.map: $(OUTDIR)/$(2)_x86_64.nexe
    368 	$(call LOG,MAP,$$@,$(X86_64_NM) -l $$^ > $$@)
    369 endif
    370 
    371 ifneq (,$(findstring arm,$(ARCHES)))
    372 all: $(OUTDIR)/$(1)_arm.map
    373 $(OUTDIR)/$(1)_arm.map: $(OUTDIR)/$(2)_arm.nexe
    374 	$(call LOG,MAP,$$@,$(ARM_NM) -l $$^ > $$@ )
    375 endif
    376 endef
    377 
    378 
    379 #
    380 # Top-level MAP Generation Macro
    381 #
    382 # $1 = Target Basename
    383 # $2 = Source Basename
    384 #
    385 define MAP_RULE
    386 $(call MAP_ALL_RULE,$(1),$(2))
    387 endef
    388 
    389 
    390 #
    391 # Generate ARCH_SUFFIXES, a list of suffixes for executables corresponding to all
    392 # the architectures in the current build.
    393 #
    394 ARCH_SUFFIXES := $(foreach arch,$(ARCHES),_$(arch).nexe)
    395 
    396 
    397 #
    398 # NMF Manifiest generation
    399 #
    400 # Use the python script create_nmf to scan the binaries for dependencies using
    401 # objdump.  Pass in the (-L) paths to the default library toolchains so that we
    402 # can find those libraries and have it automatically copy the files (-s) to
    403 # the target directory for us.
    404 #
    405 # $1 = Target Name (the basename of the nmf
    406 # $2 = Additional create_nmf.py arguments
    407 #
    408 NMF := python $(NACL_SDK_ROOT)/tools/create_nmf.py
    409 ifeq ($(CONFIG),Debug)
    410 NMF_FLAGS += --debug-libs
    411 HTML_FLAGS += --debug-libs
    412 endif
    413 
    414 EXECUTABLES=$(foreach arch,$(ARCH_SUFFIXES),$(OUTDIR)/$(1)$(arch)) $(GLIBC_SO_LIST)
    415 
    416 define NMF_RULE
    417 all: $(OUTDIR)/$(1).nmf
    418 $(OUTDIR)/$(1).nmf: $(EXECUTABLES)
    419 	$(call LOG,CREATE_NMF,$$@,$(NMF) $(NMF_FLAGS) -o $$@ $$^ $(GLIBC_PATHS) -s $(OUTDIR) $(2) $(GLIBC_REMAP))
    420 endef
    421 
    422 #
    423 # HTML file generation
    424 #
    425 CREATE_HTML := python $(NACL_SDK_ROOT)/tools/create_html.py
    426 
    427 define HTML_RULE
    428 all: $(OUTDIR)/$(1).html
    429 $(OUTDIR)/$(1).html: $(EXECUTABLES)
    430 	$(call LOG,CREATE_HTML,$$@,$(CREATE_HTML) $(HTML_FLAGS) -o $$@ $$^)
    431 endef
    432 
    433 
    434 #
    435 # Determine which executable to pass into the debugger.  For newlib
    436 # this is the NEXE which will actually be used.  For glibc, runnable-ld.so
    437 # is the "app", and the "app" is actual an .so we load.
    438 #
    439 ifeq (x86_32,$(SYSARCH))
    440 LIB_NAME = lib32
    441 else
    442 LIB_NAME = lib64
    443 endif
    444 
    445 
    446 ifeq (newlib,$(TOOLCHAIN))
    447 GDB_DEBUG_TARGET = $(abspath $(OUTDIR))/$(TARGET)_$(SYSARCH).nexe
    448 else
    449 GDB_DEBUG_TARGET = $(abspath $(OUTDIR))/$(LIB_NAME)/runnable-ld.so
    450 endif
    451