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# 13ifneq ($(TOOLCHAIN),bionic) 14X86_32_CC := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=cc) 15X86_32_CXX := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=c++) 16X86_32_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=c++) 17X86_32_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=ar) 18X86_32_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=strip) 19X86_32_NM := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_32 --tool=nm) 20 21X86_64_CC := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=cc) 22X86_64_CXX := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=c++) 23X86_64_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=c++) 24X86_64_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=ar) 25X86_64_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=strip) 26X86_64_NM := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a x86_64 --tool=nm) 27endif 28 29ifeq (,$(findstring $(TOOLCHAIN),glibc)) 30ARM_CC := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=cc) 31ARM_CXX := $(NACL_COMPILER_PREFIX) $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=c++) 32ARM_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=c++) 33ARM_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=ar) 34ARM_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=strip) 35ARM_NM := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) -a arm --tool=nm) 36endif 37 38NCVAL ?= python $(NACL_SDK_ROOT)/tools/ncval.py 39 40# Architecture-specific variables 41ifeq (,$(MULTI_PLATFORM)) 42X86_32_OUTDIR ?= $(OUTDIR) 43X86_64_OUTDIR ?= $(OUTDIR) 44ARM_OUTDIR ?= $(OUTDIR) 45else 46X86_32_OUTDIR ?= $(OUTDIR)/_platform_specific/x86-32 47X86_64_OUTDIR ?= $(OUTDIR)/_platform_specific/x86-64 48ARM_OUTDIR ?= $(OUTDIR)/_platform_specific/arm 49endif 50 51# Architecture-specific flags 52X86_32_CFLAGS ?= 53X86_64_CFLAGS ?= 54X86_32_CXXFLAGS ?= 55X86_64_CXXFLAGS ?= 56 57# Use DWARF v3 which is more commonly available when debugging 58ifeq ($(CONFIG),Debug) 59ARM_CFLAGS ?= -gdwarf-3 60ARM_CXXFLAGS ?= -gdwarf-3 61else 62ARM_CFLAGS ?= 63ARM_CXXFLAGS ?= 64endif 65 66ifeq (,$(MULTI_PLATFORM)) 67X86_32_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_x86_32.map 68X86_64_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_x86_64.map 69ARM_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_arm.map 70else 71X86_32_LDFLAGS ?= -Wl,-Map,$(X86_32_OUTDIR)/$(TARGET)_x86_32.map 72X86_64_LDFLAGS ?= -Wl,-Map,$(X86_64_OUTDIR)/$(TARGET)_x86_64.map 73ARM_LDFLAGS ?= -Wl,-Map,$(ARM_OUTDIR)/$(TARGET)_arm.map 74endif 75 76# 77# Choose between static and dynamic linking for Bionic 78# (Default to dynamic) 79# 80ifeq ($(TOOLCHAIN),bionic) 81ifeq (,$(BIONIC_USE_DYNAMIC)) 82BIONIC_LINK:=-static 83else 84BIONIC_LINK:=-Wl,-Ttext-segment=0x100000 85endif 86endif 87 88LDFLAGS_SHARED = -shared 89 90# 91# Compile Macro 92# 93# $1 = Source Name 94# $2 = Compile Flags 95# 96define 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) 126endef 127 128define 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) 158endef 159 160 161# 162# $1 = Source Name 163# $2 = POSIX Compile Flags 164# $3 = Include Directories 165# $4 = VC Flags (unused) 166# 167define COMPILE_RULE 168ifeq ($(suffix $(1)),.c) 169$(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3)) 170else 171$(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3)) 172endif 173endef 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# 179ifneq ($(TOOLCHAIN),bionic) 180VALID_ARCHES := x86_32 x86_64 181endif 182ifneq (glibc,$(TOOLCHAIN)) 183VALID_ARCHES += arm 184endif 185 186ifdef NACL_ARCH 187ifeq (,$(findstring $(NACL_ARCH),$(VALID_ARCHES))) 188$(error Invalid arch specified in NACL_ARCH: $(NACL_ARCH). Valid values are: $(VALID_ARCHES)) 189endif 190ARCHES = ${NACL_ARCH} 191else 192ARCHES ?= ${VALID_ARCHES} 193endif 194 195GLIBC_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# 212define SO_LINKER_RULE 213ifneq (,$(findstring x86_32,$(ARCHES))) 214all: $(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 221install: $(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 $$^ $$@) 225ifneq ($(6),1) 226GLIBC_SO_LIST += $(X86_32_OUTDIR)/lib$(1)_x86_32.so 227GLIBC_REMAP += -n lib$(1)_x86_32.so,lib$(1).so 228endif 229endif 230 231ifneq (,$(findstring x86_64,$(ARCHES))) 232all: $(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 239install: $(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 $$^ $$@) 243ifneq ($(6),1) 244GLIBC_SO_LIST += $(X86_64_OUTDIR)/lib$(1)_x86_64.so 245GLIBC_REMAP += -n lib$(1)_x86_64.so,lib$(1).so 246endif 247endif 248 249ifneq (,$(findstring arm,$(ARCHES))) 250all: $(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 257install: $(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 $$^ $$@) 261ifneq ($(6),1) 262GLIBC_SO_LIST += $(ARM_OUTDIR)/lib$(1)_arm.so 263GLIBC_REMAP += -n lib$(1)_arm.so,lib$(1).so 264endif 265endif 266endef 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# 275define SO_RULE 276$(call SO_LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(LIB_PATHS),$(5)) 277endef 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# 287define LIB_RULE 288$(STAMPDIR)/$(1).stamp: 289 @echo " STAMP $$@" 290 @echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp 291 292ifneq (,$(findstring x86_32,$(ARCHES))) 293all: $(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 300install: $(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 $$^ $$@) 305endif 306 307ifneq (,$(findstring x86_64,$(ARCHES))) 308all: $(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 315install: $(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 $$^ $$@) 319endif 320 321ifneq (,$(findstring arm,$(ARCHES))) 322ifneq ($(TOOLCHAIN),glibc) 323all: $(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 330install: $(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 $$^ $$@) 334endif 335endif 336endef 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# 349define LINKER_RULE 350ifneq (,$(findstring x86_32,$(ARCHES))) 351all: $(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) $$@) 356endif 357 358ifneq (,$(findstring x86_64,$(ARCHES))) 359all: $(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) $$@) 364endif 365 366ifneq (,$(findstring arm,$(ARCHES))) 367all: $(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) $$@) 372endif 373endef 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# 386define LINK_RULE 387$(call LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(5),$(LIB_PATHS)) 388endef 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# 397define STRIP_ALL_RULE 398ifneq (,$(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 $$@ $$^) 401endif 402 403ifneq (,$(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 $$@ $$^) 406endif 407 408ifneq (,$(findstring arm,$(ARCHES))) 409$(ARM_OUTDIR)/$(1)_arm.nexe: $(ARM_OUTDIR)/$(2)_arm.nexe 410 $(call LOG,STRIP,$$@,$(ARM_STRIP) -o $$@ $$^) 411endif 412endef 413 414 415# 416# Top-level Strip Macro 417# 418# $1 = Target Basename 419# $2 = Source Basename 420# 421define STRIP_RULE 422$(call STRIP_ALL_RULE,$(1),$(2)) 423endef 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# 432define MAP_ALL_RULE 433ifneq (,$(findstring x86_32,$(ARCHES))) 434all: $(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 $$^ > $$@) 437endif 438 439ifneq (,$(findstring x86_64,$(ARCHES))) 440all: $(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 $$^ > $$@) 443endif 444 445ifneq (,$(findstring arm,$(ARCHES))) 446all: $(ARM_OUTDIR)/$(1)_arm.map 447$(ARM_OUTDIR)/$(1)_arm.map: $(ARM_OUTDIR)/$(2)_arm.nexe 448 $(call LOG,MAP,$$@,$(ARM_NM) -l $$^ > $$@ ) 449endif 450endef 451 452 453# 454# Top-level MAP Generation Macro 455# 456# $1 = Target Basename 457# $2 = Source Basename 458# 459define MAP_RULE 460$(call MAP_ALL_RULE,$(1),$(2)) 461endef 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# 475NMF := python $(NACL_SDK_ROOT)/tools/create_nmf.py 476ifeq ($(CONFIG),Debug) 477NMF_FLAGS += --debug-libs 478HTML_FLAGS += --debug-libs 479endif 480 481EXECUTABLES = $(GLIBC_SO_LIST) 482ifneq (,$(findstring x86_32,$(ARCHES))) 483EXECUTABLES += $(X86_32_OUTDIR)/$(1)_x86_32.nexe 484endif 485ifneq (,$(findstring x86_64,$(ARCHES))) 486EXECUTABLES += $(X86_64_OUTDIR)/$(1)_x86_64.nexe 487endif 488ifneq (,$(findstring arm,$(ARCHES))) 489EXECUTABLES += $(ARM_OUTDIR)/$(1)_arm.nexe 490endif 491 492ifneq (,$(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). 496NMF_FLAGS += -s $(OUTDIR) --no-arch-prefix 497else 498# Otherwise stage dependent libraries the normal way, under lib32 for x86_32 499# libraries, and lib64 for x86_64 libraries. 500NMF_FLAGS += -s $(OUTDIR) 501endif 502 503ifneq (,$(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> 511FIX_MANIFEST := python $(NACL_SDK_ROOT)/tools/fix_manifest.py 512MANIFEST_JSON ?= manifest.json 513endif 514 515define NMF_RULE 516all: $(OUTDIR)/$(1).nmf 517$(OUTDIR)/$(1).nmf $(MANIFEST_JSON): $(EXECUTABLES) 518 $(call LOG,CREATE_NMF,$$@,$(NMF) $(NMF_FLAGS) -o $$@ $$^ $(GLIBC_PATHS) $(2) $(GLIBC_REMAP)) 519ifneq (,$(MULTI_PLATFORM)) 520 $(call LOG,FIX_MANIFEST,$(MANIFEST_JSON),$(FIX_MANIFEST) $(MANIFEST_JSON)) -p "$(TOOLCHAIN)/$(CONFIG)" 521endif 522endef 523 524# 525# HTML file generation 526# 527CREATE_HTML := python $(NACL_SDK_ROOT)/tools/create_html.py 528 529define HTML_RULE 530all: $(OUTDIR)/$(1).html 531$(OUTDIR)/$(1).html: $(EXECUTABLES) 532 $(call LOG,CREATE_HTML,$$@,$(CREATE_HTML) $(HTML_FLAGS) -o $$@ $$^) 533endef 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# 541ifeq (x86_32,$(SYSARCH)) 542LIB_NAME = lib32 543else 544LIB_NAME = lib64 545endif 546 547 548ifeq (newlib,$(TOOLCHAIN)) 549GDB_DEBUG_TARGET = $(abspath $(OUTDIR))/$(TARGET)_$(SYSARCH).nexe 550else 551GDB_DEBUG_TARGET = $(abspath $(OUTDIR))/$(LIB_NAME)/runnable-ld.so 552endif 553 554ifdef STANDALONE 555run: all 556ifndef NACL_ARCH 557 $(error Cannot run in sel_ldr unless $$NACL_ARCH is set) 558endif 559 $(SEL_LDR_PATH) $(SEL_LDR_ARGS) $(OUTDIR)/$(TARGET)_$(NACL_ARCH).nexe -- $(EXE_ARGS) 560 561debug: all 562ifndef NACL_ARCH 563 $(error Cannot run in sel_ldr unless $$NACL_ARCH is set) 564endif 565 $(SEL_LDR_PATH) -d $(SEL_LDR_ARGS) $(OUTDIR)/$(TARGET)_$(NACL_ARCH).nexe -- $(EXE_ARGS) 566endif 567