Regenerator script works, but is not run automatically yet.

pull/278/head
Jussi Pakkanen 9 years ago
parent 19003e49d0
commit 5be7c011bf
  1. 17
      backends.py
  2. 15
      ninjabackend.py
  3. 28
      regen_checker.py
  4. 17
      vs2010backend.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

@ -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)

@ -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)
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)

@ -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 = {}

Loading…
Cancel
Save