15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import StringIO
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import optparse
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sys.path.append(os.path.join(os.path.dirname(SCRIPT_DIR), 'tools'))
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import getos
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)valid_tools = ['newlib', 'glibc', getos.GetPlatform()]
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def Error(msg):
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print(msg)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(1)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PREAMBLE = """\
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'includes': ['%s/build_tools/nacl.gypi'],
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NEXE_TARGET = """\
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'target_name': '%(NAME)s_x86_32%(EXT)s',
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_name': '%(NAME)s_x86_32%(EXT)s',
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': '%(GYP_TYPE)s',
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'sources': %(SOURCES)s,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'libraries': %(LIBS)s,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'include_dirs': %(INCLUDES)s,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cflags': ['-m32', '-pedantic'] + %(CFLAGS)s,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'make_valid_configurations': ['newlib-debug', 'newlib-release',
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    'glibc-debug', 'glibc-release'],
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'ldflags': ['-m32', '-L../../lib/x86_32/<(CONFIGURATION_NAME)'],
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'toolset': 'target',
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(CONFIGS)s
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'target_name': '%(NAME)s_x86_64%(EXT)s',
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_name': '%(NAME)s_x86_64%(EXT)s',
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': '%(GYP_TYPE)s',
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'sources': %(SOURCES)s,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'libraries': %(LIBS)s,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'include_dirs': %(INCLUDES)s,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'make_valid_configurations': ['newlib-debug', 'newlib-release',
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    'glibc-debug', 'glibc-release'],
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cflags': ['-m64', '-pedantic'] + %(CFLAGS)s,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'ldflags': ['-m64', '-L../../lib/x86_64/<(CONFIGURATION_NAME)'],
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'toolset': 'target',
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(CONFIGS)s
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NLIB_TARGET = """\
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'target_name': '%(NAME)s_x86_32%(EXT)s',
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_name': 'lib%(NAME)s%(EXT)s',
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_dir': '../../lib/x86_32/<(CONFIGURATION_NAME)',
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': '%(GYP_TYPE)s',
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'sources': %(SOURCES)s,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'libraries': %(LIBS)s,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'include_dirs': %(INCLUDES)s,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cflags': ['-m32', '-pedantic'] + %(CFLAGS)s,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'make_valid_configurations': ['newlib-debug', 'newlib-release',
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    'glibc-debug', 'glibc-release'],
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'ldflags': ['-m32'],
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'toolset': 'target',
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(CONFIGS)s
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'target_name': '%(NAME)s_x86_64%(EXT)s',
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_name': 'lib%(NAME)s%(EXT)s',
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_dir': '../../lib/x86_64/<(CONFIGURATION_NAME)',
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': '%(GYP_TYPE)s',
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'sources': %(SOURCES)s,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'libraries': %(LIBS)s,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'include_dirs': %(INCLUDES)s,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'make_valid_configurations': ['newlib-debug', 'newlib-release',
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    'glibc-debug', 'glibc-release'],
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cflags': ['-m64', '-pedantic'] + %(CFLAGS)s,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'ldflags': ['-m64'],
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'toolset': 'target',
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(CONFIGS)s
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HOST_LIB_TARGET = """\
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'target_name': '%(NAME)s%(EXT)s',
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': '%(GYP_TYPE)s',
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'toolset': 'host',
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'sources': %(SOURCES)s,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cflags': %(CFLAGS)s,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cflags_c': ['-std=gnu99'],
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'include_dirs': %(INCLUDES)s,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'make_valid_configurations': ['host-debug', 'host-release'],
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_dir': '../../lib/%(ARCH)s/<(CONFIGURATION_NAME)',
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_name': '%(NAME)s%(EXT)s',
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(CONFIGS)s
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HOST_EXE_TARGET = """\
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'target_name': '%(NAME)s%(EXT)s',
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': '%(GYP_TYPE)s',
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'toolset': 'host',
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'sources': %(SOURCES)s,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cflags': %(CFLAGS)s,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cflags_c': ['-std=gnu99'],
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'ldflags': ['-L../../lib/%(ARCH)s/<(CONFIGURATION_NAME)'],
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'libraries': %(LIBS)s,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'include_dirs': %(INCLUDES)s,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'make_valid_configurations': ['host-debug', 'host-release'],
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'msvs_settings': {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'VCLinkerTool': {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'AdditionalLibraryDirectories':
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ['../../lib/%(ARCH)s/<(CONFIGURATION_NAME)'],
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       },
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       %(CONFIGS)s
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NMF_TARGET = """\
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'target_name': '%(NAME)s_%(TOOLCHAIN)s.nmf',
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_name': '%(NAME)s.nmf',
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'product_dir': '<(PRODUCT_DIR)/%(TOOLCHAIN)s',
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': 'none',
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'make_valid_configurations': ['%(TOOLCHAIN)s-debug', '%(TOOLCHAIN)s-release'],
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'actions': [
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'action_name': 'nmf',
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'inputs': ['<(PRODUCT_DIR)/%(NAME)s_x86_32.nexe',
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     '<(PRODUCT_DIR)/%(NAME)s_x86_64.nexe'] + %(SODEPS)s,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'outputs': ['<(PRODUCT_DIR)/%(NAME)s.nmf'],
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'action': ['../../tools/create_nmf.py', '-t', '%(TOOLCHAIN)s', '-s',
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     '<(PRODUCT_DIR)'] + %(NMFACTION)s,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ]
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TOOLCHAIN_CONFIG = """\
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '%(toolchain)s-release' : {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'cflags' : ['-O2'],
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '%(toolchain)s-debug' : {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'cflags' : ['-g', '-O0'],
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NEXE_CONFIG = """\
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          '%(toolchain)s-release' : {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'cflags' : ['--%(toolchain)s', '-O2',
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        '-idirafter', '../../include'],
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'ldflags' : ['--%(toolchain)s'],
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'arflags' : ['--%(toolchain)s'],
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          },
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          '%(toolchain)s-debug' : {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'cflags' : ['--%(toolchain)s', '-g', '-O0',
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        '-idirafter', '../../include'],
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'ldflags' : ['--%(toolchain)s'],
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'arflags' : ['--%(toolchain)s'],
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          },
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WIN32_CONFIGS = """\
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'target_defaults': {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'default_configuration': 'Debug_PPAPI',
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'configurations': {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'Debug_PPAPI': {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'msvs_configuration_platform': 'PPAPI',
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'msbuild_configuration_attributes': {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'ConfigurationType': 'DynamicLibrary'
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'include_dirs': ['../../include/win'],
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'defines': ['_WINDOWS', '_DEBUG', 'WIN32'],
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'Release_PPAPI': {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'msvs_configuration_platform': 'PPAPI',
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'msbuild_configuration_attributes': {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'ConfigurationType': 'DynamicLibrary'
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'include_dirs': ['../../include/win'],
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'defines': ['_WINDOWS', 'NDEBUG', 'WIN32'],
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'Debug_NaCl': {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'msvs_configuration_platform': 'NaCl',
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'msbuild_configuration_attributes': {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'ConfigurationType': 'Application'
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'Release_NaCl': {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'msvs_configuration_platform': 'NaCl',
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'msbuild_configuration_attributes': {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'ConfigurationType': 'Application'
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def WriteNaClTargets(output, target, tools):
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  configs = "'configurations' : {\n"
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for tc in tools:
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if tc not in valid_tools:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if tc in ['newlib', 'glibc']:
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      configs += NEXE_CONFIG % {'toolchain': tc}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  configs += "      }"
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target['CONFIGS'] = configs
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if target['TYPE'] == 'lib':
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.write(NLIB_TARGET % target)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.write(NEXE_TARGET % target)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def ConfigName(toolchain):
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if toolchain == getos.GetPlatform():
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 'host'
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return toolchain
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def ProcessDSC(filename, outfile=None):
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not os.path.exists(filename):
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Error("file not found: %s" % filename)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desc = open(filename).read()
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desc = eval(desc, {}, {})
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not desc.get('TARGETS'):
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Error("no TARGETS found in dsc")
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not outfile:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outfile = desc['NAME'] + '.gyp'
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outfile = os.path.join(os.path.dirname(filename), outfile)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output = StringIO.StringIO()
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  srcdir = os.path.dirname(SCRIPT_DIR)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output.write(PREAMBLE % srcdir.replace("\\", '/'))
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  win32 = sys.platform in ('win32', 'cygwin')
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if win32:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.write(WIN32_CONFIGS)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for tc in desc['TOOLS']:
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if tc in valid_tools:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default = '%s-debug' % ConfigName(tc)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.write("""\
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'target_defaults': {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'default_configuration': '%s',
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'configurations' : {\n""" % default)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for tc in desc['TOOLS']:
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if tc not in valid_tools:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output.write(TOOLCHAIN_CONFIG % {'toolchain': ConfigName(tc)})
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output.write("    }\n  },\n")
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output.write("\n  'targets': [\n")
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # make a list of all the so target names so that the nmf rules
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # can depend on them all
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sofiles = []
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  soremap = []
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for target in desc['TARGETS']:
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if target['TYPE'] == 'so':
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = target['NAME']
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sofiles.append('<(PRODUCT_DIR)/%s_x86_64.so' % name)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sofiles.append('<(PRODUCT_DIR)/%s_x86_32.so' % name)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      soremap += ['-n', '%s_x86_64.so,%s.so' % (name, name)]
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      soremap += ['-n', '%s_x86_32.so,%s.so' % (name, name)]
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # iterate through dsc targets generating gyp targets
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for target in desc['TARGETS']:
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target.setdefault('INCLUDES', [])
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target['INCLUDES'] = [x.replace("$(NACL_SDK_ROOT)", "../..")
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          for x in target['INCLUDES']]
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    libs = target.get('LIBS', [])
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if win32:
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      libs = [l for l in libs if l not in ('ppapi', 'ppapi_cpp')]
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target['LIBS'] = ['-l' + l + '.lib' for l in libs]
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target['LIBS'] = ['-l' + l for l in libs]
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if target['TYPE'] == 'so':
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if win32:
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['EXT'] = ''
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['EXT'] = '.so'
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target['GYP_TYPE'] = 'shared_library'
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif target['TYPE'] == 'lib':
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if win32:
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['EXT'] = ''
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['EXT'] = '.a'
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target['GYP_TYPE'] = 'static_library'
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif target['TYPE'] == 'main':
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target['EXT'] = '.nexe'
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target['GYP_TYPE'] = 'executable'
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Error("unknown type: %s" % target['TYPE'])
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target['CFLAGS'] = target.get('CXXFLAGS', [])
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not win32 and ('newlib' in desc['TOOLS'] or 'glibc' in desc['TOOLS']):
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteNaClTargets(output, target, desc['TOOLS'])
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if target['TYPE'] == 'main':
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['SODEPS'] = sofiles
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['NMFACTION'] = ['-o', '<@(_outputs)', '-L<(NMF_PATH1)',
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               '-L<(NMF_PATH2)', '-D', '<(OBJDUMP)',
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               '<@(_inputs)']
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['NMFACTION'] += soremap
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if 'newlib' in desc['TOOLS']:
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          target['TOOLCHAIN'] = 'newlib'
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          output.write(NMF_TARGET % target)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if 'glibc' in desc['TOOLS']:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          target['TOOLCHAIN'] = 'glibc'
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          output.write(NMF_TARGET % target)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if win32 or getos.GetPlatform() in desc['TOOLS']:
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target['ARCH'] = 'x86_32'
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target['INCLUDES'].append('../../include')
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if win32:
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['HOST'] = 'win'
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['CONFIGS'] = ''
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['CFLAGS'] = []
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['CONFIGS'] = ''
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['HOST'] = 'linux'
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['CFLAGS'].append('-fPIC')
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if target['TYPE'] == 'main':
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        target['GYP_TYPE'] = 'shared_library'
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if win32:
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          target['EXT'] = ''
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else:
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          target['EXT'] = '.so'
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.write(HOST_EXE_TARGET % target)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        output.write(HOST_LIB_TARGET % target)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output.write('  ],\n}\n')
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print('Writing: ' + outfile)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  open(outfile, 'w').write(output.getvalue())
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main(args):
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser = optparse.OptionParser()
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option('-o', help='Set output filename.', dest='output')
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options, args = parser.parse_args(args)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not args:
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Error('No .dsc file specified.')
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if options.output:
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outdir = os.path.dirname(options.output)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not os.path.exists(outdir):
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      os.makedirs(outdir)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert len(args) == 1
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessDSC(args[0], options.output)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  main(sys.argv[1:])
379