Compare commits

..

No commits in common. "master" and "libevdev-1.12.0" have entirely different histories.

25 changed files with 809 additions and 845 deletions

View file

@ -4,18 +4,33 @@
# # # #
######################################## ########################################
.templates_sha: &template_sha e195d80f35b45cc73668be3767b923fd76c70ed5 # see https://docs.gitlab.com/ee/ci/yaml/#includefile .templates_sha: &template_sha bbe5232986c9b98eb1efe62484e07216f7d1a4df # see https://docs.gitlab.com/ee/ci/yaml/#includefile
include: include:
# Alpine container builder template
- project: 'freedesktop/ci-templates' - project: 'freedesktop/ci-templates'
ref: *template_sha ref: *template_sha
file: file: '/templates/alpine.yml'
- '/templates/alpine.yml' # Arch container builder template
- '/templates/arch.yml' - project: 'freedesktop/ci-templates'
- '/templates/debian.yml' ref: *template_sha
- '/templates/fedora.yml' file: '/templates/arch.yml'
- '/templates/ubuntu.yml' # Centos container builder template
- '/templates/ci-fairy.yml' - project: 'freedesktop/ci-templates'
ref: *template_sha
file: '/templates/centos.yml'
# Debian container builder template
- project: 'freedesktop/ci-templates'
ref: *template_sha
file: '/templates/debian.yml'
# Fedora container builder template
- project: 'freedesktop/ci-templates'
ref: *template_sha
file: '/templates/fedora.yml'
# Ubuntu container builder template
- project: 'freedesktop/ci-templates'
ref: *template_sha
file: '/templates/ubuntu.yml'
stages: stages:
- prep # rebuild the container images if there is a change - prep # rebuild the container images if there is a change
@ -27,16 +42,10 @@ stages:
- container_clean # clean up unused container images - container_clean # clean up unused container images
- merge-check # check for a merge request - merge-check # check for a merge request
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
variables: variables:
# The upstrem repository we will check for images # The upstrem repository we will check for images
FDO_UPSTREAM_REPO: libevdev/libevdev FDO_UPSTREAM_REPO: libevdev/libevdev
LIBEVDEV_SKIP_ROOT_TESTS: 1
GIT_DEPTH: 1 GIT_DEPTH: 1
MESON_BUILDDIR: 'build dir' MESON_BUILDDIR: 'build dir'
@ -46,9 +55,9 @@ variables:
- _build/test/test-suite.log - _build/test/test-suite.log
- $MESON_BUILDDIR/meson-logs/ - $MESON_BUILDDIR/meson-logs/
expire_in: 1 week expire_in: 1 week
when: always when: on_failure
reports: reports:
junit: $MESON_BUILDDIR/*junit*.xml junit: $MESON_BUILDDIR/junit-*.xml
.autotools_build: .autotools_build:
extends: extends:
@ -61,57 +70,71 @@ variables:
- make check - make check
- if ! [[ -z "$MAKE_ARGS" ]]; then make $MAKE_ARGS; fi - if ! [[ -z "$MAKE_ARGS" ]]; then make $MAKE_ARGS; fi
- popd > /dev/null - popd > /dev/null
variables:
LIBEVDEV_SKIP_ROOT_TESTS: 1
.meson_build: .meson_build:
extends: extends:
- .default_artifacts - .default_artifacts
script: script:
- .gitlab-ci/meson-build.sh --run-test - .gitlab-ci/meson-build.sh
variables:
MESON_TEST_ARGS: '--no-suite=needs-uinput'
.fedora:40: .fedora:33:
extends: .fdo.distribution-image@fedora extends: .fdo.distribution-image@fedora
variables: variables:
FDO_DISTRIBUTION_TAG: '2024-11-25.0' FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: '40' FDO_DISTRIBUTION_VERSION: '33'
.fedora:41: .fedora:34:
extends: .fdo.distribution-image@fedora extends: .fdo.distribution-image@fedora
variables: variables:
FDO_DISTRIBUTION_TAG: '2024-11-25.0' FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: '41' FDO_DISTRIBUTION_VERSION: '34'
.ubuntu:24.10: .ubuntu:21.04:
extends: .fdo.distribution-image@ubuntu extends: .fdo.distribution-image@ubuntu
variables: variables:
FDO_DISTRIBUTION_TAG: '2024-11-25.0' FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: '24.10' FDO_DISTRIBUTION_VERSION: '21.04'
.ubuntu:20.10:
extends: .fdo.distribution-image@ubuntu
variables:
FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: '20.10'
.debian:stable: .debian:stable:
extends: .fdo.distribution-image@debian extends: .fdo.distribution-image@debian
variables: variables:
FDO_DISTRIBUTION_TAG: '2024-11-25.0' FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: 'stable' FDO_DISTRIBUTION_VERSION: 'stable'
.debian:sid: .debian:sid:
extends: .fdo.distribution-image@debian extends: .fdo.distribution-image@debian
variables: variables:
FDO_DISTRIBUTION_TAG: '2024-11-25.0' FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: 'sid' FDO_DISTRIBUTION_VERSION: 'sid'
.centos:7:
extends: .fdo.distribution-image@centos
variables:
FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: '7'
.centos:8:
extends: .fdo.distribution-image@centos
variables:
FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: '8'
.arch:rolling: .arch:rolling:
extends: .fdo.distribution-image@arch extends: .fdo.distribution-image@arch
variables: variables:
FDO_DISTRIBUTION_TAG: '2024-11-25.0' FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: 'rolling' FDO_DISTRIBUTION_VERSION: 'rolling'
.alpine:latest: .alpine:latest:
extends: .fdo.distribution-image@alpine extends: .fdo.distribution-image@alpine
variables: variables:
FDO_DISTRIBUTION_TAG: '2024-11-25.0' FDO_DISTRIBUTION_TAG: '2021-07-26.0'
FDO_DISTRIBUTION_VERSION: 'latest' FDO_DISTRIBUTION_VERSION: 'latest'
@ -127,11 +150,14 @@ variables:
# $SRCDIR/.gitlab-ci/generate-gitlab-ci.py # $SRCDIR/.gitlab-ci/generate-gitlab-ci.py
# #
check-ci-script: check-ci-script:
extends: image: golang:alpine
- .fdo.ci-fairy
stage: prep stage: prep
before_script:
- apk add python3 py-pip git
- pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
script: script:
- ci-fairy generate-template --verify && exit 0 || true - ci-fairy generate-template
- git diff --exit-code && exit 0 || true
- echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify" - echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify"
- exit 1 - exit 1
@ -140,13 +166,13 @@ check-ci-script:
# #
check-commit: check-commit:
extends: image: golang:alpine
- .fdo.ci-fairy
stage: prep stage: prep
before_script:
- apk add python3 py-pip git
- pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
script: script:
- ci-fairy -vv check-commits --junit-xml=results.xml && exit 0 || true - ci-fairy check-commits --signed-off-by --junit-xml=results.xml
- echo "Error checking the commit message format. Please verify"
- exit 1
except: except:
- master@libevdev/libevdev - master@libevdev/libevdev
variables: variables:
@ -160,9 +186,11 @@ check-commit:
# #
check-merge-request: check-merge-request:
extends: image: golang:alpine
- .fdo.ci-fairy
stage: merge-check stage: merge-check
before_script:
- apk add python3 py-pip git
- pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
script: script:
- ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml
artifacts: artifacts:
@ -170,13 +198,11 @@ check-merge-request:
reports: reports:
junit: results.xml junit: results.xml
allow_failure: true allow_failure: true
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
.fedora.packages: .fedora.packages:
variables: variables:
FDO_DISTRIBUTION_PACKAGES: 'git gcc gcc-c++ meson automake autoconf libtool make pkgconfig python3 check-devel valgrind binutils doxygen xz clang-analyzer systemd-udev qemu-img qemu-system-x86-core qemu-system-aarch64-core jq python3-click python3-rich' FDO_DISTRIBUTION_PACKAGES: 'git gcc gcc-c++ meson automake autoconf libtool make pkgconfig python3 check-devel valgrind binutils doxygen xz clang-analyzer'
.ubuntu.packages: .ubuntu.packages:
variables: variables:
@ -186,48 +212,129 @@ check-merge-request:
variables: variables:
FDO_DISTRIBUTION_PACKAGES: 'git gcc g++ meson automake autoconf libtool make pkg-config python3 check valgrind binutils doxygen xz-utils' FDO_DISTRIBUTION_PACKAGES: 'git gcc g++ meson automake autoconf libtool make pkg-config python3 check valgrind binutils doxygen xz-utils'
.centos.packages:
variables:
FDO_DISTRIBUTION_PACKAGES: 'git gcc gcc-c++ automake autoconf libtool make pkgconfig python3 check-devel valgrind binutils xz'
.arch.packages: .arch.packages:
variables: variables:
FDO_DISTRIBUTION_PACKAGES: 'git gc meson automake autoconf libtool make pkgconfig python3 check valgrind binutils doxygen' FDO_DISTRIBUTION_PACKAGES: 'git gcc meson automake autoconf libtool make pkgconfig python3 check valgrind binutils doxygen'
.alpine.packages: .alpine.packages:
variables: variables:
FDO_DISTRIBUTION_PACKAGES: 'git gcc g++ meson automake autoconf libtool make pkgconfig python3 check-dev valgrind binutils doxygen xz linux-headers' FDO_DISTRIBUTION_PACKAGES: 'git gcc g++ meson automake autoconf libtool make pkgconfig python3 check-dev valgrind binutils doxygen xz linux-headers'
# Pulls in the qemu container from upstream or rebuilds it if missing
.fedora:34@qemu-prep:
extends:
- .fedora:34
- .fedora.packages
- .fdo.qemu-build@fedora
stage: prep
tags:
- kvm
variables:
GIT_STRATEGY: none
FDO_DISTRIBUTION_TAG: qemu-2021-07-26.0
allow_failure: true
# Always rebuilds the container
.fedora:34@qemu-forced-rebuild:
extends:
- .fedora:34@qemu-prep
variables:
FDO_FORCE_REBUILD: 1
only:
- schedules
# This is the actual job
fedora:34@qemu-prep:
extends: .fedora:34@qemu-prep
fedora:34@qemu-forced-rebuild:
extends: .fedora:34@qemu-forced-rebuild
# Pulls in the container from upstream or rebuilds it if missing # Pulls in the container from upstream or rebuilds it if missing
fedora:40@container-prep: fedora:33@container-prep:
extends: extends:
- .fedora:40 - .fedora:33
- .fedora.packages - .fedora.packages
- .fdo.container-build@fedora - .fdo.container-build@fedora
stage: prep stage: prep
variables: variables:
GIT_STRATEGY: none GIT_STRATEGY: none
# Always rebuilds the container
fedora:33@container-forced-rebuild:
extends:
- fedora:33@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing # Pulls in the container from upstream or rebuilds it if missing
fedora:41@container-prep: fedora:34@container-prep:
extends: extends:
- .fedora:41 - .fedora:34
- .fedora.packages - .fedora.packages
- .fdo.container-build@fedora - .fdo.container-build@fedora
stage: prep stage: prep
variables: variables:
GIT_STRATEGY: none GIT_STRATEGY: none
# Always rebuilds the container
fedora:34@container-forced-rebuild:
extends:
- fedora:34@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing # Pulls in the container from upstream or rebuilds it if missing
ubuntu:24.10@container-prep: ubuntu:21.04@container-prep:
extends: extends:
- .ubuntu:24.10 - .ubuntu:21.04
- .ubuntu.packages - .ubuntu.packages
- .fdo.container-build@ubuntu - .fdo.container-build@ubuntu
stage: prep stage: prep
variables: variables:
GIT_STRATEGY: none GIT_STRATEGY: none
# Always rebuilds the container
ubuntu:21.04@container-forced-rebuild:
extends:
- ubuntu:21.04@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing
ubuntu:20.10@container-prep:
extends:
- .ubuntu:20.10
- .ubuntu.packages
- .fdo.container-build@ubuntu
stage: prep
variables:
GIT_STRATEGY: none
# Always rebuilds the container
ubuntu:20.10@container-forced-rebuild:
extends:
- ubuntu:20.10@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing # Pulls in the container from upstream or rebuilds it if missing
debian:stable@container-prep: debian:stable@container-prep:
@ -239,6 +346,15 @@ debian:stable@container-prep:
variables: variables:
GIT_STRATEGY: none GIT_STRATEGY: none
# Always rebuilds the container
debian:stable@container-forced-rebuild:
extends:
- debian:stable@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing # Pulls in the container from upstream or rebuilds it if missing
debian:sid@container-prep: debian:sid@container-prep:
@ -250,6 +366,55 @@ debian:sid@container-prep:
variables: variables:
GIT_STRATEGY: none GIT_STRATEGY: none
# Always rebuilds the container
debian:sid@container-forced-rebuild:
extends:
- debian:sid@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing
centos:7@container-prep:
extends:
- .centos:7
- .centos.packages
- .fdo.container-build@centos
stage: prep
variables:
GIT_STRATEGY: none
# Always rebuilds the container
centos:7@container-forced-rebuild:
extends:
- centos:7@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing
centos:8@container-prep:
extends:
- .centos:8
- .centos.packages
- .fdo.container-build@centos
stage: prep
variables:
GIT_STRATEGY: none
# Always rebuilds the container
centos:8@container-forced-rebuild:
extends:
- centos:8@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing # Pulls in the container from upstream or rebuilds it if missing
arch:rolling@container-prep: arch:rolling@container-prep:
@ -261,6 +426,15 @@ arch:rolling@container-prep:
variables: variables:
GIT_STRATEGY: none GIT_STRATEGY: none
# Always rebuilds the container
arch:rolling@container-forced-rebuild:
extends:
- arch:rolling@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
# Pulls in the container from upstream or rebuilds it if missing # Pulls in the container from upstream or rebuilds it if missing
alpine:latest@container-prep: alpine:latest@container-prep:
@ -272,6 +446,15 @@ alpine:latest@container-prep:
variables: variables:
GIT_STRATEGY: none GIT_STRATEGY: none
# Always rebuilds the container
alpine:latest@container-forced-rebuild:
extends:
- alpine:latest@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
################################################################# #################################################################
# # # #
@ -285,9 +468,11 @@ alpine:latest@container-prep:
# the registry and will remove any that are not tagged with the provided # the registry and will remove any that are not tagged with the provided
# $container_image:$tag # $container_image:$tag
.container-clean: .container-clean:
extends:
- .fdo.ci-fairy
stage: container_clean stage: container_clean
image: golang:alpine
before_script:
- apk add python3 py-pip git
- pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
script: script:
# Go to your Profile, Settings, Access Tokens # Go to your Profile, Settings, Access Tokens
# Create a personal token with 'api' scope, copy the value. # Create a personal token with 'api' scope, copy the value.
@ -302,26 +487,33 @@ alpine:latest@container-prep:
only: only:
- schedules - schedules
### fedora 40 ### fedora 33
fedora:40@container-clean: fedora:33@container-clean:
extends: extends:
- .fedora:40 - .fedora:33
- .container-clean - .container-clean
needs: ["fedora:40@container-prep"] needs: ["fedora:33@container-prep"]
### fedora 41 ### fedora 34
fedora:41@container-clean: fedora:34@container-clean:
extends: extends:
- .fedora:41 - .fedora:34
- .container-clean - .container-clean
needs: ["fedora:41@container-prep"] needs: ["fedora:34@container-prep"]
### ubuntu 24.10 ### ubuntu 21.04
ubuntu:24.10@container-clean: ubuntu:21.04@container-clean:
extends: extends:
- .ubuntu:24.10 - .ubuntu:21.04
- .container-clean - .container-clean
needs: ["ubuntu:24.10@container-prep"] needs: ["ubuntu:21.04@container-prep"]
### ubuntu 20.10
ubuntu:20.10@container-clean:
extends:
- .ubuntu:20.10
- .container-clean
needs: ["ubuntu:20.10@container-prep"]
### debian stable ### debian stable
debian:stable@container-clean: debian:stable@container-clean:
@ -337,6 +529,20 @@ debian:sid@container-clean:
- .container-clean - .container-clean
needs: ["debian:sid@container-prep"] needs: ["debian:sid@container-prep"]
### centos 7
centos:7@container-clean:
extends:
- .centos:7
- .container-clean
needs: ["centos:7@container-prep"]
### centos 8
centos:8@container-clean:
extends:
- .centos:8
- .container-clean
needs: ["centos:8@container-prep"]
### arch rolling ### arch rolling
arch:rolling@container-clean: arch:rolling@container-clean:
extends: extends:
@ -371,51 +577,68 @@ alpine:latest@container-clean:
- .meson_build - .meson_build
stage: build stage: build
dependencies: [] dependencies: []
variables:
NINJA_ARGS: "dist"
fedora:40@autotools-build: fedora:33@autotools-build:
extends: extends:
- .fedora:40 - .fedora:33
- .autotools-build@template - .autotools-build@template
stage: autotools stage: autotools
needs: ['fedora:40@container-prep'] needs: ['fedora:33@container-prep']
fedora:40@meson-build: fedora:33@meson-build:
extends: extends:
- .fedora:40 - .fedora:33
- .meson-build@template - .meson-build@template
stage: meson stage: meson
needs: ['fedora:40@container-prep'] needs: ['fedora:33@container-prep']
fedora:41@autotools-build: fedora:34@autotools-build:
extends: extends:
- .fedora:41 - .fedora:34
- .autotools-build@template - .autotools-build@template
stage: autotools stage: autotools
needs: ['fedora:41@container-prep'] needs: ['fedora:34@container-prep']
fedora:41@meson-build: fedora:34@meson-build:
extends: extends:
- .fedora:41 - .fedora:34
- .meson-build@template - .meson-build@template
stage: meson stage: meson
needs: ['fedora:41@container-prep'] needs: ['fedora:34@container-prep']
ubuntu:24.10@autotools-build: ubuntu:21.04@autotools-build:
extends: extends:
- .ubuntu:24.10 - .ubuntu:21.04
- .autotools-build@template - .autotools-build@template
stage: autotools stage: autotools
needs: ['ubuntu:24.10@container-prep'] needs: ['ubuntu:21.04@container-prep']
ubuntu:24.10@meson-build: ubuntu:21.04@meson-build:
extends: extends:
- .ubuntu:24.10 - .ubuntu:21.04
- .meson-build@template - .meson-build@template
stage: meson stage: meson
needs: ['ubuntu:24.10@container-prep'] needs: ['ubuntu:21.04@container-prep']
ubuntu:20.10@autotools-build:
extends:
- .ubuntu:20.10
- .autotools-build@template
stage: autotools
needs: ['ubuntu:20.10@container-prep']
ubuntu:20.10@meson-build:
extends:
- .ubuntu:20.10
- .meson-build@template
stage: meson
needs: ['ubuntu:20.10@container-prep']
debian:stable@autotools-build: debian:stable@autotools-build:
@ -448,6 +671,28 @@ debian:sid@meson-build:
needs: ['debian:sid@container-prep'] needs: ['debian:sid@container-prep']
centos:7@autotools-build:
extends:
- .centos:7
- .autotools-build@template
stage: autotools
variables:
MAKE_ARGS: '' # disable distcheck, requires doxygen
needs: ['centos:7@container-prep']
centos:8@autotools-build:
extends:
- .centos:8
- .autotools-build@template
stage: autotools
variables:
MAKE_ARGS: '' # disable distcheck, requires doxygen
needs: ['centos:8@container-prep']
arch:rolling@autotools-build: arch:rolling@autotools-build:
extends: extends:
- .arch:rolling - .arch:rolling
@ -484,10 +729,10 @@ alpine:latest@meson-build:
# because they're supposed to fail equally on all # because they're supposed to fail equally on all
.fedora-custom-build@autotools-template: .fedora-custom-build@autotools-template:
extends: extends:
- .fedora:40 - .fedora:33
- .autotools-build@template - .autotools-build@template
stage: build stage: build
needs: ['fedora:40@container-prep'] needs: ['fedora:33@container-prep']
no-valgrind:autotools: no-valgrind:autotools:
extends: .fedora-custom-build@autotools-template extends: .fedora-custom-build@autotools-template
@ -526,10 +771,10 @@ enable-gcov:autotools:
.fedora-custom-build@meson-template: .fedora-custom-build@meson-template:
extends: extends:
- .fedora:40 - .fedora:33
- .meson-build@template - .meson-build@template
stage: build stage: build
needs: ['fedora:40@container-prep'] needs: ['fedora:33@container-prep']
no-valgrind:meson: no-valgrind:meson:
extends: .fedora-custom-build@meson-template extends: .fedora-custom-build@meson-template
@ -542,6 +787,7 @@ no-check:meson:
- dnf remove -y check check-devel - dnf remove -y check check-devel
variables: variables:
MESON_ARGS: -Dtests=disabled MESON_ARGS: -Dtests=disabled
SKIP_MESON_TEST: 1
# doxygen is required for dist # doxygen is required for dist
no-doxygen:meson: no-doxygen:meson:
@ -560,6 +806,7 @@ no-doxygen-check-valgrind:meson:
variables: variables:
MESON_ARGS: -Dtests=disabled -Ddocumentation=disabled MESON_ARGS: -Dtests=disabled -Ddocumentation=disabled
NINJA_ARGS: '' NINJA_ARGS: ''
SKIP_MESON_TEST: 1
enable-gcov:meson: enable-gcov:meson:
extends: .fedora-custom-build@meson-template extends: .fedora-custom-build@meson-template
@ -570,6 +817,7 @@ scan-build:meson:
extends: .fedora-custom-build@meson-template extends: .fedora-custom-build@meson-template
variables: variables:
NINJA_ARGS: 'scan-build' NINJA_ARGS: 'scan-build'
SKIP_MESON_TEST: 1
static-build:meson: static-build:meson:
extends: .fedora-custom-build@meson-template extends: .fedora-custom-build@meson-template
@ -580,7 +828,7 @@ static-build:meson:
soname: soname:
extends: extends:
- .fedora:40 - .fedora:33
stage: build stage: build
script: script:
- ./autogen.sh --prefix=$PWD/prefix-autotools/ - ./autogen.sh --prefix=$PWD/prefix-autotools/
@ -589,7 +837,7 @@ soname:
- meson "$MESON_BUILDDIR" --prefix=$PWD/prefix-meson/ - meson "$MESON_BUILDDIR" --prefix=$PWD/prefix-meson/
- ninja -C "$MESON_BUILDDIR" install - ninja -C "$MESON_BUILDDIR" install
- ls -l $PWD/prefix-meson/lib64/libevdev.so.2.3.0 - ls -l $PWD/prefix-meson/lib64/libevdev.so.2.3.0
needs: ['fedora:40@container-prep'] needs: ['fedora:33@container-prep']
################################################################# #################################################################
# # # #
@ -605,48 +853,66 @@ soname:
exit 1 ; exit 1 ;
fi fi
# build on the host, then run a systemd service to execute the test suite .qemu@fedora:34:
# inside the qemu VM handled by b2c
.build-in-b2c@template:
extends: extends:
- .default_artifacts - .fedora:34
stage: VM
image: $CI_REGISTRY_IMAGE/$FDO_DISTRIBUTION_NAME/$FDO_DISTRIBUTION_VERSION:qemu-$FDO_DISTRIBUTION_TAG
tags: tags:
- kvm - kvm
variables: variables:
MESON_BUILDDIR: build_dir MESON_BUILDDIR: build_dir
B2C_KERNEL: https://gitlab.freedesktop.org/api/v4/projects/libevdev%2Fhid-tools/packages/generic/kernel-x86_64/v6.5/bzImage
B2C_IMAGE: $FDO_DISTRIBUTION_IMAGE
B2C_COMMAND: .gitlab-ci/start-in-systemd.sh
script: script:
# first build in the host container # start our vm, no args required
- .gitlab-ci/meson-build.sh --skip-test - /app/vmctl start
# pull b2c - *check_tainted
- curl -L -o /app/boot2container https://gitlab.freedesktop.org/gfx-ci/boot2container/-/raw/2ff65156ba67fa8a0c309a4fc16c5df1a88a3844/vm2c.py
- chmod +x /app/boot2container
# runs the test suite only - "scp -r $PWD vm:"
- /app/boot2container - echo "CI_JOB_ID=\"$CI_JOB_ID\"" > sshenv
- echo "CI_JOB_NAME=\"$CI_JOB_NAME\"" >> sshenv
- echo "MESON_BUILDDIR=\"$MESON_BUILDDIR\"" >> sshenv
- echo "MESON_TEST_ARGS=\"$MESON_TEST_ARGS\"" >> sshenv
- echo "NINJA_ARGS=\"$NINJA_ARGS\"" >> sshenv
- "scp sshenv vm:~/$CI_PROJECT_NAME/.meson_environment"
- /app/vmctl exec "cd $CI_PROJECT_NAME ; .gitlab-ci/meson-build.sh" && touch .success || true
# no matter the results of the tests, we want to fetch the logs
- scp -r vm:$CI_PROJECT_NAME/"$MESON_BUILDDIR" .
- *check_tainted
- /app/vmctl stop
- if [[ ! -e .success ]] ;
then
exit 1 ;
fi
artifacts:
name: "qemu-meson-logs-$CI_JOB_NAME"
when: always
expire_in: 1 week
paths:
- $MESON_BUILDDIR/meson-logs
- console.out
reports:
junit: $MESON_BUILDDIR/junit-*.xml
retry:
max: 2
when: script_failure
needs: ['fedora:34@qemu-prep']
qemu:meson: qemu:meson:
stage: VM extends: .qemu@fedora:34
extends:
- .fdo.distribution-image@fedora
- .fedora:41
- .build-in-b2c@template
needs:
- "fedora:41@container-prep"
qemu:meson:valgrind: qemu:meson:valgrind:
extends: extends: .qemu@fedora:34
- qemu:meson
variables: variables:
MESON_TEST_ARGS: '--setup=valgrind' MESON_TEST_ARGS: '--setup=valgrind'
meson-from-tarball: meson-from-tarball:
extends: extends:
- .fedora:41 - .fedora:34
stage: tarballs stage: tarballs
script: script:
- export INSTALLDIR="$PWD/_inst" - export INSTALLDIR="$PWD/_inst"
@ -654,26 +920,26 @@ meson-from-tarball:
- pushd _build > /dev/null - pushd _build > /dev/null
- ../autogen.sh --disable-silent-rules $CONFIGURE_FLAGS - ../autogen.sh --disable-silent-rules $CONFIGURE_FLAGS
- make - make
- make dist - make distcheck
- popd > /dev/null - popd > /dev/null
- mkdir -p _tarball_dir - mkdir -p _tarball_dir
- tar xf _build/libevdev-*.tar.xz -C _tarball_dir - tar xf _build/libevdev-*.tar.xz -C _tarball_dir
- pushd _tarball_dir/libevdev-*/ > /dev/null - pushd _tarball_dir/libevdev-*/ > /dev/null
- meson "$MESON_BUILDDIR" --prefix="$INSTALLDIR" - meson "$MESON_BUILDDIR" --prefix="$INSTALLDIR"
- meson test -C "$MESON_BUILDDIR" --no-suite="needs-uinput" - ninja -C "$MESON_BUILDDIR" test
- ninja -C "$MESON_BUILDDIR" install - ninja -C "$MESON_BUILDDIR" install
- popd > /dev/null - popd > /dev/null
- ls -lR $INSTALLDIR - ls -lR $INSTALLDIR
needs: ['fedora:41@container-prep'] needs: ['fedora:34@container-prep']
autotools-from-tarball: autotools-from-tarball:
extends: extends:
- .fedora:41 - .fedora:34
stage: tarballs stage: tarballs
script: script:
- export INSTALLDIR="$PWD/_inst" - export INSTALLDIR="$PWD/_inst"
- meson "$MESON_BUILDDIR" - meson "$MESON_BUILDDIR"
- meson dist -C "$MESON_BUILDDIR" --no-tests - ninja -C "$MESON_BUILDDIR" dist
- mkdir -p _tarball_dir - mkdir -p _tarball_dir
- tar xf "$MESON_BUILDDIR"/meson-dist/libevdev-*.xz -C _tarball_dir - tar xf "$MESON_BUILDDIR"/meson-dist/libevdev-*.xz -C _tarball_dir
- pushd _tarball_dir/libevdev-*/ > /dev/null - pushd _tarball_dir/libevdev-*/ > /dev/null
@ -686,7 +952,4 @@ autotools-from-tarball:
- popd > /dev/null - popd > /dev/null
- popd > /dev/null - popd > /dev/null
- ls -lR $INSTALLDIR - ls -lR $INSTALLDIR
variables: needs: ['fedora:34@container-prep']
LIBEVDEV_SKIP_ROOT_TESTS: 1
needs: ['fedora:41@container-prep']

