19fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
29e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# Use of this source code is governed by a BSD-style license that can be
39e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# found in the LICENSE file.
49e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
59e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
69e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# GNU Make based build file.  For details on GNU Make see:
79e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#   http://www.gnu.org/software/make/manual/make.html
89e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
99e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
109e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
119e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
129e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# Macros for TOOLS
139e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
149e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# We use the C++ compiler for everything and then use the -Wl,-as-needed flag
159e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# in the linker to drop libc++ unless it's actually needed.
169e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
179e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgCC ?= $(NACL_COMPILER_PREFIX) gcc
189e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgCXX ?= $(NACL_COMPILER_PREFIX) g++
199e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgLINK ?= $(CXX)
209e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgLIB ?= ar
219e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgSTRIP ?= strip
229e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
239e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# Adding -Wl,-Bsymbolic means that symbols defined within the module are always
249e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# used by the moulde, and not shadowed by symbols already loaded in, for
259e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# exmaple, libc.  Without this the libc symbols (or anything injected with
269e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# LD_PRELOAD will take precedence).
279e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgHOST_LDFLAGS ?= -Wl,-Map,$(OUTDIR)/$(TARGET).map -Wl,-Bsymbolic
289e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
299e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgifeq (,$(findstring gcc,$(shell $(WHICH) gcc)))
309e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(warning To skip the host build use:)
319e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(warning "make all_versions NO_HOST_BUILDS=1")
329e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(error Unable to find gcc in PATH while building Host build)
339e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendif
349e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
359e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgHOST_WARNINGS ?= -Wno-long-long -Wall -Werror
369e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgHOST_CFLAGS = -fPIC -pthread $(HOST_WARNINGS) -I$(NACL_SDK_ROOT)/include -I$(NACL_SDK_ROOT)/include/linux
379e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
389e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
399e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
409e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# Individual Macros
419e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
429e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $1 = Source Name
439e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $2 = Compile Flags
449e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
459e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgdefine C_COMPILER_RULE
469e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org-include $(call SRC_TO_DEP,$(1))
479e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
489e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(call LOG,CC  ,$$@,$(CC) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(HOST_CFLAGS) $(2))
499e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1))
509e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
519e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
529e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgdefine CXX_COMPILER_RULE
539e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org-include $(call SRC_TO_DEP,$(1))
549e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(call SRC_TO_OBJ,$(1)): $(1) $(TOP_MAKE) | $(dir $(call SRC_TO_OBJ,$(1)))dir.stamp
559e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(call LOG,CXX ,$$@,$(CXX) -o $$@ -c $$< -fPIC $(POSIX_FLAGS) $(HOST_CFLAGS) $(2))
569e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	@$(FIXDEPS) $(call SRC_TO_DEP_PRE_FIXUP,$(1))
579e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
589e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
599e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
609e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# Compile Macro
619e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
629e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $1 = Source Name
639e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $2 = POSIX Compile Flags
649e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $3 = VC Flags (unused)
659e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
669e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgdefine COMPILE_RULE
679e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgifeq ($(suffix $(1)),.c)
689e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(call C_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)))
699e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgelse
709e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(call CXX_COMPILER_RULE,$(1),$(2) $(foreach inc,$(INC_PATHS),-I$(inc)))
719e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendif
729e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
739e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
749e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
759e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
769e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# SO Macro
779e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
789e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $1 = Target Name
799e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $2 = List of Sources
809e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
819e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
829e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgdefine SO_RULE
839e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(error 'Shared libraries not supported by Host')
849e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
859e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
869e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
879e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
889e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# LIB Macro
899e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
909e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $1 = Target Name
914d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org# $2 = List of Sources
924d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org#
939e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
949e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgdefine LIB_RULE
959e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).a
969e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	@echo "TOUCHED $$@" > $(STAMPDIR)/$(1).stamp
979e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
989e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgall: $(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).a
999e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(LIBDIR)/$(OSNAME)_host/$(CONFIG)/lib$(1).a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src)))
1009e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(MKDIR) -p $$(dir $$@)
1019e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(RM) -f $$@
1029e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(call LOG,LIB,$$@,$(LIB) -cr $$@ $$^)
1039e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
1049e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1059e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1069e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
1079e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# Link Macro
1089e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
1099e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $1 = Target Name
1109e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $2 = List of inputs
1119e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $3 = List of libs
1129e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $4 = List of deps
1139e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $5 = List of lib dirs
1149e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $6 = Linker Args
1159e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
1169e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgifdef STANDALONE
1173847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.comdefine LINKER_RULE
1183847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.comall: $(1)
1193847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com$(1): $(2) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
1209e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(call LOG,LINK,$$@,$(LINK) -o $(1) $(2) $(HOST_LDFLAGS) $(NACL_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(OSNAME)_host)/$(CONFIG) $(foreach lib,$(3),-l$(lib)) $(6))
1219e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
1229e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgelse
1239e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgdefine LINKER_RULE
1249e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgall: $(1)
1259e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(1): $(2) $(foreach dep,$(4),$(STAMPDIR)/$(dep).stamp)
1269e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(call LOG,LINK,$$@,$(LINK) -shared -o $(1) $(2) $(HOST_LDFLAGS) $(NACL_LDFLAGS) $(LDFLAGS) $(foreach path,$(5),-L$(path)/$(OSNAME)_host)/$(CONFIG) $(foreach lib,$(3),-l$(lib)) $(6))
1279e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
1289e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendif
1299e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1309e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1319e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
1329e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# Link Macro
1339e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
1349e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $1 = Target Name
1359e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $2 = List of Sources
1369e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $3 = List of LIBS
1379e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $4 = List of DEPS
1389e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $5 = POSIX Linker Switches
1399e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# $6 = VC Linker Switches
1409e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
1419e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgdefine LINK_RULE
1429e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org$(call LINKER_RULE,$(OUTDIR)/$(1)$(HOST_EXT),$(foreach src,$(2),$(call SRC_TO_OBJ,$(src))),$(filter-out pthread,$(3)),$(4),$(LIB_PATHS),$(5))
1439e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
1449e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1459e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgall: $(LIB_LIST) $(DEPS_LIST)
1469e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1479e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1489e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#
1499e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# Strip Macro
1509e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org# The host build makes shared libraries, so the best we can do is strip-debug.
1517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org# We cannot strip the symbol names.
1527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#
1537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org# $1 = Target Name
1547c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org# $2 = Input Name
1557c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org#
1567c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgdefine STRIP_RULE
157ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgall: $(OUTDIR)/$(1)$(HOST_EXT)
158ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org$(OUTDIR)/$(1)$(HOST_EXT): $(OUTDIR)/$(2)$(HOST_EXT)
1599e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(call LOG,STRIP,$$@,$(STRIP) --strip-debug -o $$@ $$^)
1609e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendef
1619e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
1629e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
16331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org#
16431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org# Run standalone builds (command line builds outside of chrome)
16531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org#
1669e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgifdef STANDALONE
1679e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgrun: all
1689e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org	$(RUN_UNDER) $(OUTDIR)/$(TARGET)$(HOST_EXT) $(EXE_ARGS)
1699e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgendif
1709e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org