aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2014-03-18 23:54:03 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2014-03-18 23:54:03 +0200
commitf221a682523b983704fed6504ae7044dcbef7fa2 (patch)
tree466657d0323fc5fc2cde5cd7dd6e0a26860373fb
parent35a321fba9f51d09e87e31eadd1302f074052330 (diff)
downloadmeson-f221a682523b983704fed6504ae7044dcbef7fa2.zip
meson-f221a682523b983704fed6504ae7044dcbef7fa2.tar.gz
meson-f221a682523b983704fed6504ae7044dcbef7fa2.tar.bz2
Create a test project and add it to the solution.
-rw-r--r--backends.py117
-rw-r--r--coredata.py1
2 files changed, 98 insertions, 20 deletions
diff --git a/backends.py b/backends.py
index 85b1f64..f5bad2b 100644
--- a/backends.py
+++ b/backends.py
@@ -382,6 +382,20 @@ class Backend():
confdata = cf.get_configuration_data()
do_conf_file(infile, outfile, confdata)
+ def write_test_file(self, datafile):
+ arr = []
+ for t in self.build.get_tests():
+ fname = os.path.join(self.environment.get_build_dir(), self.get_target_filename(t.get_exe()))
+ is_cross = self.environment.is_cross_build()
+ if is_cross:
+ exe_wrapper = self.environment.cross_info.get('exe_wrapper', None)
+ else:
+ exe_wrapper = None
+ ts = TestSerialisation(t.get_name(), fname, is_cross, exe_wrapper,
+ t.is_parallel, t.cmd_args, t.env)
+ arr.append(ts)
+ pickle.dump(arr, datafile)
+
def generate_pkgconfig_files(self):
for p in self.build.pkgconfig_gens:
outdir = self.environment.scratch_dir
@@ -678,20 +692,6 @@ class NinjaBackend(Backend):
self.write_test_file(datafile)
datafile.close()
- def write_test_file(self, datafile):
- arr = []
- for t in self.build.get_tests():
- fname = os.path.join(self.environment.get_build_dir(), self.get_target_filename(t.get_exe()))
- is_cross = self.environment.is_cross_build()
- if is_cross:
- exe_wrapper = self.environment.cross_info.get('exe_wrapper', None)
- else:
- exe_wrapper = None
- ts = TestSerialisation(t.get_name(), fname, is_cross, exe_wrapper,
- t.is_parallel, t.cmd_args, t.env)
- arr.append(ts)
- pickle.dump(arr, datafile)
-
def generate_dep_gen_rules(self, outfile):
outfile.write('# Rules for external dependency generators.\n\n')
processed = {}
@@ -1221,27 +1221,34 @@ import xml.dom.minidom
class Vs2010Backend(Backend):
def __init__(self, build, interp):
super().__init__(build, interp)
+ self.project_file_version = '10.0.30319.1'
def generate(self):
sln_filename = os.path.join(self.environment.get_build_dir(), self.build.project_name + '.sln')
projlist = self.generate_projects()
+ self.gen_testproj('RUN_TESTS', os.path.join(self.environment.get_build_dir(), 'RUN_TESTS.vcxproj'))
self.generate_solution(sln_filename, projlist)
def generate_solution(self, sln_filename, projlist):
ofile = open(sln_filename, 'w')
ofile.write('Microsoft Visual Studio Solution File, Format Version 11.00\n')
ofile.write('# Visual Studio 2010\n')
+ prj_templ = prj_line = 'Project("{%s}") = "%s", "%s", "{%s}"\nEndProject\n'
for p in projlist:
- prj_line = 'Project("{%s}") = "%s", "%s", "{%s}"\nEndProject\n' % \
- (self.environment.coredata.guid, p[0], p[1], p[2])
+ prj_line = prj_templ % (self.environment.coredata.guid, p[0], p[1], p[2])
ofile.write(prj_line)
+ test_line = prj_templ % (self.environment.coredata.guid,
+ 'RUN_TESTS', 'RUN_TESTS.vcxproj', self.environment.coredata.test_guid)
+ ofile.write(test_line)
ofile.write('Global\n')
ofile.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n')
ofile.write('\t\tDebug|Win32 = Debug|Win32\n')
ofile.write('\tEndGlobalSection\n')
ofile.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n')
- ofile.write('\t\t{%s}.Debug|Win32.ActiveCfg = Debug|Win32\n' % p[2])
- ofile.write('\t\t{%s}.Debug|Win32.Build.0 = Debug|Win32\n' % p[2])
+ for p in projlist:
+ ofile.write('\t\t{%s}.Debug|Win32.ActiveCfg = Debug|Win32\n' % p[2])
+ ofile.write('\t\t{%s}.Debug|Win32.Build.0 = Debug|Win32\n' % p[2])
+ ofile.write('\t\t{%s}.Debug|Win32.ActiveCfg = Debug|Win32\n' % self.environment.coredata.test_guid)
ofile.write('\tEndGlobalSection\n')
ofile.write('\tGlobalSection(SolutionProperties) = preSolution\n')
ofile.write('\t\tHideSolutionNode = FALSE\n')
@@ -1277,7 +1284,6 @@ class Vs2010Backend(Backend):
project_name = target.name
target_name = target.name
subsystem = 'console'
- project_file_version = '10.0.30319.1'
root = ET.Element('Project', {'DefaultTargets' : "Build",
'ToolsVersion' : '4.0',
'xmlns' : 'http://schemas.microsoft.com/developer/msbuild/2003'})
@@ -1307,7 +1313,7 @@ class Vs2010Backend(Backend):
ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.props')
direlem = ET.SubElement(root, 'PropertyGroup')
fver = ET.SubElement(direlem, '_ProjectFileVersion')
- fver.text = project_file_version
+ fver.text = self.project_file_version
outdir = ET.SubElement(direlem, 'OutDir')
if target.subdir == '':
outdir.text = '.\\'
@@ -1370,3 +1376,74 @@ class Vs2010Backend(Backend):
# ElementTree can not do prettyprinting so do it manually
doc = xml.dom.minidom.parse(ofname)
open(ofname, 'w').write(doc.toprettyxml())
+
+ def gen_testproj(self, target_name, ofname):
+ buildtype = 'Debug'
+ platform = "Win32"
+ project_name = target_name
+ root = ET.Element('Project', {'DefaultTargets' : "Build",
+ 'ToolsVersion' : '4.0',
+ 'xmlns' : 'http://schemas.microsoft.com/developer/msbuild/2003'})
+ confitems = ET.SubElement(root, 'ItemGroup', {'Label' : 'ProjectConfigurations'})
+ prjconf = ET.SubElement(confitems, 'ProjectConfiguration', {'Include' : 'Debug|Win32'})
+ p = ET.SubElement(prjconf, 'Configuration')
+ p.text= buildtype
+ pl = ET.SubElement(prjconf, 'Platform')
+ pl.text = platform
+ globalgroup = ET.SubElement(root, 'PropertyGroup', Label='Globals')
+ guidelem = ET.SubElement(globalgroup, 'ProjectGuid')
+ guidelem.text = self.environment.coredata.test_guid
+ kw = ET.SubElement(globalgroup, 'Keyword')
+ kw.text = 'Win32Proj'
+ p = ET.SubElement(globalgroup, 'Platform')
+ p.text= platform
+ pname= ET.SubElement(globalgroup, 'ProjectName')
+ pname.text = project_name
+ ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.Default.props')
+ type_config = ET.SubElement(root, 'PropertyGroup', Label='Configuration')
+ ET.SubElement(type_config, 'ConfigurationType')
+ ET.SubElement(type_config, 'CharacterSet').text = 'MultiByte'
+ ET.SubElement(type_config, 'UseOfMfc').text = 'false'
+ ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.props')
+ direlem = ET.SubElement(root, 'PropertyGroup')
+ fver = ET.SubElement(direlem, '_ProjectFileVersion')
+ fver.text = self.project_file_version
+ outdir = ET.SubElement(direlem, 'OutDir')
+ outdir.text = '.\\'
+ intdir = ET.SubElement(direlem, 'IntDir')
+ intdir.text = 'test-temp\\'
+ tname = ET.SubElement(direlem, 'TargetName')
+ tname.text = target_name
+
+ action = ET.SubElement(root, 'ItemDefinitionGroup')
+ midl = ET.SubElement(action, 'Midl')
+ ET.SubElement(midl, "AdditionalIncludeDirectories").text = '%(AdditionalIncludeDirectories)'
+ ET.SubElement(midl, "OutputDirectory").text = '$(IntDir)'
+ ET.SubElement(midl, 'HeaderFileName').text = '%(Filename).h'
+ ET.SubElement(midl, 'TypeLibraryName').text = '%(Filename).tlb'
+ ET.SubElement(midl, 'InterfaceIdentifierFilename').text = '%(Filename)_i.c'
+ ET.SubElement(midl, 'ProxyFileName').text = '%(Filename)_p.c'
+ postbuild = ET.SubElement(action, 'PostBuildEvent')
+ ET.SubElement(postbuild, 'Message')
+ script_root = self.environment.get_script_dir()
+ test_script = os.path.join(script_root, 'meson_test.py')
+ test_data = os.path.join(self.environment.get_scratch_dir(), 'meson_test_setup.dat')
+ cmd_templ = '''setlocal
+"%s" "%s" "%s"
+if %%errorlevel%% neq 0 goto :cmEnd
+:cmEnd
+endlocal & call :cmErrorLevel %%errorlevel%% & goto :cmDone
+:cmErrorLevel
+exit /b %%1
+:cmDone
+if %%errorlevel%% neq 0 goto :VCEnd'''
+ ET.SubElement(postbuild, 'Command').text = cmd_templ % (sys.executable, test_script, test_data)
+ ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.targets')
+ tree = ET.ElementTree(root)
+ tree.write(ofname, encoding='utf-8', xml_declaration=True)
+ datafile = open(test_data, 'wb')
+ self.write_test_file(datafile)
+ datafile.close()
+ # ElementTree can not do prettyprinting so do it manually
+ #doc = xml.dom.minidom.parse(ofname)
+ #open(ofname, 'w').write(doc.toprettyxml())
diff --git a/coredata.py b/coredata.py
index 94c8ea1..af2dd52 100644
--- a/coredata.py
+++ b/coredata.py
@@ -24,6 +24,7 @@ class CoreData():
def __init__(self, options):
self.guid = str(uuid.uuid4()).upper()
+ self.test_guid = str(uuid.uuid4()).upper()
self.target_guids = {}
self.version = version
self.prefix = options.prefix