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.
6 # GNU Make based build file. For details on GNU Make see:
7 # http://www.gnu.org/software/make/manual/make.html
25 # We use the C++ compiler for everything and then use the -Wl,-as-needed flag
26 # in the linker to drop libc++ unless it's actually needed.
33 ifdef NACL_COMPILER_PREFIX
34 CC
= $(NACL_COMPILER_PREFIX
) $(CC
)
35 CXX
= $(NACL_COMPILER_PREFIX
) $(CXX
)
43 ifeq (,$(findstring gcc
,$(shell $(WHICH
) gcc
)))
44 $(warning To skip the host build use
:)
45 $(warning
"make all_versions NO_HOST_BUILDS=1")
46 $(error Unable to find gcc in PATH while building Host build
)
49 HOST_WARNINGS ?
= -Wno-long-long
-Wall
-Werror
50 HOST_CFLAGS
= -fPIC
-pthread
$(HOST_WARNINGS
) -I
$(NACL_SDK_ROOT
)/include
53 # Adding -Wl,-Bsymbolic means that symbols defined within the module are always
54 # used by the module, and not shadowed by symbols already loaded in, for
55 # exmaple, libc. Without this the libc symbols (or anything injected with
56 # LD_PRELOAD will take precedence).
57 # -pthread is not needed on mac (libpthread is a symlink to libSystem) and
58 # in fact generated a warning if passed at link time.
59 HOST_LDFLAGS ?
= -Wl
,-Map
,$(OUTDIR
)/$(TARGET
).map
-Wl
,-Bsymbolic
-pthread
60 HOST_CFLAGS
+= -I
$(NACL_SDK_ROOT
)/include/mac
62 HOST_LDFLAGS ?
= -Wl
,-map
-Wl
,$(OUTDIR
)/$(TARGET
).map
63 HOST_CFLAGS
+= -I
$(NACL_SDK_ROOT
)/include/linux
67 HOST_CFLAGS
+= -fsanitize
=address
68 HOST_LDFLAGS
+= -pie
-fsanitize
=address
72 HOST_CFLAGS
+= -fsanitize
=thread
73 HOST_LDFLAGS
+= -pie
-fsanitize
=thread
77 HOST_CFLAGS
+= -fsanitize
=memory
78 HOST_LDFLAGS
+= -pie
-fsanitize
=memory
87 define C_COMPILER_RULE
88 -include $(call SRC_TO_DEP
,$(1))
89 $(call SRC_TO_OBJ
,$(1)): $(1) $(TOP_MAKE
) |
$(dir $(call SRC_TO_OBJ
,$(1)))dir.stamp
90 $(call LOG
,CC
,$$@
,$(CC
) -o
$$@
-c
$$< $(POSIX_CFLAGS
) $(HOST_CFLAGS
) $(CFLAGS
) $(2))
91 @
$(FIXDEPS
) $(call SRC_TO_DEP_PRE_FIXUP
,$(1))
94 define CXX_COMPILER_RULE
95 -include $(call SRC_TO_DEP
,$(1))
96 $(call SRC_TO_OBJ
,$(1)): $(1) $(TOP_MAKE
) |
$(dir $(call SRC_TO_OBJ
,$(1)))dir.stamp
97 $(call LOG
,CXX
,$$@
,$(CXX
) -o
$$@
-c
$$< $(POSIX_CFLAGS
) $(HOST_CFLAGS
) $(CXXFLAGS
) $(2))
98 @
$(FIXDEPS
) $(call SRC_TO_DEP_PRE_FIXUP
,$(1))
105 # $2 = POSIX compiler flags
106 # $3 = VC compiler flags (unused)
109 ifeq ($(suffix $(1)),.c
)
110 $(call C_COMPILER_RULE
,$(1),$(2) $(foreach inc
,$(INC_PATHS
),-I
$(inc
)))
112 $(call CXX_COMPILER_RULE
,$(1),$(2) $(foreach inc
,$(INC_PATHS
),-I
$(inc
)))
121 # $2 = list of source files
124 $(error
'Shared libraries not supported by Host')
132 # $2 = List of source files
135 $(STAMPDIR
)/$(1).stamp
: $(LIBDIR
)/$(OSNAME
)_host
/$(CONFIG_DIR
)/lib
$(1).a
136 @echo
"TOUCHED $$@" > $(STAMPDIR
)/$(1).stamp
138 all: $(LIBDIR
)/$(OSNAME
)_host
/$(CONFIG_DIR
)/lib
$(1).a
139 $(LIBDIR
)/$(OSNAME
)_host
/$(CONFIG_DIR
)/lib
$(1).a
: $(foreach src
,$(2),$(call SRC_TO_OBJ
,$(src
)))
140 $(MKDIR
) -p
$$(dir $$@
)
142 $(call LOG
,LIB
,$$@
,$(AR
) $(ARFLAGS
) $$@
$$^
)
150 # $2 = List of inputs
153 # $5 = List of lib dirs
159 $(1): $(2) $(foreach dep
,$(4),$(STAMPDIR
)/$(dep
).stamp
)
160 $(call LOG
,LINK
,$$@
,$(LINK
) -o
$(1) $(2) $(HOST_LDFLAGS
) $(LDFLAGS
) $(foreach path
,$(5),-L
$(path
)/$(OSNAME
)_host
/$(CONFIG_DIR
) -L
$(path
)/$(OSNAME
)_host
/$(CONFIG
)) $(foreach lib
,$(3),-l
$(lib
)) $(6))
165 $(1): $(2) $(foreach dep
,$(4),$(STAMPDIR
)/$(dep
).stamp
)
166 $(call LOG
,LINK
,$$@
,$(LINK
) -shared
-o
$(1) $(2) $(HOST_LDFLAGS
) $(LDFLAGS
) $(foreach path
,$(5),-L
$(path
)/$(OSNAME
)_host
/$(CONFIG_DIR
) -L
$(path
)/$(OSNAME
)_host
/$(CONFIG
)) $(foreach lib
,$(3),-l
$(lib
)) $(6))
175 # $2 = List of source files
178 # $5 = POSIX linker flags
179 # $6 = VC linker flags
182 $(call LINKER_RULE
,$(OUTDIR
)/$(1)$(HOST_EXT
),$(foreach src
,$(2),$(call SRC_TO_OBJ
,$(src
))),$(filter-out pthread
,$(3)),$(4),$(LIB_PATHS
),$(5))
185 all: $(LIB_LIST
) $(DEPS_LIST
)
190 # The host build makes shared libraries, so the best we can do is -S, which
191 # only strip debug symbols. We don't strip the symbol names.
197 all: $(OUTDIR
)/$(1)$(HOST_EXT
)
198 $(OUTDIR
)/$(1)$(HOST_EXT
): $(OUTDIR
)/$(2)$(HOST_EXT
)
199 $(call LOG
,STRIP
,$$@
,$(STRIP
) -S
-o
$$@
$$^
)
204 # Run standalone builds (command line builds outside of chrome)
208 $(RUN_UNDER
) $(OUTDIR
)/$(TARGET
)$(HOST_EXT
) $(EXE_ARGS
)