aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends.py17
-rw-r--r--ninjabackend.py15
-rw-r--r--regen_checker.py28
-rw-r--r--vs2010backend.py17
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 = {}