parent
678daad6cc
commit
d3dcef7efc
4 changed files with 112 additions and 0 deletions
@ -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. |
@ -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. |
Loading…
Reference in new issue