Best (GTK+) programming practices
Contents
Code style
http://developer.gnome.org/doc/guides/programming-guidelines/code-style.html
http://git.clutter-project.org/cgit.cgi?url=clutter/tree/doc/CODING_STYLE
Vim
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; coding: utf-8 -*-
Emacs
GTK+
Autotools
Good example: http://git.gnome.org/cgit/gnome-power-manager/tree/configure.ac
- Use AM_SILENT_RULES
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
Compilation warnings
See this blog post: http://blogs.gnome.org/otte/2008/12/22/warning-options/
Use gnome-common compilation warnings:
GNOME_COMPILE_WARNINGS(maximum)
GNOME_COMPILE_WARNINGS(maximum) if test "$GCC" = "yes"; then WARNINGFLAGS="$WARNINGFLAGS -Wall" WARNINGFLAGS="$WARNINGFLAGS -Wextra" #Company # WARNINGFLAGS="$WARNINGFLAGS -Waggregate-return" WARNINGFLAGS="$WARNINGFLAGS -Wcast-align" WARNINGFLAGS="$WARNINGFLAGS -Wcast-align -Wno-uninitialized" WARNINGFLAGS="$WARNINGFLAGS -Wclobbered" WARNINGFLAGS="$WARNINGFLAGS -Wdeclaration-after-statement" WARNINGFLAGS="$WARNINGFLAGS -Wempty-body" WARNINGFLAGS="$WARNINGFLAGS -Werror" WARNINGFLAGS="$WARNINGFLAGS -Wformat-nonliteral" WARNINGFLAGS="$WARNINGFLAGS -Wformat-security" WARNINGFLAGS="$WARNINGFLAGS -Wignored-qualifiers" WARNINGFLAGS="$WARNINGFLAGS -Winit-self" WARNINGFLAGS="$WARNINGFLAGS -Winline" WARNINGFLAGS="$WARNINGFLAGS -Winvalid-pch" #Company WARNINGFLAGS="$WARNINGFLAGS -Wlogical-op" #Company WARNINGFLAGS="$WARNINGFLAGS -Wmissing-declarations" WARNINGFLAGS="$WARNINGFLAGS -Wmissing-format-attribute" WARNINGFLAGS="$WARNINGFLAGS -Wmissing-include-dirs" # WARNINGFLAGS="$WARNINGFLAGS -Wmissing-noreturn" WARNINGFLAGS="$WARNINGFLAGS -Wmissing-parameter-type" WARNINGFLAGS="$WARNINGFLAGS -Wmissing-prototypes" #Company WARNINGFLAGS="$WARNINGFLAGS -Wno-missing-field-initializers" #Company WARNINGFLAGS="$WARNINGFLAGS -Wno-strict-aliasing" WARNINGFLAGS="$WARNINGFLAGS -Wnested-externs" #Company WARNINGFLAGS="$WARNINGFLAGS -Wno-unused-parameter" #Company WARNINGFLAGS="$WARNINGFLAGS -Wold-style-definition" #Company WARNINGFLAGS="$WARNINGFLAGS -Woverride-init" WARNINGFLAGS="$WARNINGFLAGS -Wpacked" #Company WARNINGFLAGS="$WARNINGFLAGS -Wpointer-arith" WARNINGFLAGS="$WARNINGFLAGS -Wredundant-decls" WARNINGFLAGS="$WARNINGFLAGS -Wreturn-type" WARNINGFLAGS="$WARNINGFLAGS -Wshadow" # WARNINGFLAGS="$WARNINGFLAGS -Wsign-compare" WARNINGFLAGS="$WARNINGFLAGS -Wswitch-default" #Company # WARNINGFLAGS="$WARNINGFLAGS -Wswitch-enum" WARNINGFLAGS="$WARNINGFLAGS -Wsync-nand" #Company WARNINGFLAGS="$WARNINGFLAGS -Wtype-limits" WARNINGFLAGS="$WARNINGFLAGS -Wundef" #Company # WARNINGFLAGS="$WARNINGFLAGS -Wuninitialized" WARNINGFLAGS="$WARNINGFLAGS -Wunsafe-loop-optimizations" #Company WARNINGFLAGS="$WARNINGFLAGS -Wwrite-strings" else WARNINGFLAGS="" WARNINGFLAGS="" fi AC_SUBST(WARNINGFLAGS) AC_SUBST(WARNINGFLAGS)
Also, Company gcc warnings from http://cgit.freedesktop.org/swfdec/swfdec/tree/configure.ac#n32 and AS_COMPILER_FLAGS macro from http://cgit.freedesktop.org/swfdec/swfdec/tree/m4/as-compiler-flag.m4
GTK+ 3 compilant
Use GNOME_MAINTAINER_MODE_DEFINES macro:
GNOME_COMMON_INIT GNOME_MAINTAINER_MODE_DEFINES
Manual method
- Single includes
CPPFLAGS="${CPPFLAGS} -DG_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_SINGLE_INCLUDES"
- Not using deprecated symbols by default:
danielk's macro: http://git.gnome.org/cgit/mm-common/tree/macros/mm-warnings.m4#n35
CPPFLAGS="${CPPFLAGS} -DG_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED"
- Use accesor functions instead direct access by default:
CPPFLAGS="${CPPFLAGS} -DGSEAL_ENABLE"