diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2014-03-22 17:54:25 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2014-03-22 17:54:25 +0200 |
commit | 7f26d50bcc06184f7398dca0752e09ae16a39b6b (patch) | |
tree | 27383b55e88d763087f42a58f73b829fcf991d40 | |
parent | bb6446f0c07877b5bea43cb74ec8babaff8a398d (diff) | |
download | meson-7f26d50bcc06184f7398dca0752e09ae16a39b6b.zip meson-7f26d50bcc06184f7398dca0752e09ae16a39b6b.tar.gz meson-7f26d50bcc06184f7398dca0752e09ae16a39b6b.tar.bz2 |
Dep generators work except for the quoting.
-rw-r--r-- | backends.py | 62 |
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 ['"%s"' % 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' |