vs2010: properly check whether solution needs to be regenerated

pull/419/head
Nicolas Schneider 9 years ago
parent ac5ee0c414
commit 40a7287a59
  1. 23
      mesonbuild/backend/vs2010backend.py
  2. 18
      mesonbuild/scripts/regen_checker.py

@ -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,15 +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')
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):
@ -579,7 +586,7 @@ if %%errorlevel%% neq 0 goto :VCEnd'''
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()
ET.SubElement(custombuild, 'AdditionalInputs').text = ';'.join(deps)
ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.targets')

@ -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…
Cancel
Save