aboutsummaryrefslogtreecommitdiff
path: root/backends.py
diff options
context:
space:
mode:
Diffstat (limited to 'backends.py')
-rw-r--r--backends.py68
1 files changed, 66 insertions, 2 deletions
diff --git a/backends.py b/backends.py
index 2d1bc48..86cf6aa 100644
--- a/backends.py
+++ b/backends.py
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import os, pickle
+import os, pickle, re
import build
import dependencies
import mesonlib
@@ -226,7 +226,7 @@ class Backend():
if isinstance(target, build.Executable):
commands += dep.get_exe_args()
- # Fortran rquires extra include directives.
+ # Fortran requires extra include directives.
if compiler.language == 'fortran':
for lt in target.link_targets:
priv_dir = os.path.join(self.get_target_dir(lt), lt.get_basename() + lt.type_suffix())
@@ -334,3 +334,67 @@ 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
+
+ def eval_custom_target_command(self, target, absolute_paths=False):
+ ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output]
+ srcs = []
+ outdir = self.get_target_dir(target)
+ if absolute_paths:
+ outdir = os.path.join(self.environment.get_build_dir(), outdir)
+ for i in target.sources:
+ if isinstance(i, str):
+ fname = os.path.join(self.build_to_src, target.subdir, i)
+ else:
+ fname = i.rel_to_builddir(self.build_to_src)
+ if absolute_paths:
+ fname = os.path.join(self.environment.get_build_dir(), fname)
+ srcs.append(fname)
+ cmd = []
+ for i in target.command:
+ if isinstance(i, build.CustomTarget):
+ # GIR scanner will attempt to execute this binary but
+ # it assumes that it is in path, so always give it a full path.
+ tmp = i.get_filename()[0]
+ i = os.path.join(self.get_target_dir(i), tmp)
+ for (j, src) in enumerate(srcs):
+ i = i.replace('@INPUT%d@' % j, src)
+ for (j, res) in enumerate(ofilenames):
+ i = i.replace('@OUTPUT%d@' % j, res)
+ if i == '@INPUT@':
+ cmd += srcs
+ elif i == '@OUTPUT@':
+ cmd += ofilenames
+ else:
+ if '@OUTDIR@' in i:
+ i = i.replace('@OUTDIR@', outdir)
+ elif '@PRIVATE_OUTDIR_' in i:
+ match = re.search('@PRIVATE_OUTDIR_(ABS_)?([-a-zA-Z0-9.@:]*)@', i)
+ source = match.group(0)
+ if match.group(1) is None and not absolute_paths:
+ lead_dir = ''
+ else:
+ lead_dir = self.environment.get_build_dir()
+ target_id = match.group(2)
+ i = i.replace(source,
+ os.path.join(lead_dir,
+ self.get_target_private_dir(self.build.targets[target_id])))
+ cmd.append(i)
+ cmd = [i.replace('\\', '/') for i in cmd]
+ return (srcs, ofilenames, cmd)