diff options
-rw-r--r-- | backends.py | 17 | ||||
-rw-r--r-- | ninjabackend.py | 15 | ||||
-rw-r--r-- | regen_checker.py | 28 | ||||
-rw-r--r-- | vs2010backend.py | 17 |
4 files changed, 59 insertions, 18 deletions
diff --git a/backends.py b/backends.py index 4acf71c..b5af2ac 100644 --- a/backends.py +++ b/backends.py @@ -333,3 +333,20 @@ class Backend(): mfobj['projects'] = self.build.dep_manifest open(ifilename, 'w').write(json.dumps(mfobj)) d.data.append([ifilename, ofilename]) + + def get_regen_filelist(self): + '''List of all files whose alteration means that the build + definition needs to be regenerated.''' + deps = [os.path.join(self.build_to_src, df) \ + for df in self.interpreter.get_build_def_files()] + if self.environment.is_cross_build(): + deps.append(os.path.join(self.build_to_src, + self.environment.coredata.cross_file)) + deps.append('meson-private/coredata.dat') + if os.path.exists(os.path.join(self.environment.get_source_dir(), 'meson_options.txt')): + deps.append(os.path.join(self.build_to_src, 'meson_options.txt')) + for sp in self.build.subprojects.keys(): + fname = os.path.join(self.environment.get_source_dir(), sp, 'meson_options.txt') + if os.path.isfile(fname): + deps.append(os.path.join(self.build_to_src, sp, 'meson_options.txt')) + return deps diff --git a/ninjabackend.py b/ninjabackend.py index f084ed8..f9d1979 100644 --- a/ninjabackend.py +++ b/ninjabackend.py @@ -21,7 +21,7 @@ from mesonlib import File from meson_install import InstallData from build import InvalidArguments from coredata import MesonException -import os, sys, shutil, pickle, re +import os, sys, pickle, re if mesonlib.is_windows(): quote_char = '"' @@ -1613,18 +1613,7 @@ rule FORTRAN_DEP_HACK elem.write(outfile) self.check_outputs(elem) - deps = [os.path.join(self.build_to_src, df) \ - for df in self.interpreter.get_build_def_files()] - if self.environment.is_cross_build(): - deps.append(os.path.join(self.build_to_src, - self.environment.coredata.cross_file)) - deps.append('meson-private/coredata.dat') - if os.path.exists(os.path.join(self.environment.get_source_dir(), 'meson_options.txt')): - deps.append(os.path.join(self.build_to_src, 'meson_options.txt')) - for sp in self.build.subprojects.keys(): - fname = os.path.join(self.environment.get_source_dir(), sp, 'meson_options.txt') - if os.path.isfile(fname): - deps.append(os.path.join(self.build_to_src, sp, 'meson_options.txt')) + deps = self.get_regen_filelist() elem = NinjaBuildElement('build.ninja', 'REGENERATE_BUILD', deps) elem.add_item('pool', 'console') elem.write(outfile) diff --git a/regen_checker.py b/regen_checker.py index 13adc3f..a0fe028 100644 --- a/regen_checker.py +++ b/regen_checker.py @@ -14,11 +14,29 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys - -print('I am a script that checks whether VS solution should be regenerated.') -print('Currently I do nothing.') +import sys, os +import pickle, subprocess # This could also be used for XCode. -sys.exit(0)
\ No newline at end of file +def need_regen(regeninfo): + sln_time = os.stat(os.path.join(regeninfo.build_dir, regeninfo.solutionfile)).st_mtime + for i in regeninfo.depfiles: + curfile = os.path.join(regeninfo.build_dir, i) + curtime = os.stat(curfile).st_mtime + if curtime > sln_time: + return True + return False + +def regen(regeninfo): + scriptdir = os.path.split(__file__)[0] + mesonscript = os.path.join(scriptdir, 'meson.py') + cmd = [sys.executable, mesonscript, regeninfo.build_dir, regeninfo.source_dir, + '--backend=vs2010', 'secret-handshake'] + subprocess.check_call(cmd) + +if __name__ == '__main__': + regeninfo = pickle.load(open(os.path.join(sys.argv[1], 'regeninfo.dump'), 'rb')) + if need_regen(regeninfo): + regen(regeninfo) + sys.exit(0) diff --git a/vs2010backend.py b/vs2010backend.py index c4dbe9d..25eeb35 100644 --- a/vs2010backend.py +++ b/vs2010backend.py @@ -13,11 +13,19 @@ # limitations under the License. import os, sys +import pickle import backends, build import xml.etree.ElementTree as ET import xml.dom.minidom from coredata import MesonException +class RegenInfo(): + def __init__(self, source_dir, build_dir, depfiles, solutionfile): + self.source_dir = source_dir + self.build_dir = build_dir + self.depfiles = depfiles + self.solutionfile = solutionfile + class Vs2010Backend(backends.Backend): def __init__(self, build): super().__init__(build) @@ -70,6 +78,15 @@ 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) + + def generate_regen_info(self, sln_filename): + deps = self.get_regen_filelist() + regeninfo = RegenInfo(self.environment.get_source_dir(), + self.environment.get_build_dir(), + deps, + sln_filename) + pickle.dump(regeninfo, open(os.path.join(self.environment.get_scratch_dir(), 'regeninfo.dump'), 'wb')) def get_obj_target_deps(self, obj_list): result = {} |