diff options
-rw-r--r-- | build.py | 1 | ||||
-rw-r--r-- | interpreter.py | 13 | ||||
-rwxr-xr-x | meson_install.py | 20 | ||||
-rw-r--r-- | ninjabackend.py | 9 | ||||
-rw-r--r-- | test cases/common/60 install script/installed_files.txt | 2 | ||||
-rw-r--r-- | test cases/common/60 install script/meson.build | 4 | ||||
-rwxr-xr-x | test cases/common/60 install script/myinstall.sh | 5 | ||||
-rw-r--r-- | test cases/common/60 install script/prog.c | 6 |
8 files changed, 57 insertions, 3 deletions
@@ -43,6 +43,7 @@ class Build: self.pot = [] self.subprojects = {} self.pkgconfig_gens = [] + self.install_script = None def has_language(self, language): for i in self.compilers: diff --git a/interpreter.py b/interpreter.py index 1820885..d8e20de 100644 --- a/interpreter.py +++ b/interpreter.py @@ -565,8 +565,21 @@ class MesonMain(InterpreterObject): 'is_unity' : self.is_unity_method, 'current_source_dir' : self.current_source_dir_method, 'current_build_dir' : self.current_build_dir_method, + 'set_install_script' : self.set_install_script_method, }) + def set_install_script_method(self, args, kwargs): + if len(args) != 1: + raise InterpreterException('Set_install_script takes exactly one argument.') + scriptbase = args[0] + if not isinstance(scriptbase, str): + raise InterpreterException('Set_install_script argument is not a string.') + scriptfile = os.path.join(self.interpreter.environment.source_dir, + self.interpreter.subdir, scriptbase) + if not os.path.isfile(scriptfile): + raise InterpreterException('Can not find install script %s.' % scriptbase) + self.build.install_script = scriptfile + def current_source_dir_method(self, args, kwargs): src = self.interpreter.environment.source_dir sub = self.interpreter.subdir diff --git a/meson_install.py b/meson_install.py index 1c50f9c..9472954 100755 --- a/meson_install.py +++ b/meson_install.py @@ -18,7 +18,9 @@ import sys, pickle, os, shutil, subprocess, gzip, platform from glob import glob class InstallData(): - def __init__(self, prefix, depfixer, dep_prefix): + def __init__(self, source_dir, build_dir, prefix, depfixer, dep_prefix): + self.source_dir = source_dir + self.build_dir= build_dir self.prefix = prefix self.targets = [] self.depfixer = depfixer @@ -28,6 +30,7 @@ class InstallData(): self.data = [] self.po_package_name = '' self.po = [] + self.install_script = None def do_install(datafilename): ifile = open(datafilename, 'rb') @@ -44,6 +47,7 @@ def do_install(datafilename): install_man(d) install_data(d) install_po(d) + run_install_script(d) def install_po(d): packagename = d.po_package_name @@ -94,6 +98,19 @@ def install_headers(d): shutil.copyfile(fullfilename, outfilename) shutil.copystat(fullfilename, outfilename) +def run_install_script(d): + if d.install_script is None: + return + env = {'MESON_SOURCE_ROOT' : d.source_dir, + 'MESON_BUILD_ROOT' : d.build_dir, + 'MESON_INSTALL_PREFIX' : d.prefix + } + script = d.install_script + print('Running custom install script %s' % script) + child_env = os.environ.copy() + child_env.update(env) + subprocess.check_call(script, env=child_env) + def is_elf_platform(): platname = platform.system().lower() if platname == 'darwin' or platname == 'windows': @@ -123,7 +140,6 @@ def check_for_stampfile(fname): sys.exit(1) if len(files) == 1: return files[0] - return fname def install_targets(d): diff --git a/ninjabackend.py b/ninjabackend.py index 2396752..b9131ae 100644 --- a/ninjabackend.py +++ b/ninjabackend.py @@ -218,7 +218,9 @@ class NinjaBackend(backends.Backend): install_script = os.path.join(script_root, 'meson_install.py') install_data_file = os.path.join(self.environment.get_scratch_dir(), 'install.dat') depfixer = os.path.join(script_root, 'depfixer.py') - d = InstallData(self.environment.get_prefix(), depfixer, './') # Fixme + d = InstallData(self.environment.get_source_dir(), + self.environment.get_build_dir(), + self.environment.get_prefix(), depfixer, './') # Fixme elem = NinjaBuildElement('install', 'CUSTOM_COMMAND', '') elem.add_dep('all') elem.add_item('DESC', 'Installing files.') @@ -229,6 +231,7 @@ class NinjaBackend(backends.Backend): self.generate_data_install(d) self.generate_po_install(d, elem) self.generate_pkgconfig_install(d) + self.generate_custom_install_script(d) elem.write(outfile) ofile = open(install_data_file, 'wb') @@ -273,6 +276,10 @@ class NinjaBackend(backends.Backend): i = [srcabs, dstabs] d.man.append(i) + def generate_custom_install_script(self, d): + d.install_script = self.build.install_script + + def generate_header_install(self, d): incroot = self.environment.get_includedir() headers = self.build.get_headers() diff --git a/test cases/common/60 install script/installed_files.txt b/test cases/common/60 install script/installed_files.txt new file mode 100644 index 0000000..13150a2 --- /dev/null +++ b/test cases/common/60 install script/installed_files.txt @@ -0,0 +1,2 @@ +bin/prog +diiba/daaba/file.dat diff --git a/test cases/common/60 install script/meson.build b/test cases/common/60 install script/meson.build new file mode 100644 index 0000000..f140dd0 --- /dev/null +++ b/test cases/common/60 install script/meson.build @@ -0,0 +1,4 @@ +project('custom install script', 'c') + +meson.set_install_script('myinstall.sh') +executable('prog', 'prog.c', install : true) diff --git a/test cases/common/60 install script/myinstall.sh b/test cases/common/60 install script/myinstall.sh new file mode 100755 index 0000000..2face99 --- /dev/null +++ b/test cases/common/60 install script/myinstall.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +mkdir "${DESTDIR}/${MESON_INSTALL_PREFIX}/diiba" +mkdir "${DESTDIR}/${MESON_INSTALL_PREFIX}/diiba/daaba" +touch "${DESTDIR}/${MESON_INSTALL_PREFIX}/diiba/daaba/file.dat" diff --git a/test cases/common/60 install script/prog.c b/test cases/common/60 install script/prog.c new file mode 100644 index 0000000..06bc6b1 --- /dev/null +++ b/test cases/common/60 install script/prog.c @@ -0,0 +1,6 @@ +#include<stdio.h> + +int main(int argc, char **argv) { + printf("This is text.\n"); + return 0; +} |