diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2014-11-03 23:28:47 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2014-11-03 23:28:47 +0200 |
commit | 0c86f30d4bd1fa53df139dd3a182381477a1fc12 (patch) | |
tree | c974c606dcf480d265e9e77e1a15490a407f95b7 | |
parent | a500c6cfa885ab9da7527d6f983f162f31e47710 (diff) | |
download | meson-0c86f30d4bd1fa53df139dd3a182381477a1fc12.zip meson-0c86f30d4bd1fa53df139dd3a182381477a1fc12.tar.gz meson-0c86f30d4bd1fa53df139dd3a182381477a1fc12.tar.bz2 |
Can install entire subtrees with one command. Closes #14.
-rw-r--r-- | build.py | 4 | ||||
-rw-r--r-- | interpreter.py | 23 | ||||
-rwxr-xr-x | meson_install.py | 11 | ||||
-rw-r--r-- | ninjabackend.py | 7 | ||||
-rw-r--r-- | test cases/common/66 install subdir/installed_files.txt | 2 | ||||
-rw-r--r-- | test cases/common/66 install subdir/meson.build | 3 | ||||
-rw-r--r-- | test cases/common/66 install subdir/subdir/meson.build | 1 | ||||
-rw-r--r-- | test cases/common/66 install subdir/subdir/sub1/data1.dat | 1 | ||||
-rw-r--r-- | test cases/common/66 install subdir/subdir/sub1/sub2/data2.dat | 1 |
9 files changed, 53 insertions, 0 deletions
@@ -77,6 +77,7 @@ class Build: self.subprojects = {} self.pkgconfig_gens = [] self.install_script = None + self.install_dirs = [] def has_language(self, language): for i in self.compilers: @@ -120,6 +121,9 @@ class Build: def get_configure_files(self): return self.configure_files + def get_install_subdirs(self): + return self.install_dirs + def get_global_args(self, compiler): return self.global_args.get(compiler.get_language(), []) diff --git a/interpreter.py b/interpreter.py index d01ebc0..51043e1 100644 --- a/interpreter.py +++ b/interpreter.py @@ -326,6 +326,13 @@ class Data(InterpreterObject): def get_custom_install_dir(self): return self.custom_install_dir +class InstallDir(InterpreterObject): + def __init__(self, source_subdir, installable_subdir, install_dir): + InterpreterObject.__init__(self) + self.source_subdir = source_subdir + self.installable_subdir = installable_subdir + self.install_dir = install_dir + class Man(InterpreterObject): def __init__(self, source_subdir, sources, kwargs): @@ -705,6 +712,7 @@ class Interpreter(): 'install_man' : self.func_install_man, 'subdir' : self.func_subdir, 'install_data' : self.func_install_data, + 'install_subdir' : self.func_install_subdir, 'configure_file' : self.func_configure_file, 'include_directories' : self.func_include_directories, 'add_global_arguments' : self.func_add_global_arguments, @@ -1218,6 +1226,21 @@ class Interpreter(): self.build.data.append(data) return data + def func_install_subdir(self, node, args, kwargs): + if len(args ) != 1: + raise InvalidArguments('Install_subdir requires exactly one argument.') + for a in args: + if not isinstance(a, str): + raise InvalidArguments('Argument %s is not a string.' % str(a)) + if not 'install_dir' in kwargs: + raise InvalidArguments('Missing keyword argument install_dir') + install_dir = kwargs['install_dir'] + if not isinstance(install_dir, str): + raise InvalidArguments('Keyword argument install_dir not a string.') + idir = InstallDir(self.subdir, args[0], install_dir) + self.build.install_dirs.append(idir) + return idir + def func_configure_file(self, node, args, kwargs): if len(args) > 0: raise InterpreterException("configure_file takes only keyword arguments.") diff --git a/meson_install.py b/meson_install.py index 67b3a07..0d6db82 100755 --- a/meson_install.py +++ b/meson_install.py @@ -30,6 +30,7 @@ class InstallData(): self.po_package_name = '' self.po = [] self.install_script = None + self.install_subdirs = [] def do_install(datafilename): ifile = open(datafilename, 'rb') @@ -41,6 +42,7 @@ def do_install(datafilename): else: subdir = d.prefix d.prefix = os.path.join(os.environ[destdir_var], subdir) + install_subdirs(d) # Must be first, because it needs to delete the old subtree. install_targets(d) install_headers(d) install_man(d) @@ -48,6 +50,15 @@ def do_install(datafilename): install_po(d) run_install_script(d) +def install_subdirs(d): + for (src_dir, dst_dir) in d.install_subdirs: + # Python's copytree works in strange ways. + last_level = os.path.split(src_dir)[-1] + final_dst = os.path.join(dst_dir, last_level) + shutil.rmtree(final_dst, ignore_errors=True) + shutil.copytree(src_dir, final_dst, symlinks=True) + print('Installing subdir %s to %s.' % (src_dir, dst_dir)) + def install_po(d): packagename = d.po_package_name for f in d.po: diff --git a/ninjabackend.py b/ninjabackend.py index 398b0ef..ad8447d 100644 --- a/ninjabackend.py +++ b/ninjabackend.py @@ -377,6 +377,7 @@ class NinjaBackend(backends.Backend): self.generate_po_install(d, elem) self.generate_pkgconfig_install(d) self.generate_custom_install_script(d) + self.generate_subdir_install(d) elem.write(outfile) ofile = open(install_data_file, 'wb') @@ -466,6 +467,12 @@ class NinjaBackend(backends.Backend): i = [srcabs, dstabs] d.data.append(i) + def generate_subdir_install(self, d): + for sd in self.build.get_install_subdirs(): + src_dir = os.path.join(self.environment.get_source_dir(), sd.source_subdir, sd.installable_subdir) + dst_dir = os.path.join(self.environment.get_prefix(), sd.install_dir) + d.install_subdirs.append([src_dir, dst_dir]) + def generate_tests(self, outfile): self.serialise_tests() valgrind = environment.find_valgrind() diff --git a/test cases/common/66 install subdir/installed_files.txt b/test cases/common/66 install subdir/installed_files.txt new file mode 100644 index 0000000..4f5bacf --- /dev/null +++ b/test cases/common/66 install subdir/installed_files.txt @@ -0,0 +1,2 @@ +share/sub1/data1.dat +share/sub1/sub2/data2.dat diff --git a/test cases/common/66 install subdir/meson.build b/test cases/common/66 install subdir/meson.build new file mode 100644 index 0000000..16062b0 --- /dev/null +++ b/test cases/common/66 install subdir/meson.build @@ -0,0 +1,3 @@ +project('install a whole subdir', 'c') + +subdir('subdir') diff --git a/test cases/common/66 install subdir/subdir/meson.build b/test cases/common/66 install subdir/subdir/meson.build new file mode 100644 index 0000000..08b417d --- /dev/null +++ b/test cases/common/66 install subdir/subdir/meson.build @@ -0,0 +1 @@ +install_subdir('sub1', install_dir : 'share') diff --git a/test cases/common/66 install subdir/subdir/sub1/data1.dat b/test cases/common/66 install subdir/subdir/sub1/data1.dat new file mode 100644 index 0000000..d83c370 --- /dev/null +++ b/test cases/common/66 install subdir/subdir/sub1/data1.dat @@ -0,0 +1 @@ +This is a data file in a subdir. diff --git a/test cases/common/66 install subdir/subdir/sub1/sub2/data2.dat b/test cases/common/66 install subdir/subdir/sub1/sub2/data2.dat new file mode 100644 index 0000000..8ce1392 --- /dev/null +++ b/test cases/common/66 install subdir/subdir/sub1/sub2/data2.dat @@ -0,0 +1 @@ +This is a data file in a deeper subdir. |