Bug 1305145 - Move --enable-system-pixman and --enable-system-cairo to Python configure. draft
authorChris Manchester <cmanchester@mozilla.com>
Thu, 06 Oct 2016 12:04:28 -0700
changeset 421746 bb11a8b6865c656fa73af7da71f322ca74cfd89b
parent 421744 6886a25e82c2c66ab15c36ed69d2558ed5342a1e
child 533153 f43f9a900787a277941da05241b99bdcd2e64907
push id31580
push userbmo:cmanchester@mozilla.com
push dateThu, 06 Oct 2016 19:04:54 +0000
bugs1305145
milestone52.0a1
Bug 1305145 - Move --enable-system-pixman and --enable-system-cairo to Python configure. MozReview-Commit-ID: wETmNhaStR
build/moz.configure/old.configure
old-configure.in
toolkit/moz.configure
--- a/build/moz.configure/old.configure
+++ b/build/moz.configure/old.configure
@@ -222,19 +222,17 @@ def old_configure_options(*options):
     '--enable-signmar',
     '--enable-simulator',
     '--enable-small-chunk-size',
     '--enable-startup-notification',
     '--enable-startupcache',
     '--enable-stdcxx-compat',
     '--enable-strip',
     '--enable-synth-pico',
-    '--enable-system-cairo',
     '--enable-system-extension-dirs',
-    '--enable-system-pixman',
     '--enable-system-sqlite',
     '--enable-tasktracer',
     '--enable-thread-sanitizer',
     '--enable-trace-logging',
     '--enable-ui-locale',
     '--enable-universalchardet',
     '--enable-updater',
     '--enable-url-classifier',
--- a/old-configure.in
+++ b/old-configure.in
@@ -53,17 +53,16 @@ NSS_VERSION=3
 
 dnl Set the minimum version of toolkit libs used by mozilla
 dnl ========================================================
 GLIB_VERSION=2.22
 # 2_26 is the earliest version we can set GLIB_VERSION_MIN_REQUIRED.
 # The macro won't be used when compiling with earlier versions anyway.
 GLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26
 GIO_VERSION=2.22
-CAIRO_VERSION=1.10
 GTK2_VERSION=2.18.0
 GTK3_VERSION=3.4.0
 GDK_VERSION_MAX_ALLOWED=GDK_VERSION_3_4
 WINDRES_VERSION=2.14.90
 W32API_VERSION=3.14
 GNOMEUI_VERSION=2.2.0
 GCONF_VERSION=1.2.1
 STARTUP_NOTIFICATION_VERSION=0.8
@@ -3844,23 +3843,16 @@ for extension in $MOZ_EXTENSIONS; do
         AC_MSG_ERROR([Unrecognized extension provided to --enable-extensions: ${extension}.])
     fi
 done
 
 if test -n "$MOZ_USE_NATIVE_POPUP_WINDOWS"; then
   AC_DEFINE(MOZ_USE_NATIVE_POPUP_WINDOWS)
 fi
 
