commit
af53c2bc3b
|
@ -21,13 +21,13 @@ from .. import mlog
|
|||
import xml.etree.ElementTree as ET
|
||||
import xml.dom.minidom
|
||||
from ..coredata import MesonException
|
||||
from ..environment import Environment
|
||||
|
||||
class RegenInfo():
|
||||
def __init__(self, source_dir, build_dir, depfiles, solutionfile):
|
||||
def __init__(self, source_dir, build_dir, depfiles):
|
||||
self.source_dir = source_dir
|
||||
self.build_dir = build_dir
|
||||
self.depfiles = depfiles
|
||||
self.solutionfile = solutionfile
|
||||
|
||||
class Vs2010Backend(backends.Backend):
|
||||
def __init__(self, build):
|
||||
|
@ -92,18 +92,22 @@ class Vs2010Backend(backends.Backend):
|
|||
self.gen_testproj('RUN_TESTS', os.path.join(self.environment.get_build_dir(), 'RUN_TESTS.vcxproj'))
|
||||
self.gen_regenproj('REGEN', os.path.join(self.environment.get_build_dir(), 'REGEN.vcxproj'))
|
||||
self.generate_solution(sln_filename, projlist)
|
||||
self.generate_regen_info(sln_filename)
|
||||
open(os.path.join(self.environment.get_scratch_dir(), 'regen.stamp'), 'wb')
|
||||
rulefile = os.path.join(self.environment.get_scratch_dir(), 'regen.rule')
|
||||
if not os.path.exists(rulefile):
|
||||
open(rulefile, 'w').write("# For some reason this needs to be here.")
|
||||
self.generate_regen_info()
|
||||
Vs2010Backend.touch_regen_timestamp(self.environment.get_build_dir())
|
||||
|
||||
def generate_regen_info(self, sln_filename):
|
||||
@staticmethod
|
||||
def get_regen_stampfile(build_dir):
|
||||
return os.path.join(os.path.join(build_dir, Environment.private_dir), 'regen.stamp')
|
||||
|
||||
@staticmethod
|
||||
def touch_regen_timestamp(build_dir):
|
||||
open(Vs2010Backend.get_regen_stampfile(build_dir), 'w').close()
|
||||
|
||||
def generate_regen_info(self):
|
||||
deps = self.get_regen_filelist()
|
||||
regeninfo = RegenInfo(self.environment.get_source_dir(),
|
||||
self.environment.get_build_dir(),
|
||||
deps,
|
||||
sln_filename)
|
||||
deps)
|
||||
pickle.dump(regeninfo, open(os.path.join(self.environment.get_scratch_dir(), 'regeninfo.dump'), 'wb'))
|
||||
|
||||
def get_obj_target_deps(self, obj_list):
|
||||
|
@ -573,15 +577,18 @@ exit /b %%1
|
|||
:cmDone
|
||||
if %%errorlevel%% neq 0 goto :VCEnd'''
|
||||
igroup = ET.SubElement(root, 'ItemGroup')
|
||||
custombuild = ET.SubElement(igroup, 'CustomBuild', Include='meson-private/regen.rule')
|
||||
rulefile = os.path.join(self.environment.get_scratch_dir(), 'regen.rule')
|
||||
if not os.path.exists(rulefile):
|
||||
with open(rulefile, 'w') as f:
|
||||
f.write("# Meson regen file.")
|
||||
custombuild = ET.SubElement(igroup, 'CustomBuild', Include=rulefile)
|
||||
message = ET.SubElement(custombuild, 'Message')
|
||||
message.text = 'Checking whether solution needs to be regenerated.'
|
||||
ET.SubElement(custombuild, 'Command').text = cmd_templ % \
|
||||
('" "'.join(regen_command), private_dir)
|
||||
ET.SubElement(custombuild, 'Outputs').text = os.path.join(self.environment.get_scratch_dir(), 'regen.stamp')
|
||||
ET.SubElement(custombuild, 'Outputs').text = Vs2010Backend.get_regen_stampfile(self.environment.get_build_dir())
|
||||
deps = self.get_regen_filelist()
|
||||
depstr = ';'.join([os.path.join(self.environment.get_source_dir(), d) for d in deps])
|
||||
ET.SubElement(custombuild, 'AdditionalInputs').text = depstr
|
||||
ET.SubElement(custombuild, 'AdditionalInputs').text = ';'.join(deps)
|
||||
ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.targets')
|
||||
ET.SubElement(root, 'ImportGroup', Label='ExtensionTargets')
|
||||
tree = ET.ElementTree(root)
|
||||
|
|
|
@ -126,7 +126,7 @@ class Environment():
|
|||
def is_cross_build(self):
|
||||
return self.cross_info is not None
|
||||
|
||||
def generating_finished(self):
|
||||
def dump_coredata(self):
|
||||
cdf = os.path.join(self.get_build_dir(), Environment.coredata_file)
|
||||
coredata.save(self.coredata, cdf)
|
||||
|
||||
|
|
|
@ -166,8 +166,8 @@ itself as required.'''
|
|||
mlog.log('Build machine cpu family:', mlog.bold(intr.builtin['build_machine'].cpu_family_method([], {})))
|
||||
mlog.log('Build machine cpu:', mlog.bold(intr.builtin['build_machine'].cpu_method([], {})))
|
||||
intr.run()
|
||||
env.dump_coredata()
|
||||
g.generate(intr)
|
||||
env.generating_finished()
|
||||
dumpfile = os.path.join(env.get_scratch_dir(), 'build.dat')
|
||||
pickle.dump(b, open(dumpfile, 'wb'))
|
||||
|
||||
|
|
|
@ -19,13 +19,18 @@ import pickle, subprocess
|
|||
|
||||
# This could also be used for XCode.
|
||||
|
||||
def need_regen(regeninfo):
|
||||
sln_time = os.stat(os.path.join(regeninfo.build_dir, regeninfo.solutionfile)).st_mtime
|
||||
def need_regen(regeninfo, regen_timestamp):
|
||||
for i in regeninfo.depfiles:
|
||||
curfile = os.path.join(regeninfo.build_dir, i)
|
||||
curtime = os.stat(curfile).st_mtime
|
||||
if curtime > sln_time:
|
||||
if curtime > regen_timestamp:
|
||||
return True
|
||||
# The timestamp file gets automatically deleted by MSBuild during a 'Clean' build.
|
||||
# We must make sure to recreate it, even if we do not regenerate the solution.
|
||||
# Otherwise, Visual Studio will always consider the REGEN project out of date.
|
||||
print("Everything is up-to-date, regeneration of build files is not needed.")
|
||||
from mesonbuild.backend.vs2010backend import Vs2010Backend
|
||||
Vs2010Backend.touch_regen_timestamp(regeninfo.build_dir)
|
||||
return False
|
||||
|
||||
def regen(regeninfo):
|
||||
|
@ -41,8 +46,11 @@ def regen(regeninfo):
|
|||
subprocess.check_call(cmd)
|
||||
|
||||
def run(args):
|
||||
regeninfo = pickle.load(open(os.path.join(args[0], 'regeninfo.dump'), 'rb'))
|
||||
if need_regen(regeninfo):
|
||||
private_dir = args[0]
|
||||
dumpfile = os.path.join(private_dir, 'regeninfo.dump')
|
||||
regeninfo = pickle.load(open(dumpfile, 'rb'))
|
||||
regen_timestamp = os.stat(dumpfile).st_mtime
|
||||
if need_regen(regeninfo, regen_timestamp):
|
||||
regen(regeninfo)
|
||||
sys.exit(0)
|
||||
|
||||
|
|
Loading…
Reference in New Issue