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 ...@@ -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 there are that at least some of this module is eventually destined for
inclusion in GLib. 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 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; -*- /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
* *
* Copyright (C) 2017 Red Hat, Inc. * Copyright (C) 2017 Red Hat, Inc.
* Copyright 2019 Collabora Ltd.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -20,6 +21,10 @@ ...@@ -20,6 +21,10 @@
#pragma once #pragma once
#include <glib.h>
#include "glnx-backport-autoptr.h"
typedef GError _GLnxTestAutoError; typedef GError _GLnxTestAutoError;
static inline void static inline void
_glnx_test_auto_error_cleanup (_GLnxTestAutoError *autoerror) _glnx_test_auto_error_cleanup (_GLnxTestAutoError *autoerror)
...@@ -32,3 +37,12 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(_GLnxTestAutoError, _glnx_test_auto_error_cleanup) ...@@ -32,3 +37,12 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(_GLnxTestAutoError, _glnx_test_auto_error_cleanup)
#define _GLNX_TEST_DECLARE_ERROR(local_error, error) \ #define _GLNX_TEST_DECLARE_ERROR(local_error, error) \
g_autoptr(_GLnxTestAutoError) local_error = NULL; \ g_autoptr(_GLnxTestAutoError) local_error = NULL; \
GError **error = &local_error 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) ...@@ -237,6 +237,7 @@ test_filecopy (void)
int main (int argc, char **argv) int main (int argc, char **argv)
{ {
_GLNX_TEST_SCOPED_TEMP_DIR;
int ret; int ret;
g_test_init (&argc, &argv, NULL); 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