| --- |
| short-description: Code snippets module |
| ... |
| |
| # Snippets module |
| |
| *(new in 1.10.0)* |
| |
| This module provides helpers to generate commonly useful code snippets. |
| |
| ## Functions |
| |
| ### symbol_visibility_header() |
| |
| ```meson |
| snippets.symbol_visibility_header(header_name, |
| namespace: str |
| api: str |
| compilation: str |
| static_compilation: str |
| static_only: bool |
| ) |
| ``` |
| |
| Generate a header file that defines macros to be used to mark all public APIs |
| of a library. Depending on the platform, this will typically use |
| `__declspec(dllexport)`, `__declspec(dllimport)` or |
| `__attribute__((visibility("default")))`. It is compatible with C, C++, |
| ObjC and ObjC++ languages. The content of the header is static regardless |
| of the compiler used. |
| |
| The first positional argument is the name of the header file to be generated. |
| It also takes the following keyword arguments: |
| |
| - `namespace`: Prefix for generated macros, defaults to the current project name. |
| It will be converted to upper case with all non-alphanumeric characters replaced |
| by an underscore `_`. It is only used for `api`, `compilation` and |
| `static_compilation` default values. |
| - `api`: Name of the macro used to mark public APIs. Defaults to `<NAMESPACE>_API`. |
| - `compilation`: Name of a macro defined only when compiling the library. |
| Defaults to `<NAMESPACE>_COMPILATION`. |
| - `static_compilation`: Name of a macro defined only when compiling or using |
| static library. Defaults to `<NAMESPACE>_STATIC_COMPILATION`. |
| - `static_only`: If set to true, `<NAMESPACE>_STATIC_COMPILATION` is defined |
| inside the generated header. In that case the header can only be used for |
| building a static library. By default it is `true` when `default_library=static`, |
| and `false` otherwise. [See below for more information](#static_library) |
| |
| Projects that define multiple shared libraries should typically have |
| one header per library, with a different namespace. |
| |
| The generated header file should be installed using `install_headers()`. |
| |
| `meson.build`: |
| ```meson |
| project('mylib', 'c') |
| subdir('mylib') |
| ``` |
| |
| `mylib/meson.build`: |
| ```meson |
| snippets = import('snippets') |
| apiheader = snippets.symbol_visibility_header('apiconfig.h') |
| install_headers(apiheader, 'lib.h', subdir: 'mylib') |
| lib = library('mylib', 'lib.c', |
| gnu_symbol_visibility: 'hidden', |
| c_args: ['-DMYLIB_COMPILATION'], |
| ) |
| ``` |
| |
| `mylib/lib.h` |
| ```c |
| #include <mylib/apiconfig.h> |
| MYLIB_API int do_stuff(); |
| ``` |
| |
| `mylib/lib.c` |
| ```c |
| #include "lib.h" |
| int do_stuff() { |
| return 0; |
| } |
| ``` |
| |
| #### Static library |
| |
| When building both static and shared libraries on Windows (`default_library=both`), |
| `-D<NAMESPACE>_STATIC_COMPILATION` must be defined only for the static library, |
| using `c_static_args`. This causes Meson to compile the library twice. |
| |
| ```meson |
| if host_system == 'windows' |
| static_arg = ['-DMYLIB_STATIC_COMPILATION'] |
| else |
| static_arg = [] |
| endif |
| lib = library('mylib', 'lib.c', |
| gnu_symbol_visibility: 'hidden', |
| c_args: ['-DMYLIB_COMPILATION'], |
| c_static_args: static_arg |
| ) |
| ``` |
| |
| `-D<NAMESPACE>_STATIC_COMPILATION` C-flag must be defined when compiling |
| applications that use the library API. It typically should be defined in |
| `declare_dependency(..., compile_args: [])` and |
| `pkgconfig.generate(..., extra_cflags: [])`. |
| |
| Note that when building both shared and static libraries on Windows, |
| applications cannot currently rely on `pkg-config` to define this macro. |
| See https://github.com/mesonbuild/meson/pull/14829. |