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