From 7fa6e9e8378df1010ca664ed50fad6825ead5575 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Wed, 26 Sep 2018 10:56:10 -0400 Subject: [PATCH] CI: Test static build on installed glib --- .gitlab-ci.yml | 17 ++++++++++- gio/tests/meson.build | 12 ++++++++ gio/tests/static-link.py | 51 +++++++++++++++++++++++++++++++ gio/tests/static-link/app.c | 8 +++++ gio/tests/static-link/meson.build | 8 +++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100755 gio/tests/static-link.py create mode 100644 gio/tests/static-link/app.c create mode 100644 gio/tests/static-link/meson.build diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 936c97669..5738014a3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,12 +21,27 @@ fedora-x86_64: variables: CFLAGS: "-coverage -ftest-coverage -fprofile-arcs" script: - - meson ${MESON_COMMON_OPTIONS} --werror -Dsystemtap=true -Ddtrace=true -Dfam=true _build + - meson ${MESON_COMMON_OPTIONS} + --werror + --default-library=both + --prefix=$HOME/glib-installed + --libdir=lib + -Dsystemtap=true + -Ddtrace=true + -Dfam=true + -Dinstalled_tests=true + _build - ninja -C _build - mkdir -p _coverage - lcov --config-file .gitlab-ci/lcovrc --directory _build --capture --initial --output-file "_coverage/${CI_JOB_NAME}-baseline.lcov" - meson test -C _build --timeout-multiplier ${MESON_TEST_TIMEOUT_MULTIPLIER} - lcov --config-file .gitlab-ci/lcovrc --directory _build --capture --output-file "_coverage/${CI_JOB_NAME}.lcov" + # FIXME: We should run all installed tests, but do only this one for now + # because it cannot run uninstalled. Reconfigure with dtrace disabled + # because it breaks static link. + - meson configure -Ddtrace=false _build + - ninja -C _build install + - GLIB_TEST_COMPILATION=1 $HOME/glib-installed/libexec/installed-tests/glib/static-link.py $HOME/glib-installed/lib/pkgconfig artifacts: name: "glib-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" when: always diff --git a/gio/tests/meson.build b/gio/tests/meson.build index 4110c88b2..65ddcdad8 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -376,6 +376,18 @@ if installed_tests_enabled install_subdir('desktop-files', install_dir : installed_tests_execdir) install_subdir('thumbnails', install_dir : installed_tests_execdir) install_subdir('cert-tests', install_dir : installed_tests_execdir) + + cdata = configuration_data() + cdata.set('installed_tests_dir', installed_tests_execdir) + cdata.set('program', 'static-link.py ' + glib_pkgconfigreldir) + configure_file( + input: installed_tests_template, + output: 'static-link.test', + install_dir: installed_tests_metadir, + configuration: cdata + ) + install_subdir('static-link', install_dir : installed_tests_execdir) + install_data('static-link.py', install_dir : installed_tests_execdir) endif if not meson.is_cross_build() or meson.has_exe_wrapper() diff --git a/gio/tests/static-link.py b/gio/tests/static-link.py new file mode 100755 index 000000000..0af9b1af9 --- /dev/null +++ b/gio/tests/static-link.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright (C) 2018 Collabora Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General +# Public License along with this library; if not, see . +# +# Author: Xavier Claessens + +import os +import sys +import tempfile +import subprocess + +if not 'GLIB_TEST_COMPILATION' in os.environ: + print('''Test disabled because GLIB_TEST_COMPILATION is not set in the env. +If you wish to run this test, set GLIB_TEST_COMPILATION=1 in the env, +and make sure you have glib build dependencies installed, including +meson.''') + sys.exit(0) + +if len(sys.argv) != 2: + print('Usage: {} '.format(os.path.basename(sys.argv[0]))) + sys.exit(1) + +test_dir = os.path.dirname(sys.argv[0]) + +with tempfile.TemporaryDirectory() as builddir: + env = os.environ.copy() + env['PKG_CONFIG_PATH'] = sys.argv[1] + sourcedir = os.path.join(test_dir, 'static-link') + + # Ensure we can static link and run a test app + subprocess.check_call(['meson', sourcedir, builddir], env=env) + subprocess.check_call(['ninja', '-C', builddir, 'test'], env=env) + # FIXME: This probably only works on Linux + out = subprocess.check_output(['ldd', os.path.join(builddir, 'test-static-link')], env=env).decode() + if 'libgio' in out: + print('test-static-link is dynamically linked on libgio') + exit(1) diff --git a/gio/tests/static-link/app.c b/gio/tests/static-link/app.c new file mode 100644 index 000000000..94baf6057 --- /dev/null +++ b/gio/tests/static-link/app.c @@ -0,0 +1,8 @@ +#include + +int main(int argc, char *argv[]) +{ + GApplication *app = g_application_new (NULL, 0); + g_object_unref (app); + return 0; +} diff --git a/gio/tests/static-link/meson.build b/gio/tests/static-link/meson.build new file mode 100644 index 000000000..c0b638fe6 --- /dev/null +++ b/gio/tests/static-link/meson.build @@ -0,0 +1,8 @@ +project('test-static-link', 'c') + +# This is a dummy project that static links against installed gio. +# See gio/tests/static-link.py. +app = executable('test-static-link', 'app.c', + dependencies : dependency('gio-2.0', static : true) +) +test('test-static-link', app)