# Copyright (c) 2012 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # # GNU Make based build file. For details on GNU Make see: # http://www.gnu.org/software/make/manual/make.html # ifdef ASAN CLANG = 1 endif ifdef TSAN CLANG = 1 endif ifdef MSAN CLANG = 1 endif # # Macros for TOOLS # # We use the C++ compiler for everything and then use the -Wl,-as-needed flag # in the linker to drop libc++ unless it's actually needed. # ifdef CLANG CC = clang CXX = clang++ endif ifdef NACL_COMPILER_PREFIX CC = $(NACL_COMPILER_PREFIX) $(CC) CXX = $(NACL_COMPILER_PREFIX) $(CXX) endif ifeq ($(OSNAME),mac) LINK ?= $(NACL_SDK_ROOT)/tools/mac_ld_wrapper.py $(CXX) #AR = libtool -static -no_warning_for_no_symbols #ARFLAGS = -o else LINK ?= $(CXX) endif AR = ar ARFLAGS = -crs STRIP ?= strip ifeq (,$(findstring gcc,$(shell $(WHICH) gcc))) $(warning To skip the host build use:) $(warning "make all_versions NO_HOST_BUILDS=1") $(error Unable to find gcc in PATH while building Host build) endif HOST_WARNINGS ?= -Wno-long-long -Wall -Werror HOST_CFLAGS = -fPIC -pthread $(HOST_WARNINGS) -I$(NACL_SDK_ROOT)/include ifneq ($(OSNAME),mac) # Adding -Wl,-Bsymbolic means that symbols defined within the module are always # used by the module, and not shadowed by symbols already loaded in, for # exmaple, libc. Without this the libc symbols (or anything injected with # LD_PRELOAD will take precedence). # -pthread is not needed on mac (libpthread is a symlink to libSystem) and # in fact generated a warning if passed at link time. HOST_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET).map -Wl,-Bsymbolic -pthread HOST_CFLAGS += -I$(NACL_SDK_ROOT)/include/mac else HOST_LDFLAGS ?= -Wl,-map -Wl,$(OUTDIR)/$(TARGET).map HOST_CFLAGS += -I$(NACL_SDK_ROOT)/include/linux endif ifdef ASAN HOST_CFLAGS += -fsanitize=address HOST_LDFLAGS += -pie -fsanitize=address endif ifdef TSAN HOST_CFLAGS += -fsanitize=thread HOST_LDFLAGS += -pie -fsanitize=thread endif ifdef MSAN HOST_CFLAGS += -fsanitize=memory HOST_LDFLAGS += -pie -fsanitize=memory endif # # Individual Macros # # $1 = Source name # $2 = Compile flags # define C_COMPILER_RULE -include $(call SRC_TO_DEP,$(1)) $(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp $(call LOG,CC ,$$@,$(CC) -o $$@ -c $$< $(POSIX_CFLAGS) $(HOST_CFLAGS) $(CFLAGS) $(2)) @$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1)) endef define CXX_COMPILER_RULE -include $(call SRC_TO_DEP,$(1)) $(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp $(call LOG,CXX ,$$@,$(CXX) -o $$@ -c $$< $(POSIX_CFLAGS) $(HOST_CFLAGS) $(CXXFLAGS) $(2)) @$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1)) endef # # Compile Macro # # $1 = Source name # $2 = POSIX compiler flags # $3 = VC compiler flags (unused) # define COMPILE_RULE ifeq ($(suffix $(1)),.c) $(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc))) else $(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc))) endif endef # # SO Macro # # $1 = Target name # $2 = list of source files # define SO_RULE $(error 'Shared libraries not supported by Host') endef # # LIB Macro # # $1 = Target name # $2 = List of source files # define LIB_RULE $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(OSNAME)_host/$(CONFIG_DIR)/lib$(1).a @echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp all: $(LIBDIR)/$(OSNAME)_host/$(CONFIG_DIR)/lib$(1).a $(LIBDIR)/$(OSNAME)_host/$(CONFIG_DIR)/lib$(1).a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src))) $(MKDIR) -p $$(dir $$@) $(RM) -f $$@ $(call LOG,LIB,$$@,$(AR) $(ARFLAGS) $$@ $$^) endef # # Link Macro # # $1 = Target name # $2 = List of inputs # $3 = List of libs # $4 = List of deps # $5 = List of lib dirs # $6 = Linker flags # ifdef STANDALONE define LINKER_RULE all: $(1) $(1): $(2) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp) $(call LOG,LINK,$$@,$(LINK) -o $(1) $(2) $(HOST_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(OSNAME)_host/$(CONFIG_DIR) -L$(path)/$(OSNAME)_host/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(6)) endef else define LINKER_RULE all: $(1) $(1): $(2) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp) $(call LOG,LINK,$$@,$(LINK) -shared -o $(1) $(2) $(HOST_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(OSNAME)_host/$(CONFIG_DIR) -L$(path)/$(OSNAME)_host/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(6)) endef endif # # Link Macro # # $1 = Target Name # $2 = List of source files # $3 = List of LIBS # $4 = List of DEPS # $5 = POSIX linker flags # $6 = VC linker flags # define LINK_RULE $(call LINKER_RULE,$(OUTDIR)/$(1)$(HOST_EXT),$(foreach src,$(2),$(call SRC_TO_OBJ,$(src))),$(filter-out pthread,$(3)),$(4),$(LIB_PATHS),$(5)) endef # # Macro to generate linker scripts # # $1 = Target Name # $2 = Static Linker Script # $3 = Shared Linker Script # define LINKER_SCRIPT_RULE $(STAMPDIR)/$(1).stamp: @echo " STAMP $$@" @echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp install: $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).a $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).a: $(2) $(MKDIR) -p $$(dir $$@) $(call LOG,CP ,$$@,$(OSHELPERS) cp $$^ $$@) install: $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).so $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).so: $(3) $(MKDIR) -p $$(dir $$@) $(call LOG,CP ,$$@,$(OSHELPERS) cp $$^ $$@) endef all: $(LIB_LIST) $(DEPS_LIST) # # Strip Macro # The host build makes shared libraries, so the best we can do is -S, which # only strip debug symbols. We don't strip the symbol names. # # $1 = Target name # $2 = Input name # define STRIP_RULE all: $(OUTDIR)/$(1)$(HOST_EXT) $(OUTDIR)/$(1)$(HOST_EXT): $(OUTDIR)/$(2)$(HOST_EXT) $(call LOG,STRIP,$$@,$(STRIP) -S -o $$@ $$^) endef # # Run standalone builds (command line builds outside of chrome) # ifdef STANDALONE run: all $(RUN_UNDER) $(OUTDIR)/$(TARGET)$(HOST_EXT) $(EXE_ARGS) endif