aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2017-07-15 05:33:03 -0400
committerJussi Pakkanen <jpakkane@gmail.com>2017-07-21 19:40:54 +0300
commit2269b7f60b2443aa697a5616fcc3692fa3496046 (patch)
tree085e2a1b2dd75a46f0d5d837d8d039f93656ed83
parent381e8313ed191ae8e440a9ba3805d5322c769ea7 (diff)
downloadmeson-2269b7f60b2443aa697a5616fcc3692fa3496046.zip
meson-2269b7f60b2443aa697a5616fcc3692fa3496046.tar.gz
meson-2269b7f60b2443aa697a5616fcc3692fa3496046.tar.bz2
Add build_rpath as new property allowing people to specify rpath entries that are used in the build tree but will be removed on install.
-rw-r--r--mesonbuild/backend/ninjabackend.py2
-rw-r--r--mesonbuild/build.py4
-rw-r--r--mesonbuild/compilers/c.py6
-rw-r--r--mesonbuild/compilers/compilers.py7
-rw-r--r--mesonbuild/compilers/cs.py2
-rw-r--r--mesonbuild/compilers/d.py8
-rw-r--r--mesonbuild/compilers/fortran.py4
-rw-r--r--mesonbuild/compilers/java.py2
-rw-r--r--mesonbuild/compilers/rust.py4
-rw-r--r--mesonbuild/interpreter.py1
-rw-r--r--mesonbuild/linkers.py4
-rwxr-xr-xrun_unittests.py11
-rw-r--r--test cases/unit/11 build_rpath/meson.build9
-rw-r--r--test cases/unit/11 build_rpath/prog.c5
-rw-r--r--test cases/unit/11 build_rpath/sub/meson.build1
-rw-r--r--test cases/unit/11 build_rpath/sub/stuff.c3
16 files changed, 57 insertions, 16 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index 7f974ee..b134510 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -1211,6 +1211,7 @@ int dummy;
rpath_args = rustc.build_rpath_args(self.environment.get_build_dir(),
target_slashname_workaround_dir,
self.determine_rpath_dirs(target),
+ target.build_rpath,
target.install_rpath)
# ... but then add rustc's sysroot to account for rustup
# installations
@@ -2387,6 +2388,7 @@ rule FORTRAN_DEP_HACK
commands += linker.build_rpath_args(self.environment.get_build_dir(),
target_slashname_workaround_dir,
self.determine_rpath_dirs(target),
+ target.build_rpath,
target.install_rpath)
# Add libraries generated by custom targets
custom_target_libraries = self.get_custom_target_provided_libraries(target)
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index fb56cea..e1e1a33 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -49,6 +49,7 @@ known_basic_kwargs = {'install': True,
'gui_app': True,
'extra_files': True,
'install_rpath': True,
+ 'build_rpath': True,
'resources': True,
'sources': True,
'objects': True,
@@ -707,6 +708,9 @@ class BuildTarget(Target):
self.install_rpath = kwargs.get('install_rpath', '')
if not isinstance(self.install_rpath, str):
raise InvalidArguments('Install_rpath is not a string.')
+ self.build_rpath = kwargs.get('build_rpath', '')
+ if not isinstance(self.build_rpath, str):
+ raise InvalidArguments('Build_rpath is not a string.')
resources = kwargs.get('resources', [])
if not isinstance(resources, list):
resources = [resources]
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index 593366a..d93c7cc 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -87,8 +87,8 @@ class CCompiler(Compiler):
return None, fname
# The default behavior is this, override in MSVC
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
- return self.build_unix_rpath_args(build_dir, from_dir, rpath_paths, install_rpath)
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
+ return self.build_unix_rpath_args(build_dir, from_dir, rpath_paths, build_rpath, install_rpath)
def get_dependency_gen_args(self, outtarget, outfile):
return ['-MMD', '-MQ', outtarget, '-MF', outfile]
@@ -909,7 +909,7 @@ class VisualStudioCCompiler(CCompiler):
"The name of the outputted import library"
return ['/IMPLIB:' + implibname]
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
return []
# FIXME, no idea what these should be.
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index 0be3908..c88286c 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -798,8 +798,8 @@ class Compiler:
def get_instruction_set_args(self, instruction_set):
return None
- def build_unix_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
- if not rpath_paths and not install_rpath:
+ def build_unix_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
+ if not rpath_paths and not install_rpath and not build_rpath:
return []
# The rpaths we write must be relative, because otherwise
# they have different length depending on the build
@@ -812,6 +812,9 @@ class Compiler:
relative = os.path.relpath(os.path.join(build_dir, p), os.path.join(build_dir, from_dir))
rel_rpaths.append(relative)
paths = ':'.join([os.path.join('$ORIGIN', p) for p in rel_rpaths])
+ # Build_rpath is used as-is (it is usually absolute).
+ if build_rpath != '':
+ paths += ':' + build_rpath
if len(paths) < len(install_rpath):
padding = 'X' * (len(install_rpath) - len(paths))
if not paths:
diff --git a/mesonbuild/compilers/cs.py b/mesonbuild/compilers/cs.py
index e6c5b9e..b8a4d13 100644
--- a/mesonbuild/compilers/cs.py
+++ b/mesonbuild/compilers/cs.py
@@ -43,7 +43,7 @@ class MonoCompiler(Compiler):
def split_shlib_to_parts(self, fname):
return None, fname
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
return []
def get_dependency_gen_args(self, outtarget, outfile):
diff --git a/mesonbuild/compilers/d.py b/mesonbuild/compilers/d.py
index e1d534f..a989704 100644
--- a/mesonbuild/compilers/d.py
+++ b/mesonbuild/compilers/d.py
@@ -88,12 +88,14 @@ class DCompiler(Compiler):
def get_std_exe_link_args(self):
return []
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
# This method is to be used by LDC and DMD.
# GDC can deal with the verbatim flags.
if not rpath_paths and not install_rpath:
return []
paths = ':'.join([os.path.join(build_dir, p) for p in rpath_paths])
+ if build_rpath != '':
+ paths += ':' + build_rpath
if len(paths) < len(install_rpath):
padding = 'X' * (len(install_rpath) - len(paths))
if not paths:
@@ -212,8 +214,8 @@ class GnuDCompiler(DCompiler):
def get_buildtype_args(self, buildtype):
return d_gdc_buildtype_args[buildtype]
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
- return self.build_unix_rpath_args(build_dir, from_dir, rpath_paths, install_rpath)
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
+ return self.build_unix_rpath_args(build_dir, from_dir, rpath_paths, build_rpath, install_rpath)
def get_unittest_args(self):
return ['-funittest']
diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py
index d44b529..e17cda0 100644
--- a/mesonbuild/compilers/fortran.py
+++ b/mesonbuild/compilers/fortran.py
@@ -132,8 +132,8 @@ end program prog
def get_std_exe_link_args(self):
return []
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
- return self.build_unix_rpath_args(build_dir, from_dir, rpath_paths, install_rpath)
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
+ return self.build_unix_rpath_args(build_dir, from_dir, rpath_paths, build_rpath, install_rpath)
def module_name_to_filename(self, module_name):
return module_name.lower() + '.mod'
diff --git a/mesonbuild/compilers/java.py b/mesonbuild/compilers/java.py
index 0253bfe..a8138d7 100644
--- a/mesonbuild/compilers/java.py
+++ b/mesonbuild/compilers/java.py
@@ -34,7 +34,7 @@ class JavaCompiler(Compiler):
def split_shlib_to_parts(self, fname):
return None, fname
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
return []
def get_dependency_gen_args(self, outtarget, outfile):
diff --git a/mesonbuild/compilers/rust.py b/mesonbuild/compilers/rust.py
index 38ba6a2..b93289f 100644
--- a/mesonbuild/compilers/rust.py
+++ b/mesonbuild/compilers/rust.py
@@ -50,8 +50,8 @@ class RustCompiler(Compiler):
def get_buildtype_args(self, buildtype):
return rust_buildtype_args[buildtype]
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
- return self.build_unix_rpath_args(build_dir, from_dir, rpath_paths, install_rpath)
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
+ return self.build_unix_rpath_args(build_dir, from_dir, rpath_paths, build_rpath, install_rpath)
def get_sysroot(self):
cmd = self.exelist + ['--print', 'sysroot']
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 359dd17..be3e570 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1241,6 +1241,7 @@ rust_kwargs = set(['rust_crate_type'])
cs_kwargs = set(['resources'])
buildtarget_kwargs = set(['build_by_default',
+ 'build_rpath',
'dependencies',
'extra_files',
'gui_app',
diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py
index d0d5184..e0554e0 100644
--- a/mesonbuild/linkers.py
+++ b/mesonbuild/linkers.py
@@ -45,7 +45,7 @@ class VisualStudioLinker(StaticLinker):
def get_linker_always_args(self):
return VisualStudioLinker.always_args
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
return []
def thread_link_flags(self):
@@ -76,7 +76,7 @@ class ArLinker(StaticLinker):
else:
self.std_args = ['csr']
- def build_rpath_args(self, build_dir, from_dir, rpath_paths, install_rpath):
+ def build_rpath_args(self, build_dir, from_dir, rpath_paths, build_rpath, install_rpath):
return []
def get_exelist(self):
diff --git a/run_unittests.py b/run_unittests.py
index 664fdef..875ba65 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -1850,6 +1850,17 @@ class LinuxlikeTests(BasePlatformTests):
self.assertTrue(glib_found)
self.assertTrue(gobject_found)
+ def test_build_rpath(self):
+ testdir = os.path.join(self.unit_test_dir, '11 build_rpath')
+ self.init(testdir)
+ self.build()
+ build_rpath = get_rpath(os.path.join(self.builddir, 'prog'))
+ self.assertEqual(build_rpath, '$ORIGIN/sub:/foo/bar')
+ self.install()
+ install_rpath = get_rpath(os.path.join(self.installdir, 'usr/bin/prog'))
+ self.assertEqual(install_rpath, '/baz')
+
+
class LinuxArmCrossCompileTests(BasePlatformTests):
'''
Tests that verify cross-compilation to Linux/ARM
diff --git a/test cases/unit/11 build_rpath/meson.build b/test cases/unit/11 build_rpath/meson.build
new file mode 100644
index 0000000..b84c259
--- /dev/null
+++ b/test cases/unit/11 build_rpath/meson.build
@@ -0,0 +1,9 @@
+project('build rpath', 'c')
+
+subdir('sub')
+executable('prog', 'prog.c',
+ link_with : l,
+ build_rpath : '/foo/bar',
+ install_rpath : '/baz',
+ install : true,
+ )
diff --git a/test cases/unit/11 build_rpath/prog.c b/test cases/unit/11 build_rpath/prog.c
new file mode 100644
index 0000000..45b2fa3
--- /dev/null
+++ b/test cases/unit/11 build_rpath/prog.c
@@ -0,0 +1,5 @@
+int get_stuff();
+
+int main(int argc, char **argv) {
+ return get_stuff();
+}
diff --git a/test cases/unit/11 build_rpath/sub/meson.build b/test cases/unit/11 build_rpath/sub/meson.build
new file mode 100644
index 0000000..6879ec6
--- /dev/null
+++ b/test cases/unit/11 build_rpath/sub/meson.build
@@ -0,0 +1 @@
+l = shared_library('stuff', 'stuff.c')
diff --git a/test cases/unit/11 build_rpath/sub/stuff.c b/test cases/unit/11 build_rpath/sub/stuff.c
new file mode 100644
index 0000000..d56d8b0
--- /dev/null
+++ b/test cases/unit/11 build_rpath/sub/stuff.c
@@ -0,0 +1,3 @@
+int get_stuff() {
+ return 0;
+}