-if test -n "$MOZ_TREE_FREETYPE"; then
-   MOZ_ENABLE_CAIRO_FT=1
-   FT_FONT_FEATURE="#define CAIRO_HAS_FT_FONT 1"
-   CAIRO_FT_CFLAGS="-I$_topsrcdir/modules/freetype2/include"
-   AC_SUBST_LIST(CAIRO_FT_CFLAGS)
-fi
-
 AC_CHECK_PROGS(WGET, wget, "")
 AC_SUBST(WGET)
 
 dnl ========================================================
 dnl Maintenance Service
 dnl ========================================================
 
 MOZ_ARG_ENABLE_BOOL(maintenance-service,
@@ -5152,156 +5144,65 @@ if test "$USE_FC_FREETYPE"; then
         _SAVE_CPPFLAGS="$CPPFLAGS"
         CPPFLAGS="$CPPFLAGS $FT2_CFLAGS $XCFLAGS"
         MOZ_CHECK_HEADERS([fontconfig/fcfreetype.h], ,
             [AC_MSG_ERROR(Can't find header fontconfig/fcfreetype.h.)], [#include <fontconfig/fontconfig.h>])
         CPPFLAGS="$_SAVE_CPPFLAGS"
     fi
 fi
 
-dnl ========================================================
-dnl Check for pixman and cairo
-dnl ========================================================
-
-MOZ_TREE_CAIRO=1
-MOZ_ARG_ENABLE_BOOL(system-cairo,
-[  --enable-system-cairo   Use system cairo (located with pkgconfig)],
-MOZ_TREE_CAIRO=,
-MOZ_TREE_CAIRO=1 )
-
-MOZ_TREE_PIXMAN=1
-MOZ_ARG_ENABLE_BOOL(system-pixman,
-[ --enable-system-pixman Use system pixman (located with pkgconfig)],
-MOZ_TREE_PIXMAN=,
-MOZ_TREE_PIXMAN=force,
-MOZ_TREE_PIXMAN=1 )
-
-# System cairo depends on system pixman
-if test "$MOZ_TREE_PIXMAN" = "force"; then
-    if test -z "$MOZ_TREE_CAIRO"; then
-        AC_MSG_ERROR([--disable-system-pixman is incompatible with --enable-system-cairo.])
-    else
-        MOZ_TREE_PIXMAN=1
-    fi
-elif test -z "$MOZ_TREE_CAIRO"; then
-    MOZ_TREE_PIXMAN=
-fi
-
-if test "$MOZ_TREE_PIXMAN"; then
-    AC_DEFINE(MOZ_TREE_PIXMAN)
-else
-    PKG_CHECK_MODULES(MOZ_PIXMAN, pixman-1 >= 0.19.2)
-fi
-
 if test "$MOZ_TREE_CAIRO"; then
-    MOZ_CAIRO_CFLAGS="-I${DIST}/include/cairo"
-    AC_DEFINE(MOZ_TREE_CAIRO)
-
-    if test "$OS_ARCH" = "WINNT"; then
-        # For now we assume that we will have a uint64_t available through
-        # one of the above headers or mozstdint.h.
-        AC_DEFINE(HAVE_UINT64_T)
-    fi
-
-    # Define macros for cairo-features.h
-    TEE_SURFACE_FEATURE="#define CAIRO_HAS_TEE_SURFACE 1"
     if test "$MOZ_X11"; then
         XLIB_SURFACE_FEATURE="#define CAIRO_HAS_XLIB_SURFACE 1"
         XLIB_XRENDER_SURFACE_FEATURE="#define CAIRO_HAS_XLIB_XRENDER_SURFACE 1"
         PS_SURFACE_FEATURE="#define CAIRO_HAS_PS_SURFACE 1"
     fi
-    if test "$_HAVE_FREETYPE2"; then
-        FT_FONT_FEATURE="#define CAIRO_HAS_FT_FONT 1"
-        MOZ_ENABLE_CAIRO_FT=1
-        CAIRO_FT_CFLAGS="$FT2_CFLAGS"
-    fi
 
     case "$MOZ_WIDGET_TOOLKIT" in
-      cocoa | uikit)
-        QUARTZ_SURFACE_FEATURE="#define CAIRO_HAS_QUARTZ_SURFACE 1"
-        QUARTZ_IMAGE_SURFACE_FEATURE="#define CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1"
-        QUARTZ_FONT_FEATURE="#define CAIRO_HAS_QUARTZ_FONT 1"
-        ;;
       windows)
-        WIN32_D2D_SURFACE_FEATURE="#define CAIRO_HAS_D2D_SURFACE 1"
-        WIN32_DWRITE_FONT_FEATURE="#define CAIRO_HAS_DWRITE_FONT 1"
-        WIN32_FONT_FEATURE="#define CAIRO_HAS_WIN32_FONT 1"
-        WIN32_SURFACE_FEATURE="#define CAIRO_HAS_WIN32_SURFACE 1"
-        MOZ_ENABLE_D2D_SURFACE=1
-        MOZ_ENABLE_DWRITE_FONT=1
-
         if test "$COMPILE_ENVIRONMENT"; then
 
           MOZ_CHECK_HEADER(d3d9.h, MOZ_ENABLE_D3D9_LAYER=1)
 
-          dnl D3D10 Layers depend on D2D Surfaces.
-          if test -n "$WIN32_D2D_SURFACE_FEATURE"; then
-            MOZ_CHECK_HEADER(d3d10.h, MOZ_ENABLE_D3D10_LAYER=1)
-          fi
+          dnl D3D10 Layers depend on D2D Surfaces, which
+          dnl is present on windows.
+          MOZ_CHECK_HEADER(d3d10.h, MOZ_ENABLE_D3D10_LAYER=1)
         fi
         ;;
     esac
-    if test "$USE_FC_FREETYPE"; then
-        FC_FONT_FEATURE="#define CAIRO_HAS_FC_FONT 1"
-    fi
-    AC_SUBST(MOZ_ENABLE_CAIRO_FT)
-    AC_SUBST(MOZ_ENABLE_DWRITE_FONT)
-    AC_SUBST(MOZ_ENABLE_D2D_SURFACE)
     AC_SUBST(MOZ_ENABLE_D3D9_LAYER)
     AC_SUBST(MOZ_ENABLE_D3D10_LAYER)
 
     AC_SUBST(PS_SURFACE_FEATURE)
-    AC_SUBST(SVG_SURFACE_FEATURE)
     AC_SUBST(XLIB_SURFACE_FEATURE)
     AC_SUBST(XLIB_XRENDER_SURFACE_FEATURE)
-    AC_SUBST(QUARTZ_SURFACE_FEATURE)
-    AC_SUBST(QUARTZ_IMAGE_SURFACE_FEATURE)
-    AC_SUBST(WIN32_SURFACE_FEATURE)
-    AC_SUBST(OS2_SURFACE_FEATURE)
-    AC_SUBST(DIRECTFB_SURFACE_FEATURE)
-    AC_SUBST(FT_FONT_FEATURE)
-    AC_SUBST(FC_FONT_FEATURE)
-    AC_SUBST(WIN32_FONT_FEATURE)
-    AC_SUBST(WIN32_DWRITE_FONT_FEATURE)
-    AC_SUBST(WIN32_D2D_SURFACE_FEATURE)
-    AC_SUBST(QUARTZ_FONT_FEATURE)
-    AC_SUBST(PNG_FUNCTIONS_FEATURE)
-    AC_SUBST(QT_SURFACE_FEATURE)
-    AC_SUBST(TEE_SURFACE_FEATURE)
 
     if test "$MOZ_X11"; then
         MOZ_CAIRO_OSLIBS="$MOZ_CAIRO_OSLIBS $XLDFLAGS -lXrender"
     fi
 
-    CAIRO_FEATURES_H=gfx/cairo/cairo/src/cairo-features.h
 else
-    PKG_CHECK_MODULES(CAIRO, cairo >= $CAIRO_VERSION)
-    MOZ_CAIRO_CFLAGS="$CAIRO_CFLAGS"
-    MOZ_CAIRO_LIBS="$CAIRO_LIBS"
-    PKG_CHECK_MODULES(CAIRO_TEE, cairo-tee >= $CAIRO_VERSION)
     if test "$MOZ_X11"; then
-        PKG_CHECK_MODULES(CAIRO_XRENDER, cairo-xlib-xrender >= $CAIRO_VERSION)
+        PKG_CHECK_MODULES(CAIRO_XRENDER, cairo-xlib-xrender >= 1.10)
         MOZ_CAIRO_LIBS="$MOZ_CAIRO_LIBS $XLDFLAGS $CAIRO_XRENDER_LIBS"
         MOZ_CAIRO_OSLIBS="$MOZ_CAIRO_LIBS"
         MOZ_CAIRO_CFLAGS="$MOZ_CAIRO_CFLAGS $CAIRO_XRENDER_CFLAGS"
     fi
 fi
 
 case "$MOZ_WIDGET_TOOLKIT" in
 android|gonk)
     TK_CFLAGS="$MOZ_CAIRO_CFLAGS $MOZ_PIXMAN_CFLAGS"
     TK_LIBS="$MOZ_CAIRO_LIBS $MOZ_PIXMAN_LIBS"
     ;;
 esac
 
-AC_SUBST(MOZ_TREE_CAIRO)
 AC_SUBST_LIST(MOZ_CAIRO_CFLAGS)
 AC_SUBST_LIST(MOZ_CAIRO_LIBS)
 AC_SUBST_LIST(MOZ_CAIRO_OSLIBS)
-AC_SUBST(MOZ_TREE_PIXMAN)
 
 dnl ========================================================
 dnl disable xul
 dnl ========================================================
 MOZ_ARG_DISABLE_BOOL(xul,
 [  --disable-xul           Disable XUL],
     MOZ_XUL= )
 if test "$MOZ_XUL"; then
--- a/toolkit/moz.configure
+++ b/toolkit/moz.configure
@@ -821,16 +821,150 @@ def skia_includes(skia, skia_gpu):
             '/gfx/skia/skia/include/gpu',
             '/gfx/skia/skia/include/utils',
         ]
 
     return includes
 
 set_config('SKIA_INCLUDES', skia_includes)
 
