| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 import argparse | |
| 7 import StringIO | |
| 8 import sys | |
| 9 import os | |
| 10 | |
| 11 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) | |
| 12 sys.path.append(os.path.join(os.path.dirname(SCRIPT_DIR), 'tools')) | |
| 13 | |
| 14 import getos | |
| 15 | |
| 16 valid_tools = ['newlib', 'glibc', getos.GetPlatform()] | |
| 17 | |
| 18 | |
| 19 def Error(msg): | |
| 20 print(msg) | |
| 21 sys.exit(1) | |
| 22 | |
| 23 | |
| 24 PREAMBLE = """\ | |
| 25 { | |
| 26 'includes': ['%s/build_tools/nacl.gypi'], | |
| 27 """ | |
| 28 | |
| 29 NEXE_TARGET = """\ | |
| 30 { | |
| 31 'target_name': '%(NAME)s_x86_32%(EXT)s', | |
| 32 'product_name': '%(NAME)s_x86_32%(EXT)s', | |
| 33 'type': '%(GYP_TYPE)s', | |
| 34 'sources': %(SOURCES)s, | |
| 35 'libraries': %(LIBS)s, | |
| 36 'include_dirs': %(INCLUDES)s, | |
| 37 'cflags': ['-m32', '-pedantic'] + %(CFLAGS)s, | |
| 38 'make_valid_configurations': ['newlib-debug', 'newlib-release', | |
| 39 'glibc-debug', 'glibc-release'], | |
| 40 'ldflags': ['-m32', '-L../../lib/x86_32/<(CONFIGURATION_NAME)'], | |
| 41 'toolset': 'target', | |
| 42 %(CONFIGS)s | |
| 43 }, | |
| 44 { | |
| 45 'target_name': '%(NAME)s_x86_64%(EXT)s', | |
| 46 'product_name': '%(NAME)s_x86_64%(EXT)s', | |
| 47 'type': '%(GYP_TYPE)s', | |
| 48 'sources': %(SOURCES)s, | |
| 49 'libraries': %(LIBS)s, | |
| 50 'include_dirs': %(INCLUDES)s, | |
| 51 'make_valid_configurations': ['newlib-debug', 'newlib-release', | |
| 52 'glibc-debug', 'glibc-release'], | |
| 53 'cflags': ['-m64', '-pedantic'] + %(CFLAGS)s, | |
| 54 'ldflags': ['-m64', '-L../../lib/x86_64/<(CONFIGURATION_NAME)'], | |
| 55 'toolset': 'target', | |
| 56 %(CONFIGS)s | |
| 57 }, | |
| 58 """ | |
| 59 | |
| 60 NLIB_TARGET = """\ | |
| 61 { | |
| 62 'target_name': '%(NAME)s_x86_32%(EXT)s', | |
| 63 'product_name': 'lib%(NAME)s%(EXT)s', | |
| 64 'product_dir': '../../lib/x86_32/<(CONFIGURATION_NAME)', | |
| 65 'type': '%(GYP_TYPE)s', | |
| 66 'sources': %(SOURCES)s, | |
| 67 'libraries': %(LIBS)s, | |
| 68 'include_dirs': %(INCLUDES)s, | |
| 69 'cflags': ['-m32', '-pedantic'] + %(CFLAGS)s, | |
| 70 'make_valid_configurations': ['newlib-debug', 'newlib-release', | |
| 71 'glibc-debug', 'glibc-release'], | |
| 72 'ldflags': ['-m32'], | |
| 73 'toolset': 'target', | |
| 74 %(CONFIGS)s | |
| 75 }, | |
| 76 { | |
| 77 'target_name': '%(NAME)s_x86_64%(EXT)s', | |
| 78 'product_name': 'lib%(NAME)s%(EXT)s', | |
| 79 'product_dir': '../../lib/x86_64/<(CONFIGURATION_NAME)', | |
| 80 'type': '%(GYP_TYPE)s', | |
| 81 'sources': %(SOURCES)s, | |
| 82 'libraries': %(LIBS)s, | |
| 83 'include_dirs': %(INCLUDES)s, | |
| 84 'make_valid_configurations': ['newlib-debug', 'newlib-release', | |
| 85 'glibc-debug', 'glibc-release'], | |
| 86 'cflags': ['-m64', '-pedantic'] + %(CFLAGS)s, | |
| 87 'ldflags': ['-m64'], | |
| 88 'toolset': 'target', | |
| 89 %(CONFIGS)s | |
| 90 }, | |
| 91 """ | |
| 92 | |
| 93 HOST_LIB_TARGET = """\ | |
| 94 { | |
| 95 'target_name': '%(NAME)s%(EXT)s', | |
| 96 'type': '%(GYP_TYPE)s', | |
| 97 'toolset': 'host', | |
| 98 'sources': %(SOURCES)s, | |
| 99 'cflags': %(CFLAGS)s, | |
| 100 'cflags_c': ['-std=gnu99'], | |
| 101 'include_dirs': %(INCLUDES)s, | |
| 102 'make_valid_configurations': ['host-debug', 'host-release'], | |
| 103 'product_dir': '../../lib/%(ARCH)s/<(CONFIGURATION_NAME)', | |
| 104 'product_name': '%(NAME)s%(EXT)s', | |
| 105 %(CONFIGS)s | |
| 106 }, | |
| 107 """ | |
| 108 | |
| 109 HOST_EXE_TARGET = """\ | |
| 110 { | |
| 111 'target_name': '%(NAME)s%(EXT)s', | |
| 112 'type': '%(GYP_TYPE)s', | |
| 113 'toolset': 'host', | |
| 114 'sources': %(SOURCES)s, | |
| 115 'cflags': %(CFLAGS)s, | |
| 116 'cflags_c': ['-std=gnu99'], | |
| 117 'ldflags': ['-L../../lib/%(ARCH)s/<(CONFIGURATION_NAME)'], | |
| 118 'libraries': %(LIBS)s, | |
| 119 'include_dirs': %(INCLUDES)s, | |
| 120 'make_valid_configurations': ['host-debug', 'host-release'], | |
| 121 'msvs_settings': { | |
| 122 'VCLinkerTool': { | |
| 123 'AdditionalLibraryDirectories': | |
| 124 ['../../lib/%(ARCH)s/<(CONFIGURATION_NAME)'], | |
| 125 } | |
| 126 }, | |
| 127 %(CONFIGS)s | |
| 128 }, | |
| 129 """ | |
| 130 | |
| 131 NMF_TARGET = """\ | |
| 132 { | |
| 133 'target_name': '%(NAME)s_%(TOOLCHAIN)s.nmf', | |
| 134 'product_name': '%(NAME)s.nmf', | |
| 135 'product_dir': '<(PRODUCT_DIR)/%(TOOLCHAIN)s', | |
| 136 'type': 'none', | |
| 137 'make_valid_configurations': ['%(TOOLCHAIN)s-debug', '%(TOOLCHAIN)s-releas
e'], | |
| 138 'actions': [ | |
| 139 { | |
| 140 'action_name': 'nmf', | |
| 141 'inputs': ['<(PRODUCT_DIR)/%(NAME)s_x86_32.nexe', | |
| 142 '<(PRODUCT_DIR)/%(NAME)s_x86_64.nexe'] + %(SODEPS)s, | |
| 143 'outputs': ['<(PRODUCT_DIR)/%(NAME)s.nmf'], | |
| 144 'action': ['../../tools/create_nmf.py', '-t', '%(TOOLCHAIN)s', '-s', | |
| 145 '<(PRODUCT_DIR)'] + %(NMFACTION)s, | |
| 146 }, | |
| 147 ] | |
| 148 }, | |
| 149 """ | |
| 150 | |
| 151 TOOLCHAIN_CONFIG = """\ | |
| 152 '%(toolchain)s-release' : { | |
| 153 'cflags' : ['-O2'], | |
| 154 }, | |
| 155 '%(toolchain)s-debug' : { | |
| 156 'cflags' : ['-g', '-O0'], | |
| 157 }, | |
| 158 """ | |
| 159 | |
| 160 NEXE_CONFIG = """\ | |
| 161 '%(toolchain)s-release' : { | |
| 162 'cflags' : ['--%(toolchain)s', '-O2', | |
| 163 '-idirafter', '../../include'], | |
| 164 'ldflags' : ['--%(toolchain)s'], | |
| 165 'arflags' : ['--%(toolchain)s'], | |
| 166 }, | |
| 167 '%(toolchain)s-debug' : { | |
| 168 'cflags' : ['--%(toolchain)s', '-g', '-O0', | |
| 169 '-idirafter', '../../include'], | |
| 170 'ldflags' : ['--%(toolchain)s'], | |
| 171 'arflags' : ['--%(toolchain)s'], | |
| 172 }, | |
| 173 """ | |
| 174 | |
| 175 WIN32_CONFIGS = """\ | |
| 176 'target_defaults': { | |
| 177 'default_configuration': 'Debug_PPAPI', | |
| 178 'configurations': { | |
| 179 'Debug_PPAPI': { | |
| 180 'msvs_configuration_platform': 'PPAPI', | |
| 181 'msbuild_configuration_attributes': { | |
| 182 'ConfigurationType': 'DynamicLibrary' | |
| 183 }, | |
| 184 'include_dirs': ['../../include/win'], | |
| 185 'defines': ['_WINDOWS', '_DEBUG', 'WIN32'], | |
| 186 }, | |
| 187 'Release_PPAPI': { | |
| 188 'msvs_configuration_platform': 'PPAPI', | |
| 189 'msbuild_configuration_attributes': { | |
| 190 'ConfigurationType': 'DynamicLibrary' | |
| 191 }, | |
| 192 'include_dirs': ['../../include/win'], | |
| 193 'defines': ['_WINDOWS', 'NDEBUG', 'WIN32'], | |
| 194 }, | |
| 195 'Debug_NaCl': { | |
| 196 'msvs_configuration_platform': 'NaCl', | |
| 197 'msbuild_configuration_attributes': { | |
| 198 'ConfigurationType': 'Application' | |
| 199 }, | |
| 200 }, | |
| 201 'Release_NaCl': { | |
| 202 'msvs_configuration_platform': 'NaCl', | |
| 203 'msbuild_configuration_attributes': { | |
| 204 'ConfigurationType': 'Application' | |
| 205 }, | |
| 206 }, | |
| 207 }, | |
| 208 }, | |
| 209 """ | |
| 210 | |
| 211 | |
| 212 def WriteNaClTargets(output, target, tools): | |
| 213 configs = "'configurations' : {\n" | |
| 214 for tc in tools: | |
| 215 if tc not in valid_tools: | |
| 216 continue | |
| 217 if tc in ['newlib', 'glibc']: | |
| 218 configs += NEXE_CONFIG % {'toolchain': tc} | |
| 219 configs += " }" | |
| 220 target['CONFIGS'] = configs | |
| 221 if target['TYPE'] == 'lib': | |
| 222 output.write(NLIB_TARGET % target) | |
| 223 else: | |
| 224 output.write(NEXE_TARGET % target) | |
| 225 | |
| 226 | |
| 227 def ConfigName(toolchain): | |
| 228 if toolchain == getos.GetPlatform(): | |
| 229 return 'host' | |
| 230 else: | |
| 231 return toolchain | |
| 232 | |
| 233 | |
| 234 def ProcessDSC(filename, outfile=None): | |
| 235 if not os.path.exists(filename): | |
| 236 Error("file not found: %s" % filename) | |
| 237 | |
| 238 desc = open(filename).read() | |
| 239 desc = eval(desc, {}, {}) | |
| 240 if not desc.get('TARGETS'): | |
| 241 Error("no TARGETS found in dsc") | |
| 242 | |
| 243 if not outfile: | |
| 244 outfile = desc['NAME'] + '.gyp' | |
| 245 outfile = os.path.join(os.path.dirname(filename), outfile) | |
| 246 | |
| 247 output = StringIO.StringIO() | |
| 248 | |
| 249 srcdir = os.path.dirname(SCRIPT_DIR) | |
| 250 output.write(PREAMBLE % srcdir.replace("\\", '/')) | |
| 251 | |
| 252 win32 = sys.platform in ('win32', 'cygwin') | |
| 253 if win32: | |
| 254 output.write(WIN32_CONFIGS) | |
| 255 else: | |
| 256 for tc in desc['TOOLS']: | |
| 257 if tc in valid_tools: | |
| 258 default = '%s-debug' % ConfigName(tc) | |
| 259 break | |
| 260 | |
| 261 output.write("""\ | |
| 262 'target_defaults': { | |
| 263 'default_configuration': '%s', | |
| 264 'configurations' : {\n""" % default) | |
| 265 | |
| 266 for tc in desc['TOOLS']: | |
| 267 if tc not in valid_tools: | |
| 268 continue | |
| 269 output.write(TOOLCHAIN_CONFIG % {'toolchain': ConfigName(tc)}) | |
| 270 | |
| 271 output.write(" }\n },\n") | |
| 272 | |
| 273 output.write("\n 'targets': [\n") | |
| 274 | |
| 275 # make a list of all the so target names so that the nmf rules | |
| 276 # can depend on them all | |
| 277 sofiles = [] | |
| 278 soremap = [] | |
| 279 for target in desc['TARGETS']: | |
| 280 if target['TYPE'] == 'so': | |
| 281 name = target['NAME'] | |
| 282 sofiles.append('<(PRODUCT_DIR)/%s_x86_64.so' % name) | |
| 283 sofiles.append('<(PRODUCT_DIR)/%s_x86_32.so' % name) | |
| 284 soremap += ['-n', '%s_x86_64.so,%s.so' % (name, name)] | |
| 285 soremap += ['-n', '%s_x86_32.so,%s.so' % (name, name)] | |
| 286 | |
| 287 | |
| 288 # iterate through dsc targets generating gyp targets | |
| 289 for target in desc['TARGETS']: | |
| 290 target.setdefault('INCLUDES', []) | |
| 291 target['INCLUDES'] = [x.replace("$(NACL_SDK_ROOT)", "../..") | |
| 292 for x in target['INCLUDES']] | |
| 293 | |
| 294 libs = target.get('LIBS', []) | |
| 295 if win32: | |
| 296 libs = [l for l in libs if l not in ('ppapi', 'ppapi_cpp')] | |
| 297 target['LIBS'] = ['-l' + l + '.lib' for l in libs] | |
| 298 else: | |
| 299 target['LIBS'] = ['-l' + l for l in libs] | |
| 300 if target['TYPE'] == 'so': | |
| 301 if win32: | |
| 302 target['EXT'] = '' | |
| 303 else: | |
| 304 target['EXT'] = '.so' | |
| 305 target['GYP_TYPE'] = 'shared_library' | |
| 306 elif target['TYPE'] == 'lib': | |
| 307 if win32: | |
| 308 target['EXT'] = '' | |
| 309 else: | |
| 310 target['EXT'] = '.a' | |
| 311 target['GYP_TYPE'] = 'static_library' | |
| 312 elif target['TYPE'] == 'main': | |
| 313 target['EXT'] = '.nexe' | |
| 314 target['GYP_TYPE'] = 'executable' | |
| 315 else: | |
| 316 Error("unknown type: %s" % target['TYPE']) | |
| 317 | |
| 318 target['CFLAGS'] = target.get('CXXFLAGS', []) | |
| 319 | |
| 320 if not win32 and ('newlib' in desc['TOOLS'] or 'glibc' in desc['TOOLS']): | |
| 321 WriteNaClTargets(output, target, desc['TOOLS']) | |
| 322 if target['TYPE'] == 'main': | |
| 323 target['SODEPS'] = sofiles | |
| 324 target['NMFACTION'] = ['-o', '<@(_outputs)', '-L<(NMF_PATH1)', | |
| 325 '-L<(NMF_PATH2)', '-D', '<(OBJDUMP)', | |
| 326 '<@(_inputs)'] | |
| 327 target['NMFACTION'] += soremap | |
| 328 if 'newlib' in desc['TOOLS']: | |
| 329 target['TOOLCHAIN'] = 'newlib' | |
| 330 output.write(NMF_TARGET % target) | |
| 331 if 'glibc' in desc['TOOLS']: | |
| 332 target['TOOLCHAIN'] = 'glibc' | |
| 333 output.write(NMF_TARGET % target) | |
| 334 | |
| 335 if win32 or getos.GetPlatform() in desc['TOOLS']: | |
| 336 target['ARCH'] = 'x86_32' | |
| 337 target['INCLUDES'].append('../../include') | |
| 338 if win32: | |
| 339 target['HOST'] = 'win' | |
| 340 target['CONFIGS'] = '' | |
| 341 target['CFLAGS'] = [] | |
| 342 else: | |
| 343 target['CONFIGS'] = '' | |
| 344 target['HOST'] = 'linux' | |
| 345 target['CFLAGS'].append('-fPIC') | |
| 346 if target['TYPE'] == 'main': | |
| 347 target['GYP_TYPE'] = 'shared_library' | |
| 348 if win32: | |
| 349 target['EXT'] = '' | |
| 350 else: | |
| 351 target['EXT'] = '.so' | |
| 352 output.write(HOST_EXE_TARGET % target) | |
| 353 else: | |
| 354 output.write(HOST_LIB_TARGET % target) | |
| 355 | |
| 356 output.write(' ],\n}\n') | |
| 357 | |
| 358 print('Writing: ' + outfile) | |
| 359 open(outfile, 'w').write(output.getvalue()) | |
| 360 | |
| 361 | |
| 362 def main(args): | |
| 363 parser = argparse.ArgumentParser() | |
| 364 parser.add_argument('-o', help='Set output filename.', dest='output') | |
| 365 parser.add_argument('dsc', help='dsc to convert') | |
| 366 options = parser.parse_args(args) | |
| 367 | |
| 368 if options.output: | |
| 369 outdir = os.path.dirname(options.output) | |
| 370 if not os.path.exists(outdir): | |
| 371 os.makedirs(outdir) | |
| 372 | |
| 373 ProcessDSC(options.dsc, options.output) | |
| 374 return 0 | |
| 375 | |
| 376 | |
| 377 if __name__ == '__main__': | |
| 378 sys.exit(main(sys.argv[1:])) | |
| OLD | NEW |