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 # 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