blob: 3681cce8d958c9e37b5a6365d89e8d1ad9b15de4 [file] [log] [blame]
#!/usr/bin/python
# Copyright 2013 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import glob
import os
import sys
from collections import namedtuple
from optparse import OptionParser
Config = namedtuple('Config', 'linkfiles linkfileglobs ' +
'rmfiles rmfileglobs no_rmfileglobs')
configs = {
('164.gzip', 'train'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('164.gzip', 'ref'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('175.vpr', 'train'):
Config(linkfiles=[],
linkfileglobs=['data/train/input/*'],
rmfiles=[],
rmfileglobs=['*.out', '*.in'],
no_rmfileglobs=[]),
('175.vpr', 'ref'):
Config(linkfiles=[],
linkfileglobs=['data/ref/input/*'],
rmfiles=[],
rmfileglobs=['*.out', '*.in'],
no_rmfileglobs=[]),
('176.gcc', 'train'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out', '*.s'],
no_rmfileglobs=['*.sz.s']),
('176.gcc', 'ref'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out', '*.s'],
no_rmfileglobs=['*.sz.s']),
('177.mesa', 'train'):
Config(linkfiles=[],
linkfileglobs=['data/train/input/*'],
rmfiles=['mesa.log', 'mesa.ppm', 'mesa.in', 'numbers'],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('177.mesa', 'ref'):
Config(linkfiles=[],
linkfileglobs=['data/ref/input/*'],
rmfiles=['mesa.log', 'mesa.ppm', 'mesa.in', 'numbers'],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('179.art', 'train'):
Config(linkfiles=[],
linkfileglobs=['data/train/input/*'],
rmfiles=['a10.img', 'c756hel.in', 'hc.img'],
rmfileglobs=['*.out', '*.err'],
no_rmfileglobs=[]),
('179.art', 'ref'):
Config(linkfiles=[],
linkfileglobs=['data/ref/input/*'],
rmfiles=['a10.img', 'c756hel.in', 'hc.img'],
rmfileglobs=['*.out', '*.err'],
no_rmfileglobs=[]),
('181.mcf', 'train'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('181.mcf', 'ref'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('183.equake', 'train'):
Config(linkfiles=[],
linkfileglobs=['data/train/input/*'],
rmfiles=['inp.in', 'inp.out'],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('183.equake', 'ref'):
Config(linkfiles=[],
linkfileglobs=['data/ref/input/*'],
rmfiles=['inp.in', 'inp.out'],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('186.crafty', 'train'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('186.crafty', 'ref'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('188.ammp', 'train'):
Config(linkfiles=[],
linkfileglobs=['data/train/input/*'],
rmfiles=['all.new.ammp', 'ammp.in', 'new.tether', 'ammp.out'],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('188.ammp', 'ref'):
Config(linkfiles=[],
linkfileglobs=['data/ref/input/*'],
rmfiles=['all.init.ammp', 'ammp.in', 'ammp.out'],
rmfileglobs=['*.out', 'init_cond.run.[123]'],
no_rmfileglobs=[]),
('197.parser', 'train'):
Config(linkfiles=['data/all/input/words', 'data/all/input/2.1.dict'],
linkfileglobs=[],
rmfiles=['words', '2.1.dict'],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('197.parser', 'ref'):
Config(linkfiles=['data/all/input/words', 'data/all/input/2.1.dict'],
linkfileglobs=[],
rmfiles=['words', '2.1.dict'],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('252.eon', 'train'):
Config(linkfiles=[],
linkfileglobs=['data/train/input/*'],
rmfiles=['materials', 'spectra.dat', 'eon.dat'],
rmfileglobs=['*.out', 'chair.*', 'pixel_*'],
no_rmfileglobs=[]),
('252.eon', 'ref'):
Config(linkfiles=[],
linkfileglobs=['data/ref/input/*'],
rmfiles=['materials', 'spectra.dat', 'eon.dat'],
rmfileglobs=['*.out', 'chair.*', 'pixel_*'],
no_rmfileglobs=[]),
('253.perlbmk', 'train'):
Config(linkfiles=['data/all/input/lib', 'data/train/input/dictionary'],
linkfileglobs=['data/all/input/[bl]enums'],
rmfiles=['lib', 'dictionary'],
rmfileglobs=['*.out', '*.rc', '*enums'],
no_rmfileglobs=[]),
('253.perlbmk', 'ref'):
Config(linkfiles=['data/all/input/lib',
'data/all/input/cpu2000_mhonarc.rc'],
linkfileglobs=['data/all/input/[bl]enums'],
rmfiles=['lib', 'dictionary'],
rmfileglobs=['*.out', '*.rc', '*enums'],
no_rmfileglobs=[]),
('254.gap', 'train'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('254.gap', 'ref'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('255.vortex', 'train'):
Config(linkfiles=[],
linkfileglobs=['data/train/input/*'],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('255.vortex', 'ref'):
Config(linkfiles=[],
linkfileglobs=['data/ref/input/*'],
rmfiles=[],
rmfileglobs=['*.out', '*endian*', 'persons.*'],
no_rmfileglobs=[]),
('256.bzip2', 'train'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out', '*endian*', 'persons.*'],
no_rmfileglobs=[]),
('256.bzip2', 'ref'):
Config(linkfiles=[],
linkfileglobs=[],
rmfiles=[],
rmfileglobs=['*.out'],
no_rmfileglobs=[]),
('300.twolf', 'train'):
Config(linkfiles=[],
linkfileglobs=['data/train/input/*'],
rmfiles=[],
rmfileglobs=['*.out', 'train.*', 'ref.*', 'test.*'],
no_rmfileglobs=[]),
('300.twolf', 'ref'):
Config(linkfiles=[],
linkfileglobs=['data/ref/input/*'],
rmfiles=[],
rmfileglobs=['*.out', 'train.*', 'ref.*', 'test.*'],
no_rmfileglobs=[]),
}
def PrepareInput():
"""Prepares the current directory by removing old input/output files
and symlinking input files.
"""
parser = OptionParser()
parser.add_option('--linkfile', action='append', dest='linkfiles',
default=[], help='Symlink a specific file')
parser.add_option('--link', action='append', dest='linkfileglobs',
default=[], help='Symlink a pattern of files')
parser.add_option('--rmfile', action='append', dest='rmfiles',
default=[], help='Remove a specific file')
parser.add_option('--rm', action='append', dest='rmfileglobs',
default=[], help='Remove a pattern of files')
parser.add_option('--no-rm', action='append', dest='no_rmfileglobs',
default=[], help='Exclude a pattern from --rm set')
parser.add_option('--config', action='store', dest='config', nargs=2,
metavar='SpecDir train|ref',
help='Use predefined config for component SpecDir')
parser.add_option('-v', '--verbose', action='store_true', dest='verbose',
default=False, help='Verbose file messages')
parser.add_option('--gen-emcc-embed', action='store_true',
dest='gen_emcc_embed', default=False,
help='Generate --embed-file options for input files for ' +
'Wasm test')
options, args = parser.parse_args()
if args:
parser.print_help()
return 1
linkfiles = options.linkfiles
linkfileglobs = options.linkfileglobs
rmfiles = options.rmfiles
no_rmfiles = []
rmfileglobs = options.rmfileglobs
no_rmfileglobs = options.no_rmfileglobs
if options.config in configs:
if options.verbose:
print 'Using config', options.config,
print ' ==>', configs[options.config]
linkfiles.extend(configs[options.config].linkfiles)
linkfileglobs.extend(configs[options.config].linkfileglobs)
rmfiles.extend(configs[options.config].rmfiles)
rmfileglobs.extend(configs[options.config].rmfileglobs)
no_rmfileglobs.extend(configs[options.config].no_rmfileglobs)
for pattern in options.linkfileglobs:
linkfiles.extend(glob.glob(pattern))
for pattern in options.rmfileglobs:
rmfiles.extend(glob.glob(pattern))
for pattern in options.no_rmfileglobs:
no_rmfiles.extend(glob.glob(pattern))
# Wasm needs to embed input files into a js file
if options.gen_emcc_embed:
# Some benchmarks directly access input files in data/[config]/input
# directory, while others create symlinks into the current directory.
# When symlinks are created (=linkfileglobs is NOT empty), we embed those
# files assuming they are in the current directory.
# When symlinks are NOT created, we assume files in data/ will be accessed
# directly, and embed those files in the subdirectories.
input_dir = 'data/' + options.config[1] + '/input/*'
opts = ''
linkfiles_in_input_dir = []
if input_dir not in configs[options.config].linkfileglobs:
linkfiles_in_input_dir.extend(glob.glob(input_dir))
for file in linkfiles_in_input_dir:
opts += '--embed-file %s ' % file
for file in linkfiles:
opts += '--embed-file %s@%s ' % (file, os.path.basename(file))
sys.stdout.write(opts)
return 0
for file in set(rmfiles) - set(no_rmfiles):
try:
if options.verbose:
print 'Unlink', file
os.unlink(file)
except OSError:
if options.verbose:
print "Warning: couldn't remove", file
for file in linkfiles:
try:
if options.verbose:
print 'Symlink', file
os.symlink(file, os.path.basename(file))
except OSError:
if options.verbose:
print "Warning: couldn't symlink", file
return 0
if __name__ == '__main__':
sys.exit(PrepareInput())