Author: Matti Picus <matti.pi...@gmail.com> Branch: precompiled-headers Changeset: r69042:0b9dc910cbd5 Date: 2014-01-29 23:39 +0200 http://bitbucket.org/pypy/pypy/changeset/0b9dc910cbd5/
Log: move Makefile tests diff --git a/rpython/translator/platform/test/test_makefile.py b/rpython/translator/platform/test/test_makefile.py --- a/rpython/translator/platform/test/test_makefile.py +++ b/rpython/translator/platform/test/test_makefile.py @@ -1,7 +1,10 @@ from rpython.translator.platform.posix import GnuMakefile as Makefile +from rpython.translator.platform import host +from rpython.tool.udir import udir +from rpython.translator.tool.cbuild import ExternalCompilationInfo from StringIO import StringIO -import re +import re, sys def test_simple_makefile(): m = Makefile() @@ -29,3 +32,106 @@ val = s.getvalue() assert not re.search('CC += +xxx', val, re.M) assert re.search('CC += +yyy', val, re.M) + +class TestMakefile(object): + platform = host + strict_on_stderr = True + + def check_res(self, res, expected='42\n'): + assert res.out == expected + if self.strict_on_stderr: + assert res.err == '' + assert res.returncode == 0 + + def test_900_files(self): + txt = '#include <stdio.h>\n' + for i in range(900): + txt += 'int func%03d();\n' % i + txt += 'int main() {\n int j=0;' + for i in range(900): + txt += ' j += func%03d();\n' % i + txt += ' printf("%d\\n", j);\n' + txt += ' return 0;};\n' + cfile = udir.join('test_900_files.c') + cfile.write(txt) + cfiles = [cfile] + for i in range(900): + cfile2 = udir.join('implement%03d.c' %i) + cfile2.write(''' + int func%03d() + { + return %d; + } + ''' % (i, i)) + cfiles.append(cfile2) + mk = self.platform.gen_makefile(cfiles, ExternalCompilationInfo(), path=udir) + mk.write() + self.platform.execute_makefile(mk) + res = self.platform.execute(udir.join('test_900_files')) + self.check_res(res, '%d\n' %sum(range(900))) + + def test_precompiled_headers(self): + import time + tmpdir = udir.join('precompiled_headers').ensure(dir=1) + # Create an eci that should not use precompiled headers + eci = ExternalCompilationInfo(include_dirs=[tmpdir]) + main_c = tmpdir.join('main_no_pch.c') + eci.separate_module_files = [main_c] + ncfiles = 10 + nprecompiled_headers = 20 + txt = '' + for i in range(ncfiles): + txt += "int func%03d();\n" % i + txt += "\nint main(int argc, char * argv[])\n" + txt += "{\n int i=0;\n" + for i in range(ncfiles): + txt += " i += func%03d();\n" % i + txt += ' printf("%d\\n", i);\n' + txt += " return 0;\n};\n" + main_c.write(txt) + # Create some large headers with dummy functions to be precompiled + cfiles_precompiled_headers = [] + for i in range(nprecompiled_headers): + pch_name =tmpdir.join('pcheader%03d.h' % i) + txt = '' + for j in range(3000): + txt += "int pcfunc%03d_%03d();\n" %(i, j) + pch_name.write(txt) + cfiles_precompiled_headers.append(pch_name) + # Create some cfiles with headers we want precompiled + cfiles = [] + for i in range(ncfiles): + c_name =tmpdir.join('implement%03d.c' % i) + txt = '' + for pch_name in cfiles_precompiled_headers: + txt += '#include "%s"\n' % pch_name + txt += "int func%03d(){ return %d;};\n" % (i, i) + c_name.write(txt) + cfiles.append(c_name) + mk = self.platform.gen_makefile(cfiles, eci, path=udir, + cfile_precompilation=cfiles_precompiled_headers) + if sys.platform == 'win32': + clean = ('clean', '', 'for %f in ( $(OBJECTS) $(TARGET) ) do @if exist %f del /f %f') + else: + clean = ('clean', '', 'rm -f $(OBJECTS) $(TARGET) ') + mk.rule(*clean) + mk.write() + t0 = time.clock() + self.platform.execute_makefile(mk) + t1 = time.clock() + t_precompiled = t1 - t0 + res = self.platform.execute(mk.exe_name) + self.check_res(res, '%d\n' %sum(range(ncfiles))) + self.platform.execute_makefile(mk, extra_opts=['clean']) + #Rewrite a non-precompiled header makefile + mk = self.platform.gen_makefile(cfiles, eci, path=udir) + mk.rule(*clean) + mk.write() + t0 = time.clock() + self.platform.execute_makefile(mk) + t1 = time.clock() + t_normal = t1 - t0 + print "precompiled haeder 'make' time %.2f, non-precompiled header time %.2f" %(t_precompiled, t_normal) + assert t_precompiled < t_normal * 0.5 + + diff --git a/rpython/translator/platform/test/test_platform.py b/rpython/translator/platform/test/test_platform.py --- a/rpython/translator/platform/test/test_platform.py +++ b/rpython/translator/platform/test/test_platform.py @@ -59,97 +59,6 @@ res = self.platform.execute(executable) self.check_res(res) - def test_900_files(self): - txt = '#include <stdio.h>\n' - for i in range(900): - txt += 'int func%03d();\n' % i - txt += 'int main() {\n int j=0;' - for i in range(900): - txt += ' j += func%03d();\n' % i - txt += ' printf("%d\\n", j);\n' - txt += ' return 0;};\n' - cfile = udir.join('test_900_files.c') - cfile.write(txt) - cfiles = [cfile] - for i in range(900): - cfile2 = udir.join('implement%03d.c' %i) - cfile2.write(''' - int func%03d() - { - return %d; - } - ''' % (i, i)) - cfiles.append(cfile2) - mk = self.platform.gen_makefile(cfiles, ExternalCompilationInfo(), path=udir) - mk.write() - self.platform.execute_makefile(mk) - res = self.platform.execute(udir.join('test_900_files')) - self.check_res(res, '%d\n' %sum(range(900))) - - def test_precompiled_headers(self): - import time - tmpdir = udir.join('precompiled_headers').ensure(dir=1) - # Create an eci that should not use precompiled headers - eci = ExternalCompilationInfo(include_dirs=[tmpdir]) - main_c = tmpdir.join('main_no_pch.c') - eci.separate_module_files = [main_c] - ncfiles = 10 - nprecompiled_headers = 20 - txt = '' - for i in range(ncfiles): - txt += "int func%03d();\n" % i - txt += "\nint main(int argc, char * argv[])\n" - txt += "{\n int i=0;\n" - for i in range(ncfiles): - txt += " i += func%03d();\n" % i - txt += ' printf("%d\\n", i);\n' - txt += " return 0;\n};\n" - main_c.write(txt) - # Create some large headers with dummy functions to be precompiled - cfiles_precompiled_headers = [] - for i in range(nprecompiled_headers): - pch_name =tmpdir.join('pcheader%03d.h' % i) - txt = '' - for j in range(3000): - txt += "int pcfunc%03d_%03d();\n" %(i, j) - pch_name.write(txt) - cfiles_precompiled_headers.append(pch_name) - # Create some cfiles with headers we want precompiled - cfiles = [] - for i in range(ncfiles): - c_name =tmpdir.join('implement%03d.c' % i) - txt = '' - for pch_name in cfiles_precompiled_headers: - txt += '#include "%s"\n' % pch_name - txt += "int func%03d(){ return %d;};\n" % (i, i) - c_name.write(txt) - cfiles.append(c_name) - mk = self.platform.gen_makefile(cfiles, eci, path=udir, - cfile_precompilation=cfiles_precompiled_headers) - if sys.platform == 'win32': - clean = ('clean', '', 'for %f in ( $(OBJECTS) $(TARGET) ) do @if exist %f del /f %f') - else: - clean = ('clean', '', 'rm -f $(OBJECTS) $(TARGET) ') - mk.rule(*clean) - mk.write() - t0 = time.clock() - self.platform.execute_makefile(mk) - t1 = time.clock() - t_precompiled = t1 - t0 - res = self.platform.execute(mk.exe_name) - self.check_res(res, '%d\n' %sum(range(ncfiles))) - self.platform.execute_makefile(mk, extra_opts=['clean']) - #Rewrite a non-precompiled header makefile - mk = self.platform.gen_makefile(cfiles, eci, path=udir) - mk.rule(*clean) - mk.write() - t0 = time.clock() - self.platform.execute_makefile(mk) - t1 = time.clock() - t_normal = t1 - t0 - print "precompiled haeder 'make' time %.2f, non-precompiled header time %.2f" %(t_precompiled, t_normal) - assert t_precompiled < t_normal * 0.5 - def test_nice_errors(self): cfile = udir.join('test_nice_errors.c') cfile.write('') _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit