Regenerator script works, but is not run automatically yet.

pull/278/head
Jussi Pakkanen 10 years ago
parent 19003e49d0
commit 5be7c011bf
  1. 17
      backends.py
  2. 15
      ninjabackend.py
  3. 26
      regen_checker.py
  4. 17
      vs2010backend.py

@ -333,3 +333,20 @@ class Backend():
mfobj['projects'] = self.build.dep_manifest mfobj['projects'] = self.build.dep_manifest
open(ifilename, 'w').write(json.dumps(mfobj)) open(ifilename, 'w').write(json.dumps(mfobj))
d.data.append([ifilename, ofilename]) 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 meson_install import InstallData
from build import InvalidArguments from build import InvalidArguments
from coredata import MesonException from coredata import MesonException
import os, sys, shutil, pickle, re import os, sys, pickle, re
if mesonlib.is_windows(): if mesonlib.is_windows():
quote_char = '"' quote_char = '"'
@ -1613,18 +1613,7 @@ rule FORTRAN_DEP_HACK
elem.write(outfile) elem.write(outfile)
self.check_outputs(elem) self.check_outputs(elem)
deps = [os.path.join(self.build_to_src, df) \ deps = self.get_regen_filelist()
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'))
elem = NinjaBuildElement('build.ninja', 'REGENERATE_BUILD', deps) elem = NinjaBuildElement('build.ninja', 'REGENERATE_BUILD', deps)
elem.add_item('pool', 'console') elem.add_item('pool', 'console')
elem.write(outfile) elem.write(outfile)

@ -14,11 +14,29 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import sys import sys, os
import pickle, subprocess
print('I am a script that checks whether VS solution should be regenerated.')
print('Currently I do nothing.')
# This could also be used for XCode. # 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
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) sys.exit(0)

@ -13,11 +13,19 @@
# limitations under the License. # limitations under the License.
import os, sys import os, sys
import pickle
import backends, build import backends, build
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import xml.dom.minidom import xml.dom.minidom
from coredata import MesonException 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): class Vs2010Backend(backends.Backend):
def __init__(self, build): def __init__(self, build):
super().__init__(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_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.gen_regenproj('REGEN', os.path.join(self.environment.get_build_dir(), 'REGEN.vcxproj'))
self.generate_solution(sln_filename, projlist) 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): def get_obj_target_deps(self, obj_list):
result = {} result = {}

Loading…
Cancel
Save