aboutsummaryrefslogtreecommitdiff
path: root/docs/markdown/Release-notes-for-0.51.0.md
blob: 8a73cbcb16d06bdcc30e2319071de7f8919afed9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
---
title: Release 0.51.0
short-description: Release notes for 0.51.0
...

# New features

## (C) Preprocessor flag handling

Meson previously stored `CPPFLAGS` and per-language compilation flags
separately. (That latter would come from `CFLAGS`, `CXXFLAGS`, etc., along with
`<lang>_args` options whether specified no the command-line interface (`-D..`),
`meson.build` (`default_options`), or cross file (`[properties]`).) This was
mostly unobservable, except for certain preprocessor-only checks like
`check_header` would only use the preprocessor flags, leading to confusion if
some `-isystem` was in `CFLAGS` but not `CPPFLAGS`. Now, they are lumped
together, and `CPPFLAGS`, for the languages which are deemed to care to about,
is just another source of compilation flags along with the others already
listed.

## Sanity checking compilers with user flags

Sanity checks previously only used user-specified flags for cross compilers, but
now do in all cases.

All compilers meson might decide to use for the build are "sanity checked"
before other tests are run. This usually involves building simple executable and
trying to run it. Previously user flags (compilation and/or linking flags) were
used for sanity checking cross compilers, but not native compilers.  This is
because such flags might be essential for a cross binary to succeed, but usually
aren't for a native compiler.

In recent releases, there has been an effort to minimize the special-casing of
cross or native builds so as to make building more predictable in less-tested
cases. Since this the user flags are necessary for cross, but not harmful for
native, it makes more sense to use them in all sanity checks than use them in no
sanity checks, so this is what we now do.

## New `sourceset` module

A new module, `sourceset`, was added to help building many binaries
from the same source files.  Source sets associate source files and
dependencies to keys in a `configuration_data` object or a dictionary;
they then take multiple `configuration_data` objects or dictionaries,
and compute the set of source files and dependencies for each of those
configurations.

## n_debug=if-release and buildtype=plain means no asserts

Previously if this combination was used then assertions were enabled,
which is fairly surprising behavior.

## `target_type` in `build_targets` accepts the value 'shared_module'

The `target_type` keyword argument in `build_target()` now accepts the
value `'shared_module'`.

The statement

```meson
build_target(..., target_type: 'shared_module')
```

is equivalent to this:

```meson
shared_module(...)
```

## New modules kwarg for python.find_installation

This mirrors the modules argument that some kinds of dependencies (such as
qt, llvm, and cmake based dependencies) take, allowing you to check that a
particular module is available when getting a python version.

```meson
py = import('python').find_installation('python3', modules : ['numpy'])
```

## Support for the Intel Compiler on Windows (ICL)

Support has been added for ICL.EXE and ifort on windows. The support should be
on part with ICC support on Linux/MacOS. The ICL C/C++ compiler behaves like
Microsoft's CL.EXE rather than GCC/Clang like ICC does, and has a different id,
`intel-cl` to differentiate it.

```meson
cc = meson.get_compiler('c')
if cc.get_id == 'intel-cl'
  add_project_argument('/Qfoobar:yes', language : 'c')
endif
```

## Added basic support for the Xtensa CPU toolchain

You can now use `xt-xcc`, `xt-xc++`, `xt-nm`, etc... on your cross compilation
file and meson won't complain about an unknown toolchain.


## Dependency objects now have a get_variable method

This is a generic replacement for type specific variable getters such as
`ConfigToolDependency.get_configtool_variable` and
`PkgConfigDependency.get_pkgconfig_variable`, and is the only way to query
such variables from cmake dependencies.

This method allows you to get variables without knowing the kind of
dependency you have.

```meson
dep = dependency('could_be_cmake_or_pkgconfig')
# cmake returns 'YES', pkg-config returns 'ON'
if ['YES', 'ON'].contains(dep.get_variable(pkgconfig : 'var-name', cmake : 'COP_VAR_NAME', default_value : 'NO'))
  error('Cannot build your project when dep is built with var-name support')
endif
```

## CMake prefix path overrides

When using pkg-config as a dependency resolver we can pass
`-Dpkg_config_path=$somepath` to extend or overwrite where pkg-config will
search for dependencies. Now cmake can do the same, as long as the dependency
uses a ${Name}Config.cmake file (not a Find{$Name}.cmake file), by passing
`-Dcmake_prefix_path=list,of,paths`. It is important that point this at the
prefix that the dependency is installed into, not the cmake path.

If you have installed something to `/tmp/dep`, which has a layout like:
```
/tmp/dep/lib/cmake
/tmp/dep/bin
```

then invoke meson as `meson builddir/ -Dcmake_prefix_path=/tmp/dep`

## Tests that should fail but did not are now errors

You can tag a test as needing to fail like this:

```meson
test('shoulfail', exe, should_fail: true)
```

If the test passes the problem is reported in the error logs but due
to a bug it was not reported in the test runner's exit code. Starting
from this release the unexpected passes are properly reported in the
test runner's exit code. This means that test runs that were passing
in earlier versions of Meson will report failures with the current
version. This is a good thing, though, since it reveals an error in
your test suite that has, until now, gone unnoticed.

## New target keyword argument: `link_language`

There may be situations for which the user wishes to manually specify
the linking language.  For example, a C++ target may link C, Fortran,
etc. and perhaps the automatic detection in Meson does not pick the
desired compiler.  The user can manually choose the linker by language
per-target like this example of a target where one wishes to link with
the Fortran compiler:

