nacl_gcc.mk revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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# 13# Default Paths 14# 15 16LD_X86_32:=-L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG) 17LD_X86_64:=-L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG) 18LD_ARM:=-L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG) 19 20 21# 22# Macros for TOOLS 23# 24# We always link with the C++ compiler but include -Wl,-as-needed flag 25# in LD_FLAGS so the linker should drop libc++ unless it's actually needed. 26# 27X86_32_CC?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/i686-nacl-gcc 28X86_32_CXX?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/i686-nacl-g++ 29X86_32_LINK?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/i686-nacl-g++ 30X86_32_LIB?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/i686-nacl-ar 31 32X86_64_CC?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/x86_64-nacl-gcc 33X86_64_CXX?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/x86_64-nacl-g++ 34X86_64_LINK?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/x86_64-nacl-g++ 35X86_64_LIB?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/x86_64-nacl-ar 36 37ARM_CC?=$(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin/arm-nacl-gcc 38ARM_CXX?=$(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin/arm-nacl-g++ 39ARM_LINK?=$(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin/arm-nacl-g++ 40ARM_LIB?=$(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin/arm-nacl-ar 41 42 43# 44# Compile Macro 45# 46# $1 = Source Name 47# $2 = Compile Flags 48# 49define C_COMPILER_RULE 50-include $(call SRC_TO_DEP,$(1),_x86_32) 51$(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp 52 $(call LOG,CC,$$@,$(X86_32_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS)) 53 54-include $(call SRC_TO_DEP,$(1),_x86_64) 55$(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp 56 $(call LOG,CC,$$@,$(X86_64_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS)) 57 58-include $(call SRC_TO_DEP,$(1),_arm) 59$(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp 60 $(call LOG,CC,$$@,$(ARM_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS)) 61endef 62 63define CXX_COMPILER_RULE 64-include $(call SRC_TO_DEP,$(1),_x86_32) 65$(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp 66 $(call LOG,CXX,$$@,$(X86_32_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS)) 67 68-include $(call SRC_TO_DEP,$(1),_x86_64) 69$(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp 70 $(call LOG,CXX,$$@,$(X86_64_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS)) 71 72-include $(call SRC_TO_DEP,$(1),_arm) 73$(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp 74 $(call LOG,CXX,_$$@,$(ARM_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS)) 75endef 76 77 78# 79# $1 = Source Name 80# $2 = POSIX Compile Flags 81# $3 = Include Directories 82# $4 = VC Flags (unused) 83# 84define COMPILE_RULE 85ifeq ($(suffix $(1)),.c) 86$(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3)) 87else 88$(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3)) 89endif 90endef 91 92 93# 94# SO Macro 95# 96# $1 = Target Name 97# $2 = List of Sources 98# $3 = List of LIBS 99# $4 = List of DEPS 100# $5 = 1 => Don't add to NMF. 101# 102# 103GLIBC_REMAP:= 104define SO_RULE 105NMF_TARGETS+=$$(OUTDIR)/$(1)_x86_32.so 106$(OUTDIR)/$(1)_x86_32.so : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) $(4) 107 $(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m32 $$(LD_X86_32) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib))) 108 109NMF_TARGETS+=$(OUTDIR)/$(1)_x86_64.so 110$(OUTDIR)/$(1)_x86_64.so : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) $(4) 111 $(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m64 $(LD_X86_64) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib))) 112 113ifneq (1,$(5)) 114GLIBC_SO_LIST+=$(OUTDIR)/$(1)_x86_32.so $(OUTDIR)/$(1)_x86_64.so 115GLIBC_REMAP+=-n $(1)_x86_32.so,$(1).so 116GLIBC_REMAP+=-n $(1)_x86_64.so,$(1).so 117else 118all: $(OUTDIR)/$(1)_x86_32.so $(OUTDIR)/$(1)_x86_64.so 119endif 120endef 121 122 123# 124# LIB Macro 125# 126# $1 = Target Name 127# $2 = List of Sources 128# $3 = POSIX Link Flags 129# $4 = VC Link Flags (unused) 130# 131define LIB_RULE 132$(STAMPDIR)/$(1).stamp : $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a 133$(STAMPDIR)/$(1).stamp : $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a 134ifneq ('glibc','$(TOOLCHAIN)') 135$(STAMPDIR)/$(1).stamp : $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a 136endif 137 138$(STAMPDIR)/$(1).stamp : 139 @echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp 140 141all: $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a 142$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) 143 $(MKDIR) -p $$(dir $$@) 144 $(call LOG,LIB,$$@,$(X86_32_LIB) -r $$@ $$^) 145 146all: $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a 147$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) 148 $(MKDIR) -p $$(dir $$@) 149 $(call LOG,LIB,$$@,$(X86_64_LIB) -r $$@ $$^) 150 151ifneq ('glibc','$(TOOLCHAIN)') 152all: $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a 153endif 154$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm)) 155 $(MKDIR) -p $$(dir $$@) 156 $(call LOG,LIB,$$@,$(ARM_LIB) -r $$@ $$^) 157endef 158 159 160# 161# Specific Link Macro 162# 163# $1 = Target Name 164# $2 = List of Sources 165# $3 = List of LIBS 166# $4 = List of DEPS 167# $5 = POSIX Link Flags 168# $6 = Library Paths 169# 170define LINKER_RULE 171$(OUTDIR)/$(1)_x86_32.nexe : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp) 172 $(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_x86_32/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5)) 173 174$(OUTDIR)/$(1)_x86_64.nexe : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp) 175 $(call LOG,LINK,$$@,$(X86_64_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_x86_64/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5)) 176 177$(OUTDIR)/$(1)_arm.nexe : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp) 178 $(call LOG,LINK,$$@,$(ARM_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_arm/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5)) 179endef 180 181 182# 183# Generalized Link Macro 184# 185# $1 = Target Name 186# $2 = List of Sources 187# $3 = List of LIBS 188# $4 = List of DEPS 189# $5 = POSIX Linker Switches 190# $6 = VC Linker Switches 191# 192define LINK_RULE 193$(call LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(5),$(LIB_PATHS)) 194endef 195 196 197# 198# Determine which architectures to build for. The user can set NACL_ARCH or 199# ARCHES in the environment to control this. 200# 201VALID_ARCHES:=x86_32 x86_64 202ifeq (newlib,$(TOOLCHAIN)) 203VALID_ARCHES+=arm 204endif 205 206ifdef NACL_ARCH 207ifeq (,$(findstring $(NACL_ARCH),$(VALID_ARCHES))) 208$(error Invalid arch specified in NACL_ARCH: $(NACL_ARCH). Valid values are: $(VALID_ARCHES)) 209endif 210ARCHES=${NACL_ARCH} 211else 212ARCHES?=${VALID_ARCHES} 213endif 214 215# 216# Generate NMF_TARGETS 217# 218NMF_ARCHES:=$(foreach arch,$(ARCHES),_$(arch).nexe) 219 220 221# 222# NMF Manifiest generation 223# 224# Use the python script create_nmf to scan the binaries for dependencies using 225# objdump. Pass in the (-L) paths to the default library toolchains so that we 226# can find those libraries and have it automatically copy the files (-s) to 227# the target directory for us. 228# 229# $1 = Target Name (the basename of the nmf 230# $2 = Additional create_nmf.py arguments 231# 232NMF:=python $(NACL_SDK_ROOT)/tools/create_nmf.py 233GLIBC_DUMP:=$(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/bin/objdump 234GLIBC_PATHS:=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib32 235GLIBC_PATHS+=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib 236 237define NMF_RULE 238all:$(OUTDIR)/$(1).nmf 239$(OUTDIR)/$(1).nmf : $(foreach arch,$(NMF_ARCHES),$(OUTDIR)/$(1)$(arch)) $(GLIBC_SO_LIST) 240 $(call LOG,CREATE_NMF,$$@,$(NMF) -o $$@ $$^ -D $(GLIBC_DUMP) $(GLIBC_PATHS) -s $(OUTDIR) $(2) $(GLIBC_REMAP)) 241endef 242