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 # Macros for TOOLS 13 # 14 # We use the C++ compiler for everything and then use the -Wl,-as-needed flag 15 # in the linker to drop libc++ unless it's actually needed. 16 # 17 CC ?= $(NACL_COMPILER_PREFIX) gcc 18 CXX ?= $(NACL_COMPILER_PREFIX) g++ 19 LINK ?= $(CXX) 20 LIB ?= ar 21 STRIP ?= strip 22 23 # Adding -Wl,-Bsymbolic means that symbols defined within the module are always 24 # used by the moulde, and not shadowed by symbols already loaded in, for 25 # exmaple, libc. Without this the libc symbols (or anything injected with 26 # LD_PRELOAD will take precedence). 27 HOST_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET).map -Wl,-Bsymbolic 28 29 ifeq (,$(findstring gcc,$(shell $(WHICH) gcc))) 30 $(warning To skip the host build use:) 31 $(warning "make all_versions NO_HOST_BUILDS=1") 32 $(error Unable to find gcc in PATH while building Host build) 33 endif 34 35 HOST_WARNINGS ?= -Wno-long-long -Wall -Werror 36 HOST_CFLAGS = -fPIC -pthread $(HOST_WARNINGS) -I$(NACL_SDK_ROOT)/include -I$(NACL_SDK_ROOT)/include/linux 37 38 39 # 40 # Individual Macros 41 # 42 # $1 = Source Name 43 # $2 = Compile Flags 44 # 45 define C_COMPILER_RULE 46 -include $(call SRC_TO_DEP,$(1)) 47 $(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp 48 $(call LOG,CC ,$$@,$(CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(HOST_CFLAGS) $(2)) 49 @$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1)) 50 endef 51 52 define CXX_COMPILER_RULE 53 -include $(call SRC_TO_DEP,$(1)) 54 $(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp 55 $(call LOG,CXX ,$$@,$(CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(HOST_CFLAGS) $(2)) 56 @$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1)) 57 endef 58 59 # 60 # Compile Macro 61 # 62 # $1 = Source Name 63 # $2 = POSIX Compile Flags 64 # $3 = VC Flags (unused) 65 # 66 define COMPILE_RULE 67 ifeq ($(suffix $(1)),.c) 68 $(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc))) 69 else 70 $(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc))) 71 endif 72 endef 73 74 75 # 76 # SO Macro 77 # 78 # $1 = Target Name 79 # $2 = List of Sources 80 # 81 # 82 define SO_RULE 83 $(error 'Shared libraries not supported by Host') 84 endef 85 86 87 # 88 # LIB Macro 89 # 90 # $1 = Target Name 91 # $2 = List of Sources 92 # 93 # 94 define LIB_RULE 95 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).a 96 @echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp 97 98 all: $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).a 99 $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src))) 100 $(MKDIR) -p $$(dir $$@) 101 $(RM) -f $$@ 102 $(call LOG,LIB,$$@,$(LIB) -cr $$@ $$^) 103 endef 104 105 106 # 107 # Link Macro 108 # 109 # $1 = Target Name 110 # $2 = List of inputs 111 # $3 = List of libs 112 # $4 = List of deps 113 # $5 = List of lib dirs 114 # $6 = Linker Args 115 # 116 ifdef STANDALONE 117 define LINKER_RULE 118 all: $(1) 119 $(1): $(2) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp) 120 $(call LOG,LINK,$$@,$(LINK) -o $(1) $(2) $(HOST_LDFLAGS) $(NACL_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(OSNAME)_host)/$(CONFIG) $(foreach lib,$(3),-l$(lib)) $(6)) 121 endef 122 else 123 define LINKER_RULE 124 all: $(1) 125 $(1): $(2) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp) 126 $(call LOG,LINK,$$@,$(LINK) -shared -o $(1) $(2) $(HOST_LDFLAGS) $(NACL_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(OSNAME)_host)/$(CONFIG) $(foreach lib,$(3),-l$(lib)) $(6)) 127 endef 128 endif 129 130 131 # 132 # Link Macro 133 # 134 # $1 = Target Name 135 # $2 = List of Sources 136 # $3 = List of LIBS 137 # $4 = List of DEPS 138 # $5 = POSIX Linker Switches 139 # $6 = VC Linker Switches 140 # 141 define LINK_RULE 142 $(call LINKER_RULE,$(OUTDIR)/$(1)$(HOST_EXT),$(foreach src,$(2),$(call SRC_TO_OBJ,$(src))),$(filter-out pthread,$(3)),$(4),$(LIB_PATHS),$(5)) 143 endef 144 145 all: $(LIB_LIST) $(DEPS_LIST) 146 147 148 # 149 # Strip Macro 150 # The host build makes shared libraries, so the best we can do is strip-debug. 151 # We cannot strip the symbol names. 152 # 153 # $1 = Target Name 154 # $2 = Input Name 155 # 156 define STRIP_RULE 157 all: $(OUTDIR)/$(1)$(HOST_EXT) 158 $(OUTDIR)/$(1)$(HOST_EXT): $(OUTDIR)/$(2)$(HOST_EXT) 159 $(call LOG,STRIP,$$@,$(STRIP) --strip-debug -o $$@ $$^) 160 endef 161 162 163 # 164 # Run standalone builds (command line builds outside of chrome) 165 # 166 ifdef STANDALONE 167 run: all 168 $(OUTDIR)/$(TARGET)$(HOST_EXT) $(EXE_ARGS) 169 endif 170