Skip to content

Commit

Permalink
(conan-io#20346) libinput: Add recipe
Browse files Browse the repository at this point in the history
* libinput: Add recipe

* Link transitively to both libevdev and mtdev

* Revert "Link transitively to both libevdev and mtdev"

This reverts commit 20d94b1.

* Remove comment

* Disable debug_gui by default to reduce default number of dependencies

* Fix error in the test package

* Update

* Bump eudev version

* Remove comment and only require wayland when debug_gui is enabled
  • Loading branch information
jwillikers authored Mar 22, 2024
1 parent fad10d5 commit 31cb467
Show file tree
Hide file tree
Showing 6 changed files with 223 additions and 0 deletions.
4 changes: 4 additions & 0 deletions recipes/libinput/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
sources:
"1.25.0":
url: "https://gitlab.freedesktop.org/libinput/libinput/-/archive/1.25.0/libinput-1.25.0.tar.bz2"
sha256: "193bd592298bd9e369c0ef3e5d83a6a9d68ddc4cd3dfc84bbe77920a8d0d57df"
125 changes: 125 additions & 0 deletions recipes/libinput/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.env import VirtualBuildEnv
from conan.tools.files import copy, get, rmdir
from conan.tools.gnu import PkgConfigDeps
from conan.tools.layout import basic_layout
from conan.tools.meson import Meson, MesonToolchain
import os


required_conan_version = ">=1.53.0"


class LibinputConan(ConanFile):
name = "libinput"
description = "libinput is a library that handles input devices for display servers and other applications that need to directly deal with input devices."
license = "MIT"
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://www.freedesktop.org/wiki/Software/libinput/"
topics = ("device", "display", "event", "input")
package_type = "shared-library"
settings = "os", "arch", "compiler", "build_type"
options = {
"epoll_dir": [None, "ANY"],
"debug_gui": [True, False],
"with_libudev": ["eudev", "systemd"],
"with_libwacom": [True, False],
"with_wayland": [True, False],
"with_x11": [True, False],
}
default_options = {
"epoll_dir": None,
"debug_gui": False,
"with_libudev": "systemd",
# todo Package libwacom and enable this option by default.
"with_libwacom": False,
"with_wayland": True,
"with_x11": True,
}

def configure(self):
self.settings.rm_safe("compiler.cppstd")
self.settings.rm_safe("compiler.libcxx")
if not self.options.debug_gui:
self.options.rm_safe("with_wayland")
self.options.rm_safe("with_x11")

def layout(self):
basic_layout(self, src_folder="src")

def requirements(self):
self.requires("mtdev/1.1.6")
self.requires("libevdev/1.13.1")

if self.options.debug_gui:
self.requires("cairo/1.18.0")
self.requires("glib/2.78.3")
self.requires("gtk/system")
if self.options.with_wayland:
self.requires("wayland/1.22.0")
self.requires("wayland-protocols/1.33")
if self.options.with_x11:
self.requires("xorg/system")

if self.options.with_libudev == "systemd":
self.requires("libudev/system", transitive_libs=True)
elif self.options.with_libudev == "eudev":
self.requires("eudev/3.2.14", transitive_libs=True)

def validate(self):
if self.settings.os not in ["FreeBSD", "Linux"]:
raise ConanInvalidConfiguration(f"{self.ref} is not supported on {self.settings.os}.")
if self.options.with_libwacom:
raise ConanInvalidConfiguration(f"The with_libwacom option for {self.ref} is not yet supported. Contributions welcome.")

def build_requirements(self):
self.tool_requires("meson/1.3.2")
if not self.conf.get("tools.gnu:pkg_config", default=False, check_type=str):
self.tool_requires("pkgconf/2.1.0")
if self.options.debug_gui and self.options.get_safe("with_wayland"):
self.tool_requires("wayland/<host_version>")

def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)

