Compare commits

...

1 Commits

Author SHA1 Message Date
Michael Catanzaro
2ccdee2bc9 build: fix check for debug vs. release builds
Confusingly, Meson's debug option indicates whether debuginfo is
enabled, not whether we have a debug build. We should consider the
optimization level as well when deciding whether to enable debug extras.

I've outlined an argument for why we should make these changes here:

https://blogs.gnome.org/mcatanzaro/2022/07/15/best-practices-for-build-options/

The main take-away is this rule:

“You have a non-production (debug) build if debug is true and if
optimization is 0 or g; otherwise, you have a production build” (except
on Windows, which is not accounted for here).

This commit additionally removes guidance related to manually
controlling preprocessor definitions in plain builds, which is
controversial and violates Rule 6 from my blog post.
2022-09-13 17:10:24 -05:00
2 changed files with 16 additions and 33 deletions

View File

@@ -83,35 +83,22 @@ configuration option. GTK enables and disables functionality
depending on the build type used when calling *meson* to
configure the build.
### Debug builds
GTK will enable debugging code paths, including
consistency checks on the internal state of the toolkit,
when using the `debug` build type. Other build types will
disable debugging code paths and additional run time safeties,
like checked casts for object instances. It is recommended to
use the `debug` build type when developing GTK itself. Additionally,
`debug` builds of GTK are recommended for profiling and debugging GTK
applications, as they include additional validation of the internal state.
GTK will enable debugging code paths in both the `debug` and
`debugoptimized` build types. Builds with `buildtype` set to
`debug` will additionally enable consistency checks on the
internal state of the toolkit.
It is recommended to use the `debug` or `debugoptimized` build
types when developing GTK itself. Additionally, `debug` builds of
GTK are recommended for profiling and debugging GTK applications,
as they include additional validation of the internal state.
All other build types are production build types and will disable
debugging code paths and extra runtime safety checks, like checked casts
for object instances.
The `debugoptimized` build type is the default for GTK if no build
type is specified when calling *meson*.
### Release builds
The `release` build type will disable debugging code paths and
additional run time safeties, like checked casts for object
instances.
The `plain` build type provided by Meson should only be used when
packaging GTK, and it's expected that packagers will provide their
own compiler flags when building GTK. See the previous section for
the list of environment variables to be used to define compiler and
linker flags. Note that with the plain build type, you are also
responsible for controlling the debugging features of GTK with
`-DG_ENABLE_DEBUG` and `-DG_DISABLE_CAST_CHECKS`.
## Dependencies
Before you can compile the GTK widget toolkit, you need to have

View File

@@ -58,16 +58,12 @@ add_project_arguments('-DGTK_VERSION="@0@"'.format(meson.project_version()), lan
add_project_arguments('-D_GNU_SOURCE', language: 'c')
# Use debug/optimization flags to determine whether to enable debug or disable
# cast checks
# cast checks. We have a non-production (debug) build if debug is true and if
# optimization is 0 or g; otherwise, we have a production build.
gtk_debug_cflags = []
debug = get_option('debug')
optimization = get_option('optimization')
if debug
gtk_debug_cflags += '-DG_ENABLE_DEBUG'
if optimization in ['0', 'g']
gtk_debug_cflags += '-DG_ENABLE_CONSISTENCY_CHECKS'
endif
elif optimization in ['2', '3', 's']
if get_option('debug') and get_option('optimization') in [ '0', 'g' ]
gtk_debug_cflags += ['-DG_ENABLE_DEBUG', '-DG_ENABLE_CONSISTENCY_CHECKS']
else
gtk_debug_cflags += ['-DG_DISABLE_CAST_CHECKS', '-DG_DISABLE_ASSERT']
endif