View file

@ -6,16 +6,15 @@
# # # #
######################################## ########################################
.templates_sha: &template_sha e195d80f35b45cc73668be3767b923fd76c70ed5 # see https://docs.gitlab.com/ee/ci/yaml/#includefile .templates_sha: &template_sha bbe5232986c9b98eb1efe62484e07216f7d1a4df # see https://docs.gitlab.com/ee/ci/yaml/#includefile
include: include:
{% for distribution in distributions|map(attribute='name')|unique()|sort() %}
# {{ distribution.capitalize() }} container builder template
- project: 'freedesktop/ci-templates' - project: 'freedesktop/ci-templates'
ref: *template_sha ref: *template_sha
file: file: '/templates/{{distribution}}.yml'
{% for distribution in distributions|map(attribute='name')|unique()|sort() %}
- '/templates/{{distribution}}.yml'
{% endfor %} {% endfor %}
- '/templates/ci-fairy.yml'
stages: stages:
- prep # rebuild the container images if there is a change - prep # rebuild the container images if there is a change
@ -27,16 +26,10 @@ stages:
- container_clean # clean up unused container images - container_clean # clean up unused container images
- merge-check # check for a merge request - merge-check # check for a merge request
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
variables: variables:
# The upstrem repository we will check for images # The upstrem repository we will check for images
FDO_UPSTREAM_REPO: libevdev/libevdev FDO_UPSTREAM_REPO: libevdev/libevdev
LIBEVDEV_SKIP_ROOT_TESTS: 1
GIT_DEPTH: 1 GIT_DEPTH: 1
MESON_BUILDDIR: 'build dir' MESON_BUILDDIR: 'build dir'
@ -46,9 +39,9 @@ variables:
- _build/test/test-suite.log - _build/test/test-suite.log
- $MESON_BUILDDIR/meson-logs/ - $MESON_BUILDDIR/meson-logs/
expire_in: 1 week expire_in: 1 week
when: always when: on_failure
reports: reports:
junit: $MESON_BUILDDIR/*junit*.xml junit: $MESON_BUILDDIR/junit-*.xml
.autotools_build: .autotools_build:
extends: extends:
@ -61,16 +54,12 @@ variables:
- make check - make check
- if ! [[ -z "$MAKE_ARGS" ]]; then make $MAKE_ARGS; fi - if ! [[ -z "$MAKE_ARGS" ]]; then make $MAKE_ARGS; fi
- popd > /dev/null - popd > /dev/null
variables:
LIBEVDEV_SKIP_ROOT_TESTS: 1
.meson_build: .meson_build:
extends: extends:
- .default_artifacts - .default_artifacts
script: script:
- .gitlab-ci/meson-build.sh --run-test - .gitlab-ci/meson-build.sh
variables:
MESON_TEST_ARGS: '--no-suite=needs-uinput'
{# Generate templates for every distribution/version combination we want, any {# Generate templates for every distribution/version combination we want, any
job can then just extends: .name:version and the images will sort job can then just extends: .name:version and the images will sort
@ -98,11 +87,14 @@ variables:
# $SRCDIR/.gitlab-ci/generate-gitlab-ci.py # $SRCDIR/.gitlab-ci/generate-gitlab-ci.py
# #
check-ci-script: check-ci-script:
extends: image: golang:alpine
- .fdo.ci-fairy
stage: prep stage: prep
before_script:
- apk add python3 py-pip git
- pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
script: script:
- ci-fairy generate-template --verify && exit 0 || true - ci-fairy generate-template
- git diff --exit-code && exit 0 || true
- echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify" - echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify"
- exit 1 - exit 1
@ -111,13 +103,13 @@ check-ci-script:
# #
check-commit: check-commit:
extends: image: golang:alpine
- .fdo.ci-fairy
stage: prep stage: prep
before_script:
- apk add python3 py-pip git
- pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
script: script:
- ci-fairy -vv check-commits --junit-xml=results.xml && exit 0 || true - ci-fairy check-commits --signed-off-by --junit-xml=results.xml
- echo "Error checking the commit message format. Please verify"
- exit 1
except: except:
- master@libevdev/libevdev - master@libevdev/libevdev
variables: variables:
@ -131,9 +123,11 @@ check-commit:
# #
check-merge-request: check-merge-request:
extends: image: golang:alpine
- .fdo.ci-fairy
stage: merge-check stage: merge-check
before_script:
- apk add python3 py-pip git
- pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
script: script:
- ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml
artifacts: artifacts:
@ -141,8 +135,6 @@ check-merge-request:
reports: reports:
junit: results.xml junit: results.xml
allow_failure: true allow_failure: true
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
{% for distro in distributions %} {% for distro in distributions %}
@ -152,6 +144,39 @@ check-merge-request:
{% endfor %} {% endfor %}
{% for distro in distributions if distro.want_qemu %}
{% set version = "{}".format(distro.versions|last()) %}
# Pulls in the qemu container from upstream or rebuilds it if missing
.{{ distro.name }}:{{ version }}@qemu-prep:
extends:
- .{{ distro.name }}:{{ version }}
- .{{ distro.name}}.packages
- .fdo.qemu-build@fedora
stage: prep
tags:
- kvm
variables:
GIT_STRATEGY: none
FDO_DISTRIBUTION_TAG: qemu-{{ distro.tag }}
allow_failure: true
# Always rebuilds the container
.{{ distro.name }}:{{ version }}@qemu-forced-rebuild:
extends:
- .{{ distro.name }}:{{ version }}@qemu-prep
variables:
FDO_FORCE_REBUILD: 1
only:
- schedules
# This is the actual job
{{distro.name}}:{{version}}@qemu-prep:
extends: .{{distro.name}}:{{version}}@qemu-prep
{{distro.name}}:{{version}}@qemu-forced-rebuild:
extends: .{{distro.name}}:{{version}}@qemu-forced-rebuild
{% endfor %}
{% for distro in distributions %} {% for distro in distributions %}
{% for version in distro.versions %} {% for version in distro.versions %}
@ -165,6 +190,15 @@ check-merge-request:
variables: variables:
GIT_STRATEGY: none GIT_STRATEGY: none
# Always rebuilds the container
{{ distro.name }}:{{ version }}@container-forced-rebuild:
extends:
- {{ distro.name }}:{{ version }}@container-prep
only:
- schedules
variables:
FDO_FORCE_REBUILD: 1
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
@ -180,9 +214,11 @@ check-merge-request:
# the registry and will remove any that are not tagged with the provided # the registry and will remove any that are not tagged with the provided
# $container_image:$tag # $container_image:$tag
.container-clean: .container-clean:
extends:
- .fdo.ci-fairy
stage: container_clean stage: container_clean
image: golang:alpine
before_script:
- apk add python3 py-pip git
- pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
script: script:
# Go to your Profile, Settings, Access Tokens # Go to your Profile, Settings, Access Tokens
# Create a personal token with 'api' scope, copy the value. # Create a personal token with 'api' scope, copy the value.
@ -228,6 +264,8 @@ check-merge-request:
- .meson_build - .meson_build
stage: build stage: build
dependencies: [] dependencies: []
variables:
NINJA_ARGS: "dist"
{% for distro in distributions %} {% for distro in distributions %}
{% for version in distro.versions %} {% for version in distro.versions %}
@ -330,6 +368,7 @@ no-check:meson:
- dnf remove -y check check-devel - dnf remove -y check check-devel
variables: variables:
MESON_ARGS: -Dtests=disabled MESON_ARGS: -Dtests=disabled
SKIP_MESON_TEST: 1
# doxygen is required for dist # doxygen is required for dist
no-doxygen:meson: no-doxygen:meson:
@ -348,6 +387,7 @@ no-doxygen-check-valgrind:meson:
variables: variables:
MESON_ARGS: -Dtests=disabled -Ddocumentation=disabled MESON_ARGS: -Dtests=disabled -Ddocumentation=disabled
NINJA_ARGS: '' NINJA_ARGS: ''
SKIP_MESON_TEST: 1
enable-gcov:meson: enable-gcov:meson:
extends: .fedora-custom-build@meson-template extends: .fedora-custom-build@meson-template
@ -358,6 +398,7 @@ scan-build:meson:
extends: .fedora-custom-build@meson-template extends: .fedora-custom-build@meson-template
variables: variables:
NINJA_ARGS: 'scan-build' NINJA_ARGS: 'scan-build'
SKIP_MESON_TEST: 1
static-build:meson: static-build:meson:
extends: .fedora-custom-build@meson-template extends: .fedora-custom-build@meson-template
@ -393,46 +434,64 @@ soname:
exit 1 ; exit 1 ;
fi fi
# build on the host, then run a systemd service to execute the test suite {% for distro in distributions if distro.want_qemu %}
# inside the qemu VM handled by b2c {% set version = "{}".format(distro.versions|last()) %}
.build-in-b2c@template: .qemu@{{distro.name}}:{{version}}:
extends: extends:
- .default_artifacts - .{{distro.name}}:{{version}}
stage: VM
image: $CI_REGISTRY_IMAGE/$FDO_DISTRIBUTION_NAME/$FDO_DISTRIBUTION_VERSION:qemu-$FDO_DISTRIBUTION_TAG
tags: tags:
- kvm - kvm
variables: variables:
MESON_BUILDDIR: build_dir MESON_BUILDDIR: build_dir
B2C_KERNEL: {{ b2c.kernel }}
B2C_IMAGE: $FDO_DISTRIBUTION_IMAGE
B2C_COMMAND: .gitlab-ci/start-in-systemd.sh
script: script:
# first build in the host container # start our vm, no args required
- .gitlab-ci/meson-build.sh --skip-test - /app/vmctl start
# pull b2c - *check_tainted
- curl -L -o /app/boot2container https://gitlab.freedesktop.org/gfx-ci/boot2container/-/raw/{{b2c.version}}/vm2c.py
- chmod +x /app/boot2container
# runs the test suite only - "scp -r $PWD vm:"
- /app/boot2container - echo "CI_JOB_ID=\"$CI_JOB_ID\"" > sshenv
- echo "CI_JOB_NAME=\"$CI_JOB_NAME\"" >> sshenv
- echo "MESON_BUILDDIR=\"$MESON_BUILDDIR\"" >> sshenv
- echo "MESON_TEST_ARGS=\"$MESON_TEST_ARGS\"" >> sshenv
- echo "NINJA_ARGS=\"$NINJA_ARGS\"" >> sshenv
- "scp sshenv vm:~/$CI_PROJECT_NAME/.meson_environment"
- /app/vmctl exec "cd $CI_PROJECT_NAME ; .gitlab-ci/meson-build.sh" && touch .success || true
# no matter the results of the tests, we want to fetch the logs
- scp -r vm:$CI_PROJECT_NAME/"$MESON_BUILDDIR" .
- *check_tainted
- /app/vmctl stop
- if [[ ! -e .success ]] ;
then
exit 1 ;
fi
artifacts:
name: "qemu-meson-logs-$CI_JOB_NAME"
when: always
expire_in: 1 week
paths:
- $MESON_BUILDDIR/meson-logs
- console.out
reports:
junit: $MESON_BUILDDIR/junit-*.xml
retry:
max: 2
when: script_failure
needs: ['{{distro.name}}:{{version}}@qemu-prep']
{% for distro in distributions if distro.use_for_qemu_tests %}
{% set version = "{}".format(distro.versions|last()) %}
qemu:meson: qemu:meson:
stage: VM extends: .qemu@{{distro.name}}:{{version}}
extends:
- .fdo.distribution-image@{{distro.name}}
- .{{distro.name}}:{{version}}
- .build-in-b2c@template
needs:
- "{{distro.name}}:{{version}}@container-prep"
qemu:meson:valgrind: qemu:meson:valgrind:
extends: extends: .qemu@{{distro.name}}:{{version}}
- qemu:meson
variables: variables:
MESON_TEST_ARGS: '--setup=valgrind' MESON_TEST_ARGS: '--setup=valgrind'
{% endfor %} {% endfor %}
{% for distro in distributions if distro.use_for_tarball_tests %} {% for distro in distributions if distro.use_for_tarball_tests %}
@ -447,13 +506,13 @@ meson-from-tarball:
- pushd _build > /dev/null - pushd _build > /dev/null
- ../autogen.sh --disable-silent-rules $CONFIGURE_FLAGS - ../autogen.sh --disable-silent-rules $CONFIGURE_FLAGS
- make - make
- make dist - make distcheck
- popd > /dev/null - popd > /dev/null
- mkdir -p _tarball_dir - mkdir -p _tarball_dir
- tar xf _build/libevdev-*.tar.xz -C _tarball_dir - tar xf _build/libevdev-*.tar.xz -C _tarball_dir
- pushd _tarball_dir/libevdev-*/ > /dev/null - pushd _tarball_dir/libevdev-*/ > /dev/null
- meson "$MESON_BUILDDIR" --prefix="$INSTALLDIR" - meson "$MESON_BUILDDIR" --prefix="$INSTALLDIR"
- meson test -C "$MESON_BUILDDIR" --no-suite="needs-uinput" - ninja -C "$MESON_BUILDDIR" test
- ninja -C "$MESON_BUILDDIR" install - ninja -C "$MESON_BUILDDIR" install
- popd > /dev/null - popd > /dev/null
- ls -lR $INSTALLDIR - ls -lR $INSTALLDIR
@ -466,7 +525,7 @@ autotools-from-tarball:
script: script:
- export INSTALLDIR="$PWD/_inst" - export INSTALLDIR="$PWD/_inst"
- meson "$MESON_BUILDDIR" - meson "$MESON_BUILDDIR"
- meson dist -C "$MESON_BUILDDIR" --no-tests - ninja -C "$MESON_BUILDDIR" dist
- mkdir -p _tarball_dir - mkdir -p _tarball_dir
- tar xf "$MESON_BUILDDIR"/meson-dist/libevdev-*.xz -C _tarball_dir - tar xf "$MESON_BUILDDIR"/meson-dist/libevdev-*.xz -C _tarball_dir
- pushd _tarball_dir/libevdev-*/ > /dev/null - pushd _tarball_dir/libevdev-*/ > /dev/null
@ -479,8 +538,5 @@ autotools-from-tarball:
- popd > /dev/null - popd > /dev/null
- popd > /dev/null - popd > /dev/null
- ls -lR $INSTALLDIR - ls -lR $INSTALLDIR
variables:
LIBEVDEV_SKIP_ROOT_TESTS: 1
needs: ['{{distro.name}}:{{version}}@container-prep'] needs: ['{{distro.name}}:{{version}}@container-prep']
{% endfor %} {% endfor %}