```meson
executable(..., link_language : 'fortran')
```

A specific case this option fixes is where for example the main
program is Fortran that calls C and/or C++ code.  The automatic
language detection of Meson prioritizes C/C++, and so an compile-time
error results like `undefined reference to main`, because the linker
is C or C++ instead of Fortran, which is fixed by this per-target
override.

## New module to parse kconfig output files

The new module `unstable-kconfig` adds the ability to parse and use
kconfig output files from `meson.build`.


## Add new `meson subprojects foreach` command

`meson subprojects` has learned a new `foreach` command which accepts a command
with arguments and executes it in each subproject directory.

For example this can be useful to check the status of subprojects (e.g. with
`git status` or `git diff`) before performing other actions on them.


## Added c17 and c18 as c_std values for recent GCC and Clang Versions

For gcc version 8.0 and later, the values c17, c18, gnu17, and gnu18
were added to the accepted values for built-in compiler option c_std.

For Clang version 10.0 and later on Apple OSX (Darwin), and for
version 7.0 and later on other platforms, the values c17 and gnu17
were added as c_std values.

## gpgme dependency now supports gpgme-config

Previously, we could only detect GPGME with custom invocations of
`gpgme-config` or when the GPGME version was recent enough (>=1.13.0)
to install pkg-config files. Now we added support to Meson allowing us
to use `dependency('gpgme')` and fall back on `gpgme-config` parsing.

## Can link against custom targets

The output of `custom_target` and `custom_target[i]` can be used in
`link_with` and `link_whole` keyword arguments. This is useful for
integrating custom code generator steps, but note that there are many
limitations:

 - Meson can not know about link dependencies of the custom target. If
   the target requires further link libraries, you need to add them manually

 - The user is responsible for ensuring that the code produced by
   different toolchains are compatible.

 - `custom_target` may only be used when it has a single output file.
   Use `custom_target[i]` when dealing with multiple output files.

 - The output file must have the correct file name extension.


## Removed the deprecated `--target-files` API

The `--target-files` introspection API is now no longer available. The same
information can be queried with the `--targets` API introduced in 0.50.0.

## Generators have a new `depends` keyword argument

Generators can now specify extra dependencies with the `depends`
keyword argument. It matches the behaviour of the same argument in
other functions and specifies that the given targets must be built
before the generator can be run. This is used in cases such as this
one where you need to tell a generator to indirectly invoke a
different program.

```meson
exe = executable(...)
cg = generator(program_runner,
    output: ['@BASENAME@.c'],
    arguments: ['--use-tool=' + exe.full_path(), '@INPUT@', '@OUTPUT@'],
    depends: exe)
```

## Specifying options per mer machine

Previously, no cross builds were controllable from the command line.
Machine-specific options like the pkg-config path and compiler options only
affected native targets, that is to say all targets in native builds, and
`native: true` targets in cross builds. Now, prefix the option with `build.` to
affect build machine targets, and leave it unprefixed to affect host machine
targets.

For those trying to ensure native and cross builds to the same platform produced
the same result, the old way was frustrating because very different invocations
were needed to affect the same targets, if it was possible at all. Now, the same
command line arguments affect the same targets everywhere --- Meson is closer to
ignoring whether the "overall" build is native or cross, and just caring about
whether individual targets are for the build or host machines.


## subproject.get_variable() now accepts a `fallback` argument

Similar to `get_variable`, a fallback argument can now be passed to
`subproject.get_variable()`, it will be returned if the requested
variable name did not exist.

``` meson
var = subproject.get_variable('does-not-exist', 'fallback-value')
```

## Add keyword `static` to `find_library`

`find_library` has learned the `static` keyword. They keyword must be a boolean,
where `true` only searches for static libraries and `false` only searches for
dynamic/shared. Leaving the keyword unset will keep the old behavior of first
searching for dynamic and then falling back to static.

## Fortran `include` statements recursively parsed

While non-standard and generally not recommended, some legacy Fortran
programs use `include` directives to inject code inline.  Since v0.51,
Meson can handle Fortran `include` directives recursively.

DO NOT list `include` files as sources for a target, as in general
their syntax is not correct as a standalone target.  In general
`include` files are meant to be injected inline as if they were copy
and pasted into the source file.

`include` was never standard and was superceded by Fortran 90 `module`.

The `include` file is only recognized by Meson if it has a Fortran
file suffix, such as `.f` `.F` `.f90` `.F90` or similar.  This is to
avoid deeply nested scanning of large external legacy C libraries that
only interface to Fortran by `include biglib.h` or similar.

## CMake subprojects

Meson can now directly consume CMake based subprojects with the
CMake module.

Using CMake subprojects is similar to using the "normal" meson
subprojects. They also have to be located in the `subprojects`
directory.

Example:

```cmake
add_library(cm_lib SHARED ${SOURCES})
```

```meson
cmake = import('cmake')

# Configure the CMake project
sub_proj = cmake.subproject('libsimple_cmake')

# Fetch the dependency object
cm_lib = sub_proj.dependency('cm_lib')

executable(exe1, ['sources'], dependencies: [cm_lib])
```

It should be noted that not all projects are guaranteed to work. The
safest approach would still be to create a `meson.build` for the
subprojects in question.

## Multiple cross files can be specified

`--cross-file` can be passed multiple times, with the configuration files overlaying the same way as `--native-file`.