| #!/usr/bin/env python |
| # Copyright (c) 2006-2008 The Regents of The University of Michigan |
| # All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer; |
| # redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution; |
| # neither the name of the copyright holders nor the names of its |
| # contributors may be used to endorse or promote products derived from |
| # this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| # |
| # Authors: Ali Saidi |
| # Steve Reinhardt |
| # Nathan Binkert |
| |
| import os |
| import re |
| import shutil |
| import sys |
| import time |
| |
| from glob import glob |
| from os import system |
| from os.path import basename, dirname, exists, isdir, isfile, join as joinpath |
| |
| def mkdir(*args): |
| path = joinpath(*args) |
| os.mkdir(path) |
| |
| def touch(*args, **kwargs): |
| when = kwargs.get('when', None) |
| path = joinpath(*args) |
| os.utime(path, when) |
| |
| def rmtree(*args): |
| path = joinpath(*args) |
| for match in glob(path): |
| if isdir(match): |
| shutil.rmtree(match) |
| else: |
| os.unlink(match) |
| |
| def remove(*args): |
| path = joinpath(*args) |
| for match in glob(path): |
| if not isdir(match): |
| os.unlink(match) |
| |
| def movedir(srcdir, destdir, dir): |
| src = joinpath(srcdir, dir) |
| dest = joinpath(destdir, dir) |
| |
| if not isdir(src): |
| raise AttributeError |
| |
| os.makedirs(dirname(dest)) |
| shutil.move(src, dest) |
| |
| if not isdir('.hg'): |
| sys.exit('Not in the top level of an m5 tree!') |
| |
| usage = '%s <destdir> <release name>' % sys.argv[0] |
| |
| if len(sys.argv) != 3: |
| sys.exit(usage) |
| |
| destdir = sys.argv[1] |
| releasename = sys.argv[2] |
| release_dest = joinpath(destdir, 'release') |
| #encumbered_dest = joinpath(destdir, 'encumbered') |
| release_dir = joinpath(release_dest, releasename) |
| #encumbered_dir = joinpath(encumbered_dest, releasename) |
| |
| if exists(destdir): |
| if not isdir(destdir): |
| raise AttributeError, '%s exists, but is not a directory' % destdir |
| else: |
| mkdir(destdir) |
| |
| if exists(release_dest): |
| if not isdir(release_dest): |
| raise AttributeError, \ |
| '%s exists, but is not a directory' % release_dest |
| rmtree(release_dest) |
| |
| #if exists(encumbered_dest): |
| # if not isdir(encumbered_dest): |
| # raise AttributeError, \ |
| # '%s exists, but is not a directory' % encumbered_dest |
| # rmtree(encumbered_dest) |
| |
| mkdir(release_dest) |
| #mkdir(encumbered_dest) |
| mkdir(release_dir) |
| #mkdir(encumbered_dir) |
| |
| system('hg update') |
| system('rsync -av --exclude ".hg*" --exclude build . %s' % release_dir) |
| # move the time forward on some files by a couple of minutes so we can |
| # avoid building things unnecessarily |
| when = int(time.time()) + 120 |
| |
| # make sure scons doesn't try to run flex unnecessarily |
| #touch(release_dir, 'src/encumbered/eio/exolex.cc', when=(when, when)) |
| |
| # get rid of non-shipping code |
| #rmtree(release_dir, 'src/encumbered/dev') |
| rmtree(release_dir, 'src/cpu/ozone') |
| rmtree(release_dir, 'src/arch/x86') |
| #rmtree(release_dir, 'src/mem/cache/tags/split*.cc') |
| #rmtree(release_dir, 'src/mem/cache/tags/split*.hh') |
| #rmtree(release_dir, 'src/mem/cache/prefetch/ghb_*.cc') |
| #rmtree(release_dir, 'src/mem/cache/prefetch/ghb_*.hh') |
| #rmtree(release_dir, 'src/mem/cache/prefetch/stride_*.cc') |
| #rmtree(release_dir, 'src/mem/cache/prefetch/stride_*.hh') |
| rmtree(release_dir, 'configs/fullsys') |
| rmtree(release_dir, 'configs/test') |
| rmtree(release_dir, 'tests/long/*/ref') |
| rmtree(release_dir, 'tests/old') |
| rmtree(release_dir, 'tests/quick/00.hello/ref/x86') |
| rmtree(release_dir, 'tests/quick/02.insttest') |
| rmtree(release_dir, 'tests/test-progs/hello/bin/x86') |
| rmtree(release_dir, 'src/dev/x86') |
| |
| remove(release_dir, 'src/cpu/nativetrace.hh') |
| remove(release_dir, 'src/cpu/nativetrace.cc') |
| remove(release_dir, 'build_opts/X86_SE') |
| remove(release_dir, 'build_opts/X86_FS') |
| |
| # get rid of some of private scripts |
| remove(release_dir, 'util/chgcopyright') |
| remove(release_dir, 'util/make_release.py') |
| |
| #state trace |
| remove(release_dir, 'util/statetrace/x86.format') |
| remove(release_dir, 'util/statetrace/arch/tracechild_amd64.cc') |
| remove(release_dir, 'util/statetrace/arch/tracechild_amd64.hh') |
| remove(release_dir, 'util/statetrace/arch/tracechild_i386.cc') |
| remove(release_dir, 'util/statetrace/arch/tracechild_i386.hh') |
| |
| def remove_sources(regex, subdir): |
| script = joinpath(release_dir, subdir, 'SConscript') |
| if isinstance(regex, str): |
| regex = re.compile(regex) |
| inscript = file(script, 'r').readlines() |
| outscript = file(script, 'w') |
| for line in inscript: |
| if regex.match(line): |
| continue |
| |
| outscript.write(line) |
| outscript.close() |
| |
| def remove_lines(s_regex, e_regex, f): |
| f = joinpath(release_dir, f) |
| if isinstance(s_regex, str): |
| s_regex = re.compile(s_regex) |
| if isinstance(e_regex, str): |
| e_regex = re.compile(e_regex) |
| inscript = file(f, 'r').readlines() |
| outscript = file(f, 'w') |
| skipping = False |
| for line in inscript: |
| if (not skipping and s_regex.match(line)) or \ |
| (e_regex and skipping and not e_regex.match(line)): |
| if e_regex: |
| skipping = True |
| continue |
| skipping = False |
| outscript.write(line) |
| outscript.close() |
| |
| def replace_line(s_regex, f, rl): |
| f = joinpath(release_dir, f) |
| if isinstance(s_regex, str): |
| s_regex = re.compile(s_regex) |
| inscript = file(f, 'r').readlines() |
| outscript = file(f, 'w') |
| for line in inscript: |
| if s_regex.match(line): |
| outscript.write(rl) |
| continue |
| outscript.write(line) |
| outscript.close() |
| |
| |
| # fix up the SConscript to deal with files we've removed |
| #remove_sources(r'.*split.*\.cc', 'src/mem/cache/tags') |
| #remove_sources(r'.*(ghb|stride)_prefetcher\.cc', 'src/mem/cache/prefetch') |
| remove_sources(r'.*nativetrace.*', 'src/cpu') |
| |
| remove_lines(r'.*X86.*', None, 'src/arch/isa_specific.hh') |
| #remove_lines(r'.*X86.*', None, 'src/base/traceflags.py') |
| remove_lines(r'.*X86.*', None, 'AUTHORS') |
| remove_lines(r'.*X86.*', None, 'src/base/loader/object_file.hh') |
| remove_lines(r'.*_X86_.*', '.*else.*', 'src/base/loader/elf_object.cc') |
| remove_lines(r'.*X86_ISA.*', r'^.el.*','src/sim/process.cc') |
| remove_lines(r".*'x86' and build.*", None, 'src/cpu/BaseCPU.py') |
| remove_lines(r".*walker.port.*", None, 'src/cpu/BaseCPU.py') |
| remove_lines(r'.*x86.*', r'.*mips.*','src/cpu/BaseCPU.py') |
| remove_lines(r'.*X86_ISA.*', r'^.*elif.*','src/cpu/o3/dyn_inst.hh') |
| remove_lines(r'.*X86_ISA.*', r'.*stay.*','src/cpu/simple/base.cc') |
| remove_lines(r'.*x86.*', r'^if.*','src/cpu/SConscript') |
| |
| remove_lines(r'.*makeX86System.*', r'.*makeDualRoot.*','configs/common/FSConfig.py') |
| remove_lines(r'.*X86.*', None, 'configs/example/fs.py') |
| remove_lines(r'.*x86.*', None, 'configs/example/fs.py') |
| remove_lines(r'.*x86.*', r'.*makeDualRoot.*', 'configs/common/FSConfig.py') |
| |
| replace_line(r'.*X86_SE.*', 'util/regress', " 'SPARC_SE,SPARC_FS',") |
| benches = [ 'bzip2', 'eon', 'gzip', 'mcf', 'parser', 'perlbmk', |
| 'twolf', 'vortex' ] |
| for bench in benches: |
| rmtree(release_dir, 'tests', 'test-progs', bench) |
| |
| #movedir(release_dir, encumbered_dir, 'src/encumbered') |
| rmtree(release_dir, 'tests/test-progs/anagram') |
| rmtree(release_dir, 'tests/quick/20.eio-short') |
| |
| f = open('src/cpu/SConsopts', 'w+') |
| f.writelines(("Import('*')\n", "all_cpu_list.append('DummyCPUMakeSconsHappy')\n")) |
| f.close() |
| |
| |
| def taritup(directory, destdir, filename): |
| basedir = dirname(directory) |
| tarball = joinpath(destdir, filename) |
| tardir = basename(directory) |
| |
| system('cd %s; tar cfj %s %s' % (basedir, tarball, tardir)) |
| |
| taritup(release_dir, destdir, '%s.tar.bz2' % releasename) |
| #taritup(encumbered_dir, destdir, '%s-encumbered.tar.bz2' % releasename) |
| |
| print "release created in %s" % destdir |
| print "don't forget to tag the repository!" |