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 # Paths to Tools
     12 #
     13 PNACL_CC := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=cc)
     14 PNACL_CXX := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=c++)
     15 PNACL_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=c++)
     16 PNACL_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=ar)
     17 PNACL_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=strip)
     18 PNACL_FINALIZE := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=finalize)
     19 
     20 #
     21 # Compile Macro
     22 #
     23 # $1 = Source Name
     24 # $2 = Compile Flags
     25 # $3 = Include Directories
     26 #
     27 define C_COMPILER_RULE
     28 -include $(call SRC_TO_DEP,$(1))
     29 $(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     30 	$(call LOG,CC  ,$$@,$(PNACL_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS))
     31 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1))
     32 endef
     33 
     34 define CXX_COMPILER_RULE
     35 -include $(call SRC_TO_DEP,$(1))
     36 $(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
     37 	$(call LOG,CXX ,$$@,$(PNACL_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS))
     38 	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1))
     39 endef
     40 
     41 
     42 # $1 = Source Name
     43 # $2 = POSIX Compile Flags
     44 # $3 = Include Directories
     45 # $4 = VC Flags (unused)
     46 define COMPILE_RULE
     47 ifeq ($(suffix $(1)),.c)
     48 $(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
     49 else
     50 $(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
     51 endif
     52 endef
     53 
     54 
     55 #
     56 # SO Macro
     57 #
     58 # $1 = Target Name
     59 # $2 = List of Sources
     60 #
     61 #
     62 define SO_RULE
     63 $(error 'Shared libraries not supported by PNaCl')
     64 endef
     65 
     66 
     67 #
     68 # LIB Macro
     69 #
     70 # $1 = Target Name
     71 # $2 = List of Sources
     72 # $3 = POSIX Link Flags
     73 # $4 = VC Link Flags (unused)
     74 define LIB_RULE
     75 $(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a
     76 	@echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp
     77 
     78 all: $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a
     79 $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src)))
     80 	$(MKDIR) -p $$(dir $$@)
     81 	$(RM) -f $$@
     82 	$(call LOG,LIB,$$@,$(PNACL_LIB) -cr $$@ $$^ $(3))
     83 endef
     84 
     85 
     86 #
     87 # Specific Link Macro
     88 #
     89 # $1 = Target Name
     90 # $2 = List of inputs
     91 # $3 = List of libs
     92 # $4 = List of deps
     93 # $5 = List of lib dirs
     94 # $6 = Other Linker Args
     95 #
     96 define LINKER_RULE
     97 all: $(1).pexe 
     98 $(1).pexe: $(1).bc
     99 	$(call LOG,FINALIZE,$$@,$(PNACL_FINALIZE) -o $$@ $$^)
    100 
    101 $(1).bc: $(2) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
    102 	$(call LOG,LINK,$$@,$(PNACL_LINK) -o $$@ $(2) $(PNACL_LDFLAGS) $(foreach path,$(5),-L$(path)/pnacl/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(6))
    103 endef
    104 
    105 
    106 #
    107 # Generalized Link Macro
    108 #
    109 # $1 = Target Name
    110 # $2 = List of Sources
    111 # $3 = List of LIBS
    112 # $4 = List of DEPS
    113 # $5 = POSIX Linker Switches
    114 # $6 = VC Linker Switches
    115 #
    116 define LINK_RULE
    117 $(call LINKER_RULE,$(OUTDIR)/$(1),$(foreach src,$(2),$(call SRC_TO_OBJ,$(src))),$(filter-out pthread,$(3)),$(4),$(LIB_PATHS),$(5))
    118 endef
    119 
    120 
    121 #
    122 # Strip Macro
    123 #
    124 # NOTE: pnacl-strip does not really do much for finalized pexes (in a
    125 # sense, they are already stripped), but set this rule up for uniformity.
    126 #
    127 # $1 = Target Name
    128 # $2 = Input Name
    129 #
    130 define STRIP_RULE
    131 all: $(OUTDIR)/$(1).pexe
    132 $(OUTDIR)/$(1).pexe: $(OUTDIR)/$(2).pexe
    133 	$(call LOG,STRIP,$$@,$(PNACL_STRIP) $$^ -o $$@)
    134 endef
    135 
    136 
    137 #
    138 # NMF Manifest generation
    139 #
    140 # Use the python script create_nmf to scan the binaries for dependencies using
    141 # objdump.  Pass in the (-L) paths to the default library toolchains so that we
    142 # can find those libraries and have it automatically copy the files (-s) to
    143 # the target directory for us.
    144 #
    145 # $1 = Target Name (the basename of the nmf)
    146 # $2 = Additional create_nmf.py arguments
    147 #
    148 NMF:=python $(NACL_SDK_ROOT)/tools/create_nmf.py
    149 
    150 EXECUTABLES=$(OUTDIR)/$(1).pexe $(OUTDIR)/$(1)_unstripped.bc
    151 
    152 define NMF_RULE
    153 all: $(OUTDIR)/$(1).nmf
    154 $(OUTDIR)/$(1).nmf: $(EXECUTABLES)
    155 	$(call LOG,CREATE_NMF,$$@,$(NMF) -o $$@ $$^ -s $(OUTDIR) $(2))
    156 endef
    157 
    158 #
    159 # HTML file generation
    160 #
    161 CREATE_HTML := python $(NACL_SDK_ROOT)/tools/create_html.py
    162 
    163 define HTML_RULE
    164 all: $(OUTDIR)/$(1).html
    165 $(OUTDIR)/$(1).html: $(EXECUTABLES)
    166 	$(call LOG,CREATE_HTML,$$@,$(CREATE_HTML) -o $$@ $$^)
    167 endef
    168