Added documentation for disabler objects.
This commit is contained in:
parent
678daad6cc
commit
d3dcef7efc
|
@ -0,0 +1,65 @@
|
||||||
|
---
|
||||||
|
short-description: Disabling options
|
||||||
|
...
|
||||||
|
|
||||||
|
# Disabling parts of the build (available since 0.44.0)
|
||||||
|
|
||||||
|
The following is a common fragment found in many projects:
|
||||||
|
|
||||||
|
```meson
|
||||||
|
dep = dependency('foo')
|
||||||
|
|
||||||
|
# In some different directory
|
||||||
|
|
||||||
|
lib = shared_library('mylib', 'mylib.c',
|
||||||
|
dependencies : dep)
|
||||||
|
|
||||||
|
# And ín a third directory
|
||||||
|
|
||||||
|
exe = executable('mytest', 'mytest.c',
|
||||||
|
link_with : lib)
|
||||||
|
test('mytest', exe)
|
||||||
|
```
|
||||||
|
|
||||||
|
This works fine but gets a bit inflexible when you want to make this
|
||||||
|
part of the build optional. Basically it reduces to adding `if/else`
|
||||||
|
statements around all target invocations. Meson provides a simpler way
|
||||||
|
of achieving the same with a disabler object.
|
||||||
|
|
||||||
|
A disabler object is created with the `disabler` function:
|
||||||
|
|
||||||
|
```meson
|
||||||
|
d = disabler()
|
||||||
|
```
|
||||||
|
|
||||||
|
The only thing you can do to a disabler object is to ask if it has
|
||||||
|
been found:
|
||||||
|
|
||||||
|
```meson
|
||||||
|
f = d.found() # returns false
|
||||||
|
```
|
||||||
|
|
||||||
|
Any other statement that uses a disabler object will immediately
|
||||||
|
return a disabler. For example assuming that `d` contains a disabler
|
||||||
|
object then
|
||||||
|
|
||||||
|
```meson
|
||||||
|
d2 = some_func(d) # value of d2 will be disabler
|
||||||
|
d3 = true or d2 # value of d3 will be disabler
|
||||||
|
if d # neither branch is evaluated
|
||||||
|
```
|
||||||
|
|
||||||
|
Thus to disable every target that depends on the dependency given
|
||||||
|
above, you can do something like this:
|
||||||
|
|
||||||
|
```meson
|
||||||
|
if use_foo_feature
|
||||||
|
d = dependency('foo')
|
||||||
|
else
|
||||||
|
d = disabler()
|
||||||
|
endif
|
||||||
|
```
|
||||||
|
|
||||||
|
This concentrates the handling of this option in one place and other
|
||||||
|
build definition files do not need to be sprinkled with `if`
|
||||||
|
statements.
|
|
@ -319,6 +319,10 @@ otherwise. This function supports the following keyword arguments:
|
||||||
The returned object also has methods that are documented in the
|
The returned object also has methods that are documented in the
|
||||||
[object methods section](#dependency-object) below.
|
[object methods section](#dependency-object) below.
|
||||||
|
|
||||||
|
### disabler()
|
||||||
|
|
||||||
|
Returns a [disabler object]((#disabler-object)). Added in 0.44.0.
|
||||||
|
|
||||||
### error()
|
### error()
|
||||||
|
|
||||||
``` meson
|
``` meson
|
||||||
|
@ -1627,6 +1631,15 @@ an external dependency with the following methods:
|
||||||
|
|
||||||
- `version()` is the version number as a string, for example `1.2.8`
|
- `version()` is the version number as a string, for example `1.2.8`
|
||||||
|
|
||||||
|
### `disabler` object
|
||||||
|
|
||||||
|
A disabler object is an object that behaves in much the same way as
|
||||||
|
NaN numbers do in floating point math. That is when used in any
|
||||||
|
statement (function call, logical op, etc) they will cause the
|
||||||
|
statement evaluation to immediately short circuit to return a disabler
|
||||||
|
object. A disabler object has one method:
|
||||||
|
|
||||||
|
- `found()`, always returns `false`
|
||||||
|
|
||||||
### `external program` object
|
### `external program` object
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Added disabler object
|
||||||
|
|
||||||
|
A disabler object is a new kind of object that has very specific
|
||||||
|
semantics. If it is used as part of any other operation such as an
|
||||||
|
argument to a function call, logical operations etc, it will cause the
|
||||||
|
operation to not be evaluated. Instead the return value of said
|
||||||
|
operation will also be the disabler object.
|
||||||
|
|
||||||
|
For example if you have an setup like this:
|
||||||
|
|
||||||
|
```meson
|
||||||
|
dep = dependency('foo')
|
||||||
|
lib = shared_library('mylib', 'mylib.c',
|
||||||
|
dependencies : dep)
|
||||||
|
exe = executable('mytest', 'mytest.c',
|
||||||
|
link_with : lib)
|
||||||
|
test('mytest', exe)
|
||||||
|
```
|
||||||
|
|
||||||
|
If you replace the dependency with a disabler object like this:
|
||||||
|
|
||||||
|
```meson
|
||||||
|
dep = disabler()
|
||||||
|
lib = shared_library('mylib', 'mylib.c',
|
||||||
|
dependencies : dep)
|
||||||
|
exe = executable('mytest', 'mytest.c',
|
||||||
|
link_with : lib)
|
||||||
|
test('mytest', exe)
|
||||||
|
```
|
||||||
|
|
||||||
|
Then the shared library, executable and unit test are not
|
||||||
|
created. This is a handy mechanism to cut down on the number of `if`
|
||||||
|
statements.
|
|
@ -26,6 +26,7 @@ index.md
|
||||||
Localisation.md
|
Localisation.md
|
||||||
Build-options.md
|
Build-options.md
|
||||||
Subprojects.md
|
Subprojects.md
|
||||||
|
Disabler.md
|
||||||
Modules.md
|
Modules.md
|
||||||
Gnome-module.md
|
Gnome-module.md
|
||||||
i18n-module.md
|
i18n-module.md
|
||||||
|
|
Loading…
Reference in New Issue