From 0482635c1293ecc1148da8236f6b77cd4f21e130 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Mon, 30 May 2016 23:08:24 +0300 Subject: [PATCH] Handle case of install_subdirring a subdir. --- mesonbuild/backend/ninjabackend.py | 11 +++++++++-- mesonbuild/scripts/meson_install.py | 5 ++++- .../common/66 install subdir/installed_files.txt | 1 + test cases/common/66 install subdir/meson.build | 1 + .../common/66 install subdir/sub/sub1/third.dat | 1 + 5 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 test cases/common/66 install subdir/sub/sub1/third.dat diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index ce8d46ea6..077254df8 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -545,8 +545,15 @@ int dummy; 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) - inst_dir = sd.installable_subdir + inst_subdir = sd.installable_subdir.rstrip('/') + idir_parts = inst_subdir.split('/') + if len(idir_parts) > 1: + subdir = os.path.join(sd.source_subdir, '/'.join(idir_parts[:-1])) + inst_dir = idir_parts[-1] + else: + subdir = sd.source_subdir + inst_dir = sd.installable_subdir + src_dir = os.path.join(self.environment.get_source_dir(), subdir) dst_dir = os.path.join(self.environment.get_prefix(), sd.install_dir) d.install_subdirs.append([src_dir, inst_dir, dst_dir]) diff --git a/mesonbuild/scripts/meson_install.py b/mesonbuild/scripts/meson_install.py index 1cba480fb..0af7c24f1 100644 --- a/mesonbuild/scripts/meson_install.py +++ b/mesonbuild/scripts/meson_install.py @@ -55,7 +55,6 @@ def install_subdirs(data): if not os.path.exists(dst_dir): os.makedirs(dst_dir) for root, dirs, files in os.walk(src_prefix): - print(root) for d in dirs: abs_src = os.path.join(src_dir, root, d) filepart = abs_src[len(src_dir)+1:] @@ -75,6 +74,10 @@ def install_subdirs(data): print('Tried to copy file %s but a directory of that name already exists.' % abs_dst) if os.path.exists(abs_dst): os.unlink(abs_dst) + parent_dir = os.path.split(abs_dst)[0] + if not os.path.isdir(parent_dir): + os.mkdir(parent_dir) + shutil.copystat(os.path.split(abs_src)[0], parent_dir) shutil.copy2(abs_src, abs_dst, follow_symlinks=False) def install_data(d): diff --git a/test cases/common/66 install subdir/installed_files.txt b/test cases/common/66 install subdir/installed_files.txt index fb60d7437..a610c510a 100644 --- a/test cases/common/66 install subdir/installed_files.txt +++ b/test cases/common/66 install subdir/installed_files.txt @@ -1,3 +1,4 @@ usr/share/sub1/data1.dat usr/share/sub1/second.dat +usr/share/sub1/third.dat usr/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 index d15321379..669cf09a8 100644 --- a/test cases/common/66 install subdir/meson.build +++ b/test cases/common/66 install subdir/meson.build @@ -2,3 +2,4 @@ project('install a whole subdir', 'c') subdir('subdir') install_subdir('sub1', install_dir : 'share') +install_subdir('sub/sub1', install_dir : 'share') diff --git a/test cases/common/66 install subdir/sub/sub1/third.dat b/test cases/common/66 install subdir/sub/sub1/third.dat new file mode 100644 index 000000000..5ccbc43c7 --- /dev/null +++ b/test cases/common/66 install subdir/sub/sub1/third.dat @@ -0,0 +1 @@ +This is a third data file for sub1 dir.