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
21 # We use the C++ compiler for everything and then use the -Wl,-as-needed flag
22 # in the linker to drop libc++ unless it's actually needed.
29 ifdef NACL_COMPILER_PREFIX
30 CC
= $(NACL_COMPILER_PREFIX
) $(CC
)
31 CXX
= $(NACL_COMPILER_PREFIX
) $(CXX
)
39 ifeq (,$(findstring gcc
,$(shell $(WHICH
) gcc
)))
40 $(warning To skip the host build use
:)
41 $(warning
"make all_versions NO_HOST_BUILDS=1")
42 $(error Unable to find gcc in PATH while building Host build
)
45 HOST_WARNINGS ?
= -Wno-long-long
-Wall
-Werror
46 HOST_CFLAGS
= -fPIC
-pthread
$(HOST_WARNINGS
) -I
$(NACL_SDK_ROOT
)/include
49 # Adding -Wl,-Bsymbolic means that symbols defined within the module are always
50 # used by the module, and not shadowed by symbols already loaded in, for
51 # exmaple, libc. Without this the libc symbols (or anything injected with
52 # LD_PRELOAD will take precedence).
53 # -pthread is not needed on mac (libpthread is a symlink to libSystem) and
54 # in fact generated a warning if passed at link time.
55 HOST_LDFLAGS ?
= -Wl
,-Map
,$(OUTDIR
)/$(TARGET
).map
-Wl
,-Bsymbolic
-pthread
56 HOST_CFLAGS
+= -I
$(NACL_SDK_ROOT
)/include/mac
58 HOST_LDFLAGS ?
= -Wl
,-map
-Wl
,$(OUTDIR
)/$(TARGET
).map
59 HOST_CFLAGS
+= -I
$(NACL_SDK_ROOT
)/include/linux
63 HOST_CFLAGS
+= -fsanitize
=address
64 HOST_LDFLAGS
+= -pie
-fsanitize
=address
68 HOST_CFLAGS
+= -fsanitize
=thread
69 HOST_LDFLAGS
+= -pie
-fsanitize
=thread
78 define C_COMPILER_RULE
79 -include $(call SRC_TO_DEP
,$(1))
80 $(call SRC_TO_OBJ
,$(1)): $(1) $(TOP_MAKE
) |
$(dir $(call SRC_TO_OBJ
,$(1)))dir.stamp
81 $(call LOG
,CC
,$$@
,$(CC
) -o
$$@
-c
$$< $(POSIX_CFLAGS
) $(HOST_CFLAGS
) $(CFLAGS
) $(2))
82 @
$(FIXDEPS
) $(call SRC_TO_DEP_PRE_FIXUP
,$(1))
85 define CXX_COMPILER_RULE
86 -include $(call SRC_TO_DEP
,$(1))
87 $(call SRC_TO_OBJ
,$(1)): $(1) $(TOP_MAKE
) |
$(dir $(call SRC_TO_OBJ
,$(1)))dir.stamp
88 $(call LOG
,CXX
,$$@
,$(CXX
) -o
$$@
-c
$$< $(POSIX_CFLAGS
) $(HOST_CFLAGS
) $(CXXFLAGS
) $(2))
89 @
$(FIXDEPS
) $(call SRC_TO_DEP_PRE_FIXUP
,$(1))
96 # $2 = POSIX compiler flags
97 # $3 = VC compiler flags (unused)
100 ifeq ($(suffix $(1)),.c
)
101 $(call C_COMPILER_RULE
,$(1),$(2) $(foreach inc
,$(INC_PATHS
),-I
$(inc
)))
103 $(call CXX_COMPILER_RULE
,$(1),$(2) $(foreach inc
,$(INC_PATHS
),-I
$(inc
)))
112 # $2 = list of source files
115 $(error
'Shared libraries not supported by Host')
123 # $2 = List of source files
126 $(STAMPDIR
)/$(1).stamp
: $(LIBDIR
)/$(OSNAME
)_host
/$(CONFIG_DIR
)/lib
$(1).a
127 @echo
"TOUCHED $$@" > $(STAMPDIR
)/$(1).stamp
129 all: $(LIBDIR
)/$(OSNAME
)_host
/$(CONFIG_DIR
)/lib
$(1).a
130 $(LIBDIR
)/$(OSNAME
)_host
/$(CONFIG_DIR
)/lib
$(1).a
: $(foreach src
,$(2),$(call SRC_TO_OBJ
,$(src
)))
131 $(MKDIR
) -p
$$(dir $$@
)
133 $(call LOG
,LIB
,$$@
,$(AR
) $(ARFLAGS
) $$@
$$^
)
141 # $2 = List of inputs
144 # $5 = List of lib dirs
150 $(1): $(2) $(foreach dep
,$(4),$(STAMPDIR
)/$(dep
).stamp
)
151 $(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))
156 $(1): $(2) $(foreach dep
,$(4),$(STAMPDIR
)/$(dep
).stamp
)
157 $(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))
166 # $2 = List of source files
169 # $5 = POSIX linker flags
170 # $6 = VC linker flags
173 $(call LINKER_RULE
,$(OUTDIR
)/$(1)$(HOST_EXT
),$(foreach src
,$(2),$(call SRC_TO_OBJ
,$(src
))),$(filter-out pthread
,$(3)),$(4),$(LIB_PATHS
),$(5))
176 all: $(LIB_LIST
) $(DEPS_LIST
)
181 # The host build makes shared libraries, so the best we can do is -S, which
182 # only strip debug symbols. We don't strip the symbol names.
188 all: $(OUTDIR
)/$(1)$(HOST_EXT
)
189 $(OUTDIR
)/$(1)$(HOST_EXT
): $(OUTDIR
)/$(2)$(HOST_EXT
)
190 $(call LOG
,STRIP
,$$@
,$(STRIP
) -S
-o
$$@
$$^
)
195 # Run standalone builds (command line builds outside of chrome)
199 $(RUN_UNDER
) $(OUTDIR
)/$(TARGET
)$(HOST_EXT
) $(EXE_ARGS
)