nacl_gcc.mk revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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#
13# Default Paths
14#
15
16LD_X86_32:=-L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)
17LD_X86_64:=-L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)
18LD_ARM:=-L$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)
19
20
21#
22# Macros for TOOLS
23#
24# We always link with the C++ compiler but include -Wl,-as-needed flag
25# in LD_FLAGS so the linker should drop libc++ unless it's actually needed.
26#
27X86_32_CC?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/i686-nacl-gcc
28X86_32_CXX?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/i686-nacl-g++
29X86_32_LINK?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/i686-nacl-g++
30X86_32_LIB?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/i686-nacl-ar
31
32X86_64_CC?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/x86_64-nacl-gcc
33X86_64_CXX?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/x86_64-nacl-g++
34X86_64_LINK?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/x86_64-nacl-g++
35X86_64_LIB?=$(TC_PATH)/$(OSNAME)_x86_$(TOOLCHAIN)/bin/x86_64-nacl-ar
36
37ARM_CC?=$(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin/arm-nacl-gcc
38ARM_CXX?=$(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin/arm-nacl-g++
39ARM_LINK?=$(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin/arm-nacl-g++
40ARM_LIB?=$(TC_PATH)/$(OSNAME)_arm_$(TOOLCHAIN)/bin/arm-nacl-ar
41
42
43#
44# Compile Macro
45#
46# $1 = Source Name
47# $2 = Compile Flags
48#
49define C_COMPILER_RULE
50-include $(call SRC_TO_DEP,$(1),_x86_32)
51$(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
52	$(call LOG,CC,$$@,$(X86_32_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS))
53
54-include $(call SRC_TO_DEP,$(1),_x86_64)
55$(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
56	$(call LOG,CC,$$@,$(X86_64_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS))
57
58-include $(call SRC_TO_DEP,$(1),_arm)
59$(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
60	$(call LOG,CC,$$@,$(ARM_CC) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CFLAGS))
61endef
62
63define CXX_COMPILER_RULE
64-include $(call SRC_TO_DEP,$(1),_x86_32)
65$(call SRC_TO_OBJ,$(1),_x86_32): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
66	$(call LOG,CXX,$$@,$(X86_32_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS))
67
68-include $(call SRC_TO_DEP,$(1),_x86_64)
69$(call SRC_TO_OBJ,$(1),_x86_64): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
70	$(call LOG,CXX,$$@,$(X86_64_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS))
71
72-include $(call SRC_TO_DEP,$(1),_arm)
73$(call SRC_TO_OBJ,$(1),_arm): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
74	$(call LOG,CXX,_$$@,$(ARM_CXX) -o $$@ -c $$< $(POSIX_FLAGS) $(2) $(NACL_CXXFLAGS))
75endef
76
77
78#
79# $1 = Source Name
80# $2 = POSIX Compile Flags
81# $3 = Include Directories
82# $4 = VC Flags (unused)
83#
84define COMPILE_RULE
85ifeq ($(suffix $(1)),.c)
86$(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
87else
88$(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)) $(3))
89endif
90endef
91
92
93#
94# SO Macro
95#
96# $1 = Target Name
97# $2 = List of Sources
98# $3 = List of LIBS
99# $4 = List of DEPS
100# $5 = 1 => Don't add to NMF.
101#
102#
103GLIBC_REMAP:=
104define SO_RULE
105NMF_TARGETS+=$$(OUTDIR)/$(1)_x86_32.so
106$(OUTDIR)/$(1)_x86_32.so : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) $(4)
107	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m32 $$(LD_X86_32) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib)))
108
109NMF_TARGETS+=$(OUTDIR)/$(1)_x86_64.so
110$(OUTDIR)/$(1)_x86_64.so : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) $(4)
111	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter-out $(4),$$^) -shared -m64 $(LD_X86_64) $$(LD_FLAGS) $(foreach lib,$(3),-l$(lib)))
112
113ifneq (1,$(5))
114GLIBC_SO_LIST+=$(OUTDIR)/$(1)_x86_32.so $(OUTDIR)/$(1)_x86_64.so
115GLIBC_REMAP+=-n $(1)_x86_32.so,$(1).so
116GLIBC_REMAP+=-n $(1)_x86_64.so,$(1).so
117else
118all: $(OUTDIR)/$(1)_x86_32.so $(OUTDIR)/$(1)_x86_64.so
119endif
120endef
121
122
123#
124# LIB Macro
125#
126# $1 = Target Name
127# $2 = List of Sources
128# $3 = POSIX Link Flags
129# $4 = VC Link Flags (unused)
130#
131define LIB_RULE
132$(STAMPDIR)/$(1).stamp : $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
133$(STAMPDIR)/$(1).stamp : $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
134ifneq ('glibc','$(TOOLCHAIN)')
135$(STAMPDIR)/$(1).stamp : $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
136endif
137
138$(STAMPDIR)/$(1).stamp :
139	@echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp
140
141all: $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a
142$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_32/$(CONFIG)/lib$(1).a : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32))
143	$(MKDIR) -p $$(dir $$@)
144	$(call LOG,LIB,$$@,$(X86_32_LIB) -r $$@ $$^)
145
146all: $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a
147$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_x86_64/$(CONFIG)/lib$(1).a : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64))
148	$(MKDIR) -p $$(dir $$@)
149	$(call LOG,LIB,$$@,$(X86_64_LIB) -r $$@ $$^)
150
151ifneq ('glibc','$(TOOLCHAIN)')
152all: $(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a
153endif
154$(NACL_SDK_ROOT)/lib/$(TOOLCHAIN)_arm/$(CONFIG)/lib$(1).a : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm))
155	$(MKDIR) -p $$(dir $$@)
156	$(call LOG,LIB,$$@,$(ARM_LIB) -r $$@ $$^)
157endef
158
159
160#
161# Specific Link Macro
162#
163# $1 = Target Name
164# $2 = List of Sources
165# $3 = List of LIBS
166# $4 = List of DEPS
167# $5 = POSIX Link Flags
168# $6 = Library Paths
169#
170define LINKER_RULE
171$(OUTDIR)/$(1)_x86_32.nexe : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_32)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
172	$(call LOG,LINK,$$@,$(X86_32_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_x86_32/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
173
174$(OUTDIR)/$(1)_x86_64.nexe : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_x86_64)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
175	$(call LOG,LINK,$$@,$(X86_64_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_x86_64/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
176
177$(OUTDIR)/$(1)_arm.nexe : $(foreach src,$(2),$(call SRC_TO_OBJ,$(src),_arm)) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
178	$(call LOG,LINK,$$@,$(ARM_LINK) -o $$@ $$(filter %.o,$$^) $(NACL_LDFLAGS) $(foreach path,$(6),-L$(path)/$(TOOLCHAIN)_arm/$(CONFIG)) $(foreach lib,$(3),-l$(lib)) $(5))
179endef
180
181
182#
183# Generalized Link Macro
184#
185# $1 = Target Name
186# $2 = List of Sources
187# $3 = List of LIBS
188# $4 = List of DEPS
189# $5 = POSIX Linker Switches
190# $6 = VC Linker Switches
191#
192define LINK_RULE
193$(call LINKER_RULE,$(1),$(2),$(filter-out pthread,$(3)),$(4),$(5),$(LIB_PATHS))
194endef
195
196
197#
198# Determine which architectures to build for.  The user can set NACL_ARCH or
199# ARCHES in the environment to control this.
200#
201VALID_ARCHES:=x86_32 x86_64
202ifeq (newlib,$(TOOLCHAIN))
203VALID_ARCHES+=arm
204endif
205
206ifdef NACL_ARCH
207ifeq (,$(findstring $(NACL_ARCH),$(VALID_ARCHES)))
208$(error Invalid arch specified in NACL_ARCH: $(NACL_ARCH).  Valid values are: $(VALID_ARCHES))
209endif
210ARCHES=${NACL_ARCH}
211else
212ARCHES?=${VALID_ARCHES}
213endif
214
215#
216# Generate NMF_TARGETS
217#
218NMF_ARCHES:=$(foreach arch,$(ARCHES),_$(arch).nexe)
219
220
221#
222# NMF Manifiest generation
223#
224# Use the python script create_nmf to scan the binaries for dependencies using
225# objdump.  Pass in the (-L) paths to the default library toolchains so that we
226# can find those libraries and have it automatically copy the files (-s) to
227# the target directory for us.
228#
229# $1 = Target Name (the basename of the nmf
230# $2 = Additional create_nmf.py arguments
231#
232NMF:=python $(NACL_SDK_ROOT)/tools/create_nmf.py
233GLIBC_DUMP:=$(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/bin/objdump
234GLIBC_PATHS:=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib32
235GLIBC_PATHS+=-L $(TC_PATH)/$(OSNAME)_x86_glibc/x86_64-nacl/lib
236
237define NMF_RULE
238all:$(OUTDIR)/$(1).nmf
239$(OUTDIR)/$(1).nmf : $(foreach arch,$(NMF_ARCHES),$(OUTDIR)/$(1)$(arch)) $(GLIBC_SO_LIST)
240	$(call LOG,CREATE_NMF,$$@,$(NMF) -o $$@ $$^ -D $(GLIBC_DUMP) $(GLIBC_PATHS) -s $(OUTDIR) $(2) $(GLIBC_REMAP))
241endef
242