--- 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 `_API`. - `compilation`: Name of a macro defined only when compiling the library. Defaults to `_COMPILATION`. - `static_compilation`: Name of a macro defined only when compiling or using static library. Defaults to `_STATIC_COMPILATION`. - `static_only`: If set to true, `_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_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_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_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.