nacl_gcc.mk revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
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
165GLIBC_REMAP :=
166
167#
168# SO Macro
169#
170# As well as building and installing a shared library this rule adds dependencies
171# on the library's .stamp file in STAMPDIR.  However, the rule for creating the stamp
172# file is part of LIB_RULE, so users of the DEPS system are currently required to
173# use the LIB_RULE macro as well as the SO_RULE for each shared library.
174#
175# $1 = Target Name
176# $2 = List of Sources
177# $3 = List of LIBS
178# $4 = List of DEPS
179# $5 = 1 => Don't add to NMF.
180#
181define SO_RULE
182ifneq (,$(findstring x86_32,$(ARCHES)))
183all: $(OUTDIR)/lib$(1)_x86_32.so
184$(OUTDIR)/lib$(1)_x86_32.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32_pic)) $(4)
185	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m32 $(LD_X86_32) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib)))
186
187$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so
188install: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so
189$(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).so: $(OUTDIR)/lib$(1)_x86_32.so
190	$(MKDIR) -p $$(dir $$@)
191	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
192ifneq ($(5),1)
193GLIBC_SO_LIST += $(OUTDIR)/lib$(1)_x86_32.so
194GLIBC_REMAP += -n lib$(1)_x86_32.so,lib$(1).so
195endif
196endif
197
198ifneq (,$(findstring x86_64,$(ARCHES)))
199all: $(OUTDIR)/lib$(1)_x86_64.so
200$(OUTDIR)/lib$(1)_x86_64.so: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64_pic)) $(4)
201	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m64 $(LD_X86_64) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib)))
202
203$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so
204install: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so
205$(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).so: $(OUTDIR)/lib$(1)_x86_64.so
206	$(MKDIR) -p $$(dir $$@)
207	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
208ifneq ($(5),1)
209GLIBC_SO_LIST += $(OUTDIR)/lib$(1)_x86_64.so
210GLIBC_REMAP += -n lib$(1)_x86_64.so,lib$(1).so
211endif
212endif
213endef
214
215#
216# LIB Macro
217#
218# $1 = Target Name
219# $2 = List of Sources
220# $3 = POSIX Link Flags
221# $4 = VC Link Flags (unused)
222#
223define LIB_RULE
224$(STAMPDIR)/$(1).stamp:
225	@echo "  STAMP $$@"
226	@echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp
227
228ifneq (,$(findstring x86_32,$(ARCHES)))
229all: $(OUTDIR)/lib$(1)_x86_32.a
230$(OUTDIR)/lib$(1)_x86_32.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32))
231	$(MKDIR) -p $$(dir $$@)
232	$(call LOG,LIB ,$$@,$(X86_32_LIB) -cr $$@ $$^)
233
234$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
235install: $(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
236$(LIBDIR)/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_x86_32.a
237	$(MKDIR) -p $$(dir $$@)
238	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
239endif
240
241ifneq (,$(findstring x86_64,$(ARCHES)))
242all: $(OUTDIR)/lib$(1)_x86_64.a
243$(OUTDIR)/lib$(1)_x86_64.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64))
244	$(MKDIR) -p $$(dir $$@)
245	$(call LOG,LIB ,$$@,$(X86_64_LIB) -cr $$@ $$^)
246
247$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
248install: $(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
249$(LIBDIR)/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_x86_64.a
250	$(MKDIR) -p $$(dir $$@)
251	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
252endif
253
254ifneq (,$(findstring arm,$(ARCHES)))
255ifneq ($(TOOLCHAIN),glibc)
256all: $(OUTDIR)/lib$(1)_arm.a
257$(OUTDIR)/lib$(1)_arm.a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm))
258	$(MKDIR) -p $$(dir $$@)
259	$(call LOG,LIB ,$$@,$(ARM_LIB) -cr $$@ $$^)
260
261$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
262install: $(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
263$(LIBDIR)/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a: $(OUTDIR)/lib$(1)_arm.a
264	$(MKDIR) -p $$(dir $$@)
265	$(call LOG,CP  ,$$@,$(OSHELPERS) cp $$^ $$@)
266endif
267endif
268endef
269
270
271#
272# Specific Link Macro
273#
274# $1 = Target Name
275# $2 = List of Sources
276# $3 = List of LIBS
277# $4 = List of DEPS
278# $5 = POSIX Link Flags
279# $6 = Library Paths
280#
281define LINKER_RULE
282ifneq (,$(findstring x86_32,$(ARCHES)))
283all: $(OUTDIR)/$(1)_x86_32.nexe
284$(OUTDIR)/$(1)_x86_32.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
285	$(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))
286endif
287
288ifneq (,$(findstring x86_64,$(ARCHES)))
289all: $(OUTDIR)/$(1)_x86_64.nexe
290$(OUTDIR)/$(1)_x86_64.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
291	$(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))
292endif
293
294ifneq (,$(findstring arm,$(ARCHES)))
295all: $(OUTDIR)/$(1)_arm.nexe
296$(OUTDIR)/$(1)_arm.nexe: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
297	$(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))
298endif
299endef
300
301
302#
303# Generalized Link Macro
304#
305# $1 = Target Name
306# $2 = List of Sources
307# $3 = List of LIBS
308# $4 = List of DEPS
309# $5 = POSIX Linker Switches
310# $6 = VC Linker Switches
311#
312define LINK_RULE
313$(call LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(5),$(LIB_PATHS))
314endef
315
316
317#
318# Strip Macro for each arch (e.g., each arch supported by LINKER_RULE).
319#
320# $1 = Target Name
321# $2 = Source Name
322#
323define STRIP_ALL_RULE
324ifneq (,$(findstring x86_32,$(ARCHES)))
325$(OUTDIR)/$(1)_x86_32.nexe: $(OUTDIR)/$(2)_x86_32.nexe
326	$(call LOG,STRIP,$$@,$(X86_32_STRIP) -o $$@ $$^)
327endif
328
329ifneq (,$(findstring x86_64,$(ARCHES)))
330$(OUTDIR)/$(1)_x86_64.nexe: $(OUTDIR)/$(2)_x86_64.nexe
331	$(call LOG,STRIP,$$@,$(X86_64_STRIP) -o $$@ $$^)
332endif
333
334ifneq (,$(findstring arm,$(ARCHES)))
335$(OUTDIR)/$(1)_arm.nexe: $(OUTDIR)/$(2)_arm.nexe
336	$(call LOG,STRIP,$$@,$(ARM_STRIP) -o $$@ $$^)
337endif
338endef
339
340
341#
342# Top-level Strip Macro
343#
344# $1 = Target Basename
345# $2 = Source Basename
346#
347define STRIP_RULE
348$(call STRIP_ALL_RULE,$(1),$(2))
349endef
350
351
352#
353# Strip Macro for each arch (e.g., each arch supported by MAP_RULE).
354#
355# $1 = Target Name
356# $2 = Source Name
357#
358define MAP_ALL_RULE
359ifneq (,$(findstring x86_32,$(ARCHES)))
360all: $(OUTDIR)/$(1)_x86_32.map
361$(OUTDIR)/$(1)_x86_32.map: $(OUTDIR)/$(2)_x86_32.nexe
362	$(call LOG,MAP,$$@,$(X86_32_NM) -l $$^ > $$@)
363endif
364
365ifneq (,$(findstring x86_64,$(ARCHES)))
366all: $(OUTDIR)/$(1)_x86_64.map
367$(OUTDIR)/$(1)_x86_64.map: $(OUTDIR)/$(2)_x86_64.nexe
368	$(call LOG,MAP,$$@,$(X86_64_NM) -l $$^ > $$@)
369endif
370
371ifneq (,$(findstring arm,$(ARCHES)))
372all: $(OUTDIR)/$(1)_arm.map
373$(OUTDIR)/$(1)_arm.map: $(OUTDIR)/$(2)_arm.nexe
374	$(call LOG,MAP,$$@,$(ARM_NM) -l $$^ > $$@ )
375endif
376endef
377
378
379#
380# Top-level MAP Generation Macro
381#
382# $1 = Target Basename
383# $2 = Source Basename
384#
385define MAP_RULE
386$(call MAP_ALL_RULE,$(1),$(2))
387endef
388
389
390#
391# Generate ARCH_SUFFIXES, a list of suffixes for executables corresponding to all
392# the architectures in the current build.
393#
394ARCH_SUFFIXES := $(foreach arch,$(ARCHES),_$(arch).nexe)
395
396
397#
398# NMF Manifiest generation
399#
400# Use the python script create_nmf to scan the binaries for dependencies using
401# objdump.  Pass in the (-L) paths to the default library toolchains so that we
402# can find those libraries and have it automatically copy the files (-s) to
403# the target directory for us.
404#
405# $1 = Target Name (the basename of the nmf
406# $2 = Additional create_nmf.py arguments
407#
408NMF := python $(NACL_SDK_ROOT)/tools/create_nmf.py
409ifeq ($(CONFIG),Debug)
410NMF_FLAGS += --debug-libs
411HTML_FLAGS += --debug-libs
412endif
413
414EXECUTABLES=$(foreach arch,$(ARCH_SUFFIXES),$(OUTDIR)/$(1)$(arch)) $(GLIBC_SO_LIST)
415
416define NMF_RULE
417all: $(OUTDIR)/$(1).nmf
418$(OUTDIR)/$(1).nmf: $(EXECUTABLES)
419	$(call LOG,CREATE_NMF,$$@,$(NMF) $(NMF_FLAGS) -o $$@ $$^ $(GLIBC_PATHS) -s $(OUTDIR) $(2) $(GLIBC_REMAP))
420endef
421
422#
423# HTML file generation
424#
425CREATE_HTML := python $(NACL_SDK_ROOT)/tools/create_html.py
426
427define HTML_RULE
428all: $(OUTDIR)/$(1).html
429$(OUTDIR)/$(1).html: $(EXECUTABLES)
430	$(call LOG,CREATE_HTML,$$@,$(CREATE_HTML) $(HTML_FLAGS) -o $$@ $$^)
431endef
432