summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Griffis <tingping@tingping.se>2019-08-14 16:35:29 -0700
committerPatrick Griffis <tingping@tingping.se>2019-09-07 17:07:59 -0700
commit5c51ec9da23d1bf4fae9f31173e30c784f960542 (patch)
treecb538d79ab0955b9ec5e0ba8607c88aa87884c85
parentd67d5411bb7fa00226365ebcfc475af08a4ba721 (diff)
downloadmeson-tingping/blocks-dependency.tar.gz
Add blocks dependencytingping/blocks-dependency
This allows easily enabling the blocks clang extension.
-rw-r--r--ciimage/Dockerfile1
-rw-r--r--docs/markdown/Dependencies.md10
-rw-r--r--docs/markdown/Release-notes-for-0.52.0.md4
-rw-r--r--mesonbuild/dependencies/__init__.py3
-rw-r--r--mesonbuild/dependencies/misc.py33
-rwxr-xr-xrun_project_tests.py4
-rw-r--r--test cases/frameworks/29 blocks/main.c6
-rw-r--r--test cases/frameworks/29 blocks/meson.build12
8 files changed, 72 insertions, 1 deletions
diff --git a/ciimage/Dockerfile b/ciimage/Dockerfile
index 585a6ef94..3863ddab1 100644
--- a/ciimage/Dockerfile
+++ b/ciimage/Dockerfile
@@ -24,6 +24,7 @@ RUN sed -i '/^#\sdeb-src /s/^#//' "/etc/apt/sources.list" \
&& apt-get -y install libgpgme-dev \
&& apt-get -y install libhdf5-dev \
&& apt-get -y install libboost-python-dev \
+&& apt-get -y install libblocksruntime-dev \
&& dub fetch urld && dub build urld --compiler=gdc \
&& dub fetch dubtestproject \
&& dub build dubtestproject:test1 --compiler=ldc2 \
diff --git a/docs/markdown/Dependencies.md b/docs/markdown/Dependencies.md
index 0cdd353da..9672887fa 100644
--- a/docs/markdown/Dependencies.md
+++ b/docs/markdown/Dependencies.md
@@ -246,6 +246,16 @@ dep = dependency('appleframeworks', modules : 'foundation')
These dependencies can never be found for non-OSX hosts.
+## Blocks
+
+Enable support for Clang's blocks extension.
+
+```meson
+dep = dependency('blocks')
+```
+
+*(added 0.52.0)*
+
## Boost
Boost is not a single dependency but rather a group of different
diff --git a/docs/markdown/Release-notes-for-0.52.0.md b/docs/markdown/Release-notes-for-0.52.0.md
index c36758a49..de317df9e 100644
--- a/docs/markdown/Release-notes-for-0.52.0.md
+++ b/docs/markdown/Release-notes-for-0.52.0.md
@@ -9,3 +9,7 @@ short-description: Release notes for 0.52.0
Added the function `is_disabler(var)`. Returns true if a variable is a disabler
and false otherwise.
+
+## Add blocks dependency
+
+Add `dependency('blocks')` to use the Clang blocks extension.
diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py
index 846f3de86..631451c37 100644
--- a/mesonbuild/dependencies/__init__.py
+++ b/mesonbuild/dependencies/__init__.py
@@ -18,7 +18,7 @@ from .base import ( # noqa: F401
ExternalDependency, NotFoundDependency, ExternalLibrary, ExtraFrameworkDependency, InternalDependency,
PkgConfigDependency, CMakeDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language)
from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency
-from .misc import (CoarrayDependency, HDF5Dependency, MPIDependency, NetCDFDependency, OpenMPDependency, Python3Dependency, ThreadDependency, PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency, GpgmeDependency, ShadercDependency)
+from .misc import (BlocksDependency, CoarrayDependency, HDF5Dependency, MPIDependency, NetCDFDependency, OpenMPDependency, Python3Dependency, ThreadDependency, PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency, GpgmeDependency, ShadercDependency)
from .platform import AppleFrameworks
from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, SDL2Dependency, WxDependency, VulkanDependency
@@ -31,6 +31,7 @@ packages.update({
'valgrind': ValgrindDependency,
# From misc:
+ 'blocks': BlocksDependency,
'boost': BoostDependency,
'coarray': CoarrayDependency,
'mpi': MPIDependency,
diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py
index 23a283fae..c62f49f83 100644
--- a/mesonbuild/dependencies/misc.py
+++ b/mesonbuild/dependencies/misc.py
@@ -412,6 +412,39 @@ class ThreadDependency(ExternalDependency):
self.link_args = self.clib_compiler.thread_link_flags(environment)
+class BlocksDependency(ExternalDependency):
+ def __init__(self, environment, kwargs):
+ super().__init__('blocks', environment, None, kwargs)
+ self.name = 'blocks'
+ self.is_found = False
+
+ if self.env.machines[self.for_machine].is_darwin():
+ self.compile_args = []
+ self.link_args = []
+ else:
+ self.compile_args = ['-fblocks']
+ self.link_args = ['-lBlocksRuntime']
+
+ if not self.clib_compiler.has_header('Block.h', '', environment, disable_cache=True) or \
+ not self.clib_compiler.find_library('BlocksRuntime', environment, []):
+ mlog.log(mlog.red('ERROR:'), 'BlocksRuntime not found.')
+ return
+
+ source = '''
+ int main(int argc, char **argv)
+ {
+ int (^callback)(void) = ^ int (void) { return 0; };
+ return callback();
+ }'''
+
+ with self.clib_compiler.compile(source, extra_args=self.compile_args + self.link_args) as p:
+ if p.returncode != 0:
+ mlog.log(mlog.red('ERROR:'), 'Compiler does not support blocks extension.')
+ return
+
+ self.is_found = True
+
+
class Python3Dependency(ExternalDependency):
def __init__(self, environment, kwargs):
super().__init__('python3', environment, None, kwargs)
diff --git a/run_project_tests.py b/run_project_tests.py
index 10dc8c603..82f30b9b3 100755
--- a/run_project_tests.py
+++ b/run_project_tests.py
@@ -523,6 +523,10 @@ def skippable(suite, test):
if test.endswith('14 fortran links c'):
return True
+ # Blocks are not supported on all compilers
+ if test.endswith('29 blocks'):
+ return True
+
# No frameworks test should be skipped on linux CI, as we expect all
# prerequisites to be installed
if mesonlib.is_linux():
diff --git a/test cases/frameworks/29 blocks/main.c b/test cases/frameworks/29 blocks/main.c
new file mode 100644
index 000000000..e5ae5894a
--- /dev/null
+++ b/test cases/frameworks/29 blocks/main.c
@@ -0,0 +1,6 @@
+int main(int argc, char **argv)
+{
+ int (^callback)(void) = ^ int (void) { return 0; };
+
+ return callback();
+}
diff --git a/test cases/frameworks/29 blocks/meson.build b/test cases/frameworks/29 blocks/meson.build
new file mode 100644
index 000000000..398c92c2b
--- /dev/null
+++ b/test cases/frameworks/29 blocks/meson.build
@@ -0,0 +1,12 @@
+project('blocks-dependency', 'c')
+
+id = meson.get_compiler('c').get_id()
+if id != 'clang' or build_machine.system() == 'windows'
+ error('MESON_SKIP_TEST: Only clang on unix-like systems supports the blocks extension.')
+endif
+
+exe = executable('main', 'main.c',
+ dependencies: dependency('blocks')
+)
+
+test('test-blocks', exe)