aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <mail@marcel-hollerbach.de>2018-11-17 19:45:52 +0100
committerJussi Pakkanen <jpakkane@gmail.com>2018-11-21 21:36:39 +0200
commit443a4a8c78a41653abc78dabbb664739c2811d02 (patch)
tree5115aa7337b71ffb2d938836ee2ee82c9e8d93c3
parent5e91eb3d0c6750bc70504c02ca942f69aeb46178 (diff)
downloadmeson-443a4a8c78a41653abc78dabbb664739c2811d02.zip
meson-443a4a8c78a41653abc78dabbb664739c2811d02.tar.gz
meson-443a4a8c78a41653abc78dabbb664739c2811d02.tar.bz2
pkgconfig: add support for pkgconfig generation for c#
this adds support for generating pkgconfig files for c#. The difference to c and cpp is that the -I flag is not known to the c# compiler, but rather the -r flag which is used to link a .dll file into the compiled library. However this opens the question of validating which pkgconfig files can be generated (depending on the language). This implements 4409.
-rw-r--r--mesonbuild/modules/pkgconfig.py17
-rwxr-xr-xrun_unittests.py11
-rw-r--r--test cases/unit/48 pkgconfig csharp library/meson.build10
-rw-r--r--test cases/unit/48 pkgconfig csharp library/somelib.cs12
4 files changed, 45 insertions, 5 deletions
diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py
index 8684864..52285c2 100644
--- a/mesonbuild/modules/pkgconfig.py
+++ b/mesonbuild/modules/pkgconfig.py
@@ -276,10 +276,16 @@ class PkgConfigModule(ExtensionModule):
install_dir = l.get_custom_install_dir()[0]
if install_dir is False:
continue
- if isinstance(install_dir, str):
- Lflag = '-L${prefix}/%s ' % self._escape(self._make_relative(prefix, install_dir))
- else: # install_dir is True
- Lflag = '-L${libdir}'
+ if 'cs' in l.compilers:
+ if isinstance(install_dir, str):
+ Lflag = '-r${prefix}/%s/%s ' % (self._escape(self._make_relative(prefix, install_dir)), l.filename)
+ else: # install_dir is True
+ Lflag = '-r${libdir}/%s' % l.filename
+ else:
+ if isinstance(install_dir, str):
+ Lflag = '-L${prefix}/%s ' % self._escape(self._make_relative(prefix, install_dir))
+ else: # install_dir is True
+ Lflag = '-L${libdir}'
if Lflag not in Lflags:
Lflags.append(Lflag)
yield Lflag
@@ -288,7 +294,8 @@ class PkgConfigModule(ExtensionModule):
# find the library
if l.name_suffix_set:
mlog.warning(msg.format(l.name, 'name_suffix', lname, pcfile))
- yield '-l%s' % lname
+ if 'cs' not in l.compilers:
+ yield '-l%s' % lname
if len(deps.pub_libs) > 0:
ofile.write('Libs: {}\n'.format(' '.join(generate_libs_flags(deps.pub_libs))))
diff --git a/run_unittests.py b/run_unittests.py
index bf912f2..ecd6b6e 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -4162,6 +4162,17 @@ endian = 'little'
deps.append(b'-lintl')
self.assertEqual(set(deps), set(stdo.split()))
+ @skipIfNoPkgconfig
+ @skip_if_not_language('cs')
+ def test_pkgconfig_csharp_library(self):
+ testdir = os.path.join(self.unit_test_dir, '48 pkgconfig csharp library')
+ self.init(testdir)
+ myenv = os.environ.copy()
+ myenv['PKG_CONFIG_PATH'] = self.privatedir
+ stdo = subprocess.check_output(['pkg-config', '--libs', 'libsomething'], env=myenv)
+
+ self.assertEqual("-r/usr/lib/libsomething.dll", str(stdo.decode('ascii')).strip())
+
def test_deterministic_dep_order(self):
'''
Test that the dependencies are always listed in a deterministic order.
diff --git a/test cases/unit/48 pkgconfig csharp library/meson.build b/test cases/unit/48 pkgconfig csharp library/meson.build
new file mode 100644
index 0000000..148d40f
--- /dev/null
+++ b/test cases/unit/48 pkgconfig csharp library/meson.build
@@ -0,0 +1,10 @@
+project('pkgformat', 'cs',
+ version : '1.0')
+
+pkgg = import('pkgconfig')
+
+l = library('libsomething', 'somelib.cs')
+
+pkgg.generate(l,
+ version: '1.0',
+ description: 'A library that does something')
diff --git a/test cases/unit/48 pkgconfig csharp library/somelib.cs b/test cases/unit/48 pkgconfig csharp library/somelib.cs
new file mode 100644
index 0000000..24d37ed
--- /dev/null
+++ b/test cases/unit/48 pkgconfig csharp library/somelib.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace Abc
+{
+ public static class Something
+ {
+ public static bool Api1(this String str)
+ {
+ return str == "foo";
+ }
+ }
+}