View file

@ -3,17 +3,16 @@
# #
# We're happy to rebuild all containers when one changes. # We're happy to rebuild all containers when one changes.
.default_tag: &default_tag '2024-11-25.0' .default_tag: &default_tag '2021-07-26.0'
distributions: distributions:
- name: fedora - name: fedora
tag: *default_tag tag: *default_tag
want_qemu: true
use_for_tarball_tests: true use_for_tarball_tests: true
# only one distro for qemu tests
use_for_qemu_tests: true
versions: versions:
- '40' - '33'
- '41' - '34'
packages: packages:
- git - git
- gcc - gcc
@ -31,18 +30,11 @@ distributions:
- doxygen - doxygen
- xz - xz
- clang-analyzer - clang-analyzer
# below packages are for the qemu runs, so optional
- systemd-udev
- qemu-img
- qemu-system-x86-core
- qemu-system-aarch64-core
- jq
- python3-click
- python3-rich
- name: ubuntu - name: ubuntu
tag: *default_tag tag: *default_tag
versions: versions:
- '24.10' - '21.04'
- '20.10'
packages: packages:
- git - git
- gcc - gcc
@ -80,13 +72,37 @@ distributions:
- binutils - binutils
- doxygen - doxygen
- xz-utils - xz-utils
- name: centos
tag: *default_tag
versions:
- '7'
- '8'
packages:
- git
- gcc
- gcc-c++
- automake
- autoconf
- libtool
- make
- pkgconfig
- python3
- check-devel
- valgrind
- binutils
- xz
build:
meson: False
extra_variables:
# note: the variable value includes the comment because we want that in the gitlab-ci file
MAKE_ARGS: "'' # disable distcheck, requires doxygen"
- name: arch - name: arch
tag: *default_tag tag: *default_tag
versions: versions:
- 'rolling' - 'rolling'
packages: packages:
- git - git
- gc - gcc
- meson - meson
- automake - automake
- autoconf - autoconf
@ -119,7 +135,3 @@ distributions:
- doxygen - doxygen
- xz - xz
- linux-headers - linux-headers
b2c:
version: 2ff65156ba67fa8a0c309a4fc16c5df1a88a3844
kernel: https://gitlab.freedesktop.org/api/v4/projects/libevdev%2Fhid-tools/packages/generic/kernel-x86_64/v6.5/bzImage

