1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# Copyright (c) 2012 The Chromium Authors.   All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# GNU Make based build file.  For details on GNU Make see:
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#   http://www.gnu.org/software/make/manual/make.html
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Paths to Tools
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PNACL_CC := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=cc)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PNACL_CXX := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=c++)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PNACL_LINK := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=c++)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PNACL_LIB := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=ar)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PNACL_STRIP := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=strip)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PNACL_FINALIZE := $(shell $(NACL_CONFIG) -t $(TOOLCHAIN) --tool=finalize)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Compile Macro
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $1 = Source Name
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $2 = Compile Flags
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $3 = Include Directories
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)define C_COMPILER_RULE
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)-include $(call SRC_TO_DEP,$(1))
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)$(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)	$(call LOG,CC  ,$$@,$(PNACL_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS))
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1))
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endef
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)define CXX_COMPILER_RULE
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)-include $(call SRC_TO_DEP,$(1))
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)$(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)	$(call LOG,CXX ,$$@,$(PNACL_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS))
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1))
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endef
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $1 = Source Name
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $2 = POSIX Compile Flags
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $3 = Include Directories
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $4 = VC Flags (unused)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)define COMPILE_RULE
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ifeq ($(suffix $(1)),.c)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)$(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)else
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)$(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endif
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endef
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# SO Macro
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $1 = Target Name
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $2 = List of Sources
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)define SO_RULE
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)$(error 'Shared libraries not supported by PNaCl')
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endef
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# LIB Macro
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $1 = Target Name
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $2 = List of Sources
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $3 = POSIX Link Flags
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $4 = VC Link Flags (unused)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)define LIB_RULE
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	@echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)all: $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)$(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src)))
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	$(MKDIR) -p $$(dir $$@)
810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)	$(RM) -f $$@
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)	$(call LOG,LIB,$$@,$(PNACL_LIB) -cr $$@ $$^ $(3))
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endef
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Specific Link Macro
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $1 = Target Name
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $2 = List of inputs
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $3 = List of libs
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $4 = List of deps
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $5 = List of lib dirs
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $6 = Other Linker Args
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)define LINKER_RULE
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochall: $(1).pexe 
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch$(1).pexe: $(1).bc
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch	$(call LOG,FINALIZE,$$@,$(PNACL_FINALIZE) -o $$@ $$^)
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch$(1).bc: $(2) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)	$(call LOG,LINK,$$@,$(PNACL_LINK) -o $$@ $(2) $(PNACL_LDFLAGS) $(foreach path,$(5),-L$(path)/pnacl/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(6))
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endef
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Generalized Link Macro
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $1 = Target Name
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $2 = List of Sources
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $3 = List of LIBS
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $4 = List of DEPS
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $5 = POSIX Linker Switches
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $6 = VC Linker Switches
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)define LINK_RULE
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)$(call LINKER_RULE,$(OUTDIR)/$(1),$(foreach src,$(2),$(call SRC_TO_OBJ,$(src))),$(filter-out pthread,$(3)),$(4),$(LIB_PATHS),$(5))
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endef
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Strip Macro
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#
1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# NOTE: pnacl-strip does not really do much for finalized pexes (in a
1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# sense, they are already stripped), but set this rule up for uniformity.
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# $1 = Target Name
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# $2 = Input Name
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)define STRIP_RULE
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)all: $(OUTDIR)/$(1).pexe
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)$(OUTDIR)/$(1).pexe: $(OUTDIR)/$(2).pexe
1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch	$(call LOG,STRIP,$$@,$(PNACL_STRIP) $$^ -o $$@)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)endef
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# NMF Manifest generation
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use the python script create_nmf to scan the binaries for dependencies using
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# objdump.  Pass in the (-L) paths to the default library toolchains so that we
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# can find those libraries and have it automatically copy the files (-s) to
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# the target directory for us.
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# $1 = Target Name (the basename of the nmf)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# $2 = Additional create_nmf.py arguments
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NMF:=python $(NACL_SDK_ROOT)/tools/create_nmf.py
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
150effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochEXECUTABLES=$(OUTDIR)/$(1).pexe $(OUTDIR)/$(1)_unstripped.bc
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)define NMF_RULE
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)all: $(OUTDIR)/$(1).nmf
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch$(OUTDIR)/$(1).nmf: $(EXECUTABLES)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	$(call LOG,CREATE_NMF,$$@,$(NMF) -o $$@ $$^ -s $(OUTDIR) $(2))
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)endef
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)# HTML file generation
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)CREATE_HTML := python $(NACL_SDK_ROOT)/tools/create_html.py
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)define HTML_RULE
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)all: $(OUTDIR)/$(1).html
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch$(OUTDIR)/$(1).html: $(EXECUTABLES)
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)	$(call LOG,CREATE_HTML,$$@,$(CREATE_HTML) -o $$@ $$^)
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)endef
168