[gtk/mcatanzaro/build-best-practices: 139/139] build: fix check for debug vs. release builds




commit 16eff6ad98d6039b127196a4cb5aca585816b69d
Author: Michael Catanzaro <mcatanzaro redhat com>
Date:   Thu Aug 4 11:09:16 2022 -0500

    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.

 docs/reference/gtk/building.md | 37 ++++++++++++-------------------------
 meson.build                    | 15 ++++++---------
 2 files changed, 18 insertions(+), 34 deletions(-)
---
diff --git a/docs/reference/gtk/building.md b/docs/reference/gtk/building.md
index 31073d1d04..9ec47f39aa 100644
--- a/docs/reference/gtk/building.md
+++ b/docs/reference/gtk/building.md
@@ -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 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.
+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.
+
+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
diff --git a/meson.build b/meson.build
index 6ececaba95..6f4a7f7c53 100644
--- a/meson.build
+++ b/meson.build
@@ -58,16 +58,13 @@ 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']
+optimized_build = get_option('optimization') not in [ '0', 'g' ]
+if get_option('debug') and not optimized_build
+  gtk_debug_cflags += ['-DG_ENABLE_DEBUG', '-DG_ENABLE_CONSISTENCY_CHECKS']
+elif optimized_build
   gtk_debug_cflags += ['-DG_DISABLE_CAST_CHECKS', '-DG_DISABLE_ASSERT']
 endif
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]