aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2014-03-22 17:54:25 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2014-03-22 17:54:25 +0200
commit7f26d50bcc06184f7398dca0752e09ae16a39b6b (patch)
tree27383b55e88d763087f42a58f73b829fcf991d40
parentbb6446f0c07877b5bea43cb74ec8babaff8a398d (diff)
downloadmeson-7f26d50bcc06184f7398dca0752e09ae16a39b6b.zip
meson-7f26d50bcc06184f7398dca0752e09ae16a39b6b.tar.gz
meson-7f26d50bcc06184f7398dca0752e09ae16a39b6b.tar.bz2
Dep generators work except for the quoting.
-rw-r--r--backends.py62
1 files changed, 55 insertions, 7 deletions
diff --git a/backends.py b/backends.py
index 5cf8c05..f5c9e07 100644
--- a/backends.py
+++ b/backends.py
@@ -1236,6 +1236,43 @@ class Vs2010Backend(Backend):
# foo.c compiles to foo.obj, not foo.c.obj
self.source_suffix_in_obj = False
+ def generate_custom_generator_commands(self, target, parent_node):
+ idgroup = ET.SubElement(parent_node, 'ItemDefinitionGroup')
+ all_output_files = []
+ for genlist in target.get_generated_sources():
+ generator = genlist.get_generator()
+ exe = generator.get_exe()
+ infilelist = genlist.get_infilelist()
+ outfilelist = genlist.get_outfilelist()
+ if isinstance(exe, build.BuildTarget):
+ exe_file = os.path.join(self.environment.get_build_dir(), self.get_target_filename(exe))
+ else:
+ exe_file = exe.get_command()
+ base_args = generator.get_arglist()
+ for i in range(len(infilelist)):
+ if len(infilelist) == len(outfilelist):
+ sole_output = os.path.join(self.get_target_private_dir(target), outfilelist[i])
+ else:
+ sole_output = ''
+ curfile = infilelist[i]
+ infilename = os.path.join(self.environment.get_source_dir(), curfile)
+ outfiles = genlist.get_outputs_for(curfile)
+ outfiles = [os.path.join(self.get_target_private_dir(target), of) for of in outfiles]
+ all_output_files += outfiles
+ args = [x.replace("@INPUT@", infilename).replace('@OUTPUT@', sole_output)\
+ for x in base_args]
+ args = [x.replace("@SOURCE_DIR@", self.environment.get_source_dir()).replace("@BUILD_DIR@", self.get_target_private_dir(target))
+ for x in args]
+ fullcmd = [exe_file] + args
+ cbs = ET.SubElement(idgroup, 'CustomBuildStep')
+ ET.SubElement(cbs, 'Command').text = ' '.join(self.special_quote(fullcmd))
+ ET.SubElement(cbs, 'Inputs').text = infilename
+ ET.SubElement(cbs, 'Outputs').text = ';'.join(outfiles)
+ ET.SubElement(cbs, 'Message').text = 'Generating sources from %s.' % infilename
+ pg = ET.SubElement(parent_node, 'PropertyGroup')
+ ET.SubElement(pg, 'CustomBuildBeforeTargets').text = 'ClCompile'
+ return all_output_files
+
def generate(self):
self.generate_configure_files()
self.generate_pkgconfig_files()
@@ -1302,10 +1339,10 @@ class Vs2010Backend(Backend):
projlist.append((name, relname, uuid))
return projlist
- def split_sources(self, target):
+ def split_sources(self, srclist):
sources = []
headers = []
- for i in target.sources:
+ for i in srclist:
if self.environment.is_header(i):
headers.append(i)
else:
@@ -1317,11 +1354,14 @@ class Vs2010Backend(Backend):
return ''
return '/'.join(['..']*(len(os.path.split(target.subdir))-1))
+ def special_quote(self, arr):
+ return ['&quot;%s&quot;' % i for i in arr]
+
def gen_vcxproj(self, target, ofname, guid):
down = self.target_to_build_root(target)
proj_to_src_root = os.path.join(down, self.build_to_src)
proj_to_src_dir = os.path.join(proj_to_src_root, target.subdir)
- (sources, headers) = self.split_sources(target)
+ (sources, headers) = self.split_sources(target.sources)
buildtype = 'Debug'
platform = "Win32"
project_name = target.name
@@ -1363,6 +1403,8 @@ class Vs2010Backend(Backend):
ET.SubElement(type_config, 'WholeProgramOptimization').text = 'false'
ET.SubElement(type_config, 'UseDebugLibraries').text = 'true'
ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.props')
+ generated_files = self.generate_custom_generator_commands(target, root)
+ (gen_src, gen_hdrs) = self.split_sources(generated_files)
direlem = ET.SubElement(root, 'PropertyGroup')
fver = ET.SubElement(direlem, '_ProjectFileVersion')
fver.text = self.project_file_version
@@ -1443,22 +1485,28 @@ class Vs2010Backend(Backend):
targetmachine = ET.SubElement(link, 'TargetMachine')
targetmachine.text = 'MachineX86'
- if len(headers) > 0:
+ if len(headers) + len(gen_hdrs) > 0:
inc_hdrs = ET.SubElement(root, 'ItemGroup')
for h in headers:
relpath = os.path.join(proj_to_src_dir, h)
ET.SubElement(inc_hdrs, 'CLInclude', Include=relpath)
- if len(sources) > 0:
+ for h in gen_hdrs:
+ relpath = self.relpath(h, target.subdir)
+ ET.SubElement(inc_hdrs, 'CLInclude', Inlucde = relpath)
+ if len(sources) + len(gen_src) > 0:
inc_src = ET.SubElement(root, 'ItemGroup')
for s in sources:
relpath = os.path.join(proj_to_src_dir, s)
ET.SubElement(inc_src, 'CLCompile', Include=relpath)
+ for s in gen_src:
+ relpath = self.relpath(s, target.subdir)
+ ET.SubElement(inc_src, 'CLCompile', Include=relpath)
ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.targets')
tree = ET.ElementTree(root)
tree.write(ofname, encoding='utf-8', xml_declaration=True)
# ElementTree can not do prettyprinting so do it manually
- doc = xml.dom.minidom.parse(ofname)
- open(ofname, 'w').write(doc.toprettyxml())
+ #doc = xml.dom.minidom.parse(ofname)
+ #open(ofname, 'w').write(doc.toprettyxml())
def gen_testproj(self, target_name, ofname):
buildtype = 'Debug'