View file

@ -1,43 +1,9 @@
#!/usr/bin/env bash #!/bin/bash
#
# This script is sourced from here:
# https://gitlab.freedesktop.org/whot/meson-helper
#
# SPDX-License-Identifier: MIT
set -x
if [[ -f .meson_environment ]]; then if [[ -f .meson_environment ]]; then
. .meson_environment . .meson_environment
fi fi
# If test args are set, we assume we want to run the tests
MESON_RUN_TEST="$MESON_TEST_ARGS"
while [[ $# -gt 0 ]]; do
case $1 in
--skip-setup)
shift
MESON_SKIP_SETUP="1"
;;
--skip-build)
shift
MESON_SKIP_BUILD="1"
;;
--skip-test)
shift
MESON_RUN_TEST=""
;;
--run-test)
shift
MESON_RUN_TEST="1"
;;
*)
echo "Unknow commandline argument $1"
exit 1
;;
esac
done
if [[ -z "$MESON_BUILDDIR" ]]; then if [[ -z "$MESON_BUILDDIR" ]]; then
echo "\$MESON_BUILDDIR undefined." echo "\$MESON_BUILDDIR undefined."
exit 1 exit 1
@ -47,42 +13,43 @@ fi
# run and debug locally. # run and debug locally.
if [[ -z "$CI_JOB_ID" ]] || [[ -z "$CI_JOB_NAME" ]]; then if [[ -z "$CI_JOB_ID" ]] || [[ -z "$CI_JOB_NAME" ]]; then
echo "Missing \$CI_JOB_ID or \$CI_JOB_NAME". echo "Missing \$CI_JOB_ID or \$CI_JOB_NAME".
CI_PROJECT_NAME=$(basename "$PWD")
CI_JOB_ID=$(date +%s) CI_JOB_ID=$(date +%s)
CI_JOB_NAME="$CI_PROJECT_NAME-job-local" CI_JOB_NAME='libevdev-job-local'
echo "Simulating gitlab environment: " echo "Simulating gitlab environment: "
echo " CI_JOB_ID=$CI_JOB_ID" echo " CI_JOB_ID=$CI_JOB_ID"
echo " CI_JOB_NAME=$CI_JOB_NAME" echo " CI_JOB_NAME=$CI_JOB_NAME"
fi fi
if [[ -n "$FDO_CI_CONCURRENT" ]]; then
jobcount="-j$FDO_CI_CONCURRENT"
export MESON_TESTTHREADS="$FDO_CI_CONCURRENT"
fi
echo "*************************************************" echo "*************************************************"
echo "builddir: $MESON_BUILDDIR" echo "builddir: $MESON_BUILDDIR"
echo "meson args: $MESON_ARGS" echo "meson args: $MESON_ARGS"
echo "ninja args: $NINJA_ARGS" echo "ninja args: $NINJA_ARGS"
echo "meson test args: $MESON_TEST_ARGS" echo "meson test args: $MESON_TEST_ARGS"
echo "job count: ${jobcount-0}"
echo "*************************************************" echo "*************************************************"
set -e set -e
if [[ -z "$MESON_SKIP_SETUP" ]]; then rm -rf "$MESON_BUILDDIR"
rm -rf "$MESON_BUILDDIR" meson "$MESON_BUILDDIR" $MESON_ARGS
meson setup "$MESON_BUILDDIR" $MESON_ARGS
fi
meson configure "$MESON_BUILDDIR" meson configure "$MESON_BUILDDIR"
ninja -C "$MESON_BUILDDIR" $NINJA_ARGS
if [[ -z "$MESON_SKIP_BUILD" ]]; then if [[ ! -z "$SKIP_MESON_TEST" ]]; then
if [[ -n "$NINJA_ARGS" ]]; then echo "Skipping meson test"
ninja_args="--ninja-args $NINJA_ARGS" exit 0
fi
meson compile -v -C "$MESON_BUILDDIR" $jobcount $ninja_args
fi fi
if [[ -n "$MESON_RUN_TEST" ]]; then # we still want to generate the reports, even if meson test fails
meson test -C "$MESON_BUILDDIR" $MESON_TEST_ARGS --print-errorlogs set +e
fi meson test -C "$MESON_BUILDDIR" $MESON_TEST_ARGS --print-errorlogs
exit_code=$?
set -e
# We need the glob for the testlog so that it picks up those suffixed by a
# suite (e.g. testlog-valgrind.json)
./.gitlab-ci/meson-junit-report.py \
--output="$MESON_BUILDDIR/junit-$CI_JOB_NAME-report.xml" \
"$MESON_BUILDDIR"/meson-logs/testlog*.json; \
exit $exit_code

128
.gitlab-ci/meson-junit-report.py Executable file
View file

@ -0,0 +1,128 @@
#!/usr/bin/env python3
#
# meson-junit-report.py: Turns a Meson test log into a JUnit report
#
# Copyright 2019 GNOME Foundation
#
# SPDX-License-Identifier: LGPL-2.1-or-later
import argparse
import datetime
import json
import os
import sys
import xml.etree.ElementTree as ET
default_name = os.getenv('CI_PROJECT_NAME', 'unknown')
default_job_id = os.getenv('CI_JOB_ID', 'Unknown')
default_branch = os.getenv('CI_COMMIT_REF_NAME', 'master')
aparser = argparse.ArgumentParser(description='Turns a Meson test log into a JUnit report')
aparser.add_argument('--project-name', metavar='NAME',
help='The project name (default: $CI_PROJECT_NAME)',
default=default_name)
aparser.add_argument('--job-id', metavar='ID',
help='The job ID for the report (default: $CI_JOB_ID)',
default=default_job_id)
aparser.add_argument('--branch', metavar='NAME',
help='Branch of the project being tested',
default=default_branch)
aparser.add_argument('--output', metavar='FILE',
help='The output file, stdout by default',
type=argparse.FileType('w', encoding='UTF-8'),
default=sys.stdout)
aparser.add_argument('infile', metavar='FILE',
help='The input testlog.json, stdin by default',
type=argparse.FileType('r', encoding='UTF-8'),
default=sys.stdin)
args = aparser.parse_args()
outfile = args.output
testsuites = ET.Element('testsuites')
testsuites.set('id', '{}/{}'.format(args.job_id, args.branch))
testsuites.set('package', args.project_name)
testsuites.set('timestamp', datetime.datetime.utcnow().isoformat(timespec='minutes'))
suites = {}
for line in args.infile:
data = json.loads(line)
(full_suite, unit_name) = data['name'].split(' / ')
(project_name, suite_name) = full_suite.split(':')
duration = data['duration']
return_code = data['returncode']
log = data['stdout']
unit = {
'suite': suite_name,
'name': unit_name,
'duration': duration,
'returncode': return_code,
'stdout': log,
}
units = suites.setdefault(suite_name, [])
units.append(unit)
for name, units in suites.items():
print('Processing suite {} (units: {})'.format(name, len(units)))
def if_failed(unit):
if not if_skipped(unit) and unit['returncode'] != 0:
return True
return False
def if_skipped(unit):
if unit['returncode'] == 77:
return True
return False
def if_succeded(unit):
if unit['returncode'] == 0:
return True
return False
successes = list(filter(if_succeded, units))
failures = list(filter(if_failed, units))
skips = list(filter(if_skipped, units))
print(' - {}: {} pass, {} fail, {} skipped'.format(name, len(successes), len(failures), len(skips)))
testsuite = ET.SubElement(testsuites, 'testsuite')
testsuite.set('name', '{}/{}'.format(args.project_name, name))
testsuite.set('tests', str(len(units)))
testsuite.set('errors', str(len(failures)))
testsuite.set('skipped', str(len(skips)))
testsuite.set('failures', str(len(failures)))
for unit in successes:
testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration']))
for unit in skips:
testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration']))
skip = ET.SubElement(testcase, 'skipped')
for unit in failures:
testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration']))
failure = ET.SubElement(testcase, 'failure')
failure.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
failure.set('name', unit['name'])
failure.set('type', 'error')
failure.text = unit['stdout']
output = ET.tostring(testsuites, encoding='unicode')
outfile.write(output)

View file

@ -1,69 +0,0 @@
#!/usr/bin/env bash
set -x
systemd_target=basic.target
post_command="/usr/bin/systemctl exit \$EXIT_STATUS"
while [[ $# -gt 0 ]]; do
case $1 in
--debug-mode)
shift
systemd_target=multi-user.target
post_command="echo you can now log in as root (no password) and then turn off by running \'/usr/bin/systemctl exit \$EXIT_STATUS\'"
;;
*)
echo "Unknow commandline argument $1"
exit 1
;;
esac
done
WORKDIR=${FDO_DISTRIBUTION_WORKINGDIR:-$PWD}
B2C_WORKDIR=${FDO_B2C_WORKDIR:-/app}
# remove root password for debugging
sed -i 's/root:!locked::/root:::/' /etc/shadow
# create a libevdev test suite service
cat <<EOF > /etc/systemd/system/libevdev-testsuite.service
[Unit]
Description=libevdev test suite
After=$systemd_target
[Service]
Type=simple
StandardOutput=journal+console
EnvironmentFile=$B2C_WORKDIR/.b2c_env
WorkingDirectory=$WORKDIR
ExecStart=$WORKDIR/.gitlab-ci/meson-build.sh --skip-setup --skip-build --run-test
# exit the container on termination
ExecStopPost=$post_command
[Install]
WantedBy=default.target
EOF
cat /etc/systemd/system/libevdev-testsuite.service
# enable the service
systemctl enable libevdev-testsuite.service
# disable some services we don't need in the CI
systemctl mask network-online.target
systemctl mask network-pre.target
systemctl mask timers.target
systemctl mask dnf-makecache.timer
systemctl mask systemd-logind.service
systemctl mask rpmdb-migrate.service
systemctl mask systemd-network-generator.service
systemctl mask cryptsetup-pre.target
systemctl mask cryptsetup.target
#change default target
systemctl set-default $systemd_target
# start the system
exec /usr/sbin/init

View file

