10f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)# Copyright (c) 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""This is a simplified Makefile generator for single-target gyp files.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)It was originally designed for generating readable Makefiles for the
70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)the NaCl examples.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# pylint: disable=C0301
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import gyp.common
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from gyp.common import GetEnvironFallback
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from gyp.generator.make import QuoteIfNecessary
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)generator_default_variables = {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'EXECUTABLE_PREFIX': '',
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'EXECUTABLE_SUFFIX': '',
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'STATIC_LIB_PREFIX': 'lib',
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'SHARED_LIB_PREFIX': 'lib',
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'STATIC_LIB_SUFFIX': '.a',
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'INTERMEDIATE_DIR': '$(BUILDDIR)/$(BUILDTYPE)/obj',
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'SHARED_INTERMEDIATE_DIR': '$(obj)/gen',
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PRODUCT_DIR': '$(BUILDDIR)/$(BUILDTYPE)',
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CONFIGURATION_NAME': '$(BUILDTYPE)',
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)generator_additional_non_configuration_keys = [
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'make_valid_configurations',
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)]
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)preamble = """\
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# GNU Make based build file.  For details on GNU Make see:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   http://www.gnu.org/software/make/manual/make.html
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This file was generated by gyp (http://code.google.com/p/gyp/)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Default build configuration
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BUILDTYPE = %(default_config)s
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# All possible build configurations
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BUILDTYPES = %(all_configs)s
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check for valid build configuration
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ifeq (,$(findstring $(BUILDTYPE),$(BUILDTYPES)))
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$(warning Possible build configurations are: $(BUILDTYPES))
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$(warning Cannot use BUILDTYPE=$(BUILDTYPE) with this Makefile.)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)all:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Target toolchain
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CC.target ?= %(CC.target)s
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CFLAGS.target ?= $(CFLAGS)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXX.target ?= %(CXX.target)s
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXXFLAGS.target ?= $(CXXFLAGS)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LINK.target ?= %(LINK.target)s
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LDFLAGS.target ?= $(LDFLAGS)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AR.target ?= %(AR.target)s
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ARFLAGS.target ?= %(ARFLAGS.target)s
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Host toolchain
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CC.host ?= gcc
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CFLAGS.host ?=
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXX.host ?= g++
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CXXFLAGS.host ?=
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LINK.host ?= g++
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LDFLAGS.host ?=
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AR.host ?= ar
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ARFLAGS.host := %(ARFLAGS.host)s
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BUILDDIR = build
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEPFLAGS = -MMD
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEPFILES :=
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles).PHONY: all clean
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)all:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)clean:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\trm -rf $(BUILDDIR)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)none_section = """
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TARGET = $(BUILDDIR)/$(BUILDTYPE)/%(target)s.stamp
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)all: $(TARGET)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INPUTS = %(inputs)s
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$(TARGET): $(INPUTS)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)target_section = """
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TARGET = %(product)s
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)all: $(TARGET)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SOURCES = %(sources)s
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LIBS_%(target_name_var)s_$(BUILDTYPE) = %(libs)s
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OBJS = %(objs)s
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEPFILES += $(OBJS:%%.o=%%.d)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Suffix rules, putting all outputs into build folder.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$(BUILDDIR)/$(BUILDTYPE)/obj_%(target)s/%%.o: %%.c
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t@mkdir -p $(dir $@)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t$(CC.%(toolset)s) $(CFLAGS_%(target_name_var)s_$(BUILDTYPE)) -c -o $@ $<
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$(BUILDDIR)/$(BUILDTYPE)/obj_%(target)s/%%.o: %%.cc
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t@mkdir -p $(dir $@)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t$(CXX.%(toolset)s) $(CXXFLAGS_%(target_name_var)s_$(BUILDTYPE)) -c -o $@ $<
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lib_section = """
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$(TARGET): $(OBJS)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t@mkdir -p $(dir $@)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t$(AR.%(toolset)s) $(ARFLAGS.%(toolset)s) $(ARFLAGS_%(target_name_var)s_$(BUILDTYPE)) $@ $^
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)link_section = """
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$(TARGET): $(OBJS)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t@mkdir -p $(dir $@)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\t$(LINK.%(toolset)s) $(LDFLAGS_%(target_name_var)s_$(BUILDTYPE)) $(LDFLAGS.%(toolset)s) -o $@ -Wl,--start-group $^ $(LIBS_%(target_name_var)s_$(BUILDTYPE)) -Wl,--end-group
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def MakeList(value_list, prefix='', quoter=QuoteIfNecessary, initial_indent=0):
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Construct from a list of values a string that can be assigned to a make
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  variable.  This uses line continuations and limits line length to 80 chars.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not value_list:
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ''
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value_list = [quoter(prefix + l) for l in value_list]
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lines = []
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  line = ' ' * initial_indent
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for value in value_list:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if len(line) + len(value) >= 79:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lines.append(line)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      line = ''
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif line:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      line += ' '
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line += value
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lines.append(line)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rtn = ' \\\n\t'.join(lines)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rtn.lstrip()
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def WriteList(makefile, value_list, variable, prefix='', quoter=QuoteIfNecessary):
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values = MakeList(value_list, prefix, quoter, initial_indent=len(variable)+4)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  makefile.write("\n%s := %s\n" % (variable, values))
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def WriteConfig(makefile, name, config, target_type):
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteList(makefile, config.get('defines', []), 'DEFS_%s' % name, '-D')
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteList(makefile, config.get('cflags', []), 'CPPFLAGS_%s' % name)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteList(makefile, config.get('arflags', []), 'ARFLAGS_%s' % name)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ldflags = config.get('ldflags', [])
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if target_type == 'shared_library':
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ldflags.insert(0, '-shared')
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteList(makefile, ldflags, 'LDFLAGS_%s' % name)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  include_dirs = config.get('include_dirs', [])
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  include_dirs = ["-I%s" % i for i in include_dirs]
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  common_flags = ['$(CPPFLAGS_%s)' % name, '$(DEFS_%s)' % name, '$(DEPFLAGS)']
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  common_flags += include_dirs
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteList(makefile, common_flags + config.get('cflags_c', []), 'CFLAGS_%s' % name)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteList(makefile, common_flags + config.get('cflags_cc', []), 'CXXFLAGS_%s' % name)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def WriteActions(makefile, actions, target_type):
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for action in actions:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd = gyp.common.EncodePOSIXShellList(action['action'])
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    makefile.write("\t%s\n" % cmd)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if target_type == 'none':
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    makefile.write("\ttouch $@\n")
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  makefile.write("\n")
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def WriteTarget(makefile, target_info):
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_conf = ' '.join(target_info.get('make_valid_configurations', []))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if valid_conf:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    makefile.write("\nifneq (,$(findstring $(BUILDTYPE),%s))\n" % valid_conf)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  makefile.write('''
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)##
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Settings for the '%(target_name)s'
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)##
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)''' % target_info)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sources = target_info.get('sources', [])
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exts = ['.cc', '.c', '.cxx', '.cpp']
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sources = [s for s in sources if os.path.splitext(s)[1] in exts]
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  objects = [os.path.splitext(src)[0] for src in sources]
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  objects = [obj + '.o' for obj in objects]
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_name_var = target_info['target_name']
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_name_var = target_name_var.replace('.', '_')
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for name, config in target_info['configurations'].items():
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name = target_name_var + '_' + name
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteConfig(makefile, name, config, target_info['type'])
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  actions = target_info.get('actions', [])
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params = {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'target': target_info['target_name'],
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'product': target_info['target_name'],
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'target_name_var': target_name_var,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if 'product_name' in target_info:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params['product'] = target_info['product_name']
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if target_info['type'] == 'static_library':
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefix = 'lib'
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif target_info['type'] == 'shared_library':
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefix = 'lib'
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefix = ''
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if prefix and not params['product'].startswith(prefix):
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params['product'] = prefix + params['product']
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dirname = target_info.get('product_dir', '$(BUILDDIR)/$(BUILDTYPE)')
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params['product'] = os.path.join(dirname, params['product'])
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if target_info['type'] == 'none':
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.update({
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'inputs': MakeList(actions[0]['inputs'])
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    })
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    makefile.write(none_section % params)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    builddir = '$(BUILDDIR)/$(BUILDTYPE)/obj_%s' % target_info['target_name']
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.update({
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'sources': MakeList(sources),
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'libs': MakeList(target_info['libraries']),
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'objs': MakeList(["%s/%s" % (builddir, obj) for obj in objects]),
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'toolset': target_info['toolset']
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    })
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    makefile.write(target_section % params)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if target_info['type'] == 'static_library':
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      makefile.write(lib_section % params)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      makefile.write(link_section % params)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteActions(makefile, actions, target_info['type'])
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if valid_conf:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    makefile.write('endif\n')
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GenerateOutput(target_list, target_dicts, data, params):
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Main entry point for this generator.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gyp will call this function.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options = params['options']
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  makefilename = os.path.join(options.toplevel_dir, 'Makefile')
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  makefile = open(makefilename, 'w')
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  make_global_settings = data[build_file].get('make_global_settings', [])
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings_map = dict((key, value) for key, value in make_global_settings)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_info = target_dicts[target_list[0]]
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params = {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'CC.target': GetEnvironFallback(['CC_target'], '$(CC)'),
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'AR.target': GetEnvironFallback(['AR_target'], '$(AR)'),
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ARFLAGS.target': GetEnvironFallback(['ARFLAGS_target'], 'crs'),
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'CXX.target': GetEnvironFallback(['CXX_target'], '$(CXX)'),
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'LINK.target': GetEnvironFallback(['LINK_target'], '$(LINK)') ,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ARFLAGS.host': GetEnvironFallback(['ARFLAGS_host'], 'crs'),
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'default_config': target_info['default_configuration'],
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'all_configs': ' '.join(target_info['configurations'].keys()),
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.update(settings_map)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  makefile.write(preamble % params)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for target_info in target_dicts.values():
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteTarget(makefile, target_info)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  makefile.write('''
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# include (if they exists) the .d dependency files that the compiler generates
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)-include $(DEPFILES)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)endif
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)''')
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  makefile.close()
304