diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cef2446537..176564f4b7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,29 +1,33 @@ -image: registry.gitlab.gnome.org/gnome/gtk/gtk-3-24:v3 - stages: - build + - docs cache: paths: - _ccache/ fedora-autotools: + image: registry.gitlab.gnome.org/gnome/gtk/fedora-gtk3:v1 stage: build script: - - bash -x ./.gitlab-ci/test-docker-autotools.sh + - bash -x ./.gitlab-ci/test-docker-autotools.sh fedora-distcheck: + image: registry.gitlab.gnome.org/gnome/gtk/fedora-gtk3:v1 variables: DO_DISTCHECK: "yes" when: manual stage: build script: - - bash -x ./.gitlab-ci/test-docker-autotools.sh + - bash -x ./.gitlab-ci/test-docker-autotools.sh -fedora-meson: &fedora-meson-defaults +fedora-meson: + image: registry.gitlab.gnome.org/gnome/gtk/fedora-gtk3:v1 stage: build + variables: + EXTRA_MESON_FLAGS: "-Ddefault_library=both" script: - - bash -x ./.gitlab-ci/test-docker-meson.sh + - bash -x ./.gitlab-ci/test-docker-meson.sh artifacts: when: always name: "gtk3-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" @@ -31,10 +35,34 @@ fedora-meson: &fedora-meson-defaults - "_build/meson-logs" - "_build/testsuite/reftests/output" -fedora-meson-staticlibs: +debian-meson: + image: registry.gitlab.gnome.org/gnome/gtk/debian-gtk3:v1 + stage: build variables: EXTRA_MESON_FLAGS: "-Ddefault_library=both" - <<: *fedora-meson-defaults + script: + - bash -x ./.gitlab-ci/test-docker-meson.sh + artifacts: + when: always + name: "gtk3-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" + paths: + - "_build/meson-logs" + - "_build/testsuite/reftests/output" + +reference: + image: registry.gitlab.gnome.org/gnome/gtk/fedora-gtk3:v1 + stage: docs + variables: + EXTRA_MESON_FLAGS: "--buildtype=release -Dgtk_doc=true -Dman=true" + script: + - bash -x ./.gitlab-ci/test-docker-meson.sh + - ninja -C _build gdk3-doc gtk3-doc + - tar -c -J -f gdk3-docs.tar.xz _build/docs/reference/gdk + - tar -c -J -f gtk3-docs.tar.xz _build/docs/reference/gtk + artifacts: + paths: + - gdk3-docs.tar.xz + - gtk3-docs.tar.xz msys2-mingw32-meson: variables: diff --git a/.gitlab-ci/debian-gtk3.Dockerfile b/.gitlab-ci/debian-gtk3.Dockerfile new file mode 100644 index 0000000000..d8007a731a --- /dev/null +++ b/.gitlab-ci/debian-gtk3.Dockerfile @@ -0,0 +1,71 @@ +FROM debian:buster + +RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \ + adwaita-icon-theme \ + ccache \ + dconf-gsettings-backend \ + g++ \ + gcc \ + gettext \ + git \ + gobject-introspection \ + gvfs \ + hicolor-icon-theme \ + itstool \ + libatk-bridge2.0-dev \ + libatk1.0-dev \ + libc6-dev \ + libcairo2-dev \ + libcairo-gobject2 \ + libcolord-dev \ + libcups2-dev \ + libegl1-mesa-dev \ + libepoxy-dev \ + libfontconfig1-dev \ + libfreetype6-dev \ + libgdk-pixbuf2.0-dev \ + libgirepository1.0-dev \ + libglib2.0-dev \ + libharfbuzz-dev \ + libjson-glib-dev \ + libpango1.0-dev \ + librest-dev \ + librsvg2-common \ + libsoup2.4-dev \ + libwayland-dev \ + libx11-dev \ + libxcomposite-dev \ + libxcursor-dev \ + libxdamage-dev \ + libxext-dev \ + libxfixes-dev \ + libxi-dev \ + libxinerama-dev \ + libxkbcommon-dev \ + libxkbcommon-x11-dev \ + libxml2-dev \ + libxrandr-dev \ + locales \ + ninja-build \ + pkg-config \ + python3 \ + python3-pip \ + python3-setuptools \ + python3-wheel \ + shared-mime-info \ + wayland-protocols \ + xauth \ + xvfb \ + && rm -rf /usr/share/doc/* /usr/share/man/* + +# Locale for our build +RUN locale-gen C.UTF-8 && /usr/sbin/update-locale LANG=C.UTF-8 + +ARG HOST_USER_ID=5555 +ENV HOST_USER_ID ${HOST_USER_ID} +RUN useradd -u $HOST_USER_ID -ms /bin/bash user + +USER user +WORKDIR /home/user + +ENV LANG=C.UTF-8 LANGUAGE=C.UTF-8 LC_ALL=C.UTF-8 diff --git a/.gitlab-ci/Dockerfile b/.gitlab-ci/fedora-gtk3.Dockerfile similarity index 100% rename from .gitlab-ci/Dockerfile rename to .gitlab-ci/fedora-gtk3.Dockerfile diff --git a/.gitlab-ci/run-docker.sh b/.gitlab-ci/run-docker.sh index 789284130f..ef0f56154e 100755 --- a/.gitlab-ci/run-docker.sh +++ b/.gitlab-ci/run-docker.sh @@ -1,19 +1,135 @@ #!/bin/bash -# -# This script builds an image from the Dockerfile, starts a container with -# the parent directory mounted as working directory and start a bash session -# there so you can test things. -# Once you are happy you can push it to the docker hub: -# sudo docker push "${TAG}" + +read_arg() { + # $1 = arg name + # $2 = arg value + # $3 = arg parameter + local rematch='^[^=]*=(.*)$' + if [[ $2 =~ $rematch ]]; then + read "$1" <<< "${BASH_REMATCH[1]}" + else + read "$1" <<< "$3" + # There is no way to shift our callers args, so + # return 1 to indicate they should do it instead. + return 1 + fi +} set -e -TAG="registry.gitlab.gnome.org/gnome/gtk/gtk-3-24:v2" +build=0 +run=0 +push=0 +list=0 +print_help=0 +no_login=0 -# HOST_USER_ID gets used to create a user with the same ID so that files -# created in the mounted volume have the same owner -sudo docker build \ - --build-arg HOST_USER_ID="$UID" --tag "${TAG}" --file "Dockerfile" . -sudo docker run --security-opt label=disable \ - --rm --volume "$(pwd)/..:/home/user/app" --workdir "/home/user/app" \ - --tty --interactive "${TAG}" bash +while (($# > 0)); do + case "${1%%=*}" in + build) build=1;; + run) run=1;; + push) push=1;; + list) list=1;; + help) print_help=1;; + --base|-b) read_arg base "$@" || shift;; + --base-version) read_arg base_version "$@" || shift;; + --no-login) no_login=1;; + *) echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"; exit 1;; + esac + shift +done + +if [ $print_help == 1 ]; then + echo "$0 - Build and run Docker images" + echo "" + echo "Usage: $0 [options] [basename]" + echo "" + echo "Available commands" + echo "" + echo " build --base= - Build Docker image .Dockerfile" + echo " run --base= - Run Docker image " + echo " push --base= - Push Docker image to the registry" + echo " list - List available images" + echo " help - This help message" + echo "" + exit 0 +fi + +cd "$(dirname "$0")" + +if [ $list == 1 ]; then + echo "Available Docker images:" + for f in *.Dockerfile; do + filename=$( basename -- "$f" ) + basename="${filename%.*}" + + echo -e " \e[1;39m$basename\e[0m" + done + exit 0 +fi + +# All commands after this require --base to be set +if [ -z $base ]; then + echo "Usage: $0 " + exit 1 +fi + +if [ ! -f "$base.Dockerfile" ]; then + echo -e "\e[1;31mERROR\e[0m: Dockerfile for '$base' not found" + exit 1 +fi + +if [ -z $base_version ]; then + base_version="latest" +else + base_version="v$base_version" +fi + +if [ ! -x "$(command -v docker)" ] || [ docker --help |& grep -q podman ]; then + # Docker is actually implemented by podman, and its OCI output + # is incompatible with some of the dockerd instances on GitLab + # CI runners. + echo "Using: Podman" + format="--format docker" + CMD="podman" +else + echo "Using: Docker" + format="" + CMD="sudo socker" +fi + +REGISTRY="registry.gitlab.gnome.org" +TAG="${REGISTRY}/gnome/gtk/${base}:${base_version}" + +if [ $build == 1 ]; then + echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}" + ${CMD} build \ + ${format} \ + --build-arg HOST_USER_ID="$UID" \ + --tag "${TAG}" \ + --file "${base}.Dockerfile" . + exit $? +fi + +if [ $push == 1 ]; then + echo -e "\e[1;32mPUSHING\e[0m: ${base} as ${TAG}" + + if [ $no_login == 0 ]; then + ${CMD} login ${REGISTRY} + fi + + ${CMD} push ${TAG} + exit $? +fi + +if [ $run == 1 ]; then + echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}" + ${CMD} run \ + --rm \ + --volume "$(pwd)/..:/home/user/app" \ + --workdir "/home/user/app" \ + --tty \ + --interactive "${TAG}" \ + bash + exit $? +fi diff --git a/.gitlab-ci/test-docker-autotools.sh b/.gitlab-ci/test-docker-autotools.sh index d991842cf1..c685cc05a9 100755 --- a/.gitlab-ci/test-docker-autotools.sh +++ b/.gitlab-ci/test-docker-autotools.sh @@ -5,19 +5,31 @@ set -e mkdir -p _ccache export CCACHE_BASEDIR="$(pwd)" export CCACHE_DIR="${CCACHE_BASEDIR}/_ccache" +export N_PROCS=$(($(nproc) - 1)) + +EXTRA_CONFIGURE_OPT="" + +# Only enable documentation when distchecking, since it's required +if [ -n "${DO_DISTCHECK-}" ]; then + EXTRA_CONFIGURE_OPTS="${EXTRA_CONFIGURE_OPTS} --enable-gtk-doc" +fi + +NOCONFIGURE=1 ./autogen.sh mkdir _build cd _build -../autogen.sh \ + +../configure \ --enable-cloudproviders \ --enable-broadway-backend \ --enable-wayland-backend \ --enable-x11-backend \ --enable-xinerama \ - --enable-gtk-doc -make -j8 + ${EXTRA_CONFIGURE_OPTS} + +make -j${N_PROCS} if [ -n "${DO_DISTCHECK-}" ]; then - make -j8 check SKIP_GDKTARGET="echo Not actually running tests for now" - make -j8 distcheck SKIP_GDKTARGET="echo Not actually running tests for now" + make -j${N_PROCS} check SKIP_GDKTARGET="echo Not actually running tests for now" + make -j${N_PROCS} distcheck SKIP_GDKTARGET="echo Not actually running tests for now" fi diff --git a/.gitlab-ci/test-docker-meson.sh b/.gitlab-ci/test-docker-meson.sh index df3ed90ef8..469af621f7 100755 --- a/.gitlab-ci/test-docker-meson.sh +++ b/.gitlab-ci/test-docker-meson.sh @@ -10,10 +10,10 @@ export PATH="${HOME}/.local/bin:${PATH}" python3 -m pip install --user meson==0.49.2 meson \ - -Dgtk_doc=true \ - -Dman=true \ -Dinstalled_tests=true \ -Dbroadway_backend=true \ + -Dx11_backend=true \ + -Dwayland_backend=true \ -Dxinerama=yes \ -Dprint_backends="file,lpr,test,cloudprint,cups" \ ${EXTRA_MESON_FLAGS:-} \ @@ -28,5 +28,3 @@ xvfb-run -a -s "-screen 0 1024x768x24" \ --print-errorlogs \ --suite=gtk+-3.0 \ --no-suite=gtk+-3.0:a11y - -ninja gail-libgail-util3-doc gdk3-doc gtk3-doc diff --git a/gdk/gdk.c b/gdk/gdk.c index 12a1d1c585..f0869a6a81 100644 --- a/gdk/gdk.c +++ b/gdk/gdk.c @@ -104,14 +104,6 @@ * Use this macro to guard code that is specific to the Wayland backend. */ -/** - * GDK_DISABLE_DEPRECATION_WARNINGS: - * - * A macro that should be defined before including the gdk.h header. - * If it is defined, no compiler warnings will be produced for uses - * of deprecated GDK APIs. - */ - typedef struct _GdkPredicate GdkPredicate; struct _GdkPredicate diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index 4773f63ffa..3d6e4400c8 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -3671,8 +3671,10 @@ tablet_tool_handle_proximity_out (void *data, { GdkWaylandTabletToolData *tool = data; GdkWaylandTabletData *tablet = tool->current_tablet; - GdkWaylandSeat *seat = GDK_WAYLAND_SEAT (tool->seat); GdkEvent *event; +#ifdef G_ENABLE_DEBUG + GdkWaylandSeat *seat = GDK_WAYLAND_SEAT (tool->seat); +#endif GDK_NOTE (EVENTS, g_message ("proximity out, seat %p, tool %d", seat, diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c index 76049c39b7..cb60d3a0fd 100644 --- a/gdk/wayland/gdkscreen-wayland.c +++ b/gdk/wayland/gdkscreen-wayland.c @@ -1539,10 +1539,12 @@ xdg_output_handle_description (void *data, struct zxdg_output_v1 *xdg_output, const char *description) { +#ifdef G_ENABLE_DEBUG GdkWaylandMonitor *monitor = (GdkWaylandMonitor *) data; GDK_NOTE (MISC, g_message ("handle description xdg-output %d", monitor->id)); +#endif } static const struct zxdg_output_v1_listener xdg_output_listener = { diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index 0054836de9..84db789496 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -769,7 +769,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS else g_object_set_property (obj, param->name, ¶m->value); -#if G_ENABLE_DEBUG +#ifdef G_ENABLE_DEBUG if (GTK_DEBUG_CHECK (BUILDER)) { gchar *str = g_strdup_value_contents ((const GValue*)¶m->value); @@ -838,7 +838,7 @@ _gtk_builder_apply_properties (GtkBuilder *builder, else g_object_set_property (info->object, param->name, ¶m->value); -#if G_ENABLE_DEBUG +#ifdef G_ENABLE_DEBUG if (GTK_DEBUG_CHECK (BUILDER)) { gchar *str = g_strdup_value_contents ((const GValue*)¶m->value); diff --git a/gtk/gtkcssgadget.c b/gtk/gtkcssgadget.c index 09e9fdfa38..167e0a4859 100644 --- a/gtk/gtkcssgadget.c +++ b/gtk/gtkcssgadget.c @@ -541,7 +541,7 @@ gtk_css_gadget_margin_box_contains_point (GtkCssGadget *gadget, int x, int y) { - GtkAllocation margin_box; + GtkAllocation margin_box = { 0, }; gtk_css_gadget_get_margin_box (gadget, &margin_box); return allocation_contains_point (&margin_box, x, y); } @@ -895,7 +895,7 @@ gtk_css_gadget_draw (GtkCssGadget *gadget, width - margin.left - margin.right, height - margin.top - margin.bottom); -#if G_ENABLE_DEBUG +#ifdef G_ENABLE_DEBUG { GdkDisplay *display = gtk_widget_get_display (gtk_css_gadget_get_owner (gadget)); GtkDebugFlag flags = gtk_get_display_debug_flags (display); diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index 5cab98ba77..ad4a8a7e31 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.c @@ -184,8 +184,6 @@ static void gtk_tree_store_buildable_custom_finished (GtkBuildable *builda const gchar *tagname, gpointer user_data); -static void validate_gnode (GNode *node); - static void gtk_tree_store_move (GtkTreeStore *tree_store, GtkTreeIter *iter, GtkTreeIter *position, @@ -193,6 +191,8 @@ static void gtk_tree_store_move (GtkTreeStore * #ifdef G_ENABLE_DEBUG +static void validate_gnode (GNode *node); + static inline void validate_tree (GtkTreeStore *tree_store) { @@ -3313,6 +3313,7 @@ gtk_tree_store_has_default_sort_func (GtkTreeSortable *sortable) return (tree_store->priv->default_sort_func != NULL); } +#ifdef G_ENABLE_DEBUG static void validate_gnode (GNode* node) { @@ -3328,6 +3329,7 @@ validate_gnode (GNode* node) iter = iter->next; } } +#endif /* GtkBuildable custom tag implementation * diff --git a/modules/input/imwaylandgtk.c b/modules/input/imwaylandgtk.c index 1d5050496a..58a5e48c29 100644 --- a/modules/input/imwaylandgtk.c +++ b/modules/input/imwaylandgtk.c @@ -343,6 +343,8 @@ translate_purpose (GtkInputPurpose purpose) return GTK_TEXT_INPUT_CONTENT_PURPOSE_PASSWORD; case GTK_INPUT_PURPOSE_PIN: return GTK_TEXT_INPUT_CONTENT_PURPOSE_PIN; + case GTK_INPUT_PURPOSE_TERMINAL: + return GTK_TEXT_INPUT_CONTENT_PURPOSE_NORMAL; } return GTK_TEXT_INPUT_CONTENT_PURPOSE_NORMAL; diff --git a/modules/printbackends/cloudprint/gtkcloudprintaccount.c b/modules/printbackends/cloudprint/gtkcloudprintaccount.c index ee65a18287..6ff5841408 100644 --- a/modules/printbackends/cloudprint/gtkcloudprintaccount.c +++ b/modules/printbackends/cloudprint/gtkcloudprintaccount.c @@ -220,15 +220,20 @@ gtk_cloudprint_account_search_rest_call_cb (RestProxyCall *call, gpointer user_data) { GTask *task = user_data; - GtkCloudprintAccount *account = g_task_get_task_data (task); JsonParser *json_parser = NULL; JsonObject *result; JsonNode *printers = NULL; GError *error = NULL; - GTK_NOTE (PRINTING, - g_print ("Cloud Print Backend: (%p) 'search' REST call " - "returned\n", account)); +#ifdef G_ENABLE_DEBUG + { + GtkCloudprintAccount *account = g_task_get_task_data (task); + + GTK_NOTE (PRINTING, + g_print ("Cloud Print Backend: (%p) 'search' REST call returned\n", + account)); + } +#endif if (cb_error != NULL) { @@ -445,14 +450,19 @@ gtk_cloudprint_account_printer_rest_call_cb (RestProxyCall *call, gpointer user_data) { GTask *task = user_data; - GtkCloudprintAccount *account = g_task_get_task_data (task); JsonParser *json_parser = NULL; JsonObject *result; GError *error = NULL; - GTK_NOTE (PRINTING, - g_print ("Cloud Print Backend: (%p) 'printer' REST call " - "returned\n", account)); +#ifdef G_ENABLE_DEBUG + { + GtkCloudprintAccount *account = g_task_get_task_data (task); + + GTK_NOTE (PRINTING, + g_print ("Cloud Print Backend: (%p) 'printer' REST call returned\n", + account)); + } +#endif if (cb_error != NULL) { @@ -536,14 +546,19 @@ gtk_cloudprint_account_submit_rest_call_cb (RestProxyCall *call, gpointer user_data) { GTask *task = user_data; - GtkCloudprintAccount *account = g_task_get_task_data (task); JsonParser *json_parser = NULL; JsonObject *result; GError *error = NULL; - GTK_NOTE (PRINTING, - g_print ("Cloud Print Backend: (%p) 'submit' REST call " - "returned\n", account)); +#ifdef G_ENABLE_DEBUG + { + GtkCloudprintAccount *account = g_task_get_task_data (task); + + GTK_NOTE (PRINTING, + g_print ("Cloud Print Backend: (%p) 'submit' REST call returned\n", + account)); + } +#endif if (cb_error != NULL) { diff --git a/testsuite/gtk/icontheme.c b/testsuite/gtk/icontheme.c index cf466471f3..7eed015ff2 100644 --- a/testsuite/gtk/icontheme.c +++ b/testsuite/gtk/icontheme.c @@ -166,6 +166,11 @@ assert_lookup_order (const char *icon_name, GtkIconInfo *info; GList *l; +/* this hack is only usable in debug builds */ +#ifndef G_ENABLE_DEBUG + g_assert_not_reached (); +#endif + debug_flags = gtk_get_debug_flags (); gtk_set_debug_flags (debug_flags | GTK_DEBUG_ICONTHEME); g_log_set_writer_func (log_writer, NULL, NULL); @@ -196,6 +201,15 @@ assert_lookup_order (const char *icon_name, gtk_set_debug_flags (debug_flags); } +#ifdef G_ENABLE_DEBUG +#define require_debug() +#else +#define require_debug() \ + g_test_skip ("requires G_ENABLE_DEBUG"); \ + return; +#endif + + static void test_basics (void) { @@ -206,6 +220,8 @@ test_basics (void) static void test_lookup_order (void) { + require_debug (); + assert_lookup_order ("foo-bar-baz", 16, GTK_ICON_LOOKUP_GENERIC_FALLBACK, "foo-bar-baz", "foo-bar", diff --git a/testsuite/gtk/meson.build b/testsuite/gtk/meson.build index 5f3556092a..206af0dc2c 100644 --- a/testsuite/gtk/meson.build +++ b/testsuite/gtk/meson.build @@ -50,6 +50,12 @@ tests = [ ['revealer-size'], ] +# Tests that are expected to fail +xfail = [ +] + +is_debug = get_option('buildtype').startswith('debug') + test_cargs = [] if os_unix @@ -77,6 +83,8 @@ foreach t : tests install: get_option('installed_tests'), install_dir: installed_test_bindir) + expect_fail = xfail.contains(test_name) + test(test_name, test_exe, args: [ '--tap', '-k' ], env: [ 'GIO_USE_VOLUME_MONITOR=unix', @@ -89,7 +97,9 @@ foreach t : tests 'GSETTINGS_SCHEMA_DIR=@0@'.format(gtk_schema_build_dir), 'GTK_TEST_MESON=1', ], - suite: 'gtk') + suite: 'gtk', + should_fail: expect_fail, + ) endforeach # FIXME: if objc autotestkeywords_CPPFLAGS += -DHAVE_OBJC=1 -x objective-c++