+# Check for pixman and cairo
+# ========================================================
+option('--enable-system-cairo', help='Use system cairo (located with pkgconfig)')
+
+# System cairo depends on system pixman
+imply_option('--enable-system-pixman',
+             depends('--enable-system-cairo')(lambda v: v or None))
+
+option('--enable-system-pixman', help='Use system pixman (located with pkgconfig)')
+
+system_pixman = depends_if('--enable-system-pixman')(lambda _: True)
+
+pixman_info = pkg_check_modules('MOZ_PIXMAN', 'pixman-1 >= 0.19.2',
+                                when=system_pixman)
+
+add_old_configure_assignment('MOZ_PIXMAN_CFLAGS',
+                             delayed_getattr(pixman_info, 'cflags'))
+add_old_configure_assignment('MOZ_PIXMAN_LIBS',
+                             delayed_getattr(pixman_info, 'libs'))
+
+tree_pixman = depends(system_pixman)(lambda v: not bool(v) or None)
+set_define('MOZ_TREE_PIXMAN', tree_pixman)
+set_config('MOZ_TREE_PIXMAN', tree_pixman)
+
+system_cairo = depends_if('--enable-system-cairo')(lambda _: True)
+tree_cairo = depends(system_cairo)(lambda v: not bool(v) or None)
+set_define('MOZ_TREE_CAIRO', tree_cairo)
+set_config('MOZ_TREE_CAIRO', tree_cairo)
+add_old_configure_assignment('MOZ_TREE_CAIRO', tree_cairo)
+
+cairo_info = pkg_check_modules('CAIRO', 'cairo >= 1.10', when=system_cairo)
+pkg_check_modules('CAIRO_TEE', 'cairo-tee >= 1.10', when=system_cairo)
+
+@depends(check_build_environment, cairo_info)
+def cairo_cflags(build_env, cairo_info):
+    if cairo_info:
+        return cairo_info.cflags
+    return ('-I%s/include/cairo' % build_env.dist,)
+
+add_old_configure_assignment('MOZ_CAIRO_CFLAGS', cairo_cflags)
+add_old_configure_assignment('MOZ_CAIRO_LIBS',
+                             delayed_getattr(cairo_info, 'libs'))
+
+@depends(tree_cairo, freetype2_info, tree_freetype, ft2_info)
+def cairo_ft_cflags(tree_cairo, freetype2, tree_freetype, ft2_info):
+    if tree_cairo and freetype2 or tree_freetype:
+        return ft2_info.cflags
+
+set_config('MOZ_ENABLE_CAIRO_FT', depends_if(cairo_ft_cflags)(lambda _: True))
+set_config('CAIRO_FT_CFLAGS', cairo_ft_cflags)
+
+@depends(tree_cairo, toolkit)
+def tree_cairo_and_windows(tree_cairo, toolkit):
+    if tree_cairo and toolkit == 'windows':
+        return True
+
+set_config('MOZ_ENABLE_DWRITE_FONT', tree_cairo_and_windows)
+set_config('MOZ_ENABLE_D3D_SURFACE', tree_cairo_and_windows)
+
+@depends_when(target, when=tree_cairo)
+def have_uint64_t(target):
+    # For now we assume that we will have a uint64_t available through
+    # one of the above headers or mozstdint.h.
+    if target.os == 'WINNT':
+        return True
+
+set_define('HAVE_UINT64_T', have_uint64_t)
+
+@template
+def set_cairo_feature_defines(detected_features):
+    cairo_features = set([
+        'D2D_SURFACE',
+        'DIRECTFB_SURFACE',
+        'DWRITE_FONT',
+        'FC_FONT',
+        'FT_FONT',
+        'OS2_SURFACE',
+        'PNG_FUNCTIONS',
+        'QT_SURFACE',
+        'QUARTZ_FONT',
+        'QUARTZ_IMAGE_SURFACE',
+        'QUARTZ_SURFACE',
+        'SVG_SURFACE',
+        'TEE_SURFACE',
+        'WIN32_FONT',
+        'WIN32_SURFACE',
+    ])
+    # These features don't follow the pattern, and have config
+    # names that diverge from their defines.
+    feature_prefixes = {
+        'DWRITE_FONT': 'WIN32',
+        'D2D_SURFACE': 'WIN32',
+    }
+
+    @depends_if(detected_features)
+    def feature_values(detected_features):
+        difference = set(detected_features) - cairo_features
+        if difference:
+            die("Attempted to define the following unknown cairo_features: %s. "
+                "Please add them to cairo_features.", difference)
+        return namespace(**{name: '#define CAIRO_HAS_%s 1' % name if name in detected_features else ''
+                            for name in cairo_features})
+
+    for name in cairo_features:
+        config_var = '%s_FEATURE' % name
+        if name in feature_prefixes:
+            config_var = '%s_%s_FEATURE' % (feature_prefixes[name], name)
+        set_config(config_var, delayed_getattr(feature_values, name))
+
+@depends_when(target, toolkit, fc_freetype, freetype2_info, tree_freetype,
+              when=tree_cairo)
+def cairo_features(target, toolkit, fc_freetype, freetype2, tree_freetype):
+    features = []
+    # Define macros for cairo-features.h
+    features.append('TEE_SURFACE')
+
+    if freetype2 or tree_freetype:
+        features.append('FT_FONT')
+    if fc_freetype:
+        features.append('FC_FONT')
+
+    if toolkit in ('cocoa', 'uikit'):
+        features.append('QUARTZ_SURFACE')
+        features.append('QUARTZ_IMAGE_SURFACE')
+        features.append('QUARTZ_FONT')
+    elif toolkit == 'windows':
+        features.append('D2D_SURFACE')
+        features.append('DWRITE_FONT')
+        features.append('WIN32_FONT')
+        features.append('WIN32_SURFACE')
+    return tuple(features)
+
+set_cairo_feature_defines(cairo_features)
+
 # Support various fuzzing options
 # ==============================================================
 option('--enable-libfuzzer', help='Enable libfuzzer support')
 
 @depends('--enable-libfuzzer')
 def enable_libfuzzer(value):
     if value:
         return True