def generate(self):
tc = MesonToolchain(self)
tc.project_options["coverity"] = False
tc.project_options["datadir"] = "res"
tc.project_options["documentation"] = False
tc.project_options["epoll-dir"] = '' if self.options.epoll_dir is None else str(self.options.epoll_dir)
tc.project_options["debug-gui"] = self.options.debug_gui
tc.project_options["install-tests"] = False
# Change libexecdir so that the libinput subdirectory in the bin directory doesn't conflict with the libinput executable.
tc.project_options["libexecdir"] = "libexec"
tc.project_options["libwacom"] = self.options.with_libwacom
tc.project_options["tests"] = False
tc.generate()
tc = PkgConfigDeps(self)
tc.generate()
tc = VirtualBuildEnv(self)
tc.generate()

def build(self):
meson = Meson(self)
meson.configure()
meson.build()

def package(self):
copy(self, "COPYING", self.source_folder, os.path.join(self.package_folder, "licenses"))
meson = Meson(self)
meson.install()

copy(self, f"{self.name}-*", os.path.join(self.package_folder, "libexec", self.name), os.path.join(self.package_folder, "bin"))
rmdir(self, os.path.join(self.package_folder, "libexec"))

rmdir(self, os.path.join(self.package_folder, "etc"))
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
rmdir(self, os.path.join(self.package_folder, "res", "zsh"))
rmdir(self, os.path.join(self.package_folder, "share"))

def package_info(self):
self.cpp_info.libs = ["input"]
if self.settings.os in ["Linux", "FreeBSD"]:
self.cpp_info.system_libs.extend(["m", "rt"])
32 changes: 32 additions & 0 deletions recipes/libinput/all/test_package/conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.layout import basic_layout
from conan.tools.meson import Meson
import os


class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "PkgConfigDeps", "MesonToolchain", "VirtualRunEnv", "VirtualBuildEnv"
test_type = "explicit"

def layout(self):
basic_layout(self)

def requirements(self):
self.requires(self.tested_reference_str)

def build_requirements(self):
self.tool_requires("meson/1.3.2")
if not self.conf.get("tools.gnu:pkg_config", default=False, check_type=str):
self.tool_requires("pkgconf/2.1.0")

def build(self):
meson = Meson(self)
meson.configure()
meson.build()

def test(self):
if can_run(self):
bin_path = os.path.join(self.cpp.build.bindir, "test_package")
self.run(bin_path, env="conanrun")
5 changes: 5 additions & 0 deletions recipes/libinput/all/test_package/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
project('test_package', 'c')
package_dep = dependency('libinput')
executable('test_package',
sources : ['test_package.c'],
dependencies : [package_dep])
54 changes: 54 additions & 0 deletions recipes/libinput/all/test_package/test_package.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <libudev.h>
#include <libinput.h>

static int
open_restricted(const char *path, int flags, void *user_data)
{
int fd = open(path, flags);
return fd < 0 ? -1 : fd;
}

static void
close_restricted(int fd, void *user_data)
{
close(fd);
}

static const struct libinput_interface interface = {
.open_restricted = open_restricted,
.close_restricted = close_restricted,
};

int main(void) {
bool grab = false;
struct libinput *li;
struct udev *udev = udev_new();
if (!udev) {
fprintf(stderr, "Failed to initialize udev\n");
return EXIT_FAILURE;
}

li = libinput_udev_create_context(&interface, &grab, udev);
if (!li) {
fprintf(stderr, "Failed to initialize libinput context from udev\n");
udev_unref(udev);
return EXIT_FAILURE;
}

if (libinput_udev_assign_seat(li, "seat0")) {
fprintf(stderr, "Failed to set seat\n");
libinput_unref(li);
li = NULL;
udev_unref(udev);
return EXIT_FAILURE;
}

udev_unref(udev);
return EXIT_SUCCESS;
}
3 changes: 3 additions & 0 deletions recipes/libinput/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
versions:
"1.25.0":
folder: all

0 comments on commit 31cb467

Please sign in to comment.