From 3a593d0aca47fd0d8a18c42e14704fb863036e03 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 27 Aug 2016 22:45:50 -0400 Subject: [PATCH 1/2] Always obey DESTDIR even with absolute install_dir. Passing an absolute path to `install_dir` would previously always attempt to install there, instead of obeying DESTDIR, since os.path.join will 'reset' on absolute paths. --- mesonbuild/scripts/meson_install.py | 15 ++++++++++++--- .../52 custom install dirs/installed_files.txt | 6 ++++++ .../common/52 custom install dirs/meson.build | 6 ++++++ .../52 custom install dirs/subdir/datafile.dog | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 test cases/common/52 custom install dirs/subdir/datafile.dog diff --git a/mesonbuild/scripts/meson_install.py b/mesonbuild/scripts/meson_install.py index 1924b9526..6a3adab7c 100644 --- a/mesonbuild/scripts/meson_install.py +++ b/mesonbuild/scripts/meson_install.py @@ -106,7 +106,10 @@ def install_data(d): def install_man(d): for m in d.man: outfileroot = m[1] - outfilename = os.path.join(d.fullprefix, outfileroot) + if os.path.isabs(m[1]): + outfilename = destdir_join(d.destdir, m[1]) + else: + outfilename = os.path.join(d.fullprefix, m[1]) full_source_filename = m[0] outdir = os.path.split(outfilename)[0] os.makedirs(outdir, exist_ok=True) @@ -121,7 +124,10 @@ def install_man(d): def install_headers(d): for t in d.headers: fullfilename = t[0] - outdir = os.path.join(d.fullprefix, t[1]) + if os.path.isabs(t[1]): + outdir = destdir_join(d.destdir, t[1]) + else: + outdir = os.path.join(d.fullprefix, t[1]) fname = os.path.split(fullfilename)[1] outfilename = os.path.join(outdir, fname) print('Installing %s to %s' % (fname, outdir)) @@ -194,7 +200,10 @@ def check_for_stampfile(fname): def install_targets(d): for t in d.targets: fname = check_for_stampfile(t[0]) - outdir = os.path.join(d.fullprefix, t[1]) + if os.path.isabs(t[1]): + outdir = destdir_join(d.destdir, t[1]) + else: + outdir = os.path.join(d.fullprefix, t[1]) aliases = t[2] outname = os.path.join(outdir, os.path.split(fname)[-1]) should_strip = t[3] diff --git a/test cases/common/52 custom install dirs/installed_files.txt b/test cases/common/52 custom install dirs/installed_files.txt index 1b8b561d3..0cc533a9c 100644 --- a/test cases/common/52 custom install dirs/installed_files.txt +++ b/test cases/common/52 custom install dirs/installed_files.txt @@ -1,4 +1,10 @@ usr/dib/dab/dub/prog?exe +usr/dib/dab/dub2/prog2?exe usr/some/dir/sample.h +usr/some/dir2/sample.h usr/woman/prog.1.gz +usr/woman2/prog.1.gz usr/meow/datafile.cat +usr/meow2/datafile.cat +usr/woof/subdir/datafile.dog +usr/woof2/subdir/datafile.dog diff --git a/test cases/common/52 custom install dirs/meson.build b/test cases/common/52 custom install dirs/meson.build index 622ecadd7..494ff0ec2 100644 --- a/test cases/common/52 custom install dirs/meson.build +++ b/test cases/common/52 custom install dirs/meson.build @@ -1,5 +1,11 @@ project('custom install dirs', 'c') executable('prog', 'prog.c', install : true, install_dir : 'dib/dab/dub') +executable('prog2', 'prog.c', install : true, install_dir : get_option('prefix') + '/dib/dab/dub2') install_headers('sample.h', install_dir : 'some/dir') +install_headers('sample.h', install_dir : get_option('prefix') + '/some/dir2') install_man('prog.1', install_dir : 'woman') +install_man('prog.1', install_dir : get_option('prefix') + '/woman2') install_data('datafile.cat', install_dir : 'meow') +install_data('datafile.cat', install_dir : get_option('prefix') + '/meow2') +install_subdir('subdir', install_dir : 'woof') +install_subdir('subdir', install_dir : get_option('prefix') + '/woof2') diff --git a/test cases/common/52 custom install dirs/subdir/datafile.dog b/test cases/common/52 custom install dirs/subdir/datafile.dog new file mode 100644 index 000000000..7a5bcb765 --- /dev/null +++ b/test cases/common/52 custom install dirs/subdir/datafile.dog @@ -0,0 +1 @@ +Installed dog is installed. From 38a2a636b5c2ba1981ddd5b16a50d334f762e343 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 27 Aug 2016 23:05:11 -0400 Subject: [PATCH 2/2] Refactor DESTDIR determination into a single function. --- mesonbuild/scripts/meson_install.py | 39 +++++++++++------------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/mesonbuild/scripts/meson_install.py b/mesonbuild/scripts/meson_install.py index 6a3adab7c..5c5e72c8f 100644 --- a/mesonbuild/scripts/meson_install.py +++ b/mesonbuild/scripts/meson_install.py @@ -37,6 +37,13 @@ def do_copy(from_file, to_file): shutil.copystat(from_file, to_file) append_to_log(to_file) +def get_destdir_path(d, path): + if os.path.isabs(path): + output = destdir_join(d.destdir, path) + else: + output = os.path.join(d.fullprefix, path) + return output + def do_install(datafilename): ifile = open(datafilename, 'rb') d = pickle.load(ifile) @@ -56,10 +63,7 @@ def install_subdirs(data): src_dir = src_dir[:-1] src_prefix = os.path.join(src_dir, inst_dir) print('Installing subdir %s to %s.' % (src_prefix, dst_dir)) - if os.path.isabs(dst_dir): - dst_dir = destdir_join(data.destdir, dst_dir) - else: - dst_dir = data.fullprefix + dst_dir + dst_dir = get_destdir_path(data, dst_dir) if not os.path.exists(dst_dir): os.makedirs(dst_dir) for root, dirs, files in os.walk(src_prefix): @@ -92,25 +96,16 @@ def install_subdirs(data): def install_data(d): for i in d.data: fullfilename = i[0] - outfilename = i[1] - if os.path.isabs(outfilename): - outdir = destdir_join(d.destdir, os.path.split(outfilename)[0]) - outfilename = destdir_join(d.destdir, outfilename) - else: - outdir = os.path.join(d.fullprefix, os.path.split(outfilename)[0]) - outfilename = os.path.join(outdir, os.path.split(outfilename)[1]) + outfilename = get_destdir_path(d, i[1]) + outdir = os.path.split(outfilename)[0] os.makedirs(outdir, exist_ok=True) print('Installing %s to %s.' % (fullfilename, outdir)) do_copy(fullfilename, outfilename) def install_man(d): for m in d.man: - outfileroot = m[1] - if os.path.isabs(m[1]): - outfilename = destdir_join(d.destdir, m[1]) - else: - outfilename = os.path.join(d.fullprefix, m[1]) full_source_filename = m[0] + outfilename = get_destdir_path(d, m[1]) outdir = os.path.split(outfilename)[0] os.makedirs(outdir, exist_ok=True) print('Installing %s to %s.' % (full_source_filename, outdir)) @@ -124,11 +119,8 @@ def install_man(d): def install_headers(d): for t in d.headers: fullfilename = t[0] - if os.path.isabs(t[1]): - outdir = destdir_join(d.destdir, t[1]) - else: - outdir = os.path.join(d.fullprefix, t[1]) fname = os.path.split(fullfilename)[1] + outdir = get_destdir_path(d, t[1]) outfilename = os.path.join(outdir, fname) print('Installing %s to %s' % (fname, outdir)) os.makedirs(outdir, exist_ok=True) @@ -200,12 +192,9 @@ def check_for_stampfile(fname): def install_targets(d): for t in d.targets: fname = check_for_stampfile(t[0]) - if os.path.isabs(t[1]): - outdir = destdir_join(d.destdir, t[1]) - else: - outdir = os.path.join(d.fullprefix, t[1]) - aliases = t[2] + outdir = get_destdir_path(d, t[1]) outname = os.path.join(outdir, os.path.split(fname)[-1]) + aliases = t[2] should_strip = t[3] install_rpath = t[4] print('Installing %s to %s' % (fname, outname))