@ -7,8 +7,8 @@ AC_PREREQ([2.62])
# change meson version too # change meson version too
AC_INIT([libevdev], AC_INIT([libevdev],
[1.13.6], [1.12.0],
[https://gitlab.freedesktop.org/libevdev/libevdev/issues/], [https://bugs.freedesktop.org/enter_bug.cgi?product=libevdev],
[libevdev], [libevdev],
[http://freedesktop.org/wiki/Software/libevdev/]) [http://freedesktop.org/wiki/Software/libevdev/])
@ -59,9 +59,12 @@ AC_CHECK_LIB([m], [round])
PKG_PROG_PKG_CONFIG() PKG_PROG_PKG_CONFIG()
PKG_CHECK_MODULES(CHECK, [check >= 0.9.9], [HAVE_CHECK="yes"], [HAVE_CHECK="no"]) PKG_CHECK_MODULES(CHECK, [check >= 0.9.9], [HAVE_CHECK="yes"], [HAVE_CHECK="no"])
if test "x$HAVE_CHECK" != "xyes"; then if test "x$HAVE_CHECK" = "xyes"; then
AC_PATH_PROG(VALGRIND, [valgrind])
else
AC_MSG_WARN([check not found - skipping building unit tests]) AC_MSG_WARN([check not found - skipping building unit tests])
fi fi
AM_CONDITIONAL(HAVE_VALGRIND, [test "x$VALGRIND" != "x"])
AM_CONDITIONAL(ENABLE_RUNTIME_TESTS, [test "x$HAVE_CHECK" = "xyes"]) AM_CONDITIONAL(ENABLE_RUNTIME_TESTS, [test "x$HAVE_CHECK" = "xyes"])
AM_CONDITIONAL(ENABLE_STATIC_LINK_TEST, [test "x$enable_static" = "xyes"]) AM_CONDITIONAL(ENABLE_STATIC_LINK_TEST, [test "x$enable_static" = "xyes"])

View file

@ -27,7 +27,6 @@
#define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */ #define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */
#define INPUT_PROP_POINTING_STICK 0x05 /* is a pointing stick */ #define INPUT_PROP_POINTING_STICK 0x05 /* is a pointing stick */
#define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */ #define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */
#define INPUT_PROP_PRESSUREPAD 0x07 /* pressure triggers clicks */
#define INPUT_PROP_MAX 0x1f #define INPUT_PROP_MAX 0x1f
#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
@ -279,8 +278,7 @@
#define KEY_PAUSECD 201 #define KEY_PAUSECD 201
#define KEY_PROG3 202 #define KEY_PROG3 202
#define KEY_PROG4 203 #define KEY_PROG4 203
#define KEY_ALL_APPLICATIONS 204 /* AC Desktop Show All Applications */ #define KEY_DASHBOARD 204 /* AL Dashboard */
#define KEY_DASHBOARD KEY_ALL_APPLICATIONS
#define KEY_SUSPEND 205 #define KEY_SUSPEND 205
#define KEY_CLOSE 206 /* AC Close */ #define KEY_CLOSE 206 /* AC Close */
#define KEY_PLAY 207 #define KEY_PLAY 207
@ -520,7 +518,6 @@
#define KEY_NOTIFICATION_CENTER 0x1bc /* Show/hide the notification center */ #define KEY_NOTIFICATION_CENTER 0x1bc /* Show/hide the notification center */
#define KEY_PICKUP_PHONE 0x1bd /* Answer incoming call */ #define KEY_PICKUP_PHONE 0x1bd /* Answer incoming call */
#define KEY_HANGUP_PHONE 0x1be /* Decline incoming call */ #define KEY_HANGUP_PHONE 0x1be /* Decline incoming call */
#define KEY_LINK_PHONE 0x1bf /* AL Phone Syncing */
#define KEY_DEL_EOL 0x1c0 #define KEY_DEL_EOL 0x1c0
#define KEY_DEL_EOS 0x1c1 #define KEY_DEL_EOS 0x1c1
@ -602,14 +599,8 @@
#define BTN_DPAD_LEFT 0x222 #define BTN_DPAD_LEFT 0x222
#define BTN_DPAD_RIGHT 0x223 #define BTN_DPAD_RIGHT 0x223
#define BTN_GRIPL 0x224
#define BTN_GRIPR 0x225
#define BTN_GRIPL2 0x226
#define BTN_GRIPR2 0x227
#define KEY_ALS_TOGGLE 0x230 /* Ambient light sensor */ #define KEY_ALS_TOGGLE 0x230 /* Ambient light sensor */
#define KEY_ROTATE_LOCK_TOGGLE 0x231 /* Display rotation lock */ #define KEY_ROTATE_LOCK_TOGGLE 0x231 /* Display rotation lock */
#define KEY_REFRESH_RATE_TOGGLE 0x232 /* Display refresh rate toggle */
#define KEY_BUTTONCONFIG 0x240 /* AL Button Configuration */ #define KEY_BUTTONCONFIG 0x240 /* AL Button Configuration */
#define KEY_TASKMANAGER 0x241 /* AL Task/Project Manager */ #define KEY_TASKMANAGER 0x241 /* AL Task/Project Manager */
@ -621,28 +612,10 @@
#define KEY_ASSISTANT 0x247 /* AL Context-aware desktop assistant */ #define KEY_ASSISTANT 0x247 /* AL Context-aware desktop assistant */
#define KEY_KBD_LAYOUT_NEXT 0x248 /* AC Next Keyboard Layout Select */ #define KEY_KBD_LAYOUT_NEXT 0x248 /* AC Next Keyboard Layout Select */
#define KEY_EMOJI_PICKER 0x249 /* Show/hide emoji picker (HUTRR101) */ #define KEY_EMOJI_PICKER 0x249 /* Show/hide emoji picker (HUTRR101) */
#define KEY_DICTATE 0x24a /* Start or Stop Voice Dictation Session (HUTRR99) */
#define KEY_CAMERA_ACCESS_ENABLE 0x24b /* Enables programmatic access to camera devices. (HUTRR72) */
#define KEY_CAMERA_ACCESS_DISABLE 0x24c /* Disables programmatic access to camera devices. (HUTRR72) */
#define KEY_CAMERA_ACCESS_TOGGLE 0x24d /* Toggles the current state of the camera access control. (HUTRR72) */
#define KEY_ACCESSIBILITY 0x24e /* Toggles the system bound accessibility UI/command (HUTRR116) */
#define KEY_DO_NOT_DISTURB 0x24f /* Toggles the system-wide "Do Not Disturb" control (HUTRR94)*/
#define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */ #define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */
#define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */ #define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */
/*
* Keycodes for hotkeys toggling the electronic privacy screen found on some
* laptops on/off. Note when the embedded-controller turns on/off the eprivacy
* screen itself then the state should be reported through drm connecter props:
* https://www.kernel.org/doc/html/latest/gpu/drm-kms.html#standard-connector-properties
* Except when implementing the drm connecter properties API is not possible
* because e.g. the firmware does not allow querying the presence and/or status
* of the eprivacy screen at boot.
*/
#define KEY_EPRIVACY_SCREEN_ON 0x252
#define KEY_EPRIVACY_SCREEN_OFF 0x253
#define KEY_KBDINPUTASSIST_PREV 0x260 #define KEY_KBDINPUTASSIST_PREV 0x260
#define KEY_KBDINPUTASSIST_NEXT 0x261 #define KEY_KBDINPUTASSIST_NEXT 0x261
#define KEY_KBDINPUTASSIST_PREVGROUP 0x262 #define KEY_KBDINPUTASSIST_PREVGROUP 0x262
@ -687,27 +660,6 @@
/* Select an area of screen to be copied */ /* Select an area of screen to be copied */
#define KEY_SELECTIVE_SCREENSHOT 0x27a #define KEY_SELECTIVE_SCREENSHOT 0x27a
/* Move the focus to the next or previous user controllable element within a UI container */
#define KEY_NEXT_ELEMENT 0x27b
#define KEY_PREVIOUS_ELEMENT 0x27c
/* Toggle Autopilot engagement */
#define KEY_AUTOPILOT_ENGAGE_TOGGLE 0x27d
/* Shortcut Keys */
#define KEY_MARK_WAYPOINT 0x27e
#define KEY_SOS 0x27f
#define KEY_NAV_CHART 0x280
#define KEY_FISHING_CHART 0x281
#define KEY_SINGLE_RANGE_RADAR 0x282
#define KEY_DUAL_RANGE_RADAR 0x283
#define KEY_RADAR_OVERLAY 0x284
#define KEY_TRADITIONAL_SONAR 0x285
#define KEY_CLEARVU_SONAR 0x286
#define KEY_SIDEVU_SONAR 0x287
#define KEY_NAV_INFO 0x288
#define KEY_BRIGHTNESS_MENU 0x289
/* /*
* Some keyboards have keys which do not have a defined meaning, these keys * Some keyboards have keys which do not have a defined meaning, these keys
* are intended to be programmed / bound to macros by the user. For most * are intended to be programmed / bound to macros by the user. For most
@ -783,9 +735,6 @@
#define KEY_KBD_LCD_MENU4 0x2bb #define KEY_KBD_LCD_MENU4 0x2bb
#define KEY_KBD_LCD_MENU5 0x2bc #define KEY_KBD_LCD_MENU5 0x2bc
/* Performance Boost key (Alienware)/G-Mode key (Dell) */
#define KEY_PERFORMANCE 0x2bd
#define BTN_TRIGGER_HAPPY 0x2c0 #define BTN_TRIGGER_HAPPY 0x2c0
#define BTN_TRIGGER_HAPPY1 0x2c0 #define BTN_TRIGGER_HAPPY1 0x2c0
#define BTN_TRIGGER_HAPPY2 0x2c1 #define BTN_TRIGGER_HAPPY2 0x2c1
@ -890,7 +839,6 @@
#define ABS_TOOL_WIDTH 0x1c #define ABS_TOOL_WIDTH 0x1c
#define ABS_VOLUME 0x20 #define ABS_VOLUME 0x20
#define ABS_PROFILE 0x21
#define ABS_MISC 0x28 #define ABS_MISC 0x28
@ -946,8 +894,7 @@
#define SW_MUTE_DEVICE 0x0e /* set = device disabled */ #define SW_MUTE_DEVICE 0x0e /* set = device disabled */
#define SW_PEN_INSERTED 0x0f /* set = pen inserted */ #define SW_PEN_INSERTED 0x0f /* set = pen inserted */
#define SW_MACHINE_COVER 0x10 /* set = cover closed */ #define SW_MACHINE_COVER 0x10 /* set = cover closed */
#define SW_USB_INSERT 0x11 /* set = USB audio device connected */ #define SW_MAX 0x10
#define SW_MAX 0x11
#define SW_CNT (SW_MAX+1) #define SW_CNT (SW_MAX+1)
/* /*

View file

@ -27,7 +27,6 @@
#define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */ #define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */
#define INPUT_PROP_POINTING_STICK 0x05 /* is a pointing stick */ #define INPUT_PROP_POINTING_STICK 0x05 /* is a pointing stick */
#define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */ #define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */
#define INPUT_PROP_PRESSUREPAD 0x07 /* pressure triggers clicks */
#define INPUT_PROP_MAX 0x1f #define INPUT_PROP_MAX 0x1f
#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
@ -279,8 +278,7 @@
#define KEY_PAUSECD 201 #define KEY_PAUSECD 201
#define KEY_PROG3 202 #define KEY_PROG3 202
#define KEY_PROG4 203 #define KEY_PROG4 203
#define KEY_ALL_APPLICATIONS 204 /* AC Desktop Show All Applications */ #define KEY_DASHBOARD 204 /* AL Dashboard */
#define KEY_DASHBOARD KEY_ALL_APPLICATIONS
#define KEY_SUSPEND 205 #define KEY_SUSPEND 205
#define KEY_CLOSE 206 /* AC Close */ #define KEY_CLOSE 206 /* AC Close */
#define KEY_PLAY 207 #define KEY_PLAY 207
@ -520,7 +518,6 @@
#define KEY_NOTIFICATION_CENTER 0x1bc /* Show/hide the notification center */ #define KEY_NOTIFICATION_CENTER 0x1bc /* Show/hide the notification center */
#define KEY_PICKUP_PHONE 0x1bd /* Answer incoming call */ #define KEY_PICKUP_PHONE 0x1bd /* Answer incoming call */
#define KEY_HANGUP_PHONE 0x1be /* Decline incoming call */ #define KEY_HANGUP_PHONE 0x1be /* Decline incoming call */
#define KEY_LINK_PHONE 0x1bf /* AL Phone Syncing */
#define KEY_DEL_EOL 0x1c0 #define KEY_DEL_EOL 0x1c0
#define KEY_DEL_EOS 0x1c1 #define KEY_DEL_EOS 0x1c1
@ -602,14 +599,8 @@
#define BTN_DPAD_LEFT 0x222 #define BTN_DPAD_LEFT 0x222
#define BTN_DPAD_RIGHT 0x223 #define BTN_DPAD_RIGHT 0x223
#define BTN_GRIPL 0x224
#define BTN_GRIPR 0x225
#define BTN_GRIPL2 0x226
#define BTN_GRIPR2 0x227
#define KEY_ALS_TOGGLE 0x230 /* Ambient light sensor */ #define KEY_ALS_TOGGLE 0x230 /* Ambient light sensor */
#define KEY_ROTATE_LOCK_TOGGLE 0x231 /* Display rotation lock */ #define KEY_ROTATE_LOCK_TOGGLE 0x231 /* Display rotation lock */
#define KEY_REFRESH_RATE_TOGGLE 0x232 /* Display refresh rate toggle */
#define KEY_BUTTONCONFIG 0x240 /* AL Button Configuration */ #define KEY_BUTTONCONFIG 0x240 /* AL Button Configuration */
#define KEY_TASKMANAGER 0x241 /* AL Task/Project Manager */ #define KEY_TASKMANAGER 0x241 /* AL Task/Project Manager */
@ -621,28 +612,10 @@
#define KEY_ASSISTANT 0x247 /* AL Context-aware desktop assistant */ #define KEY_ASSISTANT 0x247 /* AL Context-aware desktop assistant */
#define KEY_KBD_LAYOUT_NEXT 0x248 /* AC Next Keyboard Layout Select */ #define KEY_KBD_LAYOUT_NEXT 0x248 /* AC Next Keyboard Layout Select */
#define KEY_EMOJI_PICKER 0x249 /* Show/hide emoji picker (HUTRR101) */ #define KEY_EMOJI_PICKER 0x249 /* Show/hide emoji picker (HUTRR101) */
#define KEY_DICTATE 0x24a /* Start or Stop Voice Dictation Session (HUTRR99) */
#define KEY_CAMERA_ACCESS_ENABLE 0x24b /* Enables programmatic access to camera devices. (HUTRR72) */
#define KEY_CAMERA_ACCESS_DISABLE 0x24c /* Disables programmatic access to camera devices. (HUTRR72) */
#define KEY_CAMERA_ACCESS_TOGGLE 0x24d /* Toggles the current state of the camera access control. (HUTRR72) */
#define KEY_ACCESSIBILITY 0x24e /* Toggles the system bound accessibility UI/command (HUTRR116) */
#define KEY_DO_NOT_DISTURB 0x24f /* Toggles the system-wide "Do Not Disturb" control (HUTRR94)*/
#define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */ #define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */
#define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */ #define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */
/*
* Keycodes for hotkeys toggling the electronic privacy screen found on some
* laptops on/off. Note when the embedded-controller turns on/off the eprivacy
* screen itself then the state should be reported through drm connecter props:
* https://www.kernel.org/doc/html/latest/gpu/drm-kms.html#standard-connector-properties
* Except when implementing the drm connecter properties API is not possible
* because e.g. the firmware does not allow querying the presence and/or status
* of the eprivacy screen at boot.
*/
#define KEY_EPRIVACY_SCREEN_ON 0x252
#define KEY_EPRIVACY_SCREEN_OFF 0x253
#define KEY_KBDINPUTASSIST_PREV 0x260 #define KEY_KBDINPUTASSIST_PREV 0x260
#define KEY_KBDINPUTASSIST_NEXT 0x261 #define KEY_KBDINPUTASSIST_NEXT 0x261
#define KEY_KBDINPUTASSIST_PREVGROUP 0x262 #define KEY_KBDINPUTASSIST_PREVGROUP 0x262
@ -687,27 +660,6 @@
/* Select an area of screen to be copied */ /* Select an area of screen to be copied */
#define KEY_SELECTIVE_SCREENSHOT 0x27a #define KEY_SELECTIVE_SCREENSHOT 0x27a
/* Move the focus to the next or previous user controllable element within a UI container */
#define KEY_NEXT_ELEMENT 0x27b
#define KEY_PREVIOUS_ELEMENT 0x27c
/* Toggle Autopilot engagement */
#define KEY_AUTOPILOT_ENGAGE_TOGGLE 0x27d
/* Shortcut Keys */
#define KEY_MARK_WAYPOINT 0x27e
#define KEY_SOS 0x27f
#define KEY_NAV_CHART 0x280
#define KEY_FISHING_CHART 0x281
#define KEY_SINGLE_RANGE_RADAR 0x282
#define KEY_DUAL_RANGE_RADAR 0x283
#define KEY_RADAR_OVERLAY 0x284
#define KEY_TRADITIONAL_SONAR 0x285
#define KEY_CLEARVU_SONAR 0x286
#define KEY_SIDEVU_SONAR 0x287
#define KEY_NAV_INFO 0x288
#define KEY_BRIGHTNESS_MENU 0x289
/* /*
* Some keyboards have keys which do not have a defined meaning, these keys * Some keyboards have keys which do not have a defined meaning, these keys
* are intended to be programmed / bound to macros by the user. For most * are intended to be programmed / bound to macros by the user. For most
@ -783,9 +735,6 @@
#define KEY_KBD_LCD_MENU4 0x2bb #define KEY_KBD_LCD_MENU4 0x2bb
#define KEY_KBD_LCD_MENU5 0x2bc #define KEY_KBD_LCD_MENU5 0x2bc
/* Performance Boost key (Alienware)/G-Mode key (Dell) */
#define KEY_PERFORMANCE 0x2bd
#define BTN_TRIGGER_HAPPY 0x2c0 #define BTN_TRIGGER_HAPPY 0x2c0
#define BTN_TRIGGER_HAPPY1 0x2c0 #define BTN_TRIGGER_HAPPY1 0x2c0
#define BTN_TRIGGER_HAPPY2 0x2c1 #define BTN_TRIGGER_HAPPY2 0x2c1
@ -890,7 +839,6 @@
#define ABS_TOOL_WIDTH 0x1c #define ABS_TOOL_WIDTH 0x1c
#define ABS_VOLUME 0x20 #define ABS_VOLUME 0x20
#define ABS_PROFILE 0x21
#define ABS_MISC 0x28 #define ABS_MISC 0x28
@ -946,8 +894,7 @@
#define SW_MUTE_DEVICE 0x0e /* set = device disabled */ #define SW_MUTE_DEVICE 0x0e /* set = device disabled */
#define SW_PEN_INSERTED 0x0f /* set = pen inserted */ #define SW_PEN_INSERTED 0x0f /* set = pen inserted */
#define SW_MACHINE_COVER 0x10 /* set = cover closed */ #define SW_MACHINE_COVER 0x10 /* set = cover closed */
#define SW_USB_INSERT 0x11 /* set = USB audio device connected */ #define SW_MAX 0x10
#define SW_MAX 0x11
#define SW_CNT (SW_MAX+1) #define SW_CNT (SW_MAX+1)
/* /*

View file

@ -6,16 +6,14 @@
* under the terms of the GNU General Public License version 2 as published by * under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation. * the Free Software Foundation.
*/ */
#ifndef _UAPI_INPUT_H #ifndef _INPUT_H
#define _UAPI_INPUT_H #define _INPUT_H
#ifndef __KERNEL__
#include <sys/time.h> #include <sys/time.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/types.h> #include <sys/types.h>
#include <linux/types.h> #include <linux/types.h>
#endif
#include "input-event-codes.h" #include "input-event-codes.h"
@ -78,13 +76,10 @@ struct input_id {
* Note that input core does not clamp reported values to the * Note that input core does not clamp reported values to the
* [minimum, maximum] limits, such task is left to userspace. * [minimum, maximum] limits, such task is left to userspace.
* *
* The default resolution for main axes (ABS_X, ABS_Y, ABS_Z, * The default resolution for main axes (ABS_X, ABS_Y, ABS_Z)
* ABS_MT_POSITION_X, ABS_MT_POSITION_Y) is reported in units * is reported in units per millimeter (units/mm), resolution
* per millimeter (units/mm), resolution for rotational axes * for rotational axes (ABS_RX, ABS_RY, ABS_RZ) is reported
* (ABS_RX, ABS_RY, ABS_RZ) is reported in units per radian. * in units per radian.
* The resolution for the size axes (ABS_MT_TOUCH_MAJOR,
* ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR, ABS_MT_WIDTH_MINOR)
* is reported in units per millimeter (units/mm).
* When INPUT_PROP_ACCELEROMETER is set the resolution changes. * When INPUT_PROP_ACCELEROMETER is set the resolution changes.
* The main axes (ABS_X, ABS_Y, ABS_Z) are then reported in * The main axes (ABS_X, ABS_Y, ABS_Z) are then reported in
* units per g (units/g) and in units per degree per second * units per g (units/g) and in units per degree per second
@ -274,8 +269,6 @@ struct input_mask {
#define BUS_RMI 0x1D #define BUS_RMI 0x1D
#define BUS_CEC 0x1E #define BUS_CEC 0x1E
#define BUS_INTEL_ISHTP 0x1F #define BUS_INTEL_ISHTP 0x1F
#define BUS_AMD_SFH 0x20
#define BUS_SDW 0x21
/* /*
* MT_TOOL types * MT_TOOL types
@ -429,24 +422,6 @@ struct ff_rumble_effect {
__u16 weak_magnitude; __u16 weak_magnitude;
}; };
/**
* struct ff_haptic_effect
* @hid_usage: hid_usage according to Haptics page (WAVEFORM_CLICK, etc.)
* @vendor_id: the waveform vendor ID if hid_usage is in the vendor-defined range
* @vendor_waveform_page: the vendor waveform page if hid_usage is in the vendor-defined range
* @intensity: strength of the effect as percentage
* @repeat_count: number of times to retrigger effect
* @retrigger_period: time before effect is retriggered (in ms)
*/
struct ff_haptic_effect {
__u16 hid_usage;
__u16 vendor_id;
__u8 vendor_waveform_page;
__u16 intensity;
__u16 repeat_count;
__u16 retrigger_period;
};
/** /**
* struct ff_effect - defines force feedback effect * struct ff_effect - defines force feedback effect
* @type: type of the effect (FF_CONSTANT, FF_PERIODIC, FF_RAMP, FF_SPRING, * @type: type of the effect (FF_CONSTANT, FF_PERIODIC, FF_RAMP, FF_SPRING,
@ -483,7 +458,6 @@ struct ff_effect {
struct ff_periodic_effect periodic; struct ff_periodic_effect periodic;
struct ff_condition_effect condition[2]; /* One for each axis */ struct ff_condition_effect condition[2]; /* One for each axis */
struct ff_rumble_effect rumble; struct ff_rumble_effect rumble;
struct ff_haptic_effect haptic;
} u; } u;
}; };
@ -491,7 +465,6 @@ struct ff_effect {
* Force feedback effect types * Force feedback effect types
*/ */
#define FF_HAPTIC 0x4f
#define FF_RUMBLE 0x50 #define FF_RUMBLE 0x50
#define FF_PERIODIC 0x51 #define FF_PERIODIC 0x51
#define FF_CONSTANT 0x52 #define FF_CONSTANT 0x52
@ -501,7 +474,7 @@ struct ff_effect {
#define FF_INERTIA 0x56 #define FF_INERTIA 0x56
#define FF_RAMP 0x57 #define FF_RAMP 0x57
#define FF_EFFECT_MIN FF_HAPTIC #define FF_EFFECT_MIN FF_RUMBLE
#define FF_EFFECT_MAX FF_RAMP #define FF_EFFECT_MAX FF_RAMP
/* /*
@ -536,4 +509,4 @@ struct ff_effect {
#define FF_MAX 0x7f #define FF_MAX 0x7f
#define FF_CNT (FF_MAX+1) #define FF_CNT (FF_MAX+1)
#endif /* _UAPI_INPUT_H */ #endif /* _INPUT_H */

View file

@ -33,7 +33,7 @@ event-names.h: Makefile make-event-names.py
$(PYTHON) $(srcdir)/make-event-names.py $(top_srcdir)/include/linux/@OS@/input.h $(top_srcdir)/include/linux/@OS@/input-event-codes.h > $@ $(PYTHON) $(srcdir)/make-event-names.py $(top_srcdir)/include/linux/@OS@/input.h $(top_srcdir)/include/linux/@OS@/input-event-codes.h > $@
EXTRA_DIST = make-event-names.py libevdev.sym ../include EXTRA_DIST = make-event-names.py libevdev.sym
CLEANFILES = event-names.h CLEANFILES = event-names.h
BUILT_SOURCES = event-names.h BUILT_SOURCES = event-names.h

View file

@ -468,13 +468,7 @@ libevdev_uinput_write_event(const struct libevdev_uinput *uinput_dev,
unsigned int code, unsigned int code,
int value) int value)
{ {
struct input_event ev = { struct input_event ev = { {0,0}, type, code, value };
.input_event_sec = 0,
.input_event_usec = 0,
.type = type,
.code = code,
.value = value
};
int fd = libevdev_uinput_get_fd(uinput_dev); int fd = libevdev_uinput_get_fd(uinput_dev);
int rc, max; int rc, max;

View file

@ -42,19 +42,19 @@ startswith(const char *str, size_t len, const char *prefix, size_t plen)
static inline int static inline int
bit_is_set(const unsigned long *array, int bit) bit_is_set(const unsigned long *array, int bit)
{ {
return !!(array[bit / LONG_BITS] & (1ULL << (bit % LONG_BITS))); return !!(array[bit / LONG_BITS] & (1LL << (bit % LONG_BITS)));
} }
static inline void static inline void
set_bit(unsigned long *array, int bit) set_bit(unsigned long *array, int bit)
{ {
array[bit / LONG_BITS] |= (1ULL << (bit % LONG_BITS)); array[bit / LONG_BITS] |= (1LL << (bit % LONG_BITS));
} }
static inline void static inline void
clear_bit(unsigned long *array, int bit) clear_bit(unsigned long *array, int bit)
{ {
array[bit / LONG_BITS] &= ~(1ULL << (bit % LONG_BITS)); array[bit / LONG_BITS] &= ~(1LL << (bit % LONG_BITS));
} }
static inline void static inline void

View file

@ -44,8 +44,7 @@ struct slot_change_state {
}; };
static int sync_mt_state(struct libevdev *dev, static int sync_mt_state(struct libevdev *dev,
struct slot_change_state changes_out[dev->num_slots]); struct slot_change_state *changes_out);
static int static int
update_key_state(struct libevdev *dev, const struct input_event *e); update_key_state(struct libevdev *dev, const struct input_event *e);
@ -805,34 +804,23 @@ push_mt_sync_events(struct libevdev *dev,
int rc; int rc;
for (int slot = 0; slot < dev->num_slots; slot++) { for (int slot = 0; slot < dev->num_slots; slot++) {
bool have_slot_event = false; /* stopped touches were already terminated in
* terminate_slots */
if (!bit_is_set(changes[slot].axes, ABS_MT_SLOT)) if (changes[slot].state == TOUCH_STOPPED ||
!bit_is_set(changes[slot].axes, ABS_MT_SLOT))
continue; continue;
queue_push_event(dev, EV_ABS, ABS_MT_SLOT, slot);
last_reported_slot = slot;
for (int axis = ABS_MT_MIN; axis <= ABS_MT_MAX; axis++) { for (int axis = ABS_MT_MIN; axis <= ABS_MT_MAX; axis++) {
if (axis == ABS_MT_SLOT || if (axis == ABS_MT_SLOT ||
!libevdev_has_event_code(dev, EV_ABS, axis)) !libevdev_has_event_code(dev, EV_ABS, axis))
continue; continue;
if (bit_is_set(changes[slot].axes, axis)) { if (bit_is_set(changes[slot].axes, axis))
/* We already sent the tracking id -1 in
* terminate_slots so don't do that again. There
* may be other axes like ABS_MT_TOOL_TYPE that
* need to be synced despite no touch being active */
if (axis == ABS_MT_TRACKING_ID &&
*slot_value(dev, slot, axis) == -1)
continue;
if (!have_slot_event) {
queue_push_event(dev, EV_ABS, ABS_MT_SLOT, slot);
last_reported_slot = slot;
have_slot_event = true;
}
queue_push_event(dev, EV_ABS, axis, queue_push_event(dev, EV_ABS, axis,
*slot_value(dev, slot, axis)); *slot_value(dev, slot, axis));
}
} }
} }
@ -922,8 +910,7 @@ sync_state(struct libevdev *dev)
bool want_mt_sync = false; bool want_mt_sync = false;
int last_reported_slot = 0; int last_reported_slot = 0;
struct slot_change_state changes[dev->num_slots > 0 ? dev->num_slots : 1]; struct slot_change_state changes[dev->num_slots > 0 ? dev->num_slots : 1];
memset(changes, 0, sizeof(changes));
memset(changes, 0, sizeof(changes));
/* see section "Discarding events before synchronizing" in /* see section "Discarding events before synchronizing" in
* libevdev/libevdev.h */ * libevdev/libevdev.h */

View file

@ -163,7 +163,7 @@ extern "C" {
* License information * License information
* =================== * ===================
* libevdev is licensed under the * libevdev is licensed under the
* [MIT license](http://cgit.freedesktop.org/libevdev/tree/COPYING). * [X11 license](http://cgit.freedesktop.org/libevdev/tree/COPYING).
* *
* Bindings * Bindings
* =================== * ===================
@ -500,11 +500,11 @@ extern "C" {
* <dd>supported, see libevdev_enable_event_code()</dd> * <dd>supported, see libevdev_enable_event_code()</dd>
* <dt>EVIOCGKEYCODE:</dt> * <dt>EVIOCGKEYCODE:</dt>
* <dd>currently not supported</dd> * <dd>currently not supported</dd>
* <dt>EVIOCGKEYCODE:</dt>
* <dd>currently not supported</dd>
* <dt>EVIOCSKEYCODE:</dt> * <dt>EVIOCSKEYCODE:</dt>
* <dd>currently not supported</dd> * <dd>currently not supported</dd>
* <dt>EVIOCGKEYCODE_V2:</dt> * <dt>EVIOCSKEYCODE:</dt>
* <dd>currently not supported</dd>
* <dt>EVIOCSKEYCODE_V2:</dt>
* <dd>currently not supported</dd> * <dd>currently not supported</dd>
* <dt>EVIOCGNAME:</dt> * <dt>EVIOCGNAME:</dt>
* <dd>supported, see libevdev_get_name()</dd> * <dd>supported, see libevdev_get_name()</dd>
@ -544,10 +544,6 @@ extern "C" {
* <dt>EVIOCREVOKE:</dt> * <dt>EVIOCREVOKE:</dt>
* <dd>currently not supported, see * <dd>currently not supported, see
* http://lists.freedesktop.org/archives/input-tools/2014-January/000688.html</dd> * http://lists.freedesktop.org/archives/input-tools/2014-January/000688.html</dd>
* <dt>EVIOCGMASK:</dt>
* <dd>currently not supported</dd>
* <dt>EVIOCSMASK:</dt>
* <dd>currently not supported</dd>
* </dl> * </dl>
* *
*/ */
@ -1563,7 +1559,8 @@ int libevdev_get_event_value(const struct libevdev *dev, unsigned int type, unsi
* *
* @return 0 on success, or -1 on failure. * @return 0 on success, or -1 on failure.
* @retval -1 * @retval -1
* - the device does not have the event type or code enabled, or * - the device does not have the event type or
* - code enabled, or the code is outside the, or
* - the code is outside the allowed limits for the given type, or * - the code is outside the allowed limits for the given type, or
* - the type cannot be set, or * - the type cannot be set, or
* - the value is not permitted for the given code. * - the value is not permitted for the given code.

View file

@ -1,14 +1,13 @@
project('libevdev', 'c', project('libevdev', 'c',
version: '1.13.6', # change autotools version too version: '1.12.0', # change autotools version too
license: 'MIT/Expat', license: 'MIT/Expat',
default_options: [ 'c_std=gnu99', 'warning_level=2' ], default_options: [ 'c_std=gnu99', 'warning_level=2' ],
meson_version: '>= 0.56.0') meson_version: '>= 0.47.0')
libevdev_version = meson.project_version().split('.') libevdev_version = meson.project_version().split('.')
dir_root = meson.project_source_root() dir_src = join_paths(meson.source_root(), 'libevdev')
dir_src = dir_root / 'libevdev' dir_src_test = join_paths(meson.source_root(), 'test')
dir_src_test = dir_root / 'test'
# Include directories # Include directories
includes_include = include_directories('include') includes_include = include_directories('include')
@ -40,8 +39,9 @@ pkgconfig = import('pkgconfig')
dep_lm = cc.find_library('m') dep_lm = cc.find_library('m')
dep_rt = cc.find_library('rt') dep_rt = cc.find_library('rt')
input_h = dir_root / 'include' / 'linux' / host_machine.system() / 'input.h' input_h = join_paths(meson.source_root(), 'include', 'linux', host_machine.system(), 'input.h')
input_event_codes_h = dir_root / 'include' / 'linux' / host_machine.system() / 'input-event-codes.h' uinput_h = join_paths(meson.source_root(), 'include', 'linux', host_machine.system(), 'uinput.h')
input_event_codes_h = join_paths(meson.source_root(), 'include', 'linux', host_machine.system(), 'input-event-codes.h')
# event-names.h # event-names.h
make_event_names = find_program('libevdev/make-event-names.py') make_event_names = find_program('libevdev/make-event-names.py')
@ -55,7 +55,8 @@ event_names_h = configure_file(input: 'libevdev/libevdev.h',
install_headers('libevdev/libevdev.h', install_headers('libevdev/libevdev.h',
'libevdev/libevdev-uinput.h', 'libevdev/libevdev-uinput.h',
subdir: 'libevdev-1.0/libevdev') subdir: 'libevdev-1.0/libevdev')
src_libevdev = [event_names_h] + files( src_libevdev = [
event_names_h,
'libevdev/libevdev.h', 'libevdev/libevdev.h',
'libevdev/libevdev-int.h', 'libevdev/libevdev-int.h',
'libevdev/libevdev-util.h', 'libevdev/libevdev-util.h',
@ -66,9 +67,12 @@ src_libevdev = [event_names_h] + files(
'libevdev/libevdev-names.c', 'libevdev/libevdev-names.c',
'include/linux/input.h', 'include/linux/input.h',
'include/linux/uinput.h', 'include/linux/uinput.h',
) input_event_codes_h,
input_h,
uinput_h
]
mapfile = dir_src / 'libevdev.sym' mapfile = join_paths(dir_src, 'libevdev.sym')
version_flag = '-Wl,--version-script,@0@'.format(mapfile) version_flag = '-Wl,--version-script,@0@'.format(mapfile)
lib_libevdev = library('evdev', lib_libevdev = library('evdev',
src_libevdev, src_libevdev,
@ -80,9 +84,7 @@ lib_libevdev = library('evdev',
install: true install: true
) )
inc_libevdev = include_directories('.') dep_libevdev = declare_dependency(link_with: lib_libevdev)
dep_libevdev = declare_dependency(link_with: lib_libevdev,
include_directories: [inc_libevdev])
pkgconfig.generate( pkgconfig.generate(
filebase: 'libevdev', filebase: 'libevdev',
@ -102,36 +104,33 @@ install_man(manpage)
# tools # tools
if not get_option('tools').disabled() executable('libevdev-events',
executable('libevdev-events', sources: ['tools/libevdev-events.c'],
sources: ['tools/libevdev-events.c'], include_directories: [includes_include],
include_directories: [includes_include], dependencies: dep_libevdev,
dependencies: dep_libevdev, install: false)
install: false) executable('libevdev-list-codes',
executable('libevdev-list-codes', sources: ['tools/libevdev-list-codes.c'],
sources: ['tools/libevdev-list-codes.c'], include_directories: [includes_include],
include_directories: [includes_include], dependencies: dep_libevdev,
dependencies: dep_libevdev, install: false)
install: false) executable('touchpad-edge-detector',
executable('touchpad-edge-detector', sources: ['tools/touchpad-edge-detector.c'],
sources: ['tools/touchpad-edge-detector.c'], include_directories: [includes_include],
include_directories: [includes_include], dependencies: [dep_libevdev, dep_lm],
dependencies: [dep_libevdev, dep_lm], install: true)
install: true) executable('mouse-dpi-tool',
executable('mouse-dpi-tool', sources: ['tools/mouse-dpi-tool.c'],
sources: ['tools/mouse-dpi-tool.c'], include_directories: [includes_include],
include_directories: [includes_include], dependencies: dep_libevdev,
dependencies: dep_libevdev, install: true)
install: true) executable('libevdev-tweak-device',
executable('libevdev-tweak-device', sources: ['tools/libevdev-tweak-device.c'],
sources: ['tools/libevdev-tweak-device.c'], include_directories: [includes_include],
include_directories: [includes_include], dependencies: dep_libevdev,
dependencies: dep_libevdev, install: true)
install: true) install_man('tools/libevdev-tweak-device.1',
install_man('tools/libevdev-tweak-device.1', 'tools/touchpad-edge-detector.1')
'tools/touchpad-edge-detector.1',
'tools/mouse-dpi-tool.1')
endif
# tests # tests
dep_check = dependency('check', version: '>= 0.9.9', dep_check = dependency('check', version: '>= 0.9.9',
@ -165,7 +164,7 @@ if dep_check.found()
include_directories: [includes_include], include_directories: [includes_include],
dependencies: [dep_libevdev, dep_check], dependencies: [dep_libevdev, dep_check],
install: false) install: false)
test('test-event-codes', test_event_codes, suite: ['library', 'needs-uinput']) test('test-event-codes', test_event_codes, suite: 'library')
test_internals = executable('test-internals', test_internals = executable('test-internals',
sources: src_common + [ sources: src_common + [
@ -174,7 +173,7 @@ if dep_check.found()
include_directories: [includes_include], include_directories: [includes_include],
dependencies: [dep_libevdev, dep_check], dependencies: [dep_libevdev, dep_check],
install: false) install: false)
test('test-internals', test_internals, suite: ['library', 'needs-uinput']) test('test-internals', test_internals, suite: 'library')
test_uinput = executable('test-uinput', test_uinput = executable('test-uinput',
sources: src_common + [ sources: src_common + [
@ -183,7 +182,7 @@ if dep_check.found()
include_directories: [includes_include], include_directories: [includes_include],
dependencies: [dep_libevdev, dep_check], dependencies: [dep_libevdev, dep_check],
install: false) install: false)
test('test-uinput', test_uinput, suite: ['library', 'needs-uinput']) test('test-uinput', test_uinput, suite: 'library')
test_libevdev = executable('test-libevdev', test_libevdev = executable('test-libevdev',
sources: src_common + [ sources: src_common + [
@ -194,7 +193,7 @@ if dep_check.found()
include_directories: [includes_include], include_directories: [includes_include],
dependencies: [dep_libevdev, dep_check], dependencies: [dep_libevdev, dep_check],
install: false) install: false)
test('test-libevdev', test_libevdev, suite: ['library', 'needs-uinput'], env: ['CK_DEFAULT_TIMEOUT=10']) test('test-libevdev', test_libevdev, suite: 'library')
test_kernel = executable('test-kernel', test_kernel = executable('test-kernel',
sources: src_common + [ sources: src_common + [
@ -203,7 +202,7 @@ if dep_check.found()
include_directories: [includes_include], include_directories: [includes_include],
dependencies: [dep_libevdev, dep_check], dependencies: [dep_libevdev, dep_check],
install: false) install: false)
test('test-kernel', test_kernel, suite: ['kernel', 'needs-uinput']) test('test-kernel', test_kernel, suite: 'kernel')
valgrind = find_program('valgrind', required: false) valgrind = find_program('valgrind', required: false)
@ -212,14 +211,14 @@ if dep_check.found()
valgrind_env.set('CK_TIMEOUT_MULTIPLIER', '10') valgrind_env.set('CK_TIMEOUT_MULTIPLIER', '10')
valgrind_env.set('CK_FORK', 'no') valgrind_env.set('CK_FORK', 'no')
valgrind_env.set('RUNNING_ON_VALGRIND', '1') valgrind_env.set('RUNNING_ON_VALGRIND', '1')
valgrind_suppressions_file = dir_src_test / 'valgrind.suppressions' valgrind_suppressions_file = join_paths(dir_src_test, 'valgrind.suppressions')
add_test_setup('valgrind', add_test_setup('valgrind',
exe_wrapper: [ valgrind, exe_wrapper: [ valgrind,
'--leak-check=full', '--leak-check=full',
'--gen-suppressions=all', '--gen-suppressions=all',
'--error-exitcode=3', '--error-exitcode=3',
'--suppressions=' + valgrind_suppressions_file ], '--suppressions=' + valgrind_suppressions_file ],
env: valgrind_env, env: valgrind_env,
timeout_multiplier: 100) timeout_multiplier: 100)
else else
message('valgrind not found, disabling valgrind test suite') message('valgrind not found, disabling valgrind test suite')
@ -233,10 +232,12 @@ endif
doxygen = find_program('doxygen', required: get_option('documentation')) doxygen = find_program('doxygen', required: get_option('documentation'))
if doxygen.found() if doxygen.found()
doxygen = find_program('doxygen')
src_doxygen = files( src_doxygen = files(
# source files # source files
dir_src / 'libevdev.h', join_paths(dir_src, 'libevdev.h'),
dir_src / 'libevdev-uinput.h', join_paths(dir_src, 'libevdev-uinput.h'),
# style files # style files
'doc/style/bootstrap.css', 'doc/style/bootstrap.css',
'doc/style/customdoxygen.css', 'doc/style/customdoxygen.css',
@ -262,8 +263,8 @@ if doxygen.found()
doc_config.set('PACKAGE_NAME', meson.project_name()) doc_config.set('PACKAGE_NAME', meson.project_name())
doc_config.set('PACKAGE_VERSION', meson.project_version()) doc_config.set('PACKAGE_VERSION', meson.project_version())
doc_config.set('builddir', meson.current_build_dir()) doc_config.set('builddir', meson.current_build_dir())
doc_config.set('top_srcdir', dir_root) doc_config.set('top_srcdir', meson.source_root())
doc_config.set('srcdir', dir_root / 'doc') doc_config.set('srcdir', join_paths(meson.source_root(), 'doc'))
doxyfile = configure_file(input: 'doc/libevdev.doxygen.in', doxyfile = configure_file(input: 'doc/libevdev.doxygen.in',
output: 'libevdev.doxygen', output: 'libevdev.doxygen',

View file

@ -2,15 +2,11 @@ option('tests',
type: 'feature', type: 'feature',
value: 'enabled', value: 'enabled',
description: 'Build the tests') description: 'Build the tests')
option('tools',
type: 'feature',
value: 'enabled',
description: 'Build the tools')
option('documentation', option('documentation',
type: 'feature', type: 'feature',
value: 'enabled', value: 'enabled',
description: 'Build the documentation') description: 'Build the documentation')
option('coverity', option('coverity',
type: 'boolean', type: 'boolean',
value: false, value: 'false',
description: 'Enable coverity build fixes, see meson.build for details') description: 'Enable coverity build fixes, see meson.build for details')

View file

@ -89,11 +89,24 @@ test_kernel_SOURCES = \
test_kernel_CFLAGS = -I$(top_srcdir) test_kernel_CFLAGS = -I$(top_srcdir)
test_kernel_LDADD = $(CHECK_LIBS) $(top_builddir)/libevdev/libevdev.la test_kernel_LDADD = $(CHECK_LIBS) $(top_builddir)/libevdev/libevdev.la
if HAVE_VALGRIND
VALGRIND_FLAGS=--leak-check=full \
--quiet \
--error-exitcode=3 \
--suppressions=$(srcdir)/valgrind.suppressions
valgrind:
$(MAKE) check-TESTS CK_TIMEOUT_MULTIPLIER=10 LOG_COMPILER="$(VALGRIND)" LOG_FLAGS="$(VALGRIND_FLAGS)"
check_local_deps += valgrind
endif
if GCOV_ENABLED if GCOV_ENABLED
CLEANFILES = gcov-reports/*.gcov gcov-reports/summary.txt *.gcno *.gcda CLEANFILES = gcov-reports/*.gcov gcov-reports/summary.txt *.gcno *.gcda
gcov-report: generate-gcov-report.sh gcov-report: generate-gcov-report.sh check-TESTS
$(AM_V_GEN)$(srcdir)/generate-gcov-report.sh gcov-reports $(top_builddir)/libevdev $(builddir) $(AM_V_GEN)$(srcdir)/generate-gcov-report.sh gcov-reports $(top_builddir)/libevdev $(builddir)
gcov: gcov-report gcov: gcov-report

View file

@ -158,7 +158,7 @@ START_TEST(test_code_sw_name)
ck_assert_str_eq(libevdev_event_code_get_name(EV_SW, SW_RFKILL_ALL), "SW_RFKILL_ALL"); ck_assert_str_eq(libevdev_event_code_get_name(EV_SW, SW_RFKILL_ALL), "SW_RFKILL_ALL");
ck_assert_str_eq(libevdev_event_code_get_name(EV_SW, SW_LINEIN_INSERT), "SW_LINEIN_INSERT"); ck_assert_str_eq(libevdev_event_code_get_name(EV_SW, SW_LINEIN_INSERT), "SW_LINEIN_INSERT");
ck_assert_str_eq(libevdev_event_code_get_name(EV_SW, SW_PEN_INSERTED), "SW_PEN_INSERTED"); ck_assert_str_eq(libevdev_event_code_get_name(EV_SW, SW_PEN_INSERTED), "SW_PEN_INSERTED");
ck_assert_str_eq(libevdev_event_code_get_name(EV_SW, SW_MAX), "SW_USB_INSERT"); ck_assert_str_eq(libevdev_event_code_get_name(EV_SW, SW_MAX), "SW_MACHINE_COVER");
} }
END_TEST END_TEST

View file

@ -617,12 +617,12 @@ START_TEST(test_syn_delta_sw)
EV_SYN, SYN_DROPPED, EV_SYN, SYN_DROPPED,
EV_SW, SW_HEADPHONE_INSERT, EV_SW, SW_HEADPHONE_INSERT,
EV_SW, SW_MICROPHONE_INSERT, EV_SW, SW_MICROPHONE_INSERT,
EV_SW, SW_MACHINE_COVER, /* Replace with SW_MAX once runners are on 6.16 */ EV_SW, SW_MAX,
-1); -1);
uinput_device_event(uidev, EV_SW, SW_HEADPHONE_INSERT, 1); uinput_device_event(uidev, EV_SW, SW_HEADPHONE_INSERT, 1);
uinput_device_event(uidev, EV_SW, SW_MICROPHONE_INSERT, 1); uinput_device_event(uidev, EV_SW, SW_MICROPHONE_INSERT, 1);
uinput_device_event(uidev, EV_SW, SW_MACHINE_COVER, 1); uinput_device_event(uidev, EV_SW, SW_MAX, 1);
uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
@ -635,7 +635,7 @@ START_TEST(test_syn_delta_sw)
assert_event(&ev, EV_SW, SW_MICROPHONE_INSERT, 1); assert_event(&ev, EV_SW, SW_MICROPHONE_INSERT, 1);
rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
assert_event(&ev, EV_SW, SW_MACHINE_COVER, 1); assert_event(&ev, EV_SW, SW_MAX, 1);
rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
assert_event(&ev, EV_SYN, SYN_REPORT, 0); assert_event(&ev, EV_SYN, SYN_REPORT, 0);
@ -644,7 +644,7 @@ START_TEST(test_syn_delta_sw)
ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_HEADPHONE_INSERT), 1); ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_HEADPHONE_INSERT), 1);
ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_MICROPHONE_INSERT), 1); ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_MICROPHONE_INSERT), 1);
ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_MACHINE_COVER), 1); ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_MAX), 1);
uinput_device_free(uidev); uinput_device_free(uidev);
libevdev_free(dev); libevdev_free(dev);
@ -1008,206 +1008,6 @@ START_TEST(test_syn_delta_tracking_ids_btntool)
} }
END_TEST END_TEST
START_TEST(test_syn_delta_mt_tool_type)
{
struct uinput_device* uidev;
struct libevdev *dev;
int rc;
struct input_event ev;
int i;
const int num_slots = 15;
int slot = -1;
unsigned long terminated[NLONGS(num_slots)];
struct input_absinfo abs[7] = {
{ .value = ABS_X, .maximum = 1000 },
{ .value = ABS_Y, .maximum = 1000 },
{ .value = ABS_MT_POSITION_X, .maximum = 1000 },
{ .value = ABS_MT_POSITION_Y, .maximum = 1000 },
{ .value = ABS_MT_TOOL_TYPE, .maximum = MT_TOOL_PALM },
{ .value = ABS_MT_SLOT, .maximum = num_slots },
{ .value = ABS_MT_TRACKING_ID, .minimum = -1, .maximum = 0xff },
};
test_create_abs_device(&uidev, &dev,
ARRAY_LENGTH(abs), abs,
EV_SYN, SYN_REPORT,
-1);
for (i = num_slots; i >= 0; i--) {
int tool_type = MT_TOOL_FINGER;
switch (i) {
case 0:
case 1:
case 2:
case 3:
tool_type = MT_TOOL_FINGER;
break;
case 4:
case 5:
case 6:
case 7:
tool_type = MT_TOOL_PALM;
break;
}
uinput_device_event_multiple(uidev,
EV_ABS, ABS_MT_SLOT, i,
EV_ABS, ABS_MT_TRACKING_ID, i,
EV_ABS, ABS_X, 100 + i,
EV_ABS, ABS_Y, 500 + i,
EV_ABS, ABS_MT_POSITION_X, 100 + i,
EV_ABS, ABS_MT_POSITION_Y, 500 + i,
EV_ABS, ABS_MT_TOOL_TYPE, tool_type,
EV_SYN, SYN_REPORT, 0,
-1, -1);
do {
rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
ck_assert_int_ne(rc, LIBEVDEV_READ_STATUS_SYNC);
} while (rc >= 0);
}
/* we have a bunch of touches now, and libevdev knows it. Change all
* touches */
for (i = num_slots; i >= 0; i--) {
uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, i);
switch (i) {
/* Slot 0 is a finger and stays a finger */
case 0:
/* Slot 4 is a palm and stays a palm */
case 4:
uinput_device_event_multiple(uidev,
EV_ABS, ABS_X, 200 + i,
EV_ABS, ABS_Y, 700 + i,
EV_ABS, ABS_MT_POSITION_X, 200 + i,
EV_ABS, ABS_MT_POSITION_Y, 700 + i,
-1, -1);
break;
/* Slot 1 is a finger and changes active touch to palm */
case 1:
uinput_device_event(uidev, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM);
break;
/* Slot 2 is a finger and terminates */
case 2:
/* Slot 6 is a palm and terminates */
case 6:
uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, -1);
break;
/* Slot 3 is a finger and restarts as finger */
case 3:
/* Slot 5 is a palm and restarts as finger */
case 5:
uinput_device_event_multiple(uidev,
EV_ABS, ABS_MT_TRACKING_ID, num_slots + i,
EV_ABS, ABS_X, 200 + i,
EV_ABS, ABS_Y, 700 + i,
EV_ABS, ABS_MT_POSITION_X, 200 + i,
EV_ABS, ABS_MT_POSITION_Y, 700 + i,
EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER,
-1, -1);
break;
/* Slot 7 is a palm and restarts and terminates again as finger */
case 7:
uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, -1);
uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
uinput_device_event_multiple(uidev,
EV_ABS, ABS_MT_TRACKING_ID, num_slots + i,
EV_ABS, ABS_X, 200 + i,
EV_ABS, ABS_Y, 700 + i,
EV_ABS, ABS_MT_POSITION_X, 200 + i,
EV_ABS, ABS_MT_POSITION_Y, 700 + i,
EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER,
-1, -1);
uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, -1);
uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
break;
}
uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
}
/* Force sync */
rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
/* now check for the right tracking IDs */
memset(terminated, 0, sizeof(terminated));
slot = -1;
while ((rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev)) != -EAGAIN) {
if (libevdev_event_is_code(&ev, EV_SYN, SYN_REPORT))
continue;
if (libevdev_event_is_code(&ev, EV_ABS, ABS_MT_SLOT)) {
slot = ev.value;
continue;
}
if (libevdev_event_is_code(&ev, EV_ABS, ABS_X) ||
libevdev_event_is_code(&ev, EV_ABS, ABS_Y))
continue;
ck_assert_int_ne(slot, -1);
if (libevdev_event_is_code(&ev, EV_ABS, ABS_MT_TRACKING_ID)) {
switch (slot) {
case 0:
case 1:
case 4:
ck_abort_msg("No ABS_MT_TRACKING_ID expected for this slot");
break;
case 2:
case 6:
case 7:
ck_assert_int_eq(ev.value, -1);
break;
case 3:
case 5:
if (!bit_is_set(terminated, slot)) {
ck_assert_int_eq(ev.value, -1);
set_bit(terminated, slot);
} else {
ck_assert_int_eq(ev.value, num_slots + slot);
}
break;
}
continue;
}
if (libevdev_event_is_code(&ev, EV_ABS, ABS_MT_TOOL_TYPE)) {
switch (slot) {
case 0:
case 2:
case 3:
case 4:
case 6:
ck_abort_msg("No ABS_MT_TOOL_TYPE expected for this slot");
break;
case 1:
ck_assert_int_eq(ev.value, MT_TOOL_PALM);
break;
case 5:
case 7:
ck_assert_int_eq(ev.value, MT_TOOL_FINGER);
break;
}
continue;
}
switch(ev.code) {
case ABS_MT_POSITION_X:
ck_assert_int_eq(ev.value, 200 + slot);
break;
case ABS_MT_POSITION_Y:
ck_assert_int_eq(ev.value, 700 + slot);
break;
default:
ck_abort();
}
}
uinput_device_free(uidev);
libevdev_free(dev);
}
END_TEST
START_TEST(test_syn_delta_late_sync) START_TEST(test_syn_delta_late_sync)
{ {
struct uinput_device* uidev; struct uinput_device* uidev;
@ -2260,7 +2060,6 @@ TEST_SUITE_ROOT_PRIVILEGES(libevdev_events)
add_test(s, test_syn_delta_late_sync); add_test(s, test_syn_delta_late_sync);
add_test(s, test_syn_delta_tracking_ids); add_test(s, test_syn_delta_tracking_ids);
add_test(s, test_syn_delta_tracking_ids_btntool); add_test(s, test_syn_delta_tracking_ids_btntool);
add_test(s, test_syn_delta_mt_tool_type);
add_test(s, test_skipped_sync); add_test(s, test_skipped_sync);
add_test(s, test_incomplete_sync); add_test(s, test_incomplete_sync);

View file

@ -116,11 +116,10 @@ START_TEST(test_event_codes)
test_create_abs_device(&uidev, &dev, test_create_abs_device(&uidev, &dev,
1, &abs, 1, &abs,
-1); -1);
} else { } else
test_create_device(&uidev, &dev, test_create_device(&uidev, &dev,
*evbit, code, *evbit, code,
-1); -1);
}
ck_assert_msg(libevdev_has_event_type(dev, *evbit), "for event type %d\n", *evbit); ck_assert_msg(libevdev_has_event_type(dev, *evbit), "for event type %d\n", *evbit);
ck_assert_msg(libevdev_has_event_code(dev, *evbit, code), "for type %d code %d", *evbit, code); ck_assert_msg(libevdev_has_event_code(dev, *evbit, code), "for type %d code %d", *evbit, code);

View file

@ -108,7 +108,7 @@ int main(void)
srunner_add_suite(sr, t->setup()); srunner_add_suite(sr, t->setup());
} }
srunner_run_all(sr, CK_ENV); srunner_run_all(sr, CK_NORMAL);
failed = srunner_ntests_failed(sr); failed = srunner_ntests_failed(sr);
srunner_free(sr); srunner_free(sr);

View file

@ -24,6 +24,5 @@ libevdev_tweak_device_LDADD = $(libevdev_ldadd)
dist_man_MANS = \ dist_man_MANS = \
libevdev-tweak-device.1 \ libevdev-tweak-device.1 \
mouse-dpi-tool.1 \
touchpad-edge-detector.1 \ touchpad-edge-detector.1 \
$(NULL) $(NULL)

View file

@ -1,18 +0,0 @@
.TH MOUSE-DPI-TOOL "1"
.SH NAME
mouse-dpi-tool \- mouse resolution estimation tool
.SH SYNOPSIS
.BR mouse-dpi-tool " <\fIevdev device\fP>"
.SH DESCRIPTION
.B mouse-dpi-tool
reads relative events (mouse movement events) and calculates the
distance covered and maximum frequency of the incoming events.
Combined with a measurement of the actual distance physically covered,
this allows the mouse's resolution to be estimated.
.PP
Some mouse devices provide dynamic frequencies, it is
recommended to measure multiple times to obtain the highest value.
.PP
.SH OPTIONS
.B mouse-dpi-tool
accepts no options.

View file

@ -2,36 +2,6 @@
set -e set -e
tag="$1" make
case $tag in rsync --delete -avz doc/html/ freedesktop.org:/srv/www.freedesktop.org/www/software/libevdev/doc/latest
-h|--help)
echo "Usage: $0 <tag>"
echo "Builds the libevdev documentation and rsyncs it to the freedesktop.org server."
echo ""
echo "Options:"
echo " tag ... the tag to build (default: master)"
exit 0
;;
1*)
# Helper so we can run it with the numerical tag only, tags
# are all prefixed with libevdev
tag="libevdev-$tag"
;;
**)
;;
esac
tag=${tag:-master}
dir=$(mktemp -d --tmpdir='' libevdev-doc.XXX)
git clone --depth 1 --branch "$tag" https://gitlab.freedesktop.org/libevdev/libevdev.git "$dir"
pushd $dir
builddir=_doc_build
rm -rf "$builddir"
meson setup "$builddir"
ninja -C "$builddir"
# Strip libevdev- prefix from the tag and replace master with latest, whichever applies
htmldir=${tag/#libevdev-/}
htmldir=${htmldir/master/latest}
rsync --delete -avz "$builddir/html/" freedesktop.org:/srv/www.freedesktop.org/www/software/libevdev/doc/${htmldir}
popd