Skip to content
Snippets Groups Projects
Commit 41ecc544 authored by Colin Walters's avatar Colin Walters
Browse files

Merge branch 'meson-older-compilers' into 'master'

Add Meson build system and Gitlab-CI

See merge request GNOME/libglnx!8
parents 2eeb8a75 4fca08e2
No related branches found
No related tags found
No related merge requests found
image: registry.fedoraproject.org/fedora:30
stages:
- build
before_script:
- dnf install -y gcc meson ninja-build "pkgconfig(gio-2.0)" "pkgconfig(gio-unix-2.0)" "pkgconfig(glib-2.0)"
build:
stage: build
script:
- meson _build .
- cd _build
- ninja
- meson test
# Run it again! This previously did not work.
- meson test
artifacts:
when: on_failure
name: "libglnx-${CI_COMMIT_REF_NAME}-${CI_JOB_NAME}"
paths:
- "${CI_PROJECT_DIR}/_build/meson-logs"
......@@ -28,6 +28,32 @@ One could also compare this project to gnulib; the salient differences
there are that at least some of this module is eventually destined for
inclusion in GLib.
Adding this to your project
---------------------------
## Meson
First, set up a Git submodule:
```
git submodule add https://gitlab.gnome.org/GNOME/libglnx subprojects/libglnx
```
Or a Git [subtree](https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt):
```
git remote add libglnx https://gitlab.gnome.org/GNOME/libglnx.git
git fetch libglnx
git subtree add -P subprojects/libglnx libglnx/master
```
Then, in your top-level `meson.build`:
```
libglnx_dep = subproject('libglnx').get_variable('libglnx_dep')
# now use libglnx_dep in your dependencies
```
Porting from libgsystem
-----------------------
......
project('libglnx', 'c')
add_project_arguments('-D_GNU_SOURCE', language: 'c')
add_project_arguments('-std=gnu99', language: 'c')
add_project_arguments('-Wno-unused-local-typedefs', language: 'c')
cc = meson.get_compiler('c')
check_functions = [
'renameat2',
'memfd_create',
'copy_file_range',
]
conf = configuration_data()
foreach check_function : check_functions
have_it = cc.compiles('''
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/mount.h>
#include <fcntl.h>
#include <sched.h>
#include <linux/loop.h>
#include <linux/random.h>
#include <sys/mman.h>
int func (void) {
(void) ''' + check_function + ''';
}
''',
args : '-D_GNU_SOURCE',
name : check_function + '() is declared',
)
conf.set10('HAVE_DECL_' + check_function.underscorify().to_upper(), have_it)
endforeach
config_h = configure_file(
output : 'config.h',
configuration : conf,
)
libglnx_deps = [
dependency('gio-2.0'),
dependency('gio-unix-2.0'),
]
libglnx_inc = include_directories('.')
libglnx_sources = [
'glnx-backport-autocleanups.h',
'glnx-backport-autoptr.h',
'glnx-backports.c',
'glnx-backports.h',
'glnx-console.c',
'glnx-console.h',
'glnx-dirfd.c',
'glnx-dirfd.h',
'glnx-errors.c',
'glnx-errors.h',
'glnx-fdio.c',
'glnx-fdio.h',
'glnx-local-alloc.c',
'glnx-local-alloc.h',
'glnx-lockfile.c',
'glnx-lockfile.h',
'glnx-macros.h',
'glnx-missing.h',
'glnx-missing-syscall.h',
'glnx-shutil.c',
'glnx-shutil.h',
'glnx-xattrs.c',
'glnx-xattrs.h',
'libglnx.h',
]
libglnx = static_library('glnx',
libglnx_sources,
dependencies : libglnx_deps,
include_directories : libglnx_inc,
install : false)
libglnx_dep = declare_dependency(
include_directories : libglnx_inc,
link_with : libglnx)
subdir('tests')
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright 2019 Collabora Ltd.
*
* 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 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, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include "libglnx-testlib.h"
#include <errno.h>
#include "libglnx.h"
struct _GLnxTestAutoTempDir
{
gchar *old_cwd;
int old_cwd_fd;
GLnxTmpDir temp_dir;
};
_GLnxTestAutoTempDir *
_glnx_test_auto_temp_dir_enter (void)
{
GError *error = NULL;
_GLnxTestAutoTempDir *ret = g_new0 (_GLnxTestAutoTempDir, 1);
glnx_mkdtemp ("glnx-test-XXXXXX", 0700, &ret->temp_dir, &error);
g_assert_no_error (error);
/* just for better diagnostics */
ret->old_cwd = g_get_current_dir ();
glnx_opendirat (-1, ".", TRUE, &ret->old_cwd_fd, &error);
g_assert_no_error (error);
if (fchdir (ret->temp_dir.fd) != 0)
g_error ("fchdir(<fd for \"%s\">): %s", ret->temp_dir.path, g_strerror (errno));
return ret;
}
void
_glnx_test_auto_temp_dir_leave (_GLnxTestAutoTempDir *dir)
{
GError *error = NULL;
if (fchdir (dir->old_cwd_fd) != 0)
g_error ("fchdir(<fd for \"%s\">): %s", dir->old_cwd, g_strerror (errno));
glnx_tmpdir_delete (&dir->temp_dir, NULL, &error);
g_assert_no_error (error);
}
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2017 Red Hat, Inc.
* Copyright 2019 Collabora Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
......@@ -20,6 +21,10 @@
#pragma once
#include <glib.h>
#include "glnx-backport-autoptr.h"
typedef GError _GLnxTestAutoError;
static inline void
_glnx_test_auto_error_cleanup (_GLnxTestAutoError *autoerror)
......@@ -32,3 +37,12 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(_GLnxTestAutoError, _glnx_test_auto_error_cleanup)
#define _GLNX_TEST_DECLARE_ERROR(local_error, error) \
g_autoptr(_GLnxTestAutoError) local_error = NULL; \
GError **error = &local_error
typedef struct _GLnxTestAutoTempDir _GLnxTestAutoTempDir;
_GLnxTestAutoTempDir *_glnx_test_auto_temp_dir_enter (void);
void _glnx_test_auto_temp_dir_leave (_GLnxTestAutoTempDir *dir);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(_GLnxTestAutoTempDir, _glnx_test_auto_temp_dir_leave);
#define _GLNX_TEST_SCOPED_TEMP_DIR \
g_autoptr(_GLnxTestAutoTempDir) temp_dir = _glnx_test_auto_temp_dir_enter ()
test_names = [
'errors',
'fdio',
'macros',
'shutil',
'xattrs',
]
foreach test_name : test_names
exe = executable(test_name,
[
'libglnx-testlib.c',
'libglnx-testlib.h',
'test-libglnx-' + test_name + '.c',
],
dependencies: [
libglnx_dep,
libglnx_deps,
],
)
test(test_name, exe)
endforeach
......@@ -237,6 +237,7 @@ test_filecopy (void)
int main (int argc, char **argv)
{
_GLNX_TEST_SCOPED_TEMP_DIR;
int ret;
g_test_init (&argc, &argv, NULL);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment