aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 585a6ef..3863dda 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 0cdd353..9672887 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 c36758a..de317df 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 846f3de..631451c 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 23a283f..c62f49f 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 10dc8c6..82f30b9 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 0000000..e5ae589
--- /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 0000000..398c92c
--- /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)