nacl_gcc.mk revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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# Default library paths
13#
14LD_X86_32 := -L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)
15LD_X86_64 := -L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)
16LD_ARM := -L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)
17
18
19#
20# Macros for TOOLS
21#
22# We always link with the C++ compiler but include -Wl,-as-needed flag
23# in LD_FLAGS so the linker should drop libc++ unless it's actually needed.
24#
25X86_TC_BIN ?= $(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin
26ARM_TC_BIN ?= $(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin
27
28X86_32_CC ?= $(NACL_COMPILER_PREFIX) $(X86_TC_BIN)/i686-nacl-gcc
29X86_32_CXX ?= $(NACL_COMPILER_PREFIX) $(X86_TC_BIN)/i686-nacl-g++
30X86_32_LINK ?= $(X86_TC_BIN)/i686-nacl-g++
31X86_32_LIB ?= $(X86_TC_BIN)/i686-nacl-ar
32X86_32_STRIP ?= $(X86_TC_BIN)/i686-nacl-strip
33X86_32_NM ?= $(X86_TC_BIN)/i686-nacl-nm
34
35X86_64_CC ?= $(NACL_COMPILER_PREFIX) $(X86_TC_BIN)/x86_64-nacl-gcc
36X86_64_CXX ?= $(NACL_COMPILER_PREFIX) $(X86_TC_BIN)/x86_64-nacl-g++
37X86_64_LINK ?= $(X86_TC_BIN)/x86_64-nacl-g++
38X86_64_LIB ?= $(X86_TC_BIN)/x86_64-nacl-ar
39X86_64_STRIP ?= $(X86_TC_BIN)/x86_64-nacl-strip
40X86_64_NM ?= $(X86_TC_BIN)/x86_64-nacl-nm
41
42ARM_CC ?= $(NACL_COMPILER_PREFIX) $(ARM_TC_BIN)/arm-nacl-gcc
43ARM_CXX ?= $(NACL_COMPILER_PREFIX) $(ARM_TC_BIN)/arm-nacl-g++
44ARM_LINK ?= $(ARM_TC_BIN)/arm-nacl-g++
45ARM_LIB ?= $(ARM_TC_BIN)/arm-nacl-ar
46ARM_STRIP ?= $(ARM_TC_BIN)/arm-nacl-strip
47ARM_NM ?= $(ARM_TC_BIN)/arm-nacl-nm
48
49# Architecture-specific flags
50X86_32_CFLAGS ?=
51X86_64_CFLAGS ?=
52ARM_CFLAGS ?=
53
54X86_32_CXXFLAGS ?=
55X86_64_CXXFLAGS ?=
56ARM_CXXFLAGS ?=
57
58X86_32_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_x86_32.map
59X86_64_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_x86_64.map
60ARM_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET)_arm.map
61
62#
63# Compile Macro
64#
65# $1 = Source Name
66# $2 = Compile Flags
67#
68define C_COMPILER_RULE
69-include $(call SRC_TO_DEP,$(1),_x86_32)
70$(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
71	$(call LOG,CC  ,$$@,$(X86_32_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_32_CFLAGS))
72	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32)
73
74-include $(call SRC_TO_DEP,$(1),_x86_64)
75$(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
76	$(call LOG,CC  ,$$@,$(X86_64_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_64_CFLAGS))
77	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64)
78
79-include $(call SRC_TO_DEP,$(1),_arm)
80$(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
81	$(call LOG,CC  ,$$@,$(ARM_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(ARM_CFLAGS))
82	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm)
83
84-include $(call SRC_TO_DEP,$(1),_x86_32_pic)
85$(call SRC_TO_OBJ,$(1),_x86_32_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
86	$(call LOG,CC  ,$$@,$(X86_32_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_32_CFLAGS))
87	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32_pic)
88
89-include $(call SRC_TO_DEP,$(1),_x86_64_pic)
90$(call SRC_TO_OBJ,$(1),_x86_64_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
91	$(call LOG,CC  ,$$@,$(X86_64_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(X86_64_CFLAGS))
92	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64_pic)
93
94-include $(call SRC_TO_DEP,$(1),_arm_pic)
95$(call SRC_TO_OBJ,$(1),_arm_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
96	$(call LOG,CC  ,$$@,$(ARM_CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CFLAGS) $(ARM_CFLAGS))
97	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm_pic)
98endef
99
100define CXX_COMPILER_RULE
101-include $(call SRC_TO_DEP,$(1),_x86_32)
102$(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
103	$(call LOG,CXX ,$$@,$(X86_32_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_32_CXXFLAGS))
104	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32)
105
106-include $(call SRC_TO_DEP,$(1),_x86_64)
107$(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
108	$(call LOG,CXX ,$$@,$(X86_64_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_64_CXXFLAGS))
109	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64)
110
111-include $(call SRC_TO_DEP,$(1),_arm)
112$(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
113	$(call LOG,CXX ,$$@,$(ARM_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(ARM_CXXFLAGS))
114	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm)
115
116-include $(call SRC_TO_DEP,$(1),_x86_32_pic)
117$(call SRC_TO_OBJ,$(1),_x86_32_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
118	$(call LOG,CXX ,$$@,$(X86_32_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_32_CXXFLAGS))
119	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_32_pic)
120
121-include $(call SRC_TO_DEP,$(1),_x86_64_pic)
122$(call SRC_TO_OBJ,$(1),_x86_64_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
123	$(call LOG,CXX ,$$@,$(X86_64_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(X86_64_CXXFLAGS))
124	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_x86_64_pic)
125
126-include $(call SRC_TO_DEP,$(1),_arm_pic)
127$(call SRC_TO_OBJ,$(1),_arm_pic): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
128	$(call LOG,CXX ,$$@,$(ARM_CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS) $(ARM_CXXFLAGS))
129	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1),_arm_pic)
130endef
131
132
133#
134# $1 = Source Name
135# $2 = POSIX Compile Flags
136# $3 = Include Directories
137# $4 = VC Flags (unused)
138#
139define COMPILE_RULE
140ifeq ($(suffix $(1)),.c)
141$(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
142else
143$(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
144endif
145endef
146
147#
148# Determine which architectures to build for.  The user can set NACL_ARCH or
149# ARCHES in the environment to control this.
150#
151VALID_ARCHES := x86_32 x86_64
152ifeq (newlib,$(TOOLCHAIN))
153VALID_ARCHES += arm
154endif
155
156ifdef NACL_ARCH
157ifeq (,$(findstring $(NACL_ARCH),$(VALID_ARCHES)))
158$(error Invalid arch specified in NACL_ARCH: $(NACL_ARCH).  Valid values are: $(VALID_ARCHES))
159endif
160ARCHES = ${NACL_ARCH}
161else
162ARCHES ?= ${VALID_ARCHES}
163endif
164
165#
166# SO Macro
167#
168# $1 = Target Name
169# $2 = List of Sources
170# $3 = List of LIBS
171# $4 = List of DEPS
172# $5 = 1 => Don't add to NMF.
173#
174GLIBC_REMAP :=
175define SO_RULE
176ifneq (,$(findstring x86_32,$(ARCHES)))
177all: $(OUTDIR)/lib$(1)_x86_32.so
178$(OUTDIR)/lib$(1)_x86_32.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32_pic)) $(4)
179	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m32 $(LD_X86_32) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib)))
180
181install: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so
182$(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so: $(OUTDIR)/lib$(1)_x86_32.so
183	$(MKDIR) -p $$(dir $$@)
184	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
185ifneq ($(5),1)
186GLIBC_SO_LIST += $(OUTDIR)/lib$(1)_x86_32.so
187GLIBC_REMAP += -n lib$(1)_x86_32.so,lib$(1).so
188endif
189endif
190
191ifneq (,$(findstring x86_64,$(ARCHES)))
192all: $(OUTDIR)/lib$(1)_x86_64.so
193$(OUTDIR)/lib$(1)_x86_64.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64_pic)) $(4)
194	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m64 $(LD_X86_64) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib)))
195
196install: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so
197$(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so: $(OUTDIR)/lib$(1)_x86_64.so
198	$(MKDIR) -p $$(dir $$@)
199	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
200ifneq ($(5),1)
201GLIBC_SO_LIST += $(OUTDIR)/lib$(1)_x86_64.so
202GLIBC_REMAP += -n lib$(1)_x86_64.so,lib$(1).so
203endif
204endif
205endef
206
207
208#
209# LIB Macro
210#
211# $1 = Target Name
212# $2 = List of Sources
213# $3 = POSIX Link Flags
214# $4 = VC Link Flags (unused)
215#
216define LIB_RULE
217$(STAMPDIR)/$(1).stamp: $(OUTDIR)/lib$(1)_x86_32.a
218$(STAMPDIR)/$(1).stamp: $(OUTDIR)/lib$(1)_x86_64.a
219ifneq ($(TOOLCHAIN),glibc)
220$(STAMPDIR)/$(1).stamp: $(OUTDIR)/lib$(1)_arm.a
221endif
222
223$(STAMPDIR)/$(1).stamp:
224	@echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp
225
226ifneq (,$(findstring x86_32,$(ARCHES)))
227all: $(OUTDIR)/lib$(1)_x86_32.a
228$(OUTDIR)/lib$(1)_x86_32.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32))
229	$(MKDIR) -p $$(dir $$@)
230	$(call LOG,LIB ,$$@,$(X86_32_LIB) -cr $$@ $$^)
231
232install: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
233$(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_x86_32.a
234	$(MKDIR) -p $$(dir $$@)
235	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
236endif
237
238ifneq (,$(findstring x86_64,$(ARCHES)))
239all: $(OUTDIR)/lib$(1)_x86_64.a
240$(OUTDIR)/lib$(1)_x86_64.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64))
241	$(MKDIR) -p $$(dir $$@)
242	$(call LOG,LIB ,$$@,$(X86_64_LIB) -cr $$@ $$^)
243
244install: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
245$(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_x86_64.a
246	$(MKDIR) -p $$(dir $$@)
247	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
248endif
249
250ifneq (,$(findstring arm,$(ARCHES)))
251ifneq ($(TOOLCHAIN),glibc)
252all: $(OUTDIR)/lib$(1)_arm.a
253$(OUTDIR)/lib$(1)_arm.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm))
254	$(MKDIR) -p $$(dir $$@)
255	$(call LOG,LIB ,$$@,$(ARM_LIB) -cr $$@ $$^)
256
257install: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
258$(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_arm.a
259	$(MKDIR) -p $$(dir $$@)
260	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
261endif
262endif
263endef
264
265
266#
267# Specific Link Macro
268#
269# $1 = Target Name
270# $2 = List of Sources
271# $3 = List of LIBS
272# $4 = List of DEPS
273# $5 = POSIX Link Flags
274# $6 = Library Paths
275#
276define LINKER_RULE
277ifneq (,$(findstring x86_32,$(ARCHES)))
278all: $(OUTDIR)/$(1)_x86_32.nexe
279$(OUTDIR)/$(1)_x86_32.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
280	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(X86_32_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_x86_32/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
281endif
282
283ifneq (,$(findstring x86_64,$(ARCHES)))
284all: $(OUTDIR)/$(1)_x86_64.nexe
285$(OUTDIR)/$(1)_x86_64.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
286	$(call LOG,LINK,$$@,$(X86_64_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(X86_64_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_x86_64/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
287endif
288
289ifneq (,$(findstring arm,$(ARCHES)))
290all: $(OUTDIR)/$(1)_arm.nexe
291$(OUTDIR)/$(1)_arm.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
292	$(call LOG,LINK,$$@,$(ARM_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(ARM_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_arm/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
293endif
294endef
295
296
297#
298# Generalized Link Macro
299#
300# $1 = Target Name
301# $2 = List of Sources
302# $3 = List of LIBS
303# $4 = List of DEPS
304# $5 = POSIX Linker Switches
305# $6 = VC Linker Switches
306#
307define LINK_RULE
308$(call LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(5),$(LIB_PATHS))
309endef
310
311
312#
313# Strip Macro for each arch (e.g., each arch supported by LINKER_RULE).
314#
315# $1 = Target Name
316# $2 = Source Name
317#
318define STRIP_ALL_RULE
319ifneq (,$(findstring x86_32,$(ARCHES)))
320$(OUTDIR)/$(1)_x86_32.nexe: $(OUTDIR)/$(2)_x86_32.nexe
321	$(call LOG,STRIP,$$@,$(X86_32_STRIP) -o $$@ $$^)
322endif
323
324ifneq (,$(findstring x86_64,$(ARCHES)))
325$(OUTDIR)/$(1)_x86_64.nexe: $(OUTDIR)/$(2)_x86_64.nexe
326	$(call LOG,STRIP,$$@,$(X86_64_STRIP) -o $$@ $$^)
327endif
328
329ifneq (,$(findstring arm,$(ARCHES)))
330$(OUTDIR)/$(1)_arm.nexe: $(OUTDIR)/$(2)_arm.nexe
331	$(call LOG,STRIP,$$@,$(ARM_STRIP) -o $$@ $$^)
332endif
333endef
334
335
336#
337# Top-level Strip Macro
338#
339# $1 = Target Basename
340# $2 = Source Basename
341#
342define STRIP_RULE
343$(call STRIP_ALL_RULE,$(1),$(2))
344endef
345
346
347#
348# Strip Macro for each arch (e.g., each arch supported by MAP_RULE).
349#
350# $1 = Target Name
351# $2 = Source Name
352#
353define MAP_ALL_RULE
354ifneq (,$(findstring x86_32,$(ARCHES)))
355all: $(OUTDIR)/$(1)_x86_32.map
356$(OUTDIR)/$(1)_x86_32.map: $(OUTDIR)/$(2)_x86_32.nexe
357	$(call LOG,MAP,$$@,$(X86_32_NM) -l $$^ > $$@)
358endif
359
360ifneq (,$(findstring x86_64,$(ARCHES)))
361all: $(OUTDIR)/$(1)_x86_64.map
362$(OUTDIR)/$(1)_x86_64.map: $(OUTDIR)/$(2)_x86_64.nexe
363	$(call LOG,MAP,$$@,$(X86_64_NM) -l $$^ > $$@)
364endif
365
366ifneq (,$(findstring arm,$(ARCHES)))
367all: $(OUTDIR)/$(1)_arm.map
368$(OUTDIR)/$(1)_arm.map: $(OUTDIR)/$(2)_arm.nexe
369	$(call LOG,MAP,$$@,$(ARM_NM) -l $$^ > $$@ )
370endif
371endef
372
373
374#
375# Top-level MAP Generation Macro
376#
377# $1 = Target Basename
378# $2 = Source Basename
379#
380define MAP_RULE
381$(call MAP_ALL_RULE,$(1),$(2))
382endef
383
384
385#
386# Generate ARCH_SUFFIXES, a list of suffixes for executables corresponding to all
387# the architectures in the current build.
388#
389ARCH_SUFFIXES := $(foreach arch,$(ARCHES),_$(arch).nexe)
390
391
392#
393# NMF Manifiest generation
394#
395# Use the python script create_nmf to scan the binaries for dependencies using
396# objdump.  Pass in the (-L) paths to the default library toolchains so that we
397# can find those libraries and have it automatically copy the files (-s) to
398# the target directory for us.
399#
400# $1 = Target Name (the basename of the nmf
401# $2 = Additional create_nmf.py arguments
402#
403NMF := python $(NACL_SDK_ROOT)/tools/create_nmf.py
404ifeq ($(CONFIG),Debug)
405NMF_FLAGS += --debug-libs
406HTML_FLAGS += --debug-libs
407endif
408
409EXECUTABLES=$(foreach arch,$(ARCH_SUFFIXES),$(OUTDIR)/$(1)$(arch)) $(GLIBC_SO_LIST)
410
411define NMF_RULE
412all: $(OUTDIR)/$(1).nmf
413$(OUTDIR)/$(1).nmf: $(EXECUTABLES)
414	$(call LOG,CREATE_NMF,$$@,$(NMF) $(NMF_FLAGS) -o $$@ $$^ $(GLIBC_PATHS) -s $(OUTDIR) $(2) $(GLIBC_REMAP))
415endef
416
417#
418# HTML file generation
419#
420CREATE_HTML := python $(NACL_SDK_ROOT)/tools/create_html.py
421
422define HTML_RULE
423all: $(OUTDIR)/$(1).html
424$(OUTDIR)/$(1).html: $(EXECUTABLES)
425	$(call LOG,CREATE_HTML,$$@,$(CREATE_HTML) $(HTML_FLAGS) -o $$@ $$^